(。・∀・)ノ゙嗨!你好这里是ky233的主页ky233_-CSDN博客Linux初识进程,C++类和对象中,C++类和对象上篇
https://blog.csdn.net/ky233?type=blog
点个关注不迷路⌯'▾'⌯
目录
一、新建
按字面理解,描述的是进程刚被创建出来,也就刚刚具备进程的数据结构,没有入队列,在Linux内核中没有这个状态
二、运行状态
- 这里要注意,运行状态并不是cpu正在执行代码!
因为有了进程的task_struct的存在,所以每个进程的task_struct在运行队列中排队,这就叫做运行状态!!
三、阻塞状态
阻塞这个词,在生活中我们一般都会联想到堵车了,这也是百度百科对这个词的配图
出口就这么几个,车却很多,所以自然而然的就阻塞了,那么放到进程中也是一样的,因为求大于供。
假设我们的很多进程都需要申请空间,但是我们的磁盘运行速度也很慢,所以,我们的操作系统就会把他放到另一个等待资源就绪的队列里,这时我们的cpu会先为那些准备好的进程运行,此时这个队列就叫做阻塞队列。此时这个进程的状态就叫做阻塞状态。
- 总结:等待非cpu资源到位,这时进程的状态就叫做阻塞状态。
int main()
{
int i = 0;
scanf("%d",&i);//我就是不输入!!
printf("%d\n".i);
return 0;
}
这时,我们就是不输入,那么我们这个进程就处于阻塞状态!
四、挂起状态
对于这个状态呢,其实就是因为我们的内存是有大小的,不是无穷尽大的,如果同一时间进程太多了,内存快满了,那么操作系统就会先让某些长时间不执行的进程,将他的代码和数据放到磁盘中,而PCB还在内存中,这就叫做挂起状态!
- 总结:当内存不足时,通过适当的置换进程的代码和数据到磁盘中,进程的状态就叫做挂起!
那么什么叫做挂起阻塞状态呢?
这就是在等待资源就绪的时候正好内存不足了这时就叫做挂起阻塞状态
五、进程状态
- 状态后面带+就表示前台进程。
- 表示这个时候输入命令就没啥效果了,而且可以被Ctrl+c终止的
1.运行R
1 #include<stdio.h>
2 int main()
3 {
4 while(1)
5 {
6
7 printf("hello Linux\n");
8 }
9 return 0;
10 }
我们直接进行一个死循环打印的代码,来观察我们的程序是否是运行状态。
可以看到,这其中有我们想要的R状态,但是为什么第一个是S(睡眠)状态呢?
原因是什么?是因为我们的cpu运行速度非常的快,虽然我们可能认为很复杂,但是在cpu看来可能就是几纳秒的事情,而显示器又属于外设,速度有相对于cpu很慢,这个时候我们的程序就是阻塞状态,所以我们可以发现我们的绝大部分状态都是S状态。
第二个就是R状态,这个时候就是我们的程序在运行队列或者正在被cpu运行。
- 对应的是运行状态
2.睡眠S
刚才我们已经见识到了睡眠状态,那么我也来写个程序让他一直处于睡眠状态吧
int main()
{
int i = 0;
scanf("%d",&i);//我就是不输入!!
printf("%d\n".i);
return 0;
}
这个时候大家来看是不是就全都是睡眠状态了,因为我并没有输入,所以OS就将咱们的程序放到阻塞队列了。
- 对应的是阻塞状态。
我们这里的S状态是可中断的
3.休眠D
- 与S状态类似
- 只不过是深度睡眠状态
- 是不可以被唤醒的
那么我们的D状态与S状态有什么区别呢?
D状态的睡眠是不可中断的,操作系统和kill -9都无法关掉它,只能等待他拿到资源了,结束阻塞了,才会停止D状态。当然哈,直接强制关机也行,物理方法依旧能打!❤❤❤❤❤
4.暂停T
- 没错一个进程是可以被暂停的!!
-
首先,我们先获取到一个进程的pid,然后对他使用kill -19 pid
-
这个进程就变成了暂停状态
-
用kill -18 pid,这个进程就继续运行了,但是是在后台运行,这是只能使用kill -9 pid命令了。
-
在gdb中调试时,打断点实际上就是让进程在指定行暂停运行,此时这个进程就处于T状。
5. 死亡X
死亡状态顾名思义就是这个进程关闭了,我们很难观测到,因为cpu的运行速度实在是太快了。
- 这意味着我们的资源可以被回收了
6.僵尸进程Z
1.僵尸进程是什么呢?
这是一种特殊的状态,是一个进程已经退出,但是还不允许OS释放,处于一个被检测的状态,这就叫做僵尸状态。
2.为什么维持僵尸进程呢?
- 是为了让我们的父进程或操作系统来进行回收
下面我慢来做个演示
1 #include<stdio.h>
2 #include <stdlib.h>
3 int main()
4 {
5
14 pid_t id = fork();
15 if(id == 0)
16 {
17 while(1)
18 {
E> 19 printf("子进程,pid:%d,ppid:%d\n",getpid(),getppid());
E> 20 sleep(3);
21 break;
22 }
23 exit(0);
24 }
25 else
26 {
27 while(1)
28 {
E> 29 printf("父进程,pid:%d,ppid:%d\n",getpid(),getppid());
E> 30 sleep(1);
31 }
32 }
33 return 0;
34 }
由上述代码我们可以知道,子进程在运行一次之后等待3秒直接退出,父进程一直在运行。
- defunct:失效的
- 那么此时这个子进程的状态就叫做僵尸状态。
- 也就是他的代码和数据可以被释放,而PCB还在的。
- 如果长时间不释放,那么就会造成内存泄漏
3.那么僵尸进程怎么回收呢?
六、 孤儿进程
1.什么是孤儿进程呢?
简单的来说就是父进程被终止了,子进程还没退出呢,那么此时子进程就叫做孤儿进程!
- 我们可以看到当父进程提前退出之后,我们的子进程会被系统的1号进程领养
2.为什么要被领养?
未来当子进程退出的时候父进程早就自己退出了,但是我们的子进程需要退出,所以就由1号进程来完成这个事情 !