這篇文章主要介紹了Java進程怎么理解的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java進程怎么理解文章都會有所收獲,下面我們一起來看看吧。
為尖山等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及尖山網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、尖山網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
進程描述
廣義上講,所有進程信息被放在一個叫做進程控制塊的數(shù)據(jù)結(jié)構(gòu)中,可以理解為進程屬性的集合。
進程控制塊
每個進程在內(nèi)核中都有一個進程控制塊(PCB)來維護進程相關(guān)的信息,Linux內(nèi)核的進程控制塊是task_struct結(jié)構(gòu)體。
task_struct結(jié)構(gòu)體
task_struct是Linux內(nèi)核下的一種數(shù)據(jù)結(jié)構(gòu),它會被裝載到RAM里并且包含著進程的信息,每個進程把它的信息放在task_struct結(jié)構(gòu)體里task_struct包含了這些內(nèi)容:
標示符:描述本進程的唯一標示符
狀態(tài):任務(wù)狀態(tài),退出代碼,退出信息等。
優(yōu)先級:相對于其他進程的優(yōu)先級
程序計數(shù)器:程序中被執(zhí)行的下一條指令的地址。
內(nèi)存地址:包括程序代碼和進程相關(guān)的數(shù)據(jù)的指針,還有和其他進程共享內(nèi)存塊的指針
上下文數(shù)據(jù):進程執(zhí)行時處理的寄存器中的數(shù)據(jù)
I/O狀態(tài)信息:包括顯示的I/O請求,分配給進程的I/O設(shè)備和被進程使用的文件列表
記賬信息:包括處理器時間總和,使用時鐘數(shù)總和、時間限制、記賬信號等。
保存進程信息的數(shù)據(jù)結(jié)構(gòu)叫做task_struct,所有運行在系統(tǒng)里的進程都以task_struct鏈表的形式存在內(nèi)核中進程的信息可通過/proc系統(tǒng)文件夾查看,要獲取PID為400的進程信息,需要查看/proc/400這個文件夾。大多數(shù)進程同樣可以使用top和ps這些用戶級工具獲取。
進程標示符
進程id(PID)
父進程id(PPID)
進程位置
進程內(nèi)存映像
Linux下C程序生成主要由4個步驟組成:預編譯、編譯、匯編、鏈接。編譯器gcc經(jīng)過預編譯、編譯、匯編3個步驟將源程序文件轉(zhuǎn)換成目標文件。如果程序有多個目標文件或程序中使用了庫函數(shù),則編譯器還需要將所有目標文件及所需的庫文件鏈接起來,最后生成可執(zhí)行程序。當程序執(zhí)行時,操作系統(tǒng)將可執(zhí)行程序復制到內(nèi)存中。程序轉(zhuǎn)為進程通常需要以下幾個步驟:
*內(nèi)核將程序讀入內(nèi)存,為程序分配內(nèi)存空間;
*內(nèi)核為該進程保存PID及相應(yīng)的狀態(tài)信息,把進程放到運行隊列中等待執(zhí)行。程序轉(zhuǎn)化為進程后就可被操作系統(tǒng)的調(diào)度程序執(zhí)行了。
進程的內(nèi)存映像是指內(nèi)核在內(nèi)存中如何存放可執(zhí)行程序文件。在將程序轉(zhuǎn)化為進程的過程中,操作系統(tǒng)將可執(zhí)行程序從硬盤復制到內(nèi)存中。布局如下:
2.進程映像位置依賴于使用的內(nèi)存管理
3.可執(zhí)行程序與進程內(nèi)存映像的不同之處在于:
a.可執(zhí)行程序位于磁盤中而內(nèi)存映像位于內(nèi)存
b.可支持行程序沒有堆棧,因為程序程序被加載到內(nèi)存中才會分配堆棧。
c.可執(zhí)行程序雖然也有未初始化數(shù)據(jù)段但它并并不存儲于硬盤中的可執(zhí)行文件中。
d.可執(zhí)行程序是靜態(tài)的,不變的,而內(nèi)在映像隨著程序的執(zhí)行是靜態(tài)變化的,比如數(shù)據(jù)段隨著程序執(zhí)行要存儲的變量值,棧在函數(shù)調(diào)用時也是在不斷變化的。
#include#include 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; }
關(guān)于“Java進程怎么理解”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Java進程怎么理解”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。