【APUE】進程基礎

來源:互聯網
上載者:User

標籤:style   color   使用   檔案   for   linux   ar   new   

進程標識符:非負整數

ID為0的進程通常是是調度進程,常被稱為交換進程。該進程是核心的一部分,它並不執行任何磁碟上的程式,因此也被稱為系統進程

ID為1的進程是init進程,在自舉過程結束時由核心調用,此進程負責在自舉核心後啟動一個UNIX系統,init通常讀入與系統有關的初始設定檔案,並將系統引導到一個狀態,init進程不會終止。它是普通的使用者進程,以超級使用者提高權限執行

常用函數:

pid_t getpid(void)  返回調用進程的進程id

pid_t getppid(void) 返回調用進程的父進程id

我們可以使用$ps命令來查詢正在啟動並執行進程,還可以用$pstree命令來顯示整個進程樹

 

實際上,當電腦開機的時候,核心(kernel)只建立了一個init進程。Linux kernel並不提供直接建立新進程的系統調用。剩下的所有進程都是init進程通過fork機制建立的。新的進程要通過老的進程複製自身得到,這就是fork。fork是一個系統調用。進程存活於記憶體中。每個進程都在記憶體中分配有屬於自己的一片空間 (address space)。當進程fork的時候,Linux在記憶體中開闢出一片新的記憶體空間給新的進程,並將老的進程空間中的內容複寫到新的空間中,此後兩個進程同時運行。

老進程成為新進程的父進程(parent process),而相應的,新進程就是老的進程的子進程(child process)。一個進程除了有一個PID之外,還會有一個PPID(parent PID)來儲存的父進程PID。如果我們循著PPID不斷向上追溯的話,總會發現其源頭是init進程。所以說,所有的進程也構成一個以init為根的樹狀結構。

 

當子進程終結時,它會通知父進程,並清空自己所佔據的記憶體,並在kernel裡留下自己的退出資訊(exit code,如果順利運行,為0;如果有錯誤或異常狀況,為>0的整數)。在這個資訊裡,會解釋該進程為什麼退出。父進程在得知子進程終結時,有責任對該子進程使用wait系統調用。這個wait函數能從kernel中取出子進程的退出資訊,並清空該資訊在kernel中所佔據的空間。但是,如果父進程早於子進程終結,子進程就會成為一個孤兒(orphand)進程。孤兒進程會被過繼給init進程,init進程也就成了該進程的父進程。init進程負責該子進程終結時調用wait函數。

當然,一個糟糕的程式也完全可能造成子進程的退出資訊滯留在kernel中的狀況(父進程不對子進程調用wait函數),這樣的情況下,子進程成為殭屍(zombie)進程。當大量殭屍進程積累時,記憶體空間會被擠占。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.