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;

在运行中,查看进程的状态:





猜你喜欢

转载自blog.csdn.net/weixin_39294633/article/details/80231033