内存管理——进程创建,执行,缺页,终止

与分页相关的工作。

1、进程创建时:当进程被创建时,操作系统需要确定程序和数据在初始时有多大,并针对其大小为进程创建页表,操作系统需要在内存中为页表分配空间并进行初始化。此外,操作系统需要在磁盘交换区中分配空间,以用来在一个进程换出时在磁盘上有放置此进程的空间;

2、进程执行时:重置MMU,刷新TLB,清除先前进程信息,将新进程页表设置为当前页表(Linux操作硬件设置CR3控制寄存器为新的进程页目录基地址),把进程的部分或全部页面装入到内存中以减小缺页中断发生,如程序计数器PC(Intel中为EIP寄存器)所指页面会装入内存;

3、进程缺页中断:当进程在执行中由于读写非法虚拟地址,发生缺页中断,处理如下:

  • 执行上下文从用户空间陷入内核空间,在堆栈中保存程序计数器(EIP指向发生缺页中断的指令地址);
  • 保存通用寄存器和其他易失信息,以免被操作系统破坏;
  • 操作系统捕获缺页中断,通过读取控制寄存器CR2来获取当前产生缺页中断的进程虚拟地址;
  • 得到虚拟地址,操作系统检查地址是否有效,并检查是否对受保护页执行写操作,如果是,向进程发出段错误信号或杀掉进程。如果地址有效并且没有保护错误发生,操作系统检查是否有空闲页框(空闲物理页面),如果没有则采用页面置换算法寻找一个页面进行淘汰;
  • 如果所选择的页框为“脏”,即当前物理页面上数据还未写回到磁盘,则将该页写回磁盘,并执行一次上下文切换,挂起当前缺页进程,先行调度其他进程直到磁盘传输结束。被选中的页框被标记为“忙”状态,避免其他进程使用;
  • 如果所选择的页框为“干净”(或者本来就为“干净”),操作系统查找页面在内存上的地址(对应Linux下的page数据结构),并将其装入页框中,产生缺页中断的进程仍被挂起,如果有其他可运行用户进程,选择一个执行;
  • 磁盘中断发生时,表明该页已经成功装入,页表已更新,页框被标记为正常状态;
  • 恢复缺页中断以前的状态,程序计数器重新指向该条指令;
  • 调度引发缺页中断的进程,恢复通用寄存器与其他保存的状态信息,进程返回到用户空间继续执行;

4、进程终止时:当进程退出时,操作系统释放该进程页表,页面和页面在硬盘上占用的空间。对于与其他进程共享的内存,当最后一个使用的进程终止时,释放内存和磁盘上的页面。

原文地址:https://www.cnblogs.com/scu-cjx/p/7756589.html