进程的切换过程

切换方式

进程的切换,实质上就是被中断运行进程与待运行进程的上下文切换。从主观上来理解。只分为两步:
1.切换新的页表,然后使用新的虚拟地址空间
2.切换内核栈,加入新的内容(PCB控制块,资源相关),硬件上下文切换

现在从这两句话理解,来看看这些东西到底是什么。

1,虚拟地址空间

虚拟地址空间,顾名思义:就是虚拟的,不是真的地址空间
在早期的计算机中,我们的计算机内存都非常的小。如果计算机内存是100M.已经运行了两个40M的任务。如果还想运行一个40M的。那么空间肯定就不够了。

所以后来 它在磁盘上划分出一块空间由操作系统管理,当物理内存耗尽是充当物理内存来使用。它将多个物理内存碎片和部分磁盘空间重定义为连续的地址空间,以此让程序认为自己拥有连续可用的内存
但是具体要讲清楚这个,我们还要看页表

2,页表

刚刚讲到了虚拟地址空间,说了他只是虚拟的一段空间,但是。程序可不管你那么多。人家只要在物理内存上运行。你给人家画空饼可没意思。
所以出现了页表。把虚拟地址空间对应的部分,映射到物理地址上
现在计算机一般是采用分页管理居多,这里分段管理我个人也理解了就不多叙述。
我们来看下分页管理:
在这里插入图片描述
很多初学者在这里会有一个疑问,既然给程序造成连续的空间假象,那要是内存中确实没内存可用了,会怎么办呢?那么对于*新的页数,他就会发生缺页中断,然后会覆盖起其他的页
缺页中断大概有三种算法:
1.(OPT)最晚不使用的算法:表示新的页如果进来没内存框可放了,会替换之后 几乎或者根本不会用到的页。但这种算法只是一种理想算法,因为没人能预估之后的事,包括计算机
2.(FIFO)先进先出算法:表示没来一个新的页,他都会替换最早进来的那个页。这种办法有个缺点:如果最早进来的那个页是经常被访问的,那么一定情况下效率会比较低。所以FIFO算法在按 线性顺序访问地址空间时使用
3.(LRU)最近最久未使用:这种办法,会找出当前内存中,最近一段时间最久没被使用的页。然后替换他。这种办法是前两个算法的折中选择,基本现在都用这种。还有一种是LFU 最常不使用算法,这种是找系统内使用频率最少的页(LRU是最近一段时间),然后替换他。但是,这种算法实现要长期的为每个页维护一个计数代价较大不常使用。

具体三个的算法的图解:https://blog.csdn.net/qq_34777600/article/details/79508613

第二步的切换内核栈,就是使用新的栈来存放进程运行时资源了。然后新进程有新的PCB控制块。第二步也是线程切换的步骤,因为线程共享进程的虚拟地址空间,所以切换的时候没有第一步的过程

进程一共有五个状态:
像刚刚的切换:
1.会把原来的进程保存状态,然后进入阻塞状态。这种情况一般是IO请求或者内存申请失败了。
2.可能是原来的进程正常终止了,或者CPU的时间片没了,终止是进入终止态,CPU时间片没了是进入就绪态,加入就绪队列等待下一次获得CPU
在这里插入图片描述

おすすめ

転載: blog.csdn.net/qq_40861091/article/details/102601719
おすすめ