(二)进程的状态优先级

📅 2026/7/11 20:32:17 👁️ 阅读次数 📝 编程学习
(二)进程的状态优先级

1进程的状态(兼容所有操作系统)

1.1并行和并发

CPU执行进程代码,不是把进程代码执行完毕,才开始执行下一个
而是给每一个进程预分配一个 时间片,基于时间片,进行调度轮转(单CPU下),并发。

并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行

1.2时间片

Linux/windows民用级别的操作系统,分时操作系统。-----调度任务追求公平

对应的实时操作系统,会有优先级,比如汽车的刹车。

1.3进程具有独立性(讲过了)

1.4等待的本质

1.4.1 运行状态

FIFO:先进先出。头结点的进程进入CPU运行一段时间,然后尾插到队列后,然后进入下一个进程,循环往复。

只要进程在运行队列中,该进程就叫做运行状态(我已经准备好了,随时被CPU调度)

1.4.2 阻塞状态

运行:进程等CPU。

阻塞:进程等待键盘等其他硬件。(运行和阻塞是两个队列)

运行和阻塞的本质:是让不同的进程,处在不同的队列中。

操作系统是硬件管理者,知道硬件有无数据。

执行完scanf,进程从运行到阻塞,输完数据,操作系统知道后,将进程从阻塞到运行。(将进程尾插到不同队列)

1.4.3挂起状态

背景:内存资源严重不足的情况下

1.状态:在tast_struct中通过status表示,比如1表示运行,2表示阻塞等等

2.内存资源不足时,占了内存资源且处于排队阻塞状态的进程会被换出唤入到swap分区(磁盘内),让其处于阻塞挂起状态。

3.换出:从内存到磁盘是IO,速度慢,用时间换空间,一般会被禁掉。如果swap分区不够,操作系统会杀死部分进程。

4.运行挂起:将运行状态的进程挂起。有风险,一般不会这么做。

2.Linux进程的状态

2.1 运行状态、阻塞状态

R:运行状态

S:休眠状态---阻塞等待的状态-----可中断睡眠,浅睡眠(就是将阻塞的进程可以直接kill掉)

ps axj | head -1 && ps axj | grep code code是可执行程序名字

while(1) { printf("hello world\n"); //该代码运行时,99%是S状态,阻塞状态,因为printf属于向IO相互 //速度会变慢 } while(1) { //100%是运行状态 }

2.2磁盘休眠----D

阻塞等待的状态的一种------不可中断睡眠,深度睡眠

当一个进程内存向磁盘写入大量数据时,磁盘本身比较慢,所以存入需要时间。假设内存那个进程名字叫A,A从内存到磁盘过程中(1.队列发生变化 ----CPU到磁盘 2.状态从R到S)。这是会有两种坏情况1:内存不够用,操作系统把进程A杀死了, 2:磁盘满了,存不下去,需要返回错误值给进程A,让上层知晓该情况,但是进程A不存在了。

为了解决以上情况,D状态出现了,深度睡眠,不可被杀掉

2.3T状态(了解)

kill - 19 PID :暂停进程,使其状态为T

kill -18 PID :重新开始暂停进程。放入到后台执行,无法用Ctril+C操作终止

需要用kill -9 PID终止。

前台进程和后台进程区别:

./code当执行这个指令,该可执行程序开始运行,往屏幕打印东西,这时往屏幕写入指令是无效的。

./code &让该进程处于后台进程,该可执行程序开始运行,往屏幕打印东西,这时往屏幕写入指令是有效的。

有些下载等操作,不想让它阻塞命令行,就让它去后台执行

2.4 t状态

当进程被追踪的时候(被调试程序的进程),断点停下,进程状态就是t。常见于gdp调试代码打断点时。

while :;do ps axj | head -1 && ps axj | grep code|grep -v grep;sleep 1;done
生成一个监视的功能

makefile文件

code:code.c gcc -o $@ $^ -g //这个g表示生成gdb文件,用于调试 .PHONY:clean clean: rm -f code

2.5X状态

echo $? 显示最近一个进程的退出信息 0:执行成功 非0:出错

main函数返回值就是父进程/操作系统的执行情况。

2.6Z状态