Linux内核源代码:
首先我们需要明确一点,Linux操作系统和操作系统的进程状态是不同的
上图大概标识了各个状态对应在操作系统的状态
普通进程
R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
(interruptible sleep))。
也可称为浅度睡眠,可以被阻塞(中断和杀死)
D磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
也可称为深度睡眠,不可被阻塞(终端和杀死)os也没有这个资格 关机也没用除了切断电源
如果出现这个状态,计算机几乎处于崩溃的边缘
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
可以想象成调试时打断点
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
Z(zombie)-僵尸进程和孤儿进程
Z(zombie)-僵尸进程
什么是僵尸进程?
僵尸进程如何产生?
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
僵尸进程会有什么危害吗?
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,
所以,处于z状态时一直未被回收,就会一直处于z状态,一直占用内存,从而形成内存级的内存泄漏。
可以理解为寄了,但是尸体不能动,因为要调查你为什么寄了,然后给你”收尸“
孤儿进程
什么是孤儿进程?
父进程先退出(没dad了),子进程就称之为“孤儿进程“
孤儿进程该如何处理?
那么”孤儿进程“没有父进程了,他该被如何回收呢?
首先,”孤儿“会被1号进程也就是os领养,1号进程就是它新的父进程(干爹),
然后1号进程就会作为父进程在合适的时候回收”孤儿“
不”领养“会怎么样
不领养就会一直处于僵尸状态,因为没有父进程给它”收尸“,从而造成大量的内存泄漏
优先级
概念
cpu资源分配的先后顺序,就是指进程的优先权(priority)。
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
查看系统进程
使用ps -la即可查看
注意到其中的几个重要信息,有下:
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值(进程优先级修正数据)———>(Linux支持动态优先级调整)
PRI and NI
PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小
进程的优先级别越高
那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
所以,调整进程优先级,在Linux下,就是调整进程nice值
nice其取值范围是-20至19,一共40个级别。
为什么把优先级限定在一定区域内?
os调度时,要让每一个进程都较为均衡的得到调度
否则容易导致优先级低的进程长时间得不到cpu资源——进程饥饿
修改优先级
PRI(新)=PRI(旧)+nice
其中PRI(旧)每次计算时都会重新变为80
例:
70=80-10
再次修改同一个进程的优先级,+10之后:
90=80+10
更改优先级的命令
top
进入top后按“r”–>输入进程PID–>输入nice值
nice/renice也可以修改nice值,可去查阅相关资料
补充概念
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发