1. 程式人生 > >Linux作業系統中程序的七種狀態

Linux作業系統中程序的七種狀態

1 Linux中程序的七種狀態(1)R執行狀態(runing):並不意味著程序一定在執行中,也可以在執行佇列裡;(2)S睡眠狀態(sleeping):程序在等待事件完成;(淺度睡眠,可以被喚醒)(3)D磁碟睡眠狀態(Disk sleep):不可中斷睡眠(深度睡眠,不可以被喚醒,通常在磁碟寫入時發生)(4)T停止狀態(stopped):可以通過傳送SIGSTOP訊號給程序來停止程序,可以傳送SIGCONT訊號讓程序繼續執行(5)X死亡狀態(dead):該狀態是返回狀態,在任務列表中看不到;(6)Z殭屍狀態(zombie):子程序退出,父程序還在執行,但是父程序沒有讀到子程序的退出狀態,子程序進入殭屍狀態;
(7)t追蹤停止狀態(trancing stop)2 R執行狀態  當我們讓一個程式在執行中(比如:建立一個死迴圈,輸出一條語句),那麼該程序一定是R狀態3 S睡眠狀態 顯然,當我們讓一個程式執行sleep程式碼,該程序此時一定是S狀態殭屍狀態殭屍狀態是指:當子程序退出,並且父程序沒有讀到子程序的退出碼,子程序的狀態會變為殭屍狀態(Z)。通常來說就是,子程序退出,父程序還在執行,但父程序沒有讀取子程序的狀態,子程序會變為殭屍態。我們先簡單建立一個殭屍程序:讓子程序sleep後直接exit,父程序一直在迴圈中。
1 #include <stdio.h>
2 #include <unistd.h> 
3 #include <stdlib.h>
4 #include <sys/types.h>
5
6 int main()
7 {
8     pid_t id = fork();
9     if(id == 0)//child
10     {
11         printf("child do something... ,pid:%d,ppid:%d\n",getpid(),getppid());
12         sleep(10);
13         exit(1);//退出該程序
14     }
15
16     else if(id > 0)//father
17     {
18         while(1)
19         {
20             printf("father do something... ,pid:%d,ppid:%d\n",getpid(),getppid());
21             sleep(1);
22         }
23     }
24
25     else
26     {
27         perror("fork");
28     }
29      return 0;
30 }
在執行中,檢視程序狀態:殭屍程序的危害:  1 上面說到殭屍程序是由於父程序沒有讀取到子程序的退出資訊而產生的,那麼我們是不是就可以理解為父程序一直以為處於殭屍狀態的子程序是沒有退出的。而程序是需要維護的,殭屍程序就會一直需要PCB對其進行維護浪費記憶體資源。如果殭屍程序一直沒有退出,就會一直佔用這塊記憶體,就會導致記憶體資源的浪費;記憶體洩漏殭屍程序一直佔用資源,但是卻不使用,就可能會導致記憶體洩漏。5 孤兒程序孤兒程序是指:父程序先退出,子程序變為“孤兒程序”父程序先退出,子程序後退出,由於父程序已經退出讀取不到子程序的退出資訊,子程序變為Z(殭屍)狀態,隨後子程序被1號程序Init“領養”,即子程序的父程序變為1號程序。
我們先簡單建立一個孤兒程序:讓子程序一直迴圈,父程序在sleep3秒後退出。
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5
6 int main()
7 {
8
9     pid_t id = fork();
10     if(id == 0)//child
11     {
12         while(1)
13         {
14             printf("child do something... ,pid:%d,ppid:%d\n",getpid(),getppid());
15             sleep(1);
16         }
17     }
18
19     else if(id > 0)//father
20     {
21         printf("father do something... ,pid:%d,ppid:%d\n",getpid(),getppid());
22         sleep(3);
23         exit(1);
24     }
25
26     else
27     {
28         perror("fork");
29     }
30      return 0;

在執行中,檢視程序的狀態: