Linux进程
- 1. 前言
- 2. 操作系统中进程的运行状态
- 3. 操作系统中进程的阻塞状态
- 4. 操作系统中进程的挂起状态
- 5. Linux下特定的进程状态
- 6. 前台进程和后台进程的区别
- 7. 休眠状态和磁盘休眠状态
- 8. 总结以及拓展
1. 前言
很明显,进程状态的本质就是进程
PCB结构体中的一个变量,它可能
是用宏定义来实现的,也可能是其他方式
#define NEW 1
#define RUNNING 2
#define BLOCK 3
strcut PCB
{
...其他信息
int state;//进程状态
}
if(PCB->state==NEW)
{将进程放入运行队列}
else if(PCB->state==BLOCK)
{将进程放入阻塞队列}
......
本章重点:
Linux中常见的六种状态:
还有一种状态就是z状态(僵尸状态)
2. 操作系统中进程的运行状态
只要一个进程在运行队列中,它就是运行状态
不管一个进程是否正在被处理,只要它在
运行队列中,那么它就是处于运行状态!
3. 操作系统中进程的阻塞状态
我先来描述一下进程会阻塞的情况:
最简单的例子,当代码出现scanf
或者cin时,系统会等待用户输入,只要
不输入
,要访问的资源就没有就绪
此时代码就无法运行!
此时进程就处于阻塞状态了吗?
对!但是不完全对!
我想给大家阐述的更细致一点
将一个进程从运行队列移动至设备
的等待队列中,再将状态改为阻塞
此时这个进程就处于阻塞状态
4. 操作系统中进程的挂起状态
想象一下以下情况
答案是,因为此时进程处于阻塞
状态,并且内存已严重不足,所以
OS会将PCB对应的数据和代码
弄到磁盘,为内存腾出一部分空间
此时,进程就被挂起了!
注意,将内存数据换到外设上
这一操作是针对所有阻塞进程的
不用担心与外设频繁交互会降低
操作系统的效率,因为此时要关心
的是操作系统还能不能存活下去!
注意,swap分区是磁盘中真实存在的
它的大小往往是很小的,这个部分专门
用于内存严重不足时和内存进行交互
并且当内存情况缓解后,曾经被置换
出去的代码和数据又会重新加载进来!
5. Linux下特定的进程状态
先来看看我在库中找的状态的定义:
今天的主角是R和S状态
先来写一段程序来看看效果:
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
sleep(1);
printf("hello hdu\n");
}
return 0;
}
运行此程序后查看进程状态:
按照常理来说,一个正在运行的程序
应该是处于R状态的,但是这个程序
为什么处于S状态呢(+号先不管,后面会讲)
6. 前台进程和后台进程的区别
我先给出概念再来解释:
-
前台进程:
运行时无法使用bash外壳的指令
并且可以被CTRL C强制终止掉 -
后台进程:
运行时可输入指令,不能被CTRL C掉
只能使用kill指令来杀掉进程.
将程序变成后台程序:
先来对比观察一下前后台进程:
前台进程和后台进程区别
7. 休眠状态和磁盘休眠状态
细心的同学可能已经发现了
这几种状态中有两个很相似的状态:
S被称为浅度睡眠
D被称为深度睡眠
想象一下下面的这种情况:
所以我们得出一个重要的结论:
S(sleeping):
浅度休眠,浅度睡眠,可以被终止D(disk sleep):
深度休眠,为了防止向磁盘写入
重要资源时被杀掉而专门创建的一个分类!
8. 总结以及拓展
了解Linux中进程的分类可以更进一步
的了解进程在操作系统中的运行关系
所以进程状态是学习进程中必不可少的
一课!我们和进程的故事还远远没有结束!
拓展阅读:什么是僵尸进程?
什么是僵尸进程