《Unix内核源码剖析》读书笔记(二)

第二部分 进程
进程是内核管理程序执行的单位。进程与内存的关系是:内存分配给进程,进程利用分配到的内存进行处理。
这部分所关注的内容是:

  1. 内核如何管理进程
  2. 内存如何分配给各个进程
  3. 进程如何访问被分配到的内存
  4. 进程的并行执行
  5. 内存空间的有效利用

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.给进程分配内存
进程通过虚拟地址访问物理内存空间,被分配给内存的物理空间分为代码段和数据段两个连续的区域

  1. 代码段
    只读,存储程序指令的机器代码。多个进程共享一个代码段。通过数据text[]管理,长度是user.u_tsize
  2. 数据段
    数据段不可共享,存储程序使用的变量等。数据段物理地址是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如何在虚拟地址和物理地址之间转换。下一篇学习内核是如何管理进程的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 献辞 致谢 序(一) 序() 历史注记 上篇 UNIX操作系统版本6源代码 UNIX操作系统过程分类索引 3 UNIX操作系统文件及过程 5 UNIX操作系统定义的符号列表 7 UNIX操作系统源代码交叉引用列表 9 第一部分 初始化、进程初始化 25 第部分 陷入、中断、系统调用和 进程管理 75 第三部分 程序交换、基本输入/输出、 块设备 109 第四部分 文件和目录、文件系统、管道 133 第五部分 面向字符的特殊文件 181 下篇 莱昂氏UNIX源代码分析 前言 207 第1章 绪论 209 1.1 UNIX操作系统 209 1.2 公用程序 209 1.3 其他文档 210 1.4 UNIX程序员手册 210 1.5 UNIX文档 211 1.6 UNIX操作系统源代码 211 1.7 源代码中各部分 212 1.8 源代码文件 212 1.9 分析的使用 212 1.10 对程序设计水平的一条注释 212 第2章 基础知识 214 2.1 处理机 214 2.2 处理机状态字 214 2.3 通用寄存器 214 2.4 指令集 215 2.5 寻址方式 216 2.5.1 寄存器方式 217 2.5.2 寄存器延迟方式 217 2.5.3 自动增1方式 217 2.5.4 自动减1方式 217 2.5.5 变址方式 217 2.5.6 立即方式 218 2.5.7 相对方式 218 2.6 UNIX汇编程序 219 2.7 存储管理 219 2.8 段寄存器 220 2.9 页说明寄存器 220 2.10 存储分配 220 2.11 状态寄存器 221 2.12 “i”和“d”空间 221 2.13 启动条件 221 2.14 专用设备寄存器 221 第3章 阅读“C”程序 222 3.1 某些选出的例子 222 3.2 例1 222 3.3 例2 223 3.4 例3 223 3.5 例4 225 3.6 例5 225 3.7 例6 227 3.8 例7 227 3.9 例8 228 3.10 例9 228 3.11 例10 229 3.12 例11 229 3.13 例12 230 3.14 例13 230 3.15 例14 231 3.16 例15 231 3.17 例16 232 3.18 例17 233 第4章 概述 235 4.1 变量分配 235 4.2 全局变量 235 4.3 “C”预处理程序 235 4.4 第一部分 236 4.4.1 第1组“.h”文件 236 4.4.2 汇编语言文件 237 4.4.3 在第一部分中的其他文件 237 4.5 第部分 237 4.6 第三部分 238 4.7 第四部分 238 4.8 第五部分 239 第一部分 初始化、进程初始化 第5章 两个文件 241 5.1 文件malloc.c 241 5.1.1 列表维护规则 241 5.1.2 malloc(2528) 242 5.1.3 mfree(2556) 243 5.1.4 结论 244 5.2 文件prf.c 244 5.2.1 printf(2340) 244 5.2.2 printn(2369) 245 5.2.3 putchar(2386) 246 5.2.4 panic(2419) 247 5.2.5 prdev(2433)、deverror(2447) 247 5.3 包含的文件 247 第6章 系统初启 249 6.1 操作员的动作 249 6.2 start(0612) 249 6.3 main(1550) 251 6.4 进程 252 6.5 proc〔0〕的初始化 252 6.6 sched(1940) 253 6.7 sleep(2066) 253 6.8 swtch(2178) 253 6.9 再回到main 254 第7章 进程 256 7.1 进程映像 256 7.2 proc结构(0358) 257 7.3 user结构(0413) 257 7.4 每个进程数据区 258 7.5 段 258 7.6 映像的执行 258 7.7 核心态执行 259 7.8 用户态执行

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值