通过前面两篇文章的介绍,我们已经认识到了:可执行程序通过作业调度装入内存,操作系统为进程创建虚拟地址空间,分配物理内存,建立页表(映射关系),申请并初始化PCB,开始调度进程。
大概结构如图:
当CUP调度此进程时,将PCB内的硬件上下文数据拷贝到CPU内部的寄存器上,开始逐句执行进程的指令代码。
依次介绍CPU中几种重要的寄存器:
- PC:程序计数器,存放进程当前要执行指令的地址。
- IR:指令寄存器,存放进程从内存中取回来,要被执行的指令。
- SP:堆栈指针寄存器,用于存放进程的栈顶地址。
- MAR:用于存放将要被访问的内存单元的地址。
- MDR:用于存放最近从内存中读取的内容。
- 条件码寄存器:CPU根据最近的运算结果设置的硬件位。
指令的格式:
下面描述指令的执行过程(指令周期):
取指周期:将内存中的指令取回来至IR
- CPU调度该进程,将PCB内的硬件上下文数据拷贝给CPU内的寄存器。
- PC寄存器存放着待执行指令的地址。
- 通过硬件线路将地址传送给MAR。
- 控制单元CU通过总线向主存发送读命令。
- 将MAR所指向的内存单元的数据通过总线读取到MDR中。
- 将MDR的数据送入IR。
间址周期:
如果地址码不是有效地址,而是一个间接地址(这个地址指向的内存单元中存放着有效地址),则会存在间址周期(负责将有效地址取回CPU中)。
- 将IR中的地址码部分送至MAR
- 控制单元CU通过总线向主存发送读命令。
- 将MAR所指向的内存单元的有效地址通过总线读取到MDR中。
- 将MDR中的有效地址送至IR。
执行周期:执行取回来的指令
将IR中的操作码部分送至指令译码器,产生特定指令的控制电位,将其送至微操作控制线路上,在时序部件定时信号的作用下,产生具体的操作控制信号。
请注意:以上所谈到的指令中的地址码,以及指令本身的地址,均是进程的虚拟地址空间中的地址,在CPU视角只需要对这些虚拟地址进行操作即可,具体物理内存地址在CPU和内存之间有MMU来进行虚拟地址和物理地址的转换(通过PCB内的页表)。
进程虚拟地址空间:
操作系统为每个进程提供的一种抽象的内存管理方式,它允许每个进程拥有自己的地址空间,这个地址空间对进程来说是连续的,但实际上可能分散在物理内存中。
优点如下:
-
隔离性:每个进程的虚拟地址空间是独立的,一个进程不能直接访问另一个进程的虚拟内存,这提供了进程间的隔离,增强了系统的稳定性和安全性。
-
保护:操作系统可以通过虚拟地址空间来保护进程,防止进程间相互干扰。例如,一个进程不能访问或修改另一个进程的代码或数据。
-
简化内存管理:虚拟地址空间允许操作系统使用分页技术,将虚拟地址映射到物理地址,这样可以有效地管理内存资源,提高内存利用率。
-
动态内存分配:进程可以根据需要动态地申请和释放虚拟内存,操作系统负责将这些虚拟内存映射到物理内存中。
-
内存共享:操作系统可以通过映射相同的物理内存到不同进程的虚拟地址空间来实现内存共享。
-
内存保护:操作系统可以设置虚拟地址空间的不同区域为可读、可写或不可执行,以防止程序错误地访问或修改内存。
-
内存访问的局部性:操作系统可以根据程序访问虚拟内存的局部性原理,优化内存的分配和访问,提高性能。
-
支持多任务:虚拟地址空间使得操作系统可以在同一物理内存上同时运行多个进程,每个进程都认为自己拥有整个内存空间。
-
灵活性:虚拟地址空间允许操作系统实现多种内存管理策略,如分页、分段等,以适应不同的应用需求。
虚拟地址空间为进程提供了一个抽象的、易于管理的内存模型,同时也为操作系统提供了强大的内存管理能力。