天天看點

深入了解linux核心之(二)程序

                                      深入了解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

并請聯系譚海燕本人或者前往譚海燕個人首頁留言

繼續閱讀