Linux進程管理(2)

來源:互聯網
上載者:User

linux進程的五種狀態

  • 運行
  • 可中斷
  • 不可中斷
  • 殭屍
  • 停止


 

遍曆父進程和子進程

 


 

註:init進程是作為init_struct靜態分配的。

 

進程的建立

linux中通過fork和exec實現進程的建立。fork通過拷貝當前進程來建立一個新的進程,再通過exec載入可執行檔並執行。fork採用的寫時拷貝方法避免了不必要資料的拷貝,使得linux可以快速建立進程。

 

Fork

在shell中,執行命令時,shell程式就是通過"複製"形成了父子進程。子進程產生後,執行exec系列函數,載入新的可執行檔,開始執行。
由於複製完成後,子進程馬上就要載入新的程式來運行了,在此之前從父進程那裡複製來的記憶體空間都不需要了。所以,"複製"過程中,複製記憶體空間是件費力不 討好的事情。
所以,fork有了"寫時複製"技術。"複製"的時候記憶體並沒有被複製,而是共用的。直到父子進程之一去寫某塊記憶體時,它才被複製。(核心先將這些記憶體設 為唯讀,當它們被寫時,CPU出現訪存異常。核心捕捉異常,複製空間,並改屬性為可寫。)


vfork

 

vfork最早起源於2.9BSD,它與fork的不同就在於它並不將父進程的地址空間完全複製到子進程中,因為 子進程會立即調用exec。vfork出來的子進程是在父進程的空間中啟動並執行,它的存在就是為了exec調用,所以它不需要複製這些東西,因為複製了也沒 有用。如果這時子進程修改了某個變數,這將影響到父進程。vfork保證子進程先運行,在它調用exec或exit後父進程才可能調度運行。而fork的父子進程運行順序是不定的,它取決於核心的調度演算法。

 

Linux線程的實現


 

核心線程

 

核心線程沒有獨立的地址空間,只運行與核心空間。核心線程通過kernel_thread() 建立:

 


 


 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.