1. 操作系统的几个基本概念
- 操作系统的两个基本目标:
- 与硬件交互, 管理硬件
- 为运行在计算机上的软件提供环境
- 为了实现这种机制, 引入了两种工作模式: 用户态 和 内核态
1.1 多用户系统
- def: 一台能够独立和并发的执行分别属于两个或者多个用户的若干应用程序的计算机
- 并发: 几个程序能够同时处于活动状态并竞争各种资源
- 独立: 每个程序执行自己的任务, 不用考虑其他用户程序
- 通过使用与CPU特权模式相关的硬件保护机制, 来实现
1.2 用户和组
- 操作系统必须保证用户空间的私有部分仅仅对于其拥有者是可见的 uid
- 对于需要有选择的共享资料, 设定了组的概念 gid
1.3 进程
- def: 程序执行时候的一个实例, 或者说 是一个运行程序的执行上下文
1.4 内核体系结构
- 大部分的Unix内核采用的是单块结构, 而微内核操作系统, 只需要内核有一个很小的函数集, 通常包含几个同步原语, 一个简单的调度程序和进程间通信机制
- 微内核采用模块化方法, 可以方便的移植, 并且支持代码在运行时连接到内核, 或者从内核中解除连接
2. Unix 文件系统概述
2.1 文件
- 从用户角度来看, 文件被组织在一颗树结构的命名空间中
2.2 硬链接和软连接
- 硬链接不会增加inode, 但是会增加inode 的计数, 不能对目录进行硬链接(会把目录树变成环形图), 类似于 C++ 中的引用
- 软连接, 相当于新建了一个文件, 指向原始文件, 他会新建一个inode, 类似于 C++ 中的指针
2.3 文件类型
2.4 文件描述符和索引节点
2.5 访问权限和文件模式
- suid, sgid, sticky 标记可执行程序时候 表明, 该程序以其所有者uid 或者 guid权限 执行
2.6 文件操作的系统调用
- 文件系统是硬盘分区物理组织的用户级视图, 由于用户态进程不能直接和底层硬件交互, 所以每个实际的文件操作必须在内核态下执行
2.6.1 打开文件
2.6.2 访问打开文件
- 文件的同步问题
2.6.3 关闭文件
2.6.4 更名与删除文件
3. Unix 内核概述
3.1 进程/内核模式
- 当一个程序在用户态下执行的时候, 他不能访问内核数据结构或者内核的程序, 而在内核态下运行的时候没有这个限制
- 进程是动态的实体, 在系统内通常只有有限的生存期
- 请求内核服务的进程使用所谓的系统调用的特殊编程机制
3.2 进程实现
- 每个进程有一个进程描述符来描述当前进程的状态, (寄存器, 堆栈信息)
3.3 可重入内核
- 系统调用
- 异常处理
- 硬件中断
- 抢占式调度
3.4 进程地址空间
3.5 同步和临界区
3.5.1 非抢占式内核
- 在单处理器系统上, 中断或者异常程序不能修改的所有的内核数据结构, 内核对他们的访问都是安全的
- 一个可行的同步机制: 进入临界区前禁止抢占, 退出临界区时, 启动抢占
3.5.2 禁止中断
- 进入一个临界区前禁止所有硬件中断, 离开临界区的时候重新启动中断
3.5.3 信号量
- 信号量的本质是一个与数据结构相关的计数器, 包含一个整型变量, 一个等待进程的链表, 以及两个原子方法 down(), up()
3.5.4 自旋锁
- 如果修改数据结构所用的时间很短, 信号量是很费事的, 这时候可以考虑使用自旋锁
3.5.5 避免死锁
4. 信号与进程间通信
- IPC 通信: 信号, 信号量, 消息队列, 共享内存
5. 进程管理
- 写时复制
5.1 僵死进程
- 是指子进程退出时,父进程并未对其发出的SIGCHILD信号进行适当处理,导致子进程停留在僵死状态等待其父进程为其收尸,这个状态下的子进程就是僵死进程。
- 而如果父进程先退出, 子进程就变成孤儿进程了
5.2 进程组和登陆会话
6. 内存管理
61 虚拟内存
- 虚拟内存作为一种逻辑层, 处于应用程序的内存请求和硬件内存管理单元(MMU)之间
6.2 随机访问存储器 RAM 的使用
- 注意内存碎片
6.3 内核内存分配器
6.4 进程虚拟地址空间处理
- 请求调页技术
6.5 高速缓存
- 物理内存可以用作磁盘和其他块设备的高速缓存, 因为磁盘读取IO太慢