在上一講了解了進程的基本知識後,我們再次深入瞭解進程,瞭解殭屍進程,孤兒進程,以及進程的優先級問題
Z(zombie)殭屍進程
子進程退出,父進程還在運行,但是父進程沒有讀取子進程的退出狀態,子進程就進入僵死狀態。僵死進程會以終止狀態保存在進程表中,並且會一直等待父進程讀取退出狀態碼。
在這裏爲了方便理解我們創造一個30秒的殭屍進程
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5 int main()
6 {
7 int ret=fork();
8 if(ret<0)
9 {
10 perror("fork");
11 return 1;
12 }
13 else if(ret==0)
14 {
15 printf(" child:%d is Z ret:%d\n",getpid(),ret);
16 sleep(5);
17 }
18 else
19 {
20 printf("father:%d is sleeping ret :%d\n",getpid(),ret);
21 sleep(30);
22 exit(EXIT_SUCCESS);
23 }
24 return 0;
25 }
我們編譯運行一下
打開監視器,發現父進程處在我們設定的睡眠狀態中,子進程不就處在殭屍狀態下
懂得了殭屍進程,那它有什麼危害呢?
內存資源的浪費!內存泄漏
我們知道進程的退出狀態是要一直被維持下去的以便父進程瞭解子進程的情況,這就出現了一個問題,如果是殭屍狀態,那麼也需要一致被維持,而維護進程就要用數據維護,這屬於進程的基本信息,是要被保存在PCB中的,這就導致我們的PCB一直被佔用,我們又知道PCB是一個數據結構,那麼它就要在內存中開闢一段空間進行存放,如果這段空間始終得不到釋放,甚至隨着殭屍進程的增多,被佔用的空間越來越多,那是不是內存就被浪費!
孤兒進程
父進程先退出,子進程就成了孤兒進程
孤兒進程怎麼辦?不用擔心它會被1號進程init收養,由1號進程進行回收。
同樣,我們製造一個孤兒進程
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5 int main()
6 {
7 int ret=fork();
8 if(ret<0)
9 {
10 perror("fork");
11 return 1;
12 }
13 else if(ret==0)
14 {
15 printf(" this is child:%d ret:%d\n",getpid(),ret);
16 sleep(30);
17 }
18 else
19 {
20 printf("father:%d is exit ret :%d\n",getpid(),ret);
21 sleep(5);
22 exit(0);
23 }
24 return 0;
25 }
編譯執行一下
打開監視器再瞅一眼
進程優先級
在linux下我們敲ps -l會出現下面這些看不懂的數據
我們來分析一下
PID:子進程的代號
PPID:父進程的代號
UID:執行者的身份
PRI:進程可被執行的優先級,這個值越小越被優先執行
NI:進程的nice值,表示進程可被執行的優先級的修正數
那什麼是進程的優先權呢?CPU分配資源的優先順序
優先權高的進程被優先執行,配置進程的優先權對多任務linux系統可以改善系統性能
那麼NI如何理解呢?
我們都知道PRI越小越被優先執行,但是加入NI這個數據就要發生改動。PRI(新)=PRI(舊)+NI
如果NI爲負值,PRI新就變小,那麼它的優先級就被提高,所以調整進程優先級在linux下就是調整nice值
NI的取值範圍爲-20~19,一共40個級別
NI值調整
1.啓動前調整(開始執行程序時就指定nice值):nice -n -5 ./可執行文件
2.調正已存在的進程nice:renice
具體格式爲 renice -5 -p PID
3.用top命令更改已存在的進程nice
具體步驟:top ----> r----->輸入要修改的PID------>修改的NI值
進程的附加屬性
競爭性:系統進程數目衆多,而CPU只有少量,甚至1個,所以進程之間是具有競爭性的,也因此產生了優先級
獨立性:多進程運行需要獨享各種資源,多進程運行期間互不干擾
並行:多個進程在多個CPU下分別、同時進行運行
併發:多個進程在一個CPU下采用進程切換的方式,在一段時間內讓多個進程都得以推進