寫在前面的話,因為只看不思考真的很睏,所以把一些疑惑和重要的地方記下來。
1.程序與執行緒的區別
程序是系統進行資源分配和排程的乙個獨立單位.執行緒是程序的乙個實體,是cpu排程和分派的基本單位。
2.父子程序
共享含有程式**的頁,但是各自擁有獨立的資料拷貝,因此子程序對乙個記憶體單元的修改對父程序是不可見的(反之亦然)。
寫時複製技術允許讀相同的物理頁,只有兩者之中的乙個試圖寫乙個物理頁,核心就把這個頁的內容拷貝到乙個新的物理頁,並把這個新的物理頁分配給正在寫的程序。
3.linux下有3個特殊的程序,idle程序(pid = 0), init程序(pid = 1)和kthreadd(pid = 2)
* idle程序由系統自動建立, 執行在核心態
idle程序其pid=0,其前身是系統建立的第乙個程序,也是唯一乙個沒有通過fork或者kernel_thread產生的程序。完成載入系統後,演變為程序排程、交換
* init程序由idle通過kernel_thread建立,在核心空間完成初始化後, 載入init程式, 並終端使用者空間
由0程序建立,完成系統的初始化. 是系統中所有其它使用者程序的祖先程序
linux中的所有程序都是有init程序建立並執行的。首先linux核心啟動,然後在使用者空間中啟動init程序,再啟動其他系統程序。在系統啟動完成完成後,init將變為守護程序監視系統其他程序。
* kthreadd程序由idle通過kernel_thread建立,並始終執行在核心空間, 負責所有核心執行緒的排程和管理
它的任務就是管理和排程其他核心執行緒kernel_thread, 會迴圈執行乙個kthread的函式,該函式的作用就是執行kthread_create_list全域性鍊錶中維護的kthread, 當我們呼叫kernel_thread建立的核心執行緒會被加入到此鍊錶中,因此所有的核心執行緒都是直接或者間接的以kthreadd為父程序 。
4.孤兒程序
父程序退出,而他的乙個或多個子程序還在執行,那麼子程序將成為孤兒程序。孤兒程序將被init程序(pid=1)所收養,並由init程序對它們完成狀態收集工作。
5.殭屍程序
乙個程序使用fork()建立子程序,如果子程序退出,而父程序並沒有呼叫wait4()或waitpid()獲取子程序的狀態資訊,那麼子程序的程序描述符將仍然儲存在系統中。
6.輕量級程序
兩個輕量級程序基本上可以共享一些資源,如位址空間,開啟的檔案等。只要其中乙個修改共享資源,另乙個就立即檢視這種修改。當兩個執行緒訪問共享資源時就必須同步它們自己。實現多執行緒應用程式的乙個簡單的方式是,把輕量級程序與每個執行緒關聯起來。執行緒之間就可以通過簡單地共享同一記憶體位址空間、同一開啟檔案集等來訪問相同的應用程式資料結構集,同時,每個執行緒都可以由核心獨立排程,以便乙個睡眠的同時另乙個依然是可以執行的。
7.程序切換
a.切換頁全域性目錄以安裝乙個新的位址空間
b.切換核心堆疊和硬體上下文,因為硬體上下文提供了核心執行新建成所需要的所有資訊,包含cpu暫存器。
備註:80*86體系結構,任務狀態段tss存放硬體上下文,linux為系統中每個不同的cpu建立乙個tts。a.當乙個cpu從使用者態切換到核心態時,它就從tss中獲取核心態堆疊的位址.。b.當使用者態程序實體通過in或out指令訪問乙個i/o埠,cpu需要訪問存放在tss中的i/o許可權位圖(permission bitmap)以檢查該程序是否具有訪問埠的權力。
深入理解Linux核心 程序
1 程序的靜態特性 程序 程式執行時的乙個例項 程序描述符 task struct 程序的基本資訊 thread info 指向記憶體區描述符的指標 mm struct 程序相關的tty tty struct 當前目錄 fs struct 指向 檔案描述符的指標 files struct 所接收的訊...
深入理解Linux核心 程序位址空間
給核心分配記憶體和給使用者態程序分配記憶體是有區別的 1 核心的優先順序最高,如果某個核心函式請求動態記憶體,不會被延時 2 核心信任自己,不必保護措施 3 使用者態程序對動態記憶體的請求被認為不是緊迫的,總是被盡量推遲分配 4 使用者程序總是不可信任的 程序的位址空間 1 由允許程序使用的全部線性...
深入理解linux核心第三版(二)程序
程序是程式的執行的乙個例項。從核心的角度看,程序的目的就是擔當分配系統資源 cpu時間片和記憶體 的實體。普通執行緒,指的是,在乙個應用中,有多個執行緒在執行。但是cpu對該應用的排程是以程序為單位進行排程的,這個程序中的多個執行緒不能夠併發的執行。輕量級程序實現多執行緒,情況則不一樣,在cpu分配...