first courses
1、進程是資源封裝的最小單位,線程是任務調度的最小單位
進程封裝的資源主要有:進程ID、mm_struct(內存管理相關結構)、文件系統結構(當前用戶,當前目錄等)、文件相關結構(全部 打開的文件描述符)、信號相關結構(進程使用的信號以及對應的信號處理函數)。
2、進程ID的數量是有限的,通常默認爲32768,所以通過這個弊端,可以使用進程炸彈直接幹掉整個系統-- :(){ : | : & }; :
3、哈希表用於檢索是最快的,所以linux內核把task_struct不僅串到鏈表上,還放到樹結構(方便pstree查看)上和哈希表上
4、內存泄漏是指隨着task運行的時間越久,耗費的內存就越多,造成內存泄漏的原因是分配和釋放不成對
5、父進程可以使用WIFEXITED、WIFSIGNALED、WIFSTOPPED等宏函數來獲取子進程的退出狀態,是被信號殺死還是其他原因
6、觀察程序是否內存泄漏:多個時間點觀察程序的內存佔用情況,如果是持續增多,就是內存泄漏;或者持續觀察USS來確定
7、cpulimit命令就是利用作業控制的STOP和CONTINUE信號,來控制CPU的佔用率,比如cpulimit -l 20 -p 3320,限制3320任務的最大CPU佔用率爲20%
8、子進程和父進程哪個優先運行可以配置。默認不確定
second courses
1、fork、vfork、pthread_creat之間的區別主要在於分裂實時對task_struct的操作。fork是直接對拷,並且做寫時拷貝(寫時拷貝需要mmu支持);vfork是除內存管理結構其它內容全部對拷,內存相關結構則使用指針直接指向父進程的mm結構,且vfork的特點是,父進程創建子進程後進入睡眠,直到子進程exited或者執行exec,所以子進程在退出或exec新代碼段前對變量或內存的全部操作都會直接改變父進程的相關變量和內存資源;pthread_creat完全不進行拷貝動作,直接把task_struct的相關成員指向父進程的成員,所以子線程的特點是共享進程資源,對各個變量或者內存的全部操作都會直接改變父進程的相關資源,這時就要考慮線程安全的問題。以下爲三張對比圖:
third courses
1、高吞吐必然會造成慢響應,快速響應必然會降低吞吐。進程切換本身耗費的CPU時間基本可以忽略不計,但頻繁的進程切換造成的cache miss會消耗大量的CPU時間。
2、IO消耗性任務對CPU的性能並不敏感,對及時被調度到比較敏感;CPU消耗型任務對CPU的性能比較敏感,但對及時被調度到並不敏感。
3、進程優先級被劃分爲0到139,其中0到99位實時優先級,100到139位普通優先級。
4、實時任務分爲兩種,SCHED_FIFO高優先級搶佔低優先級,同等優先級先進先出;SCHED_RR高優先級搶佔低優先級,同等優先級任務間輪轉。兩種都是高優先級跑到睡眠或退出,低優先級纔有機會運行。
5、2.6之前版本內核,採用動態獎懲方式實現內核的調度策略。睡得多的線程獎勵,跑的多的線程懲罰,對他們的初始nice值進行正負的動態調整。採用這種調度策略可以照顧到IO消耗型任務,保證了系統的低延遲。
6、從2.6版本內核開始,採用CFS調度策略,體現普通進程的nice特性。虛擬運行時間小的任務優先運行,虛擬運行時間的公式爲:vruntime += delta* NICE_0_LOAD/se.weight
delta:爲進程增加的實際運行時間
NICE_0_LOAD是nice爲0時的權重
7、chrt命令可以設置任務的實時優先級和實時策略(RR或者FIFO)。該命令可對普通任務使用,使用後普通任務會變成配置的實時任務。
8、renice和nice命令可以設置普通任務的nice值
4th courses
1、多核系統,cpu會根據當前的狀態,從其他CPU pull任務過來,也會push本核任務到其他CPU
2、taskset命令可以設置某個任務或整個進程組(多線程)的affinity屬性
3、中斷和軟中斷都可以通過sysfs下的對應屬性設置中斷處理函數和軟中斷處理函數的affinity特性
4、cgroup可以實現進程組之間的CPU劃分
5、linux不可搶佔的區域有:中斷上下文,軟中斷上下文,spin_lock鎖住的臨界區域
6、打了PREEMPT_RT補丁的linux:中斷和軟中斷都被線程化,只保留一句話的中斷處理函數,其他大部分內容在進程上下文被執行,同時自旋鎖退化爲互斥鎖。