参照这篇写的非常精彩的博客操作系统面试重难点总结 - 来写的,精炼了一下,也写了一些自己的认识,它里面的内容我也有不是很清楚的,我就不写出来了,回去再看看书再说了
处理机和处理器
学习不认真以前总是把处理器当作处理机,后来我才发现我错了。处理机不是抽象的概念,他是计算机系统的一部分,由中央处理器,主存储器,输入-输出接口组成。处理机加接外围设备就构成完整的计算机系统。它负责存储程序和数据。而处理器一般指中央处理器,CPU。也就是说处理机包含处理器,处理器是处理机的子集
操作系统的四个特性
并发:同一时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果
共享:系统中的资源可供内存中的多个并发执行的进程使用
虚拟:把一个物理上的实体,变为若干个逻辑上的对应物
异步:多道程序环境下程序的执行,允许多个程序并发执行,每个程序在何时执行,多个程序间的执行顺序以及完成每道程序所需的时间都是不确定的
操作系统的主要功能
存储管理,作业管理,设备管理,文件管理
进程的状态与转换
运行状态:进程正在运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态
就绪状态:进程准备运行。即进程得到了资源,只要获得处理器就可以运行
阻塞状态(等待状态):进程正在等待某一事件而暂停运行,也就是说他既没有资源也没有获得处理机,要想进入运行状态,就要把两样条件凑齐才行,处理机就是空闲了也不会处理阻塞状态的进程,要是得到了资源就可以进入就绪状态
进程与线程的区别
进程:当一个程序进入内存运行时,即变成了一个进程
线程:线程被称作轻量级进程,线程是进程的执行单元
当进程被初始化后,主线程就被创建了。线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程,他并不拥有系统资源,她与父进程的其他线程共享该进程所拥有的全部资源
简而言之,一个程序运行后至少有一个进程,一个进程里至少要包含一个线程
进程通信
进程通信是进程之间的信息交换,进程通信又分为低级通讯和高级通讯。
低级通信:传送的信息量较少,效率低。例如P V操作
高级通信:共享存储,消息传递,管道通讯 共享存储:相互通讯的进程有共享存储区。进程间可以通过直接读写共享存储区的变量来交互数据,这种做法效率很高,在UNIX系统中用的较多 消息传递:进程间的数据交换是以格式化的消息Message为单位的。若通信的进程之间不存在可直接访问的共享空间,则必须利用操作系统提供的消息传递方法实现进程通信。进程通过系统提供的发送消息和接收消息两个原语进行数据交换。而消息传递也分有两种情况,一种是直接通信方式:即为点到点的发送,进程在发送和接收消息时直接指明接收者或发送者进程ID发送;另一种是间接通信方式:即为进程发送信息给中转站(邮箱),再由中转站发送给接收者,所以间接通信方式也被称为信箱命名法 管道通讯:这是一种以信息流来传输的特殊通信方式。管道通信具有单向性,如果想实现双向通信只能设立第二根管道,管道通过系统调用read(), write()函数进行读写操作
进程同步
首先要明确一点。进程同步的任务是什么?进程同步的任务就是对多个相关进程在执行顺序上进行协调,使并发执行的多个进程之间可以有效的共享资源和相互合作,保证程序执行的可再现性
所有进程都应遵循以下原则:
1.空闲让进 当没有进程进入临界区时,相应的临界资源处于空闲状态,因而允许一个请求进入临界区的进程立即进入自己的临界区
2.忙则等待 当已有进程进入自己的临界区时,即相应的临界资源正被访问,因而其它试图进入临界区的进程必须等待,以保证进程互斥地访问临界资源
3.有限等待 对要求访问临界资源的进程,应保证进程能在有限时间进入临界区,以免陷入“饥饿”状态
4.让权等待 当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入忙等
死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程
死锁产生条件: 互斥条件:进程对所分配的资源进行排他性的使用 请求和保持条件:进程被阻塞的时候并不释放锁申请到的资源 不可剥夺条件:进程对于已经申请到的资源在使用完成之前不可以被剥夺 环路等待条件:发生死锁的时候存在的一个 进程-资源 环形等待链
处理死锁: 预防死锁:破坏产生死锁的4个必要条件中的一个或者多个;实现起来比较简单,但是如果限制过于严格会降低系统资源利用率以及吞吐量 避免死锁:在资源的动态分配中,防止系统进入不安全状态(可能产生死锁的状态),如银行家算法 检测死锁:允许系统运行过程中产生死锁,在死锁发生之后,采用一定的算法进行检测,并确定与死锁相关的资源和进程,采取相关方法清除检测到的死锁。实现难度较高 解除死锁:与死锁检测配合,将系统从死锁中解脱出来(撤销进程或者剥夺资源)。对检测到的和死锁相关的进程以及资源,通过撤销或者挂起的方式,释放一些资源并将其分配给处于阻塞状态的进程,使其转变为就绪态。实现难度也很高
进程调度算法
1.FCFS(first come first served) 也就是先来先服务算法,谁先排队就先执行执行谁,这个过程不会被中断,比较适合用于长作业
2.SJF(Shortest Job First) 这个是最短作业优先算法,这是对FCFS的改进,目标是减少平均周转时间,非常不适合长作业,以及难以准确估计进程的执行时间,从而影响调度性能。
3.HRRN(Highest Response Ratio Next) 这个是最高响应比优先法,响应比=(等待时间+要求服务时间)/要求服务时间。每次调度前都要计算响应比增加了系统的开销
4.RR(Round Robin) 这个是时间片轮转算法,是最简单最公平的算法,按到达的先后把进程放入队列中,然后给队首进程分配CPU时间片,时间片用完之后计时器发出中断操作,暂停当前进程并将其放到队列尾部,一直如此循环。但他也有缺点,那就是时间大小,这个很关键,偏大增大系统开销,偏小没处理完就要排到队尾等循环到他才能继续完成它未完成的部分
5.多级反馈队列 是一种CPU处理机调度算法,UNIX操作系统采取的便是这种调度算法,目前较好的调度算法设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减。优先级越高的队列分配的时间片越短,进程到达之后按FCFS放入第一个队列,如果调度执行后没有完成,那么放到第二个队列尾部等待调度,如果第二次调度仍然没有完成,放入第三队列尾部。只有当前一个队列为空的时候才会去调度下一个队列的进程
我对这些算法的看法是多用最好的算法,但也不是只用那一个算法,应该是混合着用,这样应对不同的情况
虚拟内存
根据局部性原理,程序运行时将其一部分装入内存中,其余的部分都留在外存中。如果在执行过程中发现需要的那部分没有,就将外存中需要的部分提取进内存,内存中不需要的部分放入外存中,这样节省了系统的开销