操作系统原理和设计
-
- 一、操作系统主流结构:宏内核(Monolithic Kernel)与微内核(Microkernel)的区别
- 二、从资源管理角度,操作系统主要功能划分
- 三、操作系统设计技术
-
- 1. 操作系统中文件相关的三种表之间的关系
- 2. 操作系统的进程结构设计
一、操作系统主流结构:宏内核(Monolithic Kernel)与微内核(Microkernel)的区别
宏内核(Monolithic Kernel) 与 微内核(Microkernel) 是操作系统内核的两种主要架构模式,其核心区别在于功能模块的组织方式和运行模式:
| 设计哲学 | 大而全,内核集中实现所有操作系统功能 | 小而精,内核仅提供最基本服务,其他功能运行在用户态 |
| 功能分布 | 文件系统、设备驱动、内存管理、进程调度等均在内核态实现 | 仅进程通信、低级内存管理、中断处理等核心功能在内核态 |
| 系统调用方式 | 通过内核态的系统调用直接执行 | 通过消息传递机制,内核作为消息中转站 |
| 运行效率 | 高(模块间调用无需跨越用户态/内核态边界) | 相对较低(频繁的上下文切换与消息传递带来开销) |
| 稳定性与安全性 | 一个模块崩溃可能导致整个系统崩溃 | 单个服务崩溃不影响内核与其他服务,系统更稳定、安全 |
| 可扩展性与维护 | 扩展需修改内核,较复杂;版本升级常需重启 | 模块可独立开发、加载、更新,易于扩展和维护 |
| 典型系统 | Linux、UNIX、早期Windows | Windows NT(现代版本)、macOS(基于Mach)、Minix、HarmonyOS |
补充说明: 现代操作系统常采用混合内核(Hybrid Kernel)设计,在微内核基础上将部分关键服务(如文件系统、驱动)仍置于内核态以提升性能,如Windows NT与macOS实际为混合内核结构。
二、从资源管理角度,操作系统主要功能划分
操作系统作为计算机系统的资源管理器,其主要功能可划分为以下五大类,对应于管理的核心硬件与软件资源:
| CPU管理 | 处理器资源 | 1. 进程与线程的创建、同步、通信与撤销2. CPU调度(决定哪个进程/线程使用CPU)3. 中断处理与异常响应 | 进程控制块(PCB)、调度算法(FCFS、RR、MLFQ等)、中断向量表 |
| 存储管理 | 内存与存储层次 | 1. 内存分配与回收2. 地址映射与内存保护3. 虚拟内存实现(页面置换、段页式管理)4. 缓存与交换空间管理 | 页表、TLB、页面置换算法(FIFO、LRU等)、分段与分页 |
| 设备管理 | 输入输出设备 | 1. 设备驱动管理与抽象(统一接口)2. 设备分配与回收(独占/共享/虚拟)3. 缓冲区管理与I/O调度4. 中断处理与DMA控制 | 设备控制器、驱动程序、SPOOLing、I/O队列、缓冲池 |
| 文件管理 | 文件系统与存储介质 | 1. 文件存储与目录结构组织2. 文件操作(创建、读写、删除、权限控制)3. 磁盘空间管理(分配与回收)4. 文件备份、恢复与加密 | 文件控制块(FCB)、目录树、文件分配表(FAT)、索引节点 |
| 用户接口 | 用户与系统交互 | 1. 命令接口(CLI)2. 图形接口(GUI)3. 程序接口(系统调用API) | Shell、图形窗口管理器、系统调用库(如libc) |
补充说明: 上述五大功能并非孤立,而是协同工作。例如,打开一个文件(文件管理)可能涉及磁盘I/O(设备管理)、内存缓存(存储管理)和进程等待(CPU管理)。操作系统的核心目标正是通过这五大功能的协调,实现资源的高效、公平、安全、透明共享与管理。
三、操作系统设计技术
1. 操作系统中文件相关的三种表之间的关系
(1)三种表的定义与作用
-
用户文件描述符表
- 性质:进程私有,位于用户区(实际为进程的内核数据结构一部分)。
- 结构:通常是一个数组(如 files_struct 中的 fd_array[]),索引就是文件描述符。
- 作用:进程通过文件描述符(一个整数)来访问其所有已打开的文件。该表项指向系统文件表中的一个条目。
-
系统文件表
- 性质:全局共享,位于内核区。
- 结构:一个全局内核结构数组(如 file 结构体数组)。
- 作用:记录一个打开实例的详细信息,包括:
- 文件偏移指针:下一次读/写操作开始的位置。
- 访问模式:只读、只写、读写等。
- 状态标志:如 O_APPEND, O_NONBLOCK。
- 引用计数:有多少个文件描述符指向它。
- 指向内存索引节点表项的指针(f_inode 或 vnode)。
-
内存索引节点表
- 性质:全局共享,位于内核区。
- 结构:一个缓存活动文件 inode 的内核结构数组(如 inode 结构体)。
- 作用:缓存从磁盘索引节点(存储文件元数据)读取的信息,包含:
- 磁盘inode副本:所有者、权限、大小、时间戳、数据块位置等。
- 内存状态:是否被锁定、是否与磁盘不同(脏)、是否为挂载点。
- 引用计数:有多少个系统文件表项指向它(即该文件被打开的次数)。
- 所属文件系统信息。
(2)三者之间的逻辑关系与数据流
进程打开文件:当进程调用 open(“/path/file”) 时:
- 内核通过路径查找(namei)找到或创建(ialloc)对应的磁盘inode,并将其载入内存索引节点表(iget)。
- 内核在系统文件表中分配一个空闲的 file 结构体,初始化其文件偏移(通常为0)、访问模式,并使其指向刚载入的内存inode。该 file 结构的引用计数置为1。
- 内核在进程的用户文件描述符表中找一个空闲的最小索引号(如 fd=3),令其指向刚分配的 file 结构。最后将 fd=3 返回给用户进程。
关系图示(从进程视角):
进程A 内核区(全局)
┌─────────────────────┐ ┌─────────────────────────────────────┐
│ 用户文件描述符表 │ │ │
│ fd0 ──────────────┐ │ │ 系统文件表 (file结构体) │
│ fd1 ───────────┐ │ │ │ entry1: mode=r, pos=0, count=2 ──┐│
│ fd2 │ │ │ │ entry2: mode=rw, pos=120, count=1││
│ fd3 ─────────┐ │ │ │ └────────────────┬──────────────────┘│
└──────────────│─│──│──┘ │ │
│ │ └─────────────────────────────┘ │
│ │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────┐ │
└─────────┤ 内存索引节点表 (inode结构体) │ │
│ inodeX: (文件A元数据), count=3 ◄────┘ │
│ inodeY: (文件B元数据), count=1 │
└────────────────────────────────────────────┘
关键特性与实例分析:
- 不同进程打开同一文件:进程A和进程B都打开 /etc/passwd,则它们各自拥有不同的文件描述符,指向两个不同的系统文件表项,但这两个表项都指向同一个内存inode。这样,两个进程对文件的读写通过各自的偏移指针独立进行(除非使用 O_APPEND)。
- 同一进程多次打开同一文件:进程A两次调用 open(“/etc/passwd”, …),会获得两个不同的fd,指向两个独立的系统文件表项(拥有各自独立的文件偏移),但同样指向同一个内存inode。
- fork产生的子进程继承文件描述符:当进程A调用 fork 创建子进程B时,子进程B复制父进程的整个用户文件描述符表。因此,B中的fd指向与A相同的系统文件表项,导致这些表项的引用计数增加。不需要为子进程重新建立系统文件表项,这就是“共享打开文件状态”的由来。父进程和子进程可以共用同一个文件偏移指针。
(3)与虚拟文件系统的联系
- 内存索引节点是VFS层的抽象(inode),其底层的 i_op 和 i_fop 指针指向具体文件系统(如ext4、NTFS)的实现函数。
- 系统文件表中的 file 结构体,其 f_op 指针同样指向具体文件系统的操作函数集(file_operations),从而通过“文件系统总线”实现通用接口。
2. 操作系统的进程结构设计
操作系统的进程结构设计体现在其进程控制块中,PCB是进程存在的唯一标志,集中存储了管理与控制进程所需的全部信息。课件的设计可归纳如下:
(1)标识信息
- 进程ID:唯一标识进程的整数(PID)。
- 用户/组ID:用于权限控制。
- 真实UID/GID:进程所有者的身份。
- 有效UID/GID:用于实际权限检查,setuid 程序可改变此ID以提升权限。
(2)状态与调度信息
- 进程状态:运行、就绪、睡眠(可中断/不可中断)、僵死等。
- 调度信息:优先级、调度策略(普通、实时)、时间片、累计运行时间(用于动态优先级计算)。
(3)进程间关系(树状组织)
- 父子指针:parent 指向父进程,children 链表或兄弟指针维护子进程列表。
- 进程0:内核启动时手工创建的空闲进程,是所有进程的始祖。
- 进程1:由进程0创建的 init 进程,负责启动用户空间服务,是所有用户进程的祖先。
(4)内存管理信息
- 内存描述符:指向 mm_struct,描述进程的整个虚拟地址空间。
- 内存映射:页表、段表等硬件相关结构,用于虚拟地址到物理地址的转换。
- 内存区域列表:描述代码段、数据段、堆、栈、共享库等各个虚拟内存区域(VMA)的属性。
(5)文件系统信息
- 文件描述符表:指向 files_struct,管理所有打开的文件。
- 文件系统信息:指向 fs_struct,包含根目录(root)、当前工作目录(pwd)的vnode/inode。
(6)进程上下文 这是进程能够“暂停-恢复”执行的核心,分为三级:
- 用户级上下文:进程的正文(代码)、数据、用户栈和共享内存区。
- 寄存器上下文:当进程被切换时,必须保存/恢复的CPU硬件状态,包括:
- 程序计数器:下一条要执行的指令地址。
- 处理器状态字:条件码、中断屏蔽位等。
- 栈指针、通用寄存器。
- 系统级上下文:进程在内核中的运行环境。
- 进程表项/U区:即PCB本身,是进程的静态信息。
- 内核栈:进程在内核态执行时使用的栈。
- 内存管理数据结构:页表、区表等。
上下文切换仅发生在内核态,当内核决定调度另一个进程时,它会保存当前进程的寄存器上下文和必要的系统级上下文,并恢复下一个进程的上下文。
(7)进程间通信信息
- 信号处理表:记录每个信号的处理方式(忽略、默认、捕获)。
- 信号屏蔽字:当前被阻塞的信号集合。
- IPC结构指针:指向该进程使用的消息队列、共享内存段、信号量集等System V IPC对象。
(8)时间与定时器
- 时间统计:用户态时间、内核态时间、子进程时间。
- 定时器:实时定时器、虚拟定时器(CPU时间)、Profiling定时器,超时后发送信号。
(9)其他资源信息
- 审计与控制信息:会话ID、进程组ID、控制终端。
- 资源限制:对CPU时间、文件大小、堆栈大小等的软硬限制。
(10)设计思想总结 操作系统的进程结构设计是一个分层的、模块化的信息集合体:
- 身份层:标识与关系。
- 资源层:CPU、内存、文件的分配状态。
- 现场层:保证执行连续性的上下文。
- 通信层:与其他进程的交互手段。 这种设计使得内核能够高效地隔离、调度、保护和恢复各个进程的执行,是实现多任务并发的基石。U区(进程私有内核数据)和进程表项(全局可见信息)的分离,以及通过系统区表和进程区表实现内存区域共享的间接映射,都体现了对安全性和灵活性的精心考量。
网硕互联帮助中心





评论前必须登录!
注册