转载请指明出处
马上你就会看到一串长长的目录,不要害怕,其实内容并不多。
计算机系统概述
一、基本的指令周期
取指阶段–执行阶段(–中断阶段)
二、中断
中断是一种机制,即允许其它模块(I/O、存储器)在处理器正常处理过程中打断其工作。
1、中断的分类
程序中断、时钟中断、I/O中断、硬件失效中断
2、中断处理过程

3、多个中断的处理
- 顺序中断处理(禁止中断、无优先级)
- 嵌套中断处理(有优先级)
三、存储器的层次结构
- 板上存储器(寄存器–高速缓存–内存)
- 板外存储器(磁盘)
- 离线存储器(磁带)
特点:
四、高速缓存
为了解决处理器和内存速度不匹配的问题,利用局部性原理,在处理器和内存之间提供一个容量小且速度快的存储器,称为高速缓存(Cache)。用于在内存和处理器寄存器之间分段移动数据,提高数据访问的性能。(要会计算平均存取时间)
五、局部性原理
在执行程序期间,处理器的指令访存和数据访存呈现“簇”状(一组数据集合)。
操作系统概述
一、概述
操作系统是控制应用程序执行的程序,是应用程序和计算机硬件间的接口。
操作系统的三个目标:方便、有效、扩展能力
二、多道程序设计
多道程序设计是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制之下,相互穿插的运行。(要掌握多个作业并发执行时资源利用率的计算)
目的:为了让处理器和I/O设备(包括存储设备)同时保持忙状态,以实现最大效率。
三、操作系统的发展历程
- 串行处理(没有操作系统,主要问题:调度和准备时间)
- 简单批处理系统(中心思想:监控程序)
- 多道批处理系统(采用多道程序设计,提高资源(CPU)的利用率)
- 分时系统(采用多道程序设计,减小系统响应时间)
进程描述和控制
一、进程的定义和组成
1、定义
- 一个正在执行的程序
- 一个能在计算机上执行的程序实例
- 能分配给处理器并由处理器执行的实体
- 由一组执行的指令、一个当前状态和一组相关的系统资源表征的活动单元
2、组成
- 程序代码
- 相关数据
- 进程控制块(PCB)
执行上下文(进程状态):上下文包括操作系统管理进程及处理器正确执行进程所需的所有信息。
它包括各种处理器(CPU)寄存器的内容、操作系统使用的信息
二、五状态模型
新建态、就绪态、运行态、阻塞/等待态、退出态

