MINIX3进程管理器概述

讨论MINIX3中使用的内存管理技术。

MINIX3不支持页式存储管理、提供了交换所需的相关代码。

进程管理器

负责处理与进程管理相关的系统调用(fork,exec和brk),分为两个功能(在一个进程中):

  • 进程管理
  • 存储管理(存储管理器)

存储管理器保存着一张按照内存地址排列的空洞列表,当由于执行系统调用fork或exec需要内存时,系统将用最先匹配算法对空洞列表进行搜索找出一个足够大的空洞,在运行期间,这块内存都不发生变化。

策略与机制分离

哪个进程应该被放在内存中哪个位置的决定(策略)是由存储管理器作出的

而具体的为进程设置内存映像(机制)的操作是由在内核中的系统任务完成的(具体执行的)

这个划分使得修改存储管理策略(算法等)比较容易实现,不需要修改操作系统底层

内存布局

组合的I和D空间

即进程所有的部分(代码、数据、和栈)共用一个内存块,它是作为一个整体来申请和释放。

在MINIX中有两种情况需要分配内存:

  • 在一个进程执行fork时,为子进程分配所需要的空间;
  • 在一个进程通过EXEC系统调用修改它的内存映象时,老的映象被作为空洞送到空闲表,需要为新的映象分配内存。

52820403190

独立的I和D空间

Minix3默认的是使用更为复杂的独立的I和D空间。

  • 当这样的一个进程fork时,只需要分配为新进程做一个堆栈段和数据段拷贝所需数量的内存。
  • 父进程和子进程将共享已经由父进程使用的执行代码,即共享代码(shared text)

  • 当一个这样的进程执行exec时,系统将查找进程表看是否有另外一个进程已经在使用需要的执行代码,如果找到了就只为数据和堆栈分配新内存,已经在内存的代码段将被共享。

  • 在一个进程结束时它总是要释放它的数据和堆栈占用的内存,但是只有在搜索了进程表并发现没有其他进程在使用代码段后,才释放代码段所占用的内存。

程序文件及内存布局

磁盘文件的头部包含了进程映象各部分的大小以及总的大小的信息。

在具有给定的I和D空间的程序头部,有一个域指出代码和数据部分的总长度,这些部分被直接拷贝到内存映象中。

  • 映象中的数据部分增扩了头部bss域指出的数量,扩大的部分被清0,用于未初始化的静态数据。
  • 总共分配的内存数量是由文件头中的total域说明。

对于组合I和D空间,假如一个程序有4K代码段、2K的数据与bss、和1K堆栈,若文件头中说明的需要分配的内存总量是40K(total),那么在堆栈段和数据段之间的未用内存将是33K(40-1-4-2)。

对于使用独立的I和D段的程序(由文件头中连接器设置的一位指出),文件头中的total域只对结合的数据段和堆栈段有用。一个有4K正文、2K数据、1K堆栈,total域为64K的程序将被分配68K的空间(4K指令空间,64K数据空间),留出61K空间供数据段和堆栈在运行时使用。

参考资料

  1. Operating System:Design and Implementation,Third Edition

猜你喜欢

转载自blog.csdn.net/crazy_scott/article/details/80753321
今日推荐