Linux:进程调度
文章目录
- 进程优先级
- 进程的一些补充
- 进程切换
进程优先级
是进程得到CPU资源先后的顺序。
因为目标资源稀缺,所以进程得到CPU要排队。
优先级不是权限,能得到,但是顺序不一样
优先级也是PCB里的一个数字,一般值越低,优先级越高。
当代计算机都是基于时间片的时分操作系统。
必须考虑公平性。
展现优先级信息
那么系统怎么指定我访问文件时,是拥有者,所属组,还是other呢?
拿进程和文件的uid比较就可以确定拥有者,所有者,所属组。
pri是进程优先级
ni是nice值
进程真实优先级是pri+ni
改优先级
top之后+r
输入pid之后可以输入nice值
注意:每次修改都是基于默认值+修改后的nice值。
nice和renice也可以调整nice值。
优先级的极值问题
nice[-20,19]默认优先级80
所以Linux优先级范围是[60,99],因为要考虑公平性,所以调整范围太大。
进程的一些补充
竞争性: 系统进程数⽬众多,⽽CPU资源只有少量,甚⾄1个,所以进程之间是具有竞争属性的。为
了⾼效完成任务,更合理竞争相关资源,便具有了优先级
• 独⽴性: 多进程运⾏,需要独享各种资源,多进程运⾏期间互不⼲扰
• 并⾏: 多个进程在多个CPU下分别,同时进⾏运⾏,这称之为并⾏
• 并发: 多个进程在⼀个CPU下采⽤进程切换的⽅式,在⼀段时间之内,让多个进程都得以推进,称之为并发
单cpu单核只能一个一个cpu,一个进程
多核可以多个进程,
操作系统服务器有的有多个cpu,两个cpu同时运行就叫并行
我们的电脑起始只执行一个进程,但是cpu切换太快了,可以多个进程来回切换。
进程切换
了解了并发,那么我们如何进行并发呢,这里cpu如何快速切换?
一个进程占有cpu,不会跑完所有代码,只要占用cpu,操作系统会分配一个时间片的东西。比如一个进程跑一毫秒,如果没跑完就到队列里重新排队。
这样一个进程不会一直占用cpu,所以死循环进程不会一直占用系统。
这里寄存器是保存正在运行进程的临时数据
这一寄存器就是cpu内部的临时空间
寄存器不等于寄存器内部的数据
寄存器是空间不是内容,空间只有一份,内容可以变,有多份。
这里的方框就是寄存器,存的都是临时数据。
由于时间片的原因,当进程A切走的时候我们要把寄存器的数据拷贝出来。
然后进程到队列的结尾。依次类推。
进程A切回来的时候还要把数据恢复回来,这样在下一个时间片内,进程A就可以从上次位置继续执行了。
那这些数据保存到哪里呢?
可以理解为把这些临时数据保存到task_struck里。
这里有TSS:任务状态段,保存数据
系统内存在 struct task_struct * current 指针,实时指向现在运行的进程。
每个cpu都有一个运行队列,runqueque,多个cpu就有多个。
操作系统是分为分时操作系统,基于时间片公平调度
实时操作系统,来了一个进程要立马调度完,这里工业重要领域最多
我们在电脑里基本上分时操作系统最多。
我们在数组里规定优先级的时候前100个是别的操作系统的优先级
后40个是分时操作系统,这里的40个下标正好映射实时操作系统的优先级
这里queque本质是hash表,算法用hash算法
bitmap是无符号整数
这里5个整数类型,5*32=160,能覆盖所有40位置的优先级0没有内容,1有内容
1要挑队列,2要挑进程,
这里*active指向活跃的进程
active队列里执行完后链入expired队列里,
active执行完后,swap(&active,&expired)再执行active 队列,这里有两个runqueque
新进程来了放入expired队列里,就相当于就绪
实时操作系统的内核抢占,立刻放入active队列里。
双cpu时有负载,一个挂50个进程,另一个如果少,查最低的负载cpu,新进程来了放入负载低的cpu内