Minix3进程概述
介绍Minix3中的系统组织结构及进程实现。
概述
- UNIX 的内核是一个部分模块的单块程序
- MINIX 是微内核结构,是一组进程的集合,内核功能较少,进程之间以及用户进程之间使用进程级通信机制(IPC)进行通信
-
内部结构
- 注意:内核层的 system task 是系统任务,第二第三层统称为系统进程 system process
- 除了第一层为内核层,其他层都是user mode。
- 进程都潜在有一定特权,这是第二层、第三层、第四层内的进程的不同之处。
- kernel call 与system call的区别
- 内核调用(kernel call)是由系统服务提供的以使驱动程序和服务器完成工作的低层函数。例如读硬件的I/O端口。
- system call 是用POSIX规范定义的高层调用,如read、fork和unlink,这些调用供第四层的用户程序使用。
- 用户程序包含很多POSIX调用,但不包含内核调用。
内核层(Kernel)
多数用 C 写,汇编负责内核直接与硬件交互的最底层部分。
主要功能是为上层驱动程序和服务提供一组特权内核调用。
内核
- 进程调度,负责进程在就绪态、运行态、阻塞态之间转换
- 处理进程间的消息
- 支持对 I/O 端口和中断的访问,在处理器中需要使用特权内核模式(kernel mode),这些指令在用户指令中是没有的。
时钟任务
- 类似设备驱动程序,与产生时钟信号的硬件交互
- 只提供内核接口,用户不能访问
系统任务
- 为驱动程序和服务器提供内核调用,用户进程不可调用
- 包括读写 I/O 端口、跨地址空间复制数据
设备驱动程序(Device Drives)
- 请求系统任务代表它们读写 I/O 端口
- 请求系统任务将读取的数据副本到另一个地址空间
- 实现操作系统工作一:管理资源
服务器进程(server processes)
进程管理器(Process Manage)
- 执行所有涉及或者终止进程的MINIX3系统调用,例如fork,exec和wait。
- 还负责执行与信号有关的系统调用,例如alarm和kill。
- 管理内存,如发出brk系统调用。
文件系统(File System)
- 执行文件系统的调用,如read,mount和chdir。
- 实现操作系统工作二:通过实现系统调用提供一个扩展的计算机(PM & FS)
信息服务器(information server)
- 负责提供其他驱动程序和服务器的调试和状态信息的工作。
再生服务器(reincarnation server)
- 启动或者重启那些不与内核一起加载到内存的设备驱动程序。
网络服务器(network server)
- 可以通过驱动程序来请求I/O。
用户进程(user processes)
- 如shell程序、编辑器、编译器和用户程序。
- 系统进程比用户进程拥有更高的执行优先级
-
Init进程
- 在系统引导时启动
-
Daemon 守护进程
- 周期性运行或总是等待某个事件的后台进程
MINIX3 中的进程管理
MINIX3 的启动
软盘
只有第一个分区可以引导(引导块,boot block),由它装入引导程序(bootstrap),引导程序很小,并装入一个更大的程序boot,由boot装入操作系统。
boot block -> bootstrap -> boot -> boot image
硬盘
可能包含很多分区,第一个扇区包含主引导记录。
主引导记录(master boot record)= 第1个扇区内的一小段程序(用于选择活动分区)+ 磁盘分区表(partition table)
程序部分被执行以读入分区表并选择活动分区,活动分区的第一个扇区有一个引导程序,被装入并执行以查找启动程序boot。
master boot record -> partition table -> active parttition -> boot block (扇区1) -> bootstrap-> boot -> boot image
在 BIOS 中设置启动盘的搜索顺序
- 软盘启动
-
硬盘启动
- 程序部分被执行读入分区表并选择活动分区,活动分区第一个扇区中的引导程序被装入执行并以查找并启动程序boot
boot
- 是MINIX3的磁极装入程序,不仅可以装入操作系统,而且作为一个金控程序,允许用户改变、设置和保存不同的参数。
引导映像(boot image)
- MINIX3 的 boot 程序将在软盘或硬盘分区上找一个包含多个部分(各种程序,如PM、FS 等)的文件,并将各部分装到内存适当的位置。
-
引导映像的各个部分是独立的程序,内核、FS、PM、再生服务器必须是引导映像的一部分。
- 在初始化阶段,内核先启动系统任务和时钟任务,再启动进程管理器和文件系统,接着是其他一些服务器和驱动程序,这些都完成之后被阻塞,然后第1个用户进程 init 才开始运行。
进程树的初始化
-
Init 是第1个用户进程,也是作为引导映像(boot image)的一部分加载的最后一个进程
- init进程首先执行
/etc/rc
脚本,启动不在引导映像中的其他服务器和驱动程序。 - 其中一个使用程序为服务(service),是再生服务器的用户接口
- 最后启动守护进程
- init不是进程树的树根,其结构也不能判断系统进程的启动顺序
进程管理器
是用户空间运行的第1个进程再生服务器
是其他所有再引导映像中启动的进程的父进程
- init进程首先执行
MINIX3 中的进程间通信
- 原语
- Send
- Receive
- Sendrec
- 发送一条消息,并等待同一个进程的应答
-
实现:内核中的消息传递机制将消息从发送者复制到接收者
- 同步通讯:当一个进程发送消息到目标进程而目标进程并不在等待消息时,发送进程将阻塞,直到目标进程调用 receive 为止。
- 当 A 向 B 发送消息时,如果 B 向 A 发送消息,会导致死锁。
每个任务、驱动程序或服务器只允许与一些特定的进程通信
-
Notify
- 不阻塞消息发送
- 只发送一个很简单的通知,使用置位就可以存储。
- 异步通讯,可以避免死锁
- 消息通知(notification message)的简单性在于,不能被接受的通知可以很容易的存储起来,以便当接受者调用receive时可以收到这个通知。
- 实现
- 通过置位来接收,notify 只包含发送者信息和一个内核加上的时间戳
MINIX3 中的进程调度
-
结构:多级排队系统
- 共 16 个队列
- 最低优先级位 IDLE 进程,只在没有其他任务时运行
- 系统和时钟任务处于最高优先级队列中
驱动程序和服务器进程通常具有一个较大的时间片,通常是运行结束被阻塞而非时间片到了被中断
只有当前一个队列中没有就绪的程序时,才会转向下一个队列
优先级调度 + 改进的轮转调度算法
进程的优先级可根据实际情况调整
参考资料
- Operating System:Design and Implementation,Third Edition