您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java進程怎么理解的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java進程怎么理解文章都會有所收獲,下面我們一起來看看吧。
進程描述
廣義上講,所有進程信息被放在一個叫做進程控制塊的數據結構中,可以理解為進程屬性的集合。
進程控制塊
每個進程在內核中都有一個進程控制塊(PCB)來維護進程相關的信息,Linux內核的進程控制塊是task_struct結構體。
task_struct結構體
task_struct是Linux內核下的一種數據結構,它會被裝載到RAM里并且包含著進程的信息,每個進程把它的信息放在task_struct結構體里task_struct包含了這些內容:
標示符:描述本進程的唯一標示符
狀態:任務狀態,退出代碼,退出信息等。
優先級:相對于其他進程的優先級
程序計數器:程序中被執行的下一條指令的地址。
內存地址:包括程序代碼和進程相關的數據的指針,還有和其他進程共享內存塊的指針
上下文數據:進程執行時處理的寄存器中的數據
I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表
記賬信息:包括處理器時間總和,使用時鐘數總和、時間限制、記賬信號等。
保存進程信息的數據結構叫做task_struct,所有運行在系統里的進程都以task_struct鏈表的形式存在內核中進程的信息可通過/proc系統文件夾查看,要獲取PID為400的進程信息,需要查看/proc/400這個文件夾。大多數進程同樣可以使用top和ps這些用戶級工具獲取。
進程標示符
進程id(PID)
父進程id(PPID)
進程位置
進程內存映像
Linux下C程序生成主要由4個步驟組成:預編譯、編譯、匯編、鏈接。編譯器gcc經過預編譯、編譯、匯編3個步驟將源程序文件轉換成目標文件。如果程序有多個目標文件或程序中使用了庫函數,則編譯器還需要將所有目標文件及所需的庫文件鏈接起來,最后生成可執行程序。當程序執行時,操作系統將可執行程序復制到內存中。程序轉為進程通常需要以下幾個步驟:
*內核將程序讀入內存,為程序分配內存空間;
*內核為該進程保存PID及相應的狀態信息,把進程放到運行隊列中等待執行。程序轉化為進程后就可被操作系統的調度程序執行了。
進程的內存映像是指內核在內存中如何存放可執行程序文件。在將程序轉化為進程的過程中,操作系統將可執行程序從硬盤復制到內存中。布局如下:
2.進程映像位置依賴于使用的內存管理
3.可執行程序與進程內存映像的不同之處在于:
a.可執行程序位于磁盤中而內存映像位于內存
b.可支持行程序沒有堆棧,因為程序程序被加載到內存中才會分配堆棧。
c.可執行程序雖然也有未初始化數據段但它并并不存儲于硬盤中的可執行文件中。
d.可執行程序是靜態的,不變的,而內在映像隨著程序的執行是靜態變化的,比如數據段隨著程序執行要存儲的變量值,棧在函數調用時也是在不斷變化的。
#include <stdio.h> #include <stdlib.h> int g_val = 100; void test() { int a = 10; int b = 10; printf("test stack1 address : 0x%x\n", &a); printf("test stack2 address : 0x%x\n", &b); } void (*fp)(); int main() { int a = 10; int *heap = malloc(sizeof(int)); fp = test; printf("code address : 0x%x\n", fp); printf("data address : 0x%x\n", &g_val); printf("heap address : 0x%x\n", heap); printf("main stack0 address : 0x%x\n", &a); fp(); return 0; }
關于“Java進程怎么理解”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Java進程怎么理解”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。