<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      《Linux內核設計與實現》讀書筆記(三)- Linux的進程

      進程是所有操作系統的核心概念,同樣在linux上也不例外。

      主要內容:

      • 進程和線程
      • 進程的生命周期
      • 進程的創建
      • 進程的終止

      1. 進程和線程

      進程和線程是程序運行時狀態,是動態變化的,進程和線程的管理操作(比如,創建,銷毀等)都是有內核來實現的。

      Linux中的進程于Windows相比是很輕量級的,而且不嚴格區分進程和線程,線程不過是一種特殊的進程。

      所以下面只討論進程,只有當線程與進程存在不一樣的地方時才提一下線程。

       

      進程提供2種虛擬機制:虛擬處理器和虛擬內存

      每個進程有獨立的虛擬處理器和虛擬內存,

      每個線程有獨立的虛擬處理器,同一個進程內的線程有可能會共享虛擬內存。

       

      內核中進程的信息主要保存在task_struct中(include/linux/sched.h)

      進程標識PID和線程標識TID對于同一個進程或線程來說都是相等的。

      Linux中可以用ps命令查看所有進程的信息:

      ps -eo pid,tid,ppid,comm

       

      2. 進程的生命周期

      進程的各個狀態之間的轉化構成了進程的整個生命周期。

      進程生命周期

       

      3. 進程的創建

      Linux中創建進程與其他系統有個主要區別,Linux中創建進程分2步:fork()和exec()。

      fork: 通過拷貝當前進程創建一個子進程

      exec: 讀取可執行文件,將其載入到內存中運行

      創建的流程:

      1. 調用dup_task_struct()為新進程分配內核棧,task_struct等,其中的內容與父進程相同。
      2. check新進程(進程數目是否超出上限等)
      3. 清理新進程的信息(比如PID置0等),使之與父進程區別開。
      4. 新進程狀態置為 TASK_UNINTERRUPTIBLE
      5. 更新task_struct的flags成員。
      6. 調用alloc_pid()為新進程分配一個有效的PID
      7. 根據clone()的參數標志,拷貝或共享相應的信息
      8. 做一些掃尾工作并返回新進程指針

      創建進程的fork()函數實際上最終是調用clone()函數。

      創建線程和進程的步驟一樣,只是最終傳給clone()函數的參數不同。

      比如,通過一個普通的fork來創建進程,相當于:clone(SIGCHLD, 0)

      創建一個和父進程共享地址空間,文件系統資源,文件描述符和信號處理程序的進程,即一個線程:clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0)

      在內核中創建的內核線程與普通的進程之間還有個主要區別在于:內核線程沒有獨立的地址空間,它們只能在內核空間運行。

      這與之前提到的Linux內核是個單內核有關。

       

      4. 進程的終止

      和創建進程一樣,終結一個進程同樣有很多步驟:

       

      子進程上的操作(do_exit)

      1. 設置task_struct中的標識成員設置為PF_EXITING
      2. 調用del_timer_sync()刪除內核定時器, 確保沒有定時器在排隊和運行
      3. 調用exit_mm()釋放進程占用的mm_struct
      4. 調用sem__exit(),使進程離開等待IPC信號的隊列
      5. 調用exit_files()和exit_fs(),釋放進程占用的文件描述符和文件系統資源
      6. 把task_struct的exit_code設置為進程的返回值
      7. 調用exit_notify()向父進程發送信號,并把自己的狀態設為EXIT_ZOMBIE
      8. 切換到新進程繼續執行

      子進程進入EXIT_ZOMBIE之后,雖然永遠不會被調度,關聯的資源也釋放掉了,但是它本身占用的內存還沒有釋放,
      比如創建時分配的內核棧,task_struct結構等。這些由父進程來釋放。

      父進程上的操作(release_task)

      父進程受到子進程發送的exit_notify()信號后,將該子進程的進程描述符和所有進程獨享的資源全部刪除。

      從上面的步驟可以看出,必須要確保每個子進程都有父進程,如果父進程在子進程結束之前就已經結束了會怎么樣呢?

      子進程在調用exit_notify()時已經考慮到了這點。

      如果子進程的父進程已經退出了,那么子進程在退出時,exit_notify()函數會先調用forget_original_parent(),然后再調用find_new_reaper()來尋找新的父進程。

      find_new_reaper()函數先在當前線程組中找一個線程作為父親,如果找不到,就讓init做父進程。(init進程是在linux啟動時就一直存在的)

      posted @ 2012-08-20 17:42  wang_yb  閱讀(15871)  評論(3)    收藏  舉報
      主站蜘蛛池模板: 人妻久久久一区二区三区| 免费AV片在线观看网址| 亚洲高清免费在线观看| 精品久久久久无码| 久久亚洲日本激情战少妇| 国产很色很黄很大爽的视频| 久久日韩精品一区二区五区| 骚虎视频在线观看| 亚洲一区二区国产av| 亚洲中文字幕精品久久久久久动漫| 精品亚洲国产成人av| 国产不卡精品视频男人的天堂| 另类 专区 欧美 制服| 高清性欧美暴力猛交| 欧美激情内射喷水高潮| 亚洲欧洲日韩国内精品| 亚洲成人av一区二区| 日韩内射美女人妻一区二区三区| 亚洲精品一区二区三区综合| 丝袜美腿视频一区二区三区| 色综合国产一区二区三区| 国产精品入口麻豆| 91密桃精品国产91久久| 东京热大乱系列无码| 国产又色又爽又黄的在线观看 | 中国女人大白屁股ass| 国产在线视频精品视频| 亚洲欧美v国产一区二区| 亚洲综合91社区精品福利| 国产精品国三级国产av| 亚洲第一极品精品无码久久| 国内露脸少妇精品视频| 射阳县| 国产精品午夜福利91| 91久久性奴调教国产免费| 成人嫩草研究院久久久精品| 国产亚洲一区二区三区av | 97久久精品人人做人人爽| 亚洲国产无套无码av电影| 茂名市| 亚洲av无码精品蜜桃|