操作系统
操作系统
程序 进程 线程
1 程序
- 程序是含有指令和数据的文件,是静态的代码
2 进程
- 进程是 程序及其数据 在处理器上运行的过程,是资源分配和调度的基本单位(线程引入之前)
- 引入: 为了描述 程序动态执行过程的性质,并更好的支持并发,引入了进程
3 线程
- 引入: 解决了1、进程同一时间只能做一件事、2、进程执行时某部分阻塞了,与此部分无关的工作也被阻塞
- 调度: 线程是独立调度的基本单位、进程是资源拥有的基本单位
- 并发: 进程与线程都可以并发
- 系统开销: 进程撤销时开销大、线程撤销时开销小、且同一进程间的线程共享资源,线程间的同步与通信容易
进程调度算法:
a) 批处理系统: 用户操作少 尽可能保证吞吐量和周转时间
i. 先来先服务(FCFS):有利于长作业 不利于短作业
ii. 短作业优先(shortest job frist SJF) 长作业饿死
iii. 最短剩余时间优先(shortest remaining time next SRTN) 按剩余运行时间调度
b) 交互式系统: 存在大量用户交互,尽可能保证快速响应
i. 时间片轮转 就绪进程按FCFS排成一个队列 每次执行一个时间片
ii. 优先级调度: 为每个进程分配一个优先级
iii. 多级反馈队列:有多个就绪队列,每个就绪队列执行的时间片依次增加,每次执行时从第一个就绪队列开始,没执行完的进程会放到下一个就绪队列,这样既保证了时间短的任务优先执行,又保证了时间长的任务可运行的时间片长。
c) 实时系统: 在一个确定的时间内得到响应
进程间的通信方式 7种
a) 管道pipe 半双工通信方式 数据只能单向流动。 非命名管道只能父子进程通信, 存在内存中的文件(只能顺序读取,无格式)
b) 命名管道 可以用于非父子进程,存在实际磁盘中(只能顺序读取,无格式)
c) 信号 signal 通知接收进程某个事件已经发生 一种同步手段
d) 信号量 semaphore 计数器 控制多个进程对共享资源的访问 不能传递复杂消息 仅用于同步
e) 消息队列 message queue 消息的链表 放在内核中(可随机读取,有特定的格式)
f) 共享内存 shared memory(速度快,mmap()系统调用,Posix,System V共享内存)
g) 套接字 socket (不同主机间的 进程通信)
线程间的通信方式
- 锁: 互斥锁 条件变量 读写锁
- 信号量机制
- 信号机制
虚拟地址空间
a) 描述:处理器读取或写出内存时,使用的是虚拟地址,具体操作过程中内存管理单元(Memory Management Unit, MMU)会将虚拟地址转换成物理地址
b) 使用虚拟地址的优点:
i. 程序可使用一系列连续的虚拟地址访问物理内存中不连续的缓冲区
ii. 程序可使用虚拟地址访问大于物理内存的缓冲区,数据或代码页会根据需要在物理内存与磁盘间移动
iii. 不同进程使用的虚拟地址彼此隔离,一个进程中的代码无法更高另一个进程或操作系统正在使用的物理内存。
c) N位虚拟地址的组成:
i. p位虚拟页面偏移量 (Virtual Page Offset ,VPO)
ii. n-p位虚拟页号(Virtual Page Number,VPN)
d) 页表(缓存在内存中): 每个页表包含多个页表条目(Page Table Entry,PTE),PTE含有有效标记为和物理页号,有效标志位可代表某个虚拟页是否被缓存在物理内存中
e) 快表(Translation Lookaside Buffer,TLB):旁路缓冲区是MMU中的一个缓冲区,若PTE存在快表中,那么就不用去主存中读取页表
f) 地址翻译的步骤:
i. CPU 将虚拟地址VP交给MMU进行地址翻译(通过页号查快表)
ii. MMU传递VPN给TLB得到相应的PTE (查到后利用PTE计算出物理地址)
iii. MMU通过PTE翻译出+VPO翻译出实际的物理地址PA
iv. 高速缓存返回数据给CPU
g) 局部性原理
i. 时间局部性:某指令/数据一旦执行/访问,不久之后此指令/数据可能再次执行/访问。 原理:程序中存在循环操作。设计:近来使用的指令和数据保存到高速缓存。
ii. 空间局部性:某指令/数据与一旦被执行/访问,不久之后该指令/数据附近的指令/数据也可能也将被执行/访问。原理:指令/数据通常是顺序执行/存放的。设计:预取机制加载相邻的数据
四、 页面置换算法(地址映射时 发生缺页中断)
a) 最佳页面置换算法(Optimal OPT)理想情况,淘汰的是永远不用的页面
b) 先进先出(First In First Out FIFO) 总淘汰最先进入内存的
c) 最近最久未使用(Least Recently Used,LRU)
d) 最少使用(Least Frequently Used LFU)
协程
- 协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态。
- 协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制。因此,没有线程切换的开销,和多线程相比,线程数量越多,相同数量的协程体现出的优势越明显。
- 不需要多线程的锁机制。由于只有一个线程,也不存在同时写变量的冲突,在协程中控制共享资源不需要加锁,只需要判断数据的状态,所以执行效率远高于线程。对于多核CPU可以使用多进程+协程来尽可能高效率地利用CPU。
死锁
- 死锁是指多个进程竞争资源造成的一种互相等待的僵局,若无外力作用,这些进程都无法向前推进
用户态和内核态
系统资源是固定的,为了有效利用有限的系统资源,要给不同的操作赋予不同的权限,因此就有了用户态和内核态两个权限等级,给不同的操作分别不同的权限等级
- 用户态切换到内核态的3种方式
- 系统调用 如 malloc调用brk() mmap()系统调用分配内存
- 异常:如缺页异常
- 外围设备中断:如硬盘读写完成,系统会切换到硬盘读写中断程序进入内核态