- 进程和线程
- 进程是系统中能独立运行的基本单位,系统资源分配和调度的基本单位,由一组机器指令、数据和堆栈组成,进程包括进程堆栈,文本段,数据段,堆。
- 线程是CPU调度和分派的基本单位。一个线程包括线程ID、程序计数器寄存器和堆栈。一个进程能有多个线程。线程能共享同一个进程中的代码段、数据段和其他操作系统资源。
- 线程同步的方式
- 信号量:使用一个计数器来限制同时访问资源的线程数。
- 互斥锁:只允许一个线程持有互斥对象。
- 事件(信号):允许一个线程在处理完任务后,主动唤醒另一个线程执行任务。
- 进程的通信方式
主要分为:管道、系统IPC(包括消息队列、信号量、共享内存、信号)、SOCKET
- 管道:普通管道是一种半双工的通信方式,数据只能单向流动,通常在父子进程之间使用。命名管道也是半双工的通信方式,允许无亲缘关系的进程间的通信,通信可以是双向的。流管道:可以双向传输。
- 进程调度策略
- FCFS(先来先服务):先请求CPU的进程先分配CPU
- SJF(最短作业优先调度算法):平均时间最短,但难以知道下一个CPU区间长度
- 优先级调度算法(可以是抢占的,也可以是非抢占的):优先级越高越先分配到CPU,相同优先级先到先服务,存在的问题是:优先级低的进程无穷等待CPU,导致无穷阻塞或饥饿;解决方法:老化
- 时间片轮转调度算法(可抢占的):队列中没有进程被分配超过一个时间片的CPU时间,除非它是唯一可以运行的进程。如果进程的CPU区间超过了一个时间片,那么该进程就会被抢占并放回就绪队列
- 多级队列调度算法:将就绪队列分成多个独立的队列,每个队列有自己的调度算法,队列之间固定优先级抢占调度。其中,一个进程根据自身属性被永久分配到一个队列中。
- 多级反馈队列调度算法:与多级队列调度算法相比,其允许进程在队列之间移动:如果进程使用过多的CPU时间,那么它会被转移到优先级更低的队列;在较低优先级队列等待时间过长的进程会被转移到优先级更高的队列,以防止饥饿发生。
进程同步机制
临界区、互斥量、信号量、事件死锁
死锁的概念:在两个或多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放他们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的将,就是两个或多个进程无限期的阻塞、相互等待。
死锁产生的四个必要条件:
1.互斥:至少有一个资源必须属于非共享模式,即一次只能被一个进程使用;若其他进程申请必须等到该资源被释放为止。
2.占有并等待:一个进程至少占有一个资源,并等待另一个资源,而该资源为其他进程所占有。
3.非抢占:进程不能被抢占,即资源只能被进程在完成任务后自愿释放
4.循环等待:若干进程之间形成一种头尾相接的环形等待资源关系死锁的处理基本策略
解决死锁的基本方法主要有 预防死锁、避免死锁、检测死锁、解除死锁
- 页面置换算法
- FIFO先进先出算法
- LRU(Least recently use)最近最少使用算法:根据使用时间到现在多久来判断
- LFU(Least frequentlu use)最少使用次数算法:根据使用次数来判断
- OPT(Optimal replacement)最优置换算法:
什么是虚拟内存
虚拟内存允许执行进程不必完全在内存中。虚拟内存的主要思想:每个进程拥有独立的空间,这个空间被分为大小相等的多个块,称为页,每个页是一段连续的地址。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分不在物理内存中的地址时,操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。对于进程而言,逻辑上似乎有很大的内存空间,实际上其中一部分在硬盘上,在使用到的时候操作系统才会加载到内存中。虚拟内存的优点和引用
虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。虚拟内存的好处:
- 在内存中可以保留多个进程,系统并发程度高
- 解决了用户与内存之间的紧密约束,进程可以比内存的全部空间还大