操作系统如何实现多进程切换

一个cpu一次只能执行一个进程(多核cpu除外),而目前我们的电脑能够同时运行多个程序,则是依赖于操作系统控制cpu在多个进程之间不断切换,以达到多个程序能够同时运行,那么他是如何实现的呢?

首先,我们要了解cpu是如何执行代码的,cpu只能根据寄存器(通常是ip寄存器中保存的是需要执行机器码的地址,寄存器也可以保存其他各种信息,包括栈顶地址,计算时的过程数据等等)中的内存地址去执行该地址的机器码,而高等语言通常由编译器编译为可执行文件,而可执行文件内部就包含机器码,但cpu无法直接执行可执行文件中的机器码,因为可执行文件中不仅含有机器指令,还含有程序入口,和数据等,这些都需要操作系统辅助,控制cpu来执行,这就是一个程序的执行,而执行的程序就叫做一个进程。

那么进程之间到底如何切换呢,想要了解这个东西,我们还需要知道cpu的行为通常由寄存器控制,而操作系统控制cpu也是通过改变寄存器来控制cpu,比如说esp寄存器(保存当前执行栈栈顶地址),ip寄存器(保存当前要执行机器码的地址),通用寄存器,浮点寄存器等等等等,总之当前cpu的行为取决于其寄存器内部的值(cpu的行为也会影响寄存器内部的值),而我们需要切换进程,并且保存当前进程的执行状态,以保证下次切换回此进程依然能够继续上次的执行进度继续执行,都需要对寄存器的内容进行改变(执行其他进程)或者保存(保存本次进程执行进度),所以我们对进程就有一个大概的了解了,他其实就是通过该改变寄存器信息,来控制cpu执行其他进程,并且保存寄存器信息使下一次cpu执行此进程时能够继续上次进度执行。那么操作系统具体如何实现的呢

当操作系统切换进程时(具体什么时候需要切断下面会说),操作系统会使用调度器来完成进程切换,调度器首先会将寄存器信息通过汇编的push指令将其推入到内核栈(每个进程都有自己的内核栈,不要认为只有一个内核就只有一个内核栈,内核栈和用户栈都是和进程一一对应的)中以保证所有信息被保存,在由操作系统将内核栈中的寄存器信息保存在进程控制块(PCB)中,然后通过调度算法找到下一个执行的进程,然后将该进程的进程控制块中的寄存器信息恢复到寄存器中,以此来实现进程切换。

那为什么他要多次一举呢,直接将寄存器信息保存进PCB不就好了吗?

想要获取寄存器信息必须通过汇编代码,而如果直接储存在PCB中则需要拿到PCB指针进行汇编语言修改内存的操作,而PCB结构由操作系统确定,这样可移植性会很差,并且使用大量汇编语言操作内存,也更容易出错,而如果先推入内核栈,接下来只需要获取esp寄存器的指针,通过移位操作便可以获取所有信息,之后就可以用用c语言修改PCB。

那么调度算法具体是如何判断何时该切换进程呢?调度算法有多种,我来一一讲解。

1.普通队列

这种就没什么特别之处,就是哪个进程先来就执行哪个,执行完就执行下一个,毫无优点

2.短任务优先

短任务优先就是当一个进程执行完后,会挑选一个最短的进程继续执行,但缺点也足够明显,一个进程需要等待其他进程执行完才能得到执行,响应时间过长,并且如果有个长任务正在执行,短任务需要等待长任务执行完,再次选择进程时,才能优先执行

3.抢占式短任务优先

在短任务的基础上加上抢占机制,也就是不等长任务执行完,只要有短任务,就优先执行短任务,但响应时间依旧没有缩短

4.优先级调度

根据程序员设置的进程优先级顺序进行进程切换执行,响应时间过长的问题依旧存在

5.多级队列

根据进程类型不同分配到多个队列当中,每个队列根据不同的类型实行不同的调度算法,缺点也显而易见,如果同一类型的进程过多,那么就会导致一个队列任务过多而其他队列却没有事情做。

6.时间片轮转

首先为了解决进程响应时间过长的问题,时间片成了最好的解决方式,把一个进程分成若干个时间片,每次只执行一个时间片,这样一个进程就不需要等待另一个进程完全执行完在执行,大大提高了进程的响应时间,但是时间分片又对短进程不太友好,本来一个短进程只需要一秒执行完,但是由于被时间分片,导致剩余部分迟迟得不到执行,便会导致完成时间被拉长,而时间片轮转的解决方案就是一个进程被执行完一个时间片后就会被放入队列末尾,让每个进程都能被公平执行,但由于需要不断地切换进程位置,可能会导致较大的切换开销,不过目前操作系统并由没有完美的解决方案,所以此算法的理念还是被广泛应用的。

7.多级反馈队列

最有意思的一个调度算法,该算法使用了多个队列,每个队列的优先级不同,当进程第一次执行都会出现在第一级队列,每次执行完一个时间片,都会导致优先级降低,以此长任务队列和短任务队列都会被公平执行的同时,短任务队列较短,优先级降低过程中也会更快的被执行完,长任务则会被停滞在低级队列,但问题也就在这,如果不断有新进程或者短进程的进入,长进程就会不断地呆在低级队列中不被执行,所以调度算法还会进行周期性更新,每隔一段时间会将所有进程重新放入一级队列重新降级。

对于一些I/O密集型进程(与用户频繁交互,输入输出),为了让该进程尽快相应用户的操作,应该也给予类似于短进程的高优先级执行顺序,让其先执行,但一旦这样做,某且程序员便会利用这种机制,给自己的程序进行多次无用的I/O操作用于给自己的程序提高执行优先级,对此多级反馈队列中会采用临时提高优先级的策略,也就是说在用户执行完I/O操作后会对其进程临时提高执行优先级,然后在随着时间片的逐步执行,退到低级队列,而这种机制对时间片轮转没有效果,因为时间片轮转保证了绝对的公平,每个进程都会得到公平的执行。

时间分片:所谓时间分片就是利用定时器中断实现的,也就是说其实所谓的时间分片其实是操作系统进行的一个定时器在规定每个进程能够执行多久,所以一个时间分片的执行完毕必然面临这定时器中断,在换句话说进程的切换必然伴随着中断,但中断虽然不一定伴随着进程切换,但大部分中断都会引起进程切换,因为中断通常面临着耗时操作,操作系统不会等待中断结束,而是会直接执行下一个时间片,然后等待再次中断时继续执行该进程,如系统调用,I/O操作等

中断:中断代表cpu中断当前程序执行,中断由很多类型,如硬件中断,软件中断等,系统调用和定时器中断是软件中断的一种,I/O操作如果用户读写硬件信息,导致硬件需要告知cpu完成此操作而导致中断也是硬件中断的一种

  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不止会JS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值