运行–>就绪:
- 正在运行的程序已到达“允许不中断执行” 的最大时间段
- 被高优先级的进程所抢占
- 进程自愿释放对处理器的控制
运行–>阻塞:进程必须等待某些事件时(例如:I/O操作)
阻塞–>就绪:所等待的事件发生时
三、进程挂起
由于处理器远快于I/O,可能会出现内存中所有的进程都处于阻塞状态。
解决这个问题的方法之一就是交换,即把内存中某个进程的一部分或全部移到磁盘中。因此在五状态模型的基础上增多了两个挂起态:阻塞/挂起态、就绪/挂起态。
挂起进程的特点:
- 进程不能立即执行
- 该进程可能在也可能不在等待一个事件。若进程正在等待一个事件,阻塞条件不依赖于挂起条件,阻塞事件发生不会使进程立即被执行
- 为阻止进程执行,可以通过代理把这个进程置于挂起状态,代理可以是进程自己,也可以是父进程或操作系统
- 除非代理显式地命令系统进行状态转换,否则进程无法从这个状态中转移
四、操作系统的控制结构
- 内存表:用于跟踪内(实)存和外(虚)存
- I/O表:管理计算机系统中的I/O设备和通道
- 文件表:提供文件的相关信息(非全部信息)
- 进程表:管理进程
内存、I/O和文件是代表进程而被管理的,因此进程表中必须有对这些资源的直接或间接引用。
五、进程的控制结构
1、进程映像
程序、数据、栈和属性(进程控制块)的集合称为进程映像
项目 | 说明 |
---|---|
用户数据 | 用户空间中的可修改部分,包括程序数据、用户栈区域和可修改的程序 |
用户程序 | 将被执行的程序 |
系统栈 | 每个进程有一个或多个系统栈,用于保存参数、过程调用地址和系统调用地址 |
进程控制块 | 操作系统控制进程所需要的数据 |
2、进程控制块(PCB)
信息分为三类:
- 进程标识信息
进程ID、父进程ID、用户ID
- 进程状态信息
用户可见寄存器、控制和状态寄存器(程序状态字PSW)、栈指针
- 进程控制信息
调度和状态信息、数据结构、进程通信、进程特权、存储管理、资源的所有权和使用情况
六、进程控制
1、两种模式
- 用户模式(用户态):运行用户程序
- 系统模式、控制模式或内核模式(系统态、控制态或内核态):执行特权指令
处理器如何获知和改变所处模式?
程序状态字中有表示执行模式的位,并且该位应某些事件要求而改变
2、进程创建
- 分配唯一进程标识符
- 分配空间
- 初始化进程控制块
- 设置正确的连接
- 创建或扩充其它数据结构
当操作系统为另一个进程的显式请求创建一个进程时,这个动作称为进程派生。
(进程间的派生:父进程派生子进程)
3、进程切换和模式切换
(1)、进程切换
进程切换是让处于运行态的进程中断运行,让出处理器,让操作系统指定的新进程运行。被中断进程的上下文环境需要保存。
切换时机(但中断不一定会发生进程切换):
- 系统中断
- 中断(与外部事件相关)
- 时钟中断
- I/O中断
- 内存失效
- 陷阱(进程产生的错误或异常条件相关)
- 中断(与外部事件相关)
- 系统调用
(2)、模式切换
出现中断时,处理器会做如下工作:
- 把程序计数器置成中断处理程序的开始地址
- 从用户态切换到内核态,以便中断处理代码包含特权指令
此时,将已中断进程的上下文保存到已中断程序的进程控制块中,保存的内容包括:
- 所有中断处理可能改变的信息
- 恢复被中断程序时所需要的信息
模式切换可以不改变正处于运行态的进程状态,保存和恢复上下文环境开销小
进程切换涉及进程状态的变化,开销较大。
4、额外知识点
UNIX中,父进程通过系统调用fork()创建子进程(在父进程的内核模式下完成),之后可能进行下面三种操作之一:
- 在父进程中继续执行。控制权返回到用户态下父进程调用fork的位置。
- 处理器控制权交给子进程。子进程开始执行代码,执行点与父进程相同,即在fork调用的返回处。
- 控制转交给另一个进程。父进程和子进程都置于就绪态。
从fork中返回时,测试返回参数:
- 若值为0,则是子进程,可以转移到相应的用户程序中继续执行
- 若值不为0(子进程的PID),则是父进程,继续执行主程序
线程
进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
一、线程的优点
- 在已有进程中创建一个新线程的时间,远少于创建一个全新进程的时间
- 终止线程要比终止进程所花时间少
- 同一进程内线程间切换的时间,要少于进程间切换的时间
- 线程提高了不同执行程序间通信的效率
二、线程的状态
主要状态有:就绪态、运行态、阻塞态
挂起态对线程没有意义。当进程被换出,则所有的线程也被换出。
(问题:一个线程的阻塞是否会导致整个进程的阻塞?这得看线程的类别)
三、线程的分类
- 用户级线程(ULT)
- 内核级线程(KLT)
1、用户级线程(ULT)
线程的创建、调度、同步,由所属进程用户空间的线程库实现,对于内核几乎是透明的,内核以进程为单位进行调度。
优点:
- 线程切换时,不需要进行用户态/内核态切换,节省开销
- 每个进程可以有属于自己的线程调度算法
- ULT可以在任何操作系统中运行,不需要修改底层内核。线程库是供所有应用程序共享的一组应用级函数
缺点:
- 当某个进程中的线程进行系统调用(例如I/O)时,该进程也会阻塞(可以用“套管”技术解决)
- 内核一次只把一个进程分配给一个处理器,因此一个进程中只能有一个线程可以执行,相当与在进程内实现了应用级多道程序设计
2、内核级线程(KLT)
管理线程的工作都由内核完成。
优点(克服了用户级线程的两个缺点):
- 内核可以同时把一个进程中的多个线程调度到多个处理器
- 当进程中的线程被阻塞时,内核可以调度同一个进程中的另一个线程,而不阻塞进程
主要缺点:
- 线程切换时,要进行用户态/内核态切换
并发性:互斥和同步
一、基本概念
- 原子操作:保证指令序列要么作为一个组来执行,要么都不执行。没有其他进程能看到其中间状态或能中断此操作。原子性保证了并发进程的隔离。
- 临界资源:一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机、磁带机等。诸进程间应采取互斥方式,实现对这种资源的共享。
- 临界区:一段代码。在这段代码中进程将访问共享资源,当一个进程已经在这段代码中运行时,另外一个进程就不能在这段代码中执行。(互斥)
- 互斥:当一个进程在临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源。会产生两个控制问题:死锁和饥饿。
- 并发和并行:并发是指单处理器多道程序设计系统中,进程的交替执行(先后次序);并行是指在多处理器系统中,不仅可以交替执行进程,还可以重叠执行进程(同时执行)。
- 信号量:不要求忙等(自旋等待)的同步互斥工具。
二、互斥
1、互斥的要求
- 必须强制实施互斥:在与相同资源或共享对象的临界区有关的所有进程中,一次只允许一个进程进入临界区
- 一个在非临界区停止的进程不能干涉其他进程
- 绝不允许出现需要访问临界区的进程被无限延迟的情况,即不会死锁或饥饿
- 当没有进程在临界区时,任何需要进入临界区的进程必须能够立即进入
- 对相关进程的执行速度和处理器的数目没有任何要求和限制
- 一个进程驻留在临界区中的时间必须是有限的
2、实现互斥的方法
- 硬件方法
- 中断禁用(单CPU情况下)
- 专用机器指令(多CPU情况下,使用忙等,可能导致饥饿和死锁)
- 操作系统或程序设计语言提供某种级别的支持
- 信号量
- 管程
- 消息传递
三、信号量
semWait:该进程请求分配一个资源,使信号量减1。若信号量小于0,则该进程进入阻塞队列。
semSignal:该进程释放一个资源,使信号量加1。若信号量小于或等于0,则从阻塞队列中解除被阻塞的进程。信号量的初始值为零或正数。当为负数时,其值等于正在等待解除阻塞的进程数量。
原语定义:
semWait和semSignal必须成对出现。用于互斥时,位于同一个进程内;用于同步时,交错出现在两个合作进程内。
多个semSignal操作次序可以随意,多个semWait操作次序不能颠倒,否则可能死锁。如果要实现互斥,信号量需要初始化为1。
四、有限缓存的生产者/消费者问题
互斥、同步问题
const int sizeofbuffer = /*缓冲区大小*/
semaphore s = 1, n = 0, e = sizeofbuffer;
//n为缓冲区数据项的个数
void producer() {
while(true) {
produce();
semWait(e); //申请空缓冲
semWait(s);
append(); //互斥操作
semSignal(s);
semSignal(n);
}
}
void consumer() {
while(true) {
semWait(n);
semWait(s);