操作系统——虚拟内存

虚拟内存别称虚拟存储器(Virtual Memory)。

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

常规存储器的特征与虚拟存储器的基本思想

常规存储器的特征

  • 整体特性

    用户作业在运行以前,必须将全部的内容一次装到主存中,这必然会导致主存容量不够;而且在大多数情况下,系统运行时并不要求使用用户作业的所有程序代码,因而会造成主存的空间的浪费。

  • 驻留特性

    用户作业在装入主存运行的过程中,将一直占据着主存的部分空间,有些程序只运行一次,但它不会主动释放所占据的主存空间,一直要等到用户作业运行结束才会释放。

局部性原理

​ 程序的执行呈现出局部性规律,即在一较短的时间里,程序的执行仅局限在某一部分,相应地,它访问的存储空间也局限在某一个区域。

虚拟存储器的基本思想

当用户作业要求的存储空间很大,不能被装入主存时,基于局部性原理,系统可以把当前要用的程序和数据装入主存中启动程序运行,而暂时不需要的程序和数据则驻留在外存中。在主存中需要用到不在主存中的信息时,通过系统的调入调出功能和置换功能将暂时不用的数据调出主存,腾出空间让系统调入要用的程序和数据。这样系统就能很好地运行该用户作业。从用户的角度上看,系统具备了比实际主存容量大得多的存储器,人们就把这样的存储器称为虚拟存储器。

虚拟内存的实现——页式存储

  • 数据结构

    虚拟页式存储管理系统中所需要的主要数据结构是页表,主要包含:页框号, 状态位, 访问字段, 修改位,保护权限, 外存地址。

  • 虚拟页式存储管理工作流程

硬件环境:

  • 具有一定容量的的主存
  • 相当容量的外存
  • 地址变换机构
  • 缺页中断机构

总的流程

系统位用户作业或进程分配主存工作区并填写相应的页表目录;接着由进程调度程序(内核)调度用户进程执行。进程在执行中访问某一页时,硬件地址转换机构先查看快表,若在快表中命中,则立即形成绝对的地址,否则再查看页表,若该页的对应的状态位为1, 表明该页已存在主存中,即根据表内的页框号形成访问主存的绝对地址,若该状态码为0,则表明该页不存在内存中,则由硬件产生一个缺页中断,之后由系统将该页装入主存的空闲页框。

内核空间,用户空间

Linux虚拟内存只有4G,不代表内存卡最大4G(如果不受地址线限制)。虚拟内存只能说明每个进程的空间最大为为4G,内存内如果越大,引起的页切换越小,程序运行速度也越快。

现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。

因为每个进程可以通过系统调用进入内核,因此,Linux内核空间由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟地址空间(也叫虚拟内存)。

内核:

内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。

进程切换

为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。

从一个进程的运行转到另一个进程上运行,这个过程中经过下面这些变化:

  1. 保存处理机上下文,包括程序计数器和其他寄存器。
  2. 更新PCB信息。
  3. 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
  4. 选择另一个进程执行,并更新其PCB。
  5. 更新内存管理的数据结构。
  6. 恢复处理机上下文。

注:总而言之进程切换就是很耗资源

参考:

内核百度百科

https://segmentfault.com/a/1190000003063859

《操作系统设计原理》

end

评论