📅  最后修改于: 2023-12-03 15:42:17.497000             🧑  作者: Mango
该题目要求我们考虑一个操作系统中进程管理的问题。
在一个透明的多进程操作系统中,支持fork()和 exec()系统调用。操作系统采用页式虚拟内存管理,且有一个用户级虚拟内存管理器。它按照以下方式将虚拟地址映射到物理地址:
虚拟地址的高位位数是虚拟页号。
所有的进程共享一个页面表,每个进程拥有自己的页目录。
页面表中的每一条目都有权限位,用于确定进程能够对页面进行的操作类型。
虚拟地址的第二高位用于确定它属于哪个进程。
假设一个进程当前正在运行,则fork系统调用的作用是复制该进程和其内存映像,其中每个页都标记为只读。而exec系统调用的作用是装载并运行一个新的程序,它将覆盖进程的当前代码段和数据段,但是保留了进程的页表。
考虑一个场景,其中一个父进程通过fork系统调用创建了一个子进程,然后子进程再通过exec系统调用替换自己。当子进程试图执行以前由父进程共享的只读页时,将会发生什么?
请解释您的答案。
该题是一道计算机操作系统中的进程管理问题,需要理解以下几个概念。
Fork系统调用是操作系统中进程管理的系统调用之一。该系统调用可以创建一个新的进程,并使新的进程与原进程有不同的PID。新进程是原进程的一个完全复制,包括代码和内存空间等。
Exec系统调用是操作系统中进程管理的系统调用之一。该系统调用可以用于运行另一个程序。Exec函数会将当前进程的内容替换为新进程。在执行exec系统调用后,原程序的代码段和已经分配的数据段都会被覆盖。
虚拟内存管理器(Virtual Memory Manager, VMM)是一个管理虚拟内存的操作系统内核部分。它实现了虚拟地址到物理地址的映射,为用户进程提供了虚拟内存空间。VMM可以将进程的虚拟地址映射到物理地址,同时保证虚拟内存地址的完整性和独立性。
页面表(Page Table)是虚拟内存管理器中记录虚拟内存和物理内存映射关系的数据结构。每个进程对应一个页面表。页面表记录了虚拟内存地址到物理内存地址的映射关系。页目录(Page Directory)则是一个记录页面表地址的数据结构,用于多个进程共用同一种虚拟内存。
在了解了上述概念之后,我们可以回答本题的问题。
假设子进程试图执行以前由父进程共享的只读页,执行请求将被操作系统拒绝,因为只读页是不能被写入的。
当子进程试图写共享只读页的时候,处理器会产生某种形式的缺页异常,此时操作系统会负责处理该异常。根据操作系统不同的策略,缺页异常可能会被操作系统拒绝,也可能会触发一个写时复制(Copy on Write, COW)当前页的拷贝。COW是一种技术,它通过仅在第一次写入时创建副本来复制内存页,以尽可能增加可共享页的数量。
因此,对于子进程试图写共享只读页的情况,操作系统会通过COW来执行写入。这样,在父子进程之间共享只读页时,就可以避免无谓的内存页面复制。
当子进程试图执行以前由父进程共享的只读页时,执行请求将被操作系统拒绝。
当子进程试图写共享只读页的时候,操作系统会通过COW来执行写入。
马卓立等. 操作系统. 北京:机械工业出版社,2015.
Abraham Silberschatz, Peter B. Galvin, Greg Gagne. Operating System Concepts. Wiley, 2018.