第一章 计算机系统概述
操作系统概念:
操作系统是控制应用程序执行的程序,是应用程序和计算机硬件间的接口
中断:
处理器接收到一个中断请求信号后,处理器做出响应暂停当前程序的处理,转去处理服务于特定I/O设备的程序
中断分类:
程序中断(算术溢出、除数为0)
时钟中断(定时器中断)
I/O中断(I/O操作)
硬件失效中断(拉闸)
中断的目的:
处理器可以在I/O操作的执行过程中执行其他指令
中断的两种处理方式:
正在处理一个中断时,禁止再发生中断(顺序中断)
定义中断优先级,允许高优先级打断低优先级中断的运行(嵌套中断)
局部性原理
引入目的:为了解决内存和处理器传输速度不匹配
解决办法:在内存和处理器之间提供一个容量小且速度快的存储器(高速缓存)
执行I/O操作的三种技术:
可编程I/O、中断驱动I/O、直接内存存取(DMA)
第二章 操作系统的概述
操作系统的五大功能:
存储器管理、处理器管理、设备管理、文件管理、接口管理
操作系统的发展史:
串行处理、简单批处理、多道批处理、分时系统(多个用户分享处理器时间)
两种模式:
用户模式:有些内存区域是受保护的,特权指令不允许执行
内核模式:不仅可以执行特权指令、而且还可以访问受保护的内存区域
引入两种模式的原因:
保护操作系统和重要的操作系统表不受用户程序干扰
操作系统的四个关键理论进展:
进程、内存管理、信息保护和安全、调度和资源管理
线程和进程的区别:
线程:可分配的工作单元。它包括处理器上下文环境和栈中自身的数据区域。线程顺序执行且可以中断,因此处理器可以转到另一个线程。
进程:一个或多个线程和相关系统资源的集合。它严格对应于一个正在执行的程序的概念,通过一个应用程序分解成多个线程
第三章 进程描述和控制
什么是进程:
进程是一个动态概念,指执行中的程序,有生命周期,是操作系统进行资源分配和调度的基本单位
引入进程的原因:
为了使程序能够并发执行,对并发执行的程序加以描述和控制
理解PCB
进程控制块由操作系统创建和管理
例:进程中断时,操作系统会把程序计数器和处理器寄存器(上下文数据)保存到进程控制块的相应位置
三态图、五态图、七态图
就绪态、运行台、阻塞态
新建态、就绪态、运行态、阻塞态、退出态
新建态、就绪挂起态、阻塞挂起态、阻塞态、就绪态、运行态、退出态
进程映像
程序、数据、栈和属性的集合(进程控制块)称为进程映像
何时切换进程
中断、陷阱、系统调用
中断的三个例子:时钟中断、I/O中断、内存失效
模式切换与进程切换的区别:
进程切换需要操作系统获得处理器的控制权
模式切换:不需要改变进程的当前状态
第四章 线程
进程与线程可以:1:1、M:1、1:N、M:N
多线程指操作系统在单个进程内支持多个并发执行路径的能力
线程可分为:用户级线程和内核级线程
进程和线程简单的区别:前者涉及资源的所有权,后者涉及程序的执行
第五章:并发性:互斥和同步
互斥:
当一个进程在临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源的情形
实施互斥产生了两个额外问题:
死锁:两个或两个以上的进程因每个进程都在等待其他进程做完某些事情而不能继续执行的情形
饥饿:一个可运行进程尽管能继续执行,但被调度程序无限期地护士,而不能被调度执行的情形
临界区:
是一段代码,在这段代码中进程将访问共享资源,当另一个进程已在这段代码中运行时,这个进程就不能在这段代码中执行
临界资源:
在执行过程中,每个进程都给该I/O设备发命令,接受状态信息,发送数据和接受数据,这类资源就叫临界资源
并发:
在单处理器多道程序设计系统中,进程会被交替地执行,因而表现出一种并发执行的外部特征
信号量:
用于进程间传递信号的一个整数值
在信号量上只可进行三种操作:初始化、递增、递减
递减用于阻塞一个进程,递增用于解除一个进程的阻塞
P(s)?–;s<0阻塞(绝对值为正在等待解除阻塞的进程的数量)
V(s):s++;s<=0唤醒
初始化为非负数,加加为负就阻塞,减减不正就唤醒
信号量定义
struct semaphore{
int count;
queueType quene;
};
void semWait(semaphore s){
s.count--;
if(s.count<0){
/*把当前进程插入队列;
阻塞当前进程;*/
}
}
void semSignal(semaphore s)
{
s.count++;
if(s.count<=0){
/*把当前进程P从队列中移除;
把进程P插入就绪队列;
*/
}
}
生产者消费者问题
满不存、空不取
const int sizeofbuffer=5 //缓冲区大小
semaphore s = 1,n = 0, e = sizeofbuffer;
void producer()
{
while(true){
produce();
semWait(e); //满不存
semWait(s);
append();
semSignal(s);
semSignal(n);
}
}
void consumer()
{
while(true){
semWait(n); //空不取
semWait(s);
take();
semSignal(s);
semSignal(e);
consumer();
}
}
void main(){
parbegin(producer, consumer);
}
PPVV
P操作不可以颠倒否则死锁
V操作可以颠倒无影响
第六章 并发:死锁和饥饿
死锁定义:
一组相互竞争系统资源或进行通信的进程间的“永久阻塞”。
死锁产生的原因:
竞争资源、进程在运行的过程中请求和释放资源的顺序不当
死锁的四个条件:
互斥、占有且等待、不可抢占(必要)、循环等待(充要)
处理死锁的三种办法:
预防死锁(消除死锁4个条件中的某个条件)
避免死锁(基于资源分配的当前状态做动态选择,用某种方法防止死锁进入不安全状态)银行家算法
检测死锁(检测死锁的存在并从死锁中恢复)
银行家算法
首先明确安全状态和不安全状态
安全状态:至少有一个资源分配序列不会导致死锁(所有进程都能运行直到结束)
不安全状态:导致死锁
列出Claim Allocation Need Resource Available
只要有一种安全状态就可以
哲学家就餐问题
圆桌派5个人5根筷子
解决办法:
1、房间让放四个人进来,这样至少有一个人可以就餐
2、只有双手都有筷子时才可以拿起筷子
3、奇数号人先拿左边筷子后拿右边筷子,偶数号相反
第七章 内存管理
页框:内存中固定长度的块
页:固定长度的数据块,数据页可以临时复制到内存的页框中
段:变长数据块
内部碎片:由于装入数据块小于分区大小,因而导致分区内部存在空间浪费
外部碎片:当空闲内存被分为小区块但没有一块可以大到被内存使用时产生
为什么需要重定位:
通常情况下,并不能事先直到在某个程序执行期间会有那个程序驻留在主存中。此外还希望通过提供一个巨大的就绪进程池,能够把活动进程换入和换出主存,以便使处理器的利用率最大化,这两种情况下,进程在主存中的确切位置是不知道的,所以需要重定位。
伙伴系统:
理解计算过程
固定大小的块根据请求划分成为二叉树表示
内存动态分区的放置算法:
最佳适配、首次适配和下次适配
最佳适配选择与要求大小最接近的块
首次适配:从头扫描内存,选择大小足够的第一个可用块
下次适配:从上一次放置的位置开始扫描内存,选择下一个大小足够的可用块
分页式内存管理
页表:给出了进程的每页所对页框的位置
逻辑地址(相对地址):包括页号和在该页的偏移量
物理地址:页框号、偏移量
相对地址=页号(左)+偏移量(右)
分页:页框号+偏移量
分段:物理地址=逻辑地址+起始物理地址
例:系统使用简单分页,内存大小为232字节,页大小为210字节,逻辑地址空间包含2^16页。
a.逻辑地址多少位:216*210=226比特
b.一个页框有多少字节:210字节
c.物理地址中的多少位是页框号:32-10=22位
d.页表中有多少表项:216项
e.假设每个页表项中含一位有效位,每个页表项有多少位:22+1=23位
例:在使用下列内存管理方案的情况下,分别写出逻辑地址0001010010111010转换为物理地址的过程
分页:页面大小为256-address,也表中的页框号是页号的1/4
256=28偏移量为8位,剩下八位为页号,页号为20,页框号5
物理地址:0000010110111010
第八章 虚拟内存
虚拟内存术语:
在存储分配机制中,尽管备用内存是主存的一部分,但它也可被寻址。程序引用内存使用的地址与内存系统用于识别物理存储站点的地址是不同的,程序生成的地址会自动转换为及其地址。虚拟存储的大小受计算机系统寻址机制和可用的备用内存量的限制,而不受主存储位置实际数量的限制
局部性原理是虚拟存储系统的理论基础:
时间局部性和空间局部性
常驻集:进程执行的任何时候都在内存的部分称为进程的常驻集
TLB:用于改善虚拟地址到物理地址转换速度的高速缓存
页面置换算法:
OPT:置换下次访问距当前时间最长的页
LRU:置换最近最少使用的页
FIFO:先进先出
系统颠簸
刚被淘汰的页面不久又被调入,而调入不久后又被淘汰,如此反复,使系统把大部分时间用在页面的调入和换出上,这种现象称为颠簸