深入了解linux核心之(二)程序
程式是靜态的,程序是正在執行的程式的一個執行個體,一個程式可以由多個程序組成.程序是資源配置設定的實體.
在程序被建立出來之後,該子程序幾乎和父程序一樣.子程序複制了父程序的位址空間,從fork()之後的第一條指令開始執行,和父程序有同樣的程式可執行代碼(exec調用除外).盡管子程序和父程序具有同樣的程式執行代碼,但是子程序擁有自己的stack和heap,是以,子程序對資料的修改對父程序來說是不可見的.
前面說到子程序複制了父程序的位址空間以及資料.那麼,這種複制遵循 寫時複制(cow) 的原則.當子程序建立之後,核心将父程序的資料标記為read-only隻讀.一開始子程序是共享父程序的資料的,隻有當子程序需要對資料作出修改(寫)的時候,才會将相關資料從父程序複制到子程序的位址空間.
盡管如此,在使用者空間子程序還是從父程序繼承了很多東西:
父程序打開的檔案,包括檔案描述符,offset
real user id, real group id, effective id, effective group id
追加的group id
程序組id
session 會話id
控制終端
set-user-id, set-group-id 标志
目前的工作目錄
root 目錄
建立檔案的模式掩碼
指的是建立一個檔案時,給檔案的最基本的權限.比如055.
信号mask以及信号的處理方式(handle)
子程序擁有和父程序相同的信号處理方式.例如父程序忽略了sigint,子程序也 了sigint信号,當然,子程序可以更改該處理方式.
打開檔案的close-on-exec标志
環境變量
共享記憶體段
記憶體映射
資源限制變量
子程序和父程序不同之處:
fork()的傳回值不同
fork()在父程序中傳回子程序程序号,在子程序中傳回0;
程序号不同
父程序id不同
父程序的檔案鎖沒有被子程序繼承
挂起的鬧鐘被清除
信号集被設定為空
新版本的linux(2.6)核心中,已經能夠很好的對多線程進行支援了, 在較老版本的linux當中,将線程當做普通程序或者傳遞給使用者空間處理線程.對于現行的新linux版本提出了一個輕量級程序的概念.核心中,用一個輕量級的程序代表一個線程,并将使用者空間的線程和核心中的輕量級程序進行關聯,進而可以使得使用者空間線程得到管理和排程.輕量級程序共享父程序的資料.這樣一來,可以達到很好的對多線程進行支援.
每一個程序在核心中都有一個task_struct結構體來表示,該結構體包含了一個程序所需的全部資訊.并将這些task_struct放到一個雙向連結清單task list中.
關于task_struct相關結構我在這裡就不贅述,這方面的資料參考linux kernel development
版權申明:
轉載文章請注明原文出處http://blog.csdn.net/feiyinzilgd/archive/2010/09/15/5885640.aspx
并請聯系譚海燕本人或者前往譚海燕個人首頁留言