對於乙個程序,基本概念我覺得就是乙個資源分配單位。對於每乙個程序都有對應的pcb(程序控制塊),在linux下的pcb是task_struct。 對於task_struct,一開始我看原始碼的時候也是非常痛苦,看了這忘了那,一直都模模糊糊。所以總結之後,覺得得需要根據乙個程序,需要有什麼東西,大概就能有個印象了。對於乙個程序,首先需要的就是他的記憶體,所以有個指mm的指標,對於乙個程序,還必須要有相關的訊號處理,所以又有乙個指標指向signal,類似的還有fs,files之類的指標,而一些細微的小碎塊,則到用到的時候再去檢視。...
那對於乙個程序,首先就是一副程序生命週期圖。
就緒態->執行態->等待態 暫停 , 僵死。
對於殭屍程序,相關的記憶體已經釋放,就是他已經死亡,但是父程序沒有對他呼叫wait,wait4 (wait函式裡面可以看到子程序被什麼殺死的)。那殭屍程序會有什麼危害呢,看上去好像是沒什麼危害,畢竟記憶體也都釋放了,沒有佔著什麼資源不放(即無記憶體洩漏)。但是過多的殭屍程序會占用過多的pid號,導致無法產生新的程序。對於這個上限是多少,可以查的到。
命令 : cat /proc/sys/kernel/pid_max -> 32768.
我這裡呼叫waitpid,可以清楚的看到wait是可以看到子程序被什麼訊號殺死的。
int main(void)
else if (pid==0) else
if (wifexited(status))
printf("child process exites, status=%d\n", wexitstatus(status));
if(wifsignaled(status))
printf("child process is killed by signal %d\n", wtermsig(status));
if (wifstopped(status))
printf("child process is stopped by signal %d\n", wstopsig(status));
if (wifcontinued(status))
printf("child process resume running....\n");
} while (!wifexited(status) && !wifsignaled(status));
exit(0);
}}
對於乙個程序,fork出來後,他首先處於就緒態。等待到他拿到cpu開始執行的時候,他就進入了執行態。那什麼時候他又會從執行態變成等待態和就緒態呢?有2,1為時間片用完了,否則就是被搶占了。那對於程序什麼時候進入等待態? 很自然,你在執行的時候,如果是為了等待某個事件的發生,或者說是等待獲取某種資源,那你這段時間其實除了等之外啥也做不了,那豈不是很浪費。。。所以他就會進入乙個等待狀態,等待到我的資源了,那我才被喚醒。那到這裡,等待又分為兩種情況,一種是interruptible,另一種是uninterruptible.字面上就很容易理解,乙個是可被打擾,另一種是不可被打擾。那什麼是可被打擾呢,就是你給我乙個訊號我就會被打擾,不管我等沒等到資源。不可被打擾就是,我只有等到了我想要的資源,我才可以被喚醒,訊號對我來說不起作用。
那我都能暫停乙個程序,然後又讓他執行了,那我自然很容易的可以操控乙個程序的cpu佔用率了。//一段時間內暫停和執行的比率來操控 這裡有乙個cpulimit的命令 可以達到這個效果。
這裡cpul的%cpu為93.4
這時候變成了20左右。
Linux 程序生命週期
本文參考了 深入linux核心架構 linux作業系統屬於多工作業系統,系統中的每個程序能夠分時復用cpu時間片,通過有效的程序排程策略實現多工並行執行。而程序在被cpu排程執行,等待cpu資源分配以及等待外部事件時會屬於不同的狀態。下圖描述了程序之間的狀態關係 程序的三種基本狀態 執行 該程序此刻...
執行緒和程序生命週期
執行緒和程序生命週期 幾種狀態 執行緒的狀態以及狀態之間的相互轉換 1 新建狀態 new 新建立了乙個執行緒物件。2 就緒狀態 runnable 執行緒物件建立後,其他執行緒呼叫了該物件的start 方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權。3 執行狀態 runn...
React 生命週期 生命週期方法
生命週期 掛載 更新 解除安裝 元件被建立 執行初始化 並被掛載到dom中,完成元件的第一次渲染 constructor props getderivedstatefromprops props,state render componentdidmount 元件被建立時會首先呼叫元件的構造方法,接受...