1.进程的状态(所有系统)
因为是对于所有系统的,所以描述会很抽象。
补充知识:
并行和并发
- 并行:多个进程再多个cpu下分别同时运行
- 并发:多个进程在一个cpu下采取进程切换的方式,在一段时间内,让多个进程都得以推进,称之为并发
并发详解:
- cpu执行进程代码,不是把进程代码执行完毕再去执行下一个,而是给每个进程分配一个时间片,每个进程每次只被cpu运行一个时间片的时间,进行轮转
- 所以即使是死循环程序,也不会导致所有进程卡掉
- 轮转过程用户感觉不到:因为轮换速度太快, 人类时感受不到的
时间片
-
目的与应用:
- 分时操作系统:旨在提高多个用户的交互体验,通过时间片轮转的方式让多个任务共享CPU资源。适用于一般计算环境,如个人计算机和服务器。
- 实时操作系统:强调在严格的时间限制内完成任务,确保系统能在特定的时间内响应外部事件。适用于嵌入式系统、工业控制、航空航天等领域。
-
任务调度:
- 分时操作系统:采用时间片轮转、优先级调度等方式,任务调度相对灵活,用户等待时间可能不固定。
- 实时操作系统:使用硬实时或软实时调度策略,确保任务在预定的时间内完成,时间敏感性高
进程具有独立性
进程间互不干扰
等待
阻塞
当cpu遇到scanf但键盘还未输入数据时,系统会把runqueque中的对应struct_task剥离下来,链接到键盘对应的device中的task_struct* wait_queue中进行等待。这叫做阻塞,task_struct从等待cpu到等待硬件设备
从键盘得到数据后,从wait_queue剥离task_struct剥离,将其状态由阻塞改为运行。并入队cpu的runqueue
task_struck等呆cpu的叫做运行,等硬件设备的叫做阻塞
运行&阻塞状态本质是让不同进程处在不同队列中
运行
该进程在cpu运行队列中,就叫做运行状态
挂起
当内存不足时,系统会挂起
挂起是时间换空间的操作
换入换出本质是I/O,会导致很慢,所以一般企业服务器会禁掉swap分区
阻塞时挂起:
当阻塞状态时,系统会把其对应数据从内存换出到磁盘,当其又运行时,系统再将其从磁盘换入到内存
磁盘中有专门swap分区,存储换入数据
运行时挂起:
运行程序过多时,系统甚至可能把runqueue队尾数据换入到磁盘
如果内存占用过多,且挂起也无法缓解,系统会kill进程保护自己
tips
CPU切换和运行的速度非常快,用户感觉不到
runqueque同一管理运行中的进程,其中节点同task_struct。cpu会运行runqueque中task_struct
进程过多导致卡顿:每次调度时间变长到人能感觉到的程度
2.linux进程状态
以具体操作系统为例可以更通俗易懂理解进程状态
各种进程状态(R S D T t X Z)
R 正在运行
S即阻塞/休眠状态
可中断睡眠,浅睡眠
D 也是阻塞/休眠状态 disk sleep
不可中断睡眠,深度睡眠
防止与磁盘I/O时,I/O失败但进程被kill导致不能处理失败,最终数据缺失
所以D状态禁止系统kill与disk有关的sleep进程
T:stopped暂停
t:trace stopped暂停,比如调试遇到断点时,被调试进程所处状态即为t
X:dead死亡状态
Z:zombie僵尸状态
状态后的+
前台进程
后台进程
tips
进程结束时要先进入Z,后进入X状态。Z状态时确认退出原因,程序结束是否正常
程序退出状态
进程结束情况相当于main函数中的return 0,可以表明进程的执行结果是否正确。进程是否正常退出
$?
$? linux中的特殊符号,代表上一个结束进程结束情况,0为正常退出
阻碍状态
循环I/O时,大部分时间是S状态,因为I/O耗时太长,很少时间是R状态
后台&前台
运行时加上空格&可转后台运行, 对应STAT没有+号
比如下载时不想看下载动画,可以把它放在后台
后台进程不能ctrl c杀死,只能kill -9
kill命令
kill -l 列出各信号
kill -19
kill -18
kill -9