Unix内核概述
Unix内核提供了应用程序可以运行的环境,因此,内核必须实现一组服务及相应的接口。应用程序使用这些接口而不会跟硬件资源直接交互。
- 进程/内核模式
- 用户态和内核态
- 进程是动态的实体,在系统内通常只有有限的生存期
- 内核本身不是一个进程,而是进程的管理者
-请求内核服务的进程使用系统调用 - 除了用户进程,还有些称为内核线程的特权进程
- 以内核态运行在内核地址空间
- 不与用户交互,不需要终端设备
- 通常系统创建时启动,然后一直处于活跃状态
- 激活内核例程的几种方式
- 系统调用
- 正在执行进程的CPU发出一个异常信号
- 外围设备向CPU发出一个中断信号
- 内核线程被执行
进程实现
- 每个进程有一个进程描述符(包含有关进程的当前状态的信息)
当内核暂停一个进程执行时,把几个相关处理器寄存器保存在进程描述符中
- 程序计数器PC,栈指针sp寄存器
- 通用寄存器
- 浮点寄存器
- 包含CPU状态信息的处理器控制寄存器(处理器状态字)
- 跟踪进程对RAM访问的内存管理寄存器
内核恢复一个进程执行时,用进程描述符中的合适字段装载CPU寄存器
- 等待状态可能会有很多,有进程描述符队列实现、
可重入内核
- 所有Unix内核都是可重入的(若干个进程可以同时在内核态下执行)
- 可重入的一种方式是编写函数,至修改局部变量。
- 内核也可以包含非重入函数,利用锁机制来保证有且只有一个进程执行非重入函数
- 内核控制路径(指令序列)
- 内核控制路径交错执行
进程地址空间
- 每个进程运行在自己的私有地址空间
- 用户态下涉及私有栈、数据区和代码区
- 内核态下,进程访问内核的数据区和代码区,但使用另外的私有栈
- 每个内核路径都引用自己的私有内核栈
有时候也会共享部分地址空间
同步和临界区
一致性状态
- 抢占式和非抢占式内核
- 禁止中断
信号量
- 组成:一个整数变量、一个等待进程的链表和两个原子方法(down()和up())。
自旋锁(检查信号量耗时多,对于时间较短的操作较低效)
- 跟信号量很相似
- 但是没有进程链表
- 但处理器环境下无效
- 避免死锁
信号和进程间通信
- 信号量
- 消息队列
- 共享内存
- IPC资源是持久不变的
进程管理
- fork()和_exit()系统调用分别创建一个新进程和终止一个进程
- exec()类系统调用装入一个新程序
- fork()的进程是父进程,而新进程是它的子进程。
- 父子进程可以互相找到对方
- 每个进程的数据结构中有两个指针,一个指向父,一个指向子
- 写时复制技术
僵死进程
- 父进程等待子进程结束,wait4()系统调用
- init的特殊系统进程,系统初始化时创建
- 当一个进程终止时,内核改变它的所有子进程的进程描述符指针,成为init的孩子
进程组和登录会话
- 进程组(作业的抽象)
- 登录会话通常是shell进程为用户创建的第一条命令
- 一个登录会话可以让几个进程组同时处于活动状态
- bg和fg命令的使用
内存管理
重点
- 虚拟内存
- 随机访问存储器RAM的使用
- 内核内存分配器KMA
- 进程虚拟地址空间处理,调页分配策略
- 高速缓存
- 设备驱动程序