(二)进程的状态优先级
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 code2.5X状态
echo $? 显示最近一个进程的退出信息 0:执行成功 非0:出错
main函数返回值就是父进程/操作系统的执行情况。
2.6Z状态
