第二部分 进程
进程是内核管理程序执行的单位。进程与内存的关系是:内存分配给进程,进程利用分配到的内存进行处理。
这部分所关注的内容是:
- 内核如何管理进程
- 内存如何分配给各个进程
- 进程如何访问被分配到的内存
- 进程的并行执行
- 内存空间的有效利用
1.概念性解释:
首先最重要的一点呢是,进程是以唯一标识进程ID来识别的。一个进程有着自己的虚拟地址空间,这个虚拟地址由MMU转换为物理地址。
UNIX V6中处理程序的物理CPU只有一个,所以真正处于执行状态的进程仍然只有一个。不过可以使用分时系统实现多个程序的并行处理。
进程的执行状态分为两种,可执行态和休眠状态。
内核程序在系统启动的时候,就被读取到内存中了。处理器的两种模式切换时,进程的虚拟地址映射到的物 理地址空间也会随之切换。这个切换是由MMU来实现的。
用户进程无法访问加载内核程序的内存区域,所以必须使用系统调用的方式来访问内核功能。这样设置的目的是提高系统的安全性。
交换处理,原因是进程数量的增多会导致内存容量不足。内核于是会定期把处于休眠状态、重要度较低的进程从内存转移到交换空间,或者将交换空间中已处于可执行状态的进程回复到内存。交换处理由系统启动时生成的程序进行。读写数据函数:fubyte(),fuibyte(),fuword(),fuiword(),subyte(),suibyte(),suword(),suiword()。
2.重要的结构体:
1). proc结构体
常驻内存,存储一个进程的状态信息。系统中的所有进程的proc结构体组成的数组,用于管理进程状态、优先级等与进程相关的、经常被内核访问到的信息。proc[]常驻内存,以便于内核对所有进程状态的检查和遍历。proc[]数组的长度决定了系统中最多能同时存在多少个进程。这个长度由NPROC定义,值是50。
具体的字段和含义参见原书p16、p17
重要的几个字段:p_pid进程ID, p_ppid 父进程ID,p_stat状态,p_pri优先级(数值越小优先级越高),p_addr数据段的物理地址,p_size数据段的长度,p_wchan使进程进入休眠状态的原因,p_flag标志变量等。
2). user结构体
user结构体有可能被交换到交换空间,用于管理进程打开的文件或目录等信息。
内核可通过全局变量u访问执行进程的user结构体。
3.给进程分配内存
进程通过虚拟地址访问物理内存空间,被分配给内存的物理空间分为代码段和数据段两个连续的区域
- 代码段
只读,存储程序指令的机器代码。多个进程共享一个代码段。通过数据text[]管理,长度是user.u_tsize - 数据段
数据段不可共享,存储程序使用的变量等。数据段物理地址是proc.p_addr,长度是proc.p_size。
进程有64KB的虚拟地址空间,通过长度为16比特的虚拟地址访问物理内存。虚拟地址由MMU转换成长度为18比特的物理地址。
每个进程都有独立的虚拟地址空间。在虚拟地址中数据区域和栈区域是不同的栈。使用虚拟地址的优点:程序能够以任意的地址为起点的内存空间,实现对内存访问的管理。提高的内存的使用效率。
个人觉得使用虚拟地址提高了进程这个概念的抽象程度。
变换地址的过程,有点麻烦。MMU通过APR来实现转换。
APR分为PAR和PDR寄存器,PAR存储页对应的基地址,PDR存储页的块数(每一页最多有128个块)、更新标志、页分配的方向、页访问控制方法。PDP-11/40有两套APR供内核模式和用户模式使用。
APR值保存在user结构体中,当该进程执行时,这些值就会被写入APR中。
APR有8组。
映射算法:虚拟地址的高位3个比特决定了对应的页,PAP的11-0决定了对应的物理地址基地址的块地址再加上虚拟地址的12-6得到物理内存的块地址,再加上作为块内偏移值的虚拟地址的5-0比特,就得到最后物理地址。
举例说明:内核使用的全局变量u(0140000),访问执行进程的user结构体,是因为供内核使用的APR有特殊设定。内核模式使用的编号6的PAR设置为执行进程的数据段的物理地址(proc.p_addr)。0140000(八进制)对应的二进制数是:1100000000000,高三位是6,低位全是0,所以u指向了内核空间第6页的起始位置。
这是第二章,进程中涉及到的概念,以及两个重要的抽象结构体:proc和user。最后讲了MMU如何在虚拟地址和物理地址之间转换。下一篇学习内核是如何管理进程的。