Linux/Unix分配進程ID的方法以及原始碼實現

來源:互聯網
上載者:User

標籤:ted   ext   task   類型   標識符   sch   and   不能   class   

       在Linux/Unix系統中。每一個進程都有一個非負整型表示的唯一進程ID。儘管是唯一的。可是進程的ID能夠重用。當一個進程終止後,其進程ID就能夠再次使用了。

大多數Linux/Unix系統採用延遲重用的演算法,使得賦予建立進程ID不同於近期終止進程所使用的ID,這主要是為了防止將新進程誤覺得是使用同一ID的某個已終止的先前進程。本文討論了Linux/Unix分配進程ID的方法以及原始碼實現。

分配進程ID的方法

      在大多數Linux/Unix系統中,產生一個進程ID方法是:從0開始依次連續分配,一直到能夠分配的最大的進程ID(不同的系統。這個最大值是不一樣的,比方有些Linux系統是65536)。一旦到達最大值,又一次從某個值(不同的系統,這個值也是不一樣的,比方在Mac OS X和HP-UX系統中,這個值是100)開始依次連續尋找那些還沒有被使用的ID。這裡分配進程ID的方法,存在潛在的安全問題。由於能夠從系統擷取資訊或者提取處理序間通訊的內容。

考慮到安全問題。部分系統可能用其它方法來分配進程ID,比方隨機分配一個進程ID。

不管用什麼方法分配進程ID。系統都須要保證每一個進程ID是獨一無二的。

Linux系統上分配進程ID的原始碼實現

      在Linux系統中,核心分配PID的範圍是(RESERVED_PIDS, PID_MAX_DEFAULT)。在每一個namespace中。PID是依次連續分配的(在不同的namespace的task能夠有同樣的ID)。

一旦ID達到分配到達上限(在pseudo-file /proc/sys/kernel/pid_max中能夠查看能夠分配的最大進程ID),從頭開始尋找分配PID。下面是相關的源碼:

struct pid *alloc_pid(struct pid_namespace *ns){/*省略了一些代碼*/for (i = ns->level; i >= 0; i--) {    nr = alloc_pidmap(tmp);    if (nr < 0)goto out_free;    pid->numbers[i].nr = nr;    pid->numbers[i].ns = tmp;    tmp = tmp->parent;}/*省略了一些代碼*/}static int alloc_pidmap(struct pid_namespace *pid_ns){        int i, offset, max_scan, pid, last = pid_ns->last_pid;        struct pidmap *map;        pid = last + 1;        if (pid >= pid_max)                pid = RESERVED_PIDS;        /* and later on... */        pid_ns->last_pid = pid;        return pid;}

       注意在Linux核心中,進程PID實現並不不過一個int標識符號(當然返回給應用程式,PID不過int類型的數值)。相關實現的結構體在/include/linux/pid.h中能夠找到。除了ID外。它還包含跟這個ID相關的task列表、引用計數器和一個能夠方便尋找的hashed list。

進程ID分配須要注意的事項
       1、殭屍進程的PID是臨時不能用的。須要其父進程收集器全部的終止狀態才幹使用,也就是說須要調用類似wait()函數後,才幹使用。
       2、詳細實現時,系統能夠隨機分配進程PID(當然是保證沒有被其它進程使用),因此在應用程式中,不要依賴於進程PID的分配方式。
       3、在使用者空間(user space)可能看到分配的進程ID並不連續,這是由於在應用程式兩個fork之間,核心發送器(scheduling)可能建立了一個進程。

其實。這樣的情況是常常發生的。

參考資料

《UNIX環境進階編程》(第二版)
http://superuser.com/questions/135007/how-are-pids-generated
http://stackoverflow.com/questions/3446727/how-does-linux-determine-the-next-pid
http://en.wikipedia.org/wiki/Process_identifier


Linux/Unix分配進程ID的方法以及原始碼實現

聯繫我們

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