操作系统知识点总结

1.进程和线程以及他们的区别

  • 进程是对运行时程序的封装, 是系统进行资源调度和分配的基本单位, 实现了操作系统的并发
  • 线程是进程的子任务 是CPU调度和分派的基本单位

一个程序至少有一个进程, 一个进程至少有一个线程, 线程依赖于进程而存在

进程在执行过程中拥有独立的内存单元, 而多个线程共享进程的内存

2.进程间通信的几种方式

  • 管道(pipe) 及命名管道(named pipe): 管道可用于具有亲缘关系的父子进程间的通信, 有名管道除了具有管道所具有的功能外, 它还允许无亲缘关系进程间的通信
  • 信号(signal):信号是一种比较复杂的通信方式, 用于接受进程某个事件已发生
  • 消息队列:消息队列是消息的链接表, 它克服了上两种通信方式中信号量有限的缺点, 具有写权限的进程可以按照一定的规则向消息队列中添加新信息, 对消息队列有读权限的进程则可以从消息队列中读取信息
  • 共享内存:可以说这是最有用的进程间通信方式。 它使得多个进程可以访问同一块内存空间, 不同进程可以及时看到对方进程中对共享内存中数据的更新。 这种方式需要依赖某种同步操作, 如互斥锁和信号量等。
  • 信号量:主要作为进程之间及同一种进程的不同线程之间的同步和互斥手段
  • 套接字:这是一种更为一般的进程间通信机制, 它可用于网络中不同机器之间的进程间通信, 应用非常广泛

3.线程同步的方式

  • 互斥量(synchronized/Lock): 采用互斥对象机制, 只有拥有互斥对象的线程才有访问公共资源的权限。 因为互斥对象只有一个, 所以可以保证公共资源不会被多个线程同时访问
  • 信号量(Semphare): 它允许同一时刻多个线程访问同一资源, 但是需要控制同一时刻访问此资源的最大线程数量
  • 事件(信号)(Wait/Notify): 通过通知操作的方式来保持多线程同步, 还可以方便的实现多线程优先级的比较操作

4.什么是死锁?死锁产生的条件?

  • 死锁:在两个或者多个并发进程中。 如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源, 在为改变这种状态之前都不能向前推进, 称这一组进程产生了死锁。 通俗的讲, 就是两个或多个进程无限期阻塞、 相互等待的一种状态
  • 死锁产生的必要条件(4个):
  1. 互 斥: 至少有一个资源必须属于非共享模式, 即一次只能被一个进程使用; 若其他申请使用该资源, 那么申请进程必须等到该资源被释放为止
  2. 占有并等待: 一个进程必须占有至少一个资源并等待另一个资源, 而该资源为其他进程所占有
  3. 非抢占: 进程不能被抢占, 即资源只能被进程在完成任务后自愿释放
  4. 循环等待: 若干进程之间形成一种头尾相接的环形等待资源关系

5.死锁的处理基本策略和常用方法有哪些?

 预防死锁避免死锁检测死锁解除死锁鸵鸟算法(把头埋在沙里, 假装根本没有问题发生)

6.死锁预防的基本思想是什么?

只要确保死锁发生的四个必要条件中至少有一个不成立, 就能预防死锁的发生 

 具体方法:

  • 打破互斥条件: 允许进程同时访问某些资源。 但是, 有些资源是不能被多个进程所共享的, 这是由资源本身属性所决定的, 因此, 这种办法通常并无实用价值
  • 打破占有并等待条件: 可以实行资源预先分配策略(进程在运行前一次性向系统申请它所需要的全部资源, 若所需全部资源得不到满足, 则不分配任何资源, 此进程暂不运行; 只有当系统满足当前进程所需的全部资源时, 才一次性将所申请资源全部分配给该进程)或者只允许进程在没有占用资源时才可以申请资源(一个进程可申请一些资源并使用它们, 但是在当前进程申请更多资源之前, 它必须全部释放当前所占有资源)。但是这种策略也存在一些缺点:在很多情况下, 无法预知一个进程执行前所需的全部资源, 因为进程是动态执行的, 不可预知的; 同时, 会降低资源利用率, 导致降低了进程的并发性
  • 打破非抢占条件:允许进程强行从占有者那里夺取某些资源。 也就是说当一个进程占了一部分资源, 在其中请求新的资源且得不到满足, 它必须释放所有占有的资源以使其它线程使用, 这种预防死锁的方式实现起来困难, 会降低系统性能
  • 打破循环等待条件:实行资源有序分配策略。 对所有资源排序编号, 所有进程对资源的请求必须严格按资源序号递增的顺序提出, 即只用占用了小号资源才能申请大号资源, 这样就不会产生环路, 预防死锁的发生

7.死锁避免的基本思想是什么?

死锁避免的基本思想是动态地检测资源分配状态, 以确保循环等待条件不成立, 从而确保系统处于安全状态。 所谓的安全状态是指:如果系统能按某个顺序为每个进程分配资源, 那么系统状态是安全的, 换句话说就是, 如果存在一个安全序列, 那么系统处于安全状态。 资源分配图算法银行家算法是两种经典的死锁避免算法, 其可以确保系统始终处于安全状态。 其中, 资源分配图算法应用场景为每种资源类型只有一个实例(申请边, 分配边, 需求边, 不形成环在允许分配) 而银行家算法(现代操作系统第四版P257)应用于每种资源类型可以有多个实例的场景

8.死锁解除的常用方法是什么?

  • 进程终止和资源抢占

所谓进程终止是指简单地终止一个或多个进程以打破循环等待, 包括两种方式:终止所有死锁进程和一次只终止一个进程直到取消死锁循环为止

所谓资源抢占是值从一个或多个死锁进程那里抢占一个或多个资源, 此时必须考虑三个问题:

  1. 选择一个牺牲品
  2. 回滚:回滚到安全状态
  3. 饥饿:在代价因素中加上回滚次数, 回滚的越多则越不可能继续被作为牺牲品。 避免一个进程总是被回滚

 9.进程有哪几种状态?

  • 就绪状态:进程已获得除处理机意外的所需资源待分配处理机资源
  • 运行状态:占用处理机资源运行, 处于此状态的进程数小于等于CPU数
  • 阻塞状态:进程等待某种条件, 在条件满足之前无法执行

10.线程有哪几种状态?

  • 就绪(Runnable): 线程准备运行, 不一定立马就能开始执行
  • 运行中(Running):进程正在执行线程的代码
  • 等待中(Waiting):线程处于阻塞的状态, 等待外部的处理结束
  • 睡眠中(Sleeping):线程被强制睡眠
  • I/O阻塞(Blocked on I/O):等待I/O操作完成
  • 同步阻塞(Blocked on Synchronization):等待获取锁
  • 死亡(Dead):线程完成了执行

11.分页和分段有什么区别(内存管理)?

段式存储管理是一种符合用户视角的内存分配管理方案。 在段式存储管理中, 将程序的地址空间划分为若干段堆栈段; 这样每个进程有一个二维地址空间相互独立, 互不干扰。段式管理的优点是:没有内碎片(因为段大小可变, 改变段大小来消除内碎片) 。 但段换入换出时, 会产生外碎片(比如4K的段换5K的段, 会产生1K的外碎片)

页式存储管理方案是一种用户视角内存与物理内存相分离的内存分配管理方案。 在页式存储管理中, 将程序的逻辑地址分为固定大小的页(Page), 而物理内存划分为同样大小的帧, 程序加载时, 可以将任意一页放入内存中任意一个帧, 这些帧不必连续, 从而实现了离散分离。 页式存储管理的优点是:没有外碎片(因为页的大小固定), 但会产生内碎片(一个页可能填充不满)

两者不同点:

  • 目的不同:分页是由于系统管理的需要而不是用户的需要, 它是信息的物理单位; 分段的目的是为了更好地满足用户的需要, 它是信息的逻辑单位, 它含有一组其意义相对完整的信息
  • 大小不同:页的大小固定且由系统决定, 而段的长度却不固定, 由其所完成的功能决定
  • 地址空间不同:段向用户提供了二维地址空间; 页向用户提供的是一维地址空间
  • 信息共享:段是信息的逻辑单位, 便于存储保护和信息的共享, 页的保护、共享收到限制
  • 内存碎片:页式存储管理的优点是没有外碎片(因为页的大小固定), 但会产生内碎片(一个页可能填不满), 段式管理的优点是没有内碎片(段大小可变, 改变段大小来消除内碎片), 但段换入换出时会产生外碎片

12.操作系统中进程调度策略有哪几种?

  • FCFS(先来先服务, 队列实现, 非抢占的):先请求CPU的进程先分配到CPU
  • SJF(最短作业优先调度算法):平均等待时间最短, 但难以知道下一个CPU区间长度
  • 优先级调度算法(可以是抢占的, 也可以是非抢占的):优先级越高的越先分配到CPU相同优先级先到先服务, 存在的主要问题是:低优先级进程无穷等待CPU, 会导致无穷阻塞式饥饿,解决方案:老化(随着时间的推移, 那些越老的进程优先级反而越高)
  • 时间片轮转调度算法(可抢占的):队列中没有进程被分配超过一个时间片的CPU时间, 除非它是唯一可运行的进程。 如果进程的CPU区间超过了一个时间片, 那么该进程就被抢占并放回就绪队列
  • 多级队列调度算法:将就绪队列分成多个独立的队列, 每个队列都有自己的调度算法, 队列之间采用固定优先级抢占调度, 其中, 一个进程根据自身属性被永久地分配到一个队列中
  • 多级反馈队列调度算法:与多级队列调度算法相比, 其允许进程在队列之间移动, 若进程使用过多CPU时间, 那么它会被转移到更低的优先级队列, 在较低优先级队列等待时间过长的进程会被转移到更高优先级队列, 以防止饥饿发生

 13.进程同步的机制有哪些?

原子操作信号量控制自旋锁管理会合、分布式系统

14.虚拟内存是什么?

内存的发展历程:没有内存抽象--有内存抽象--连续内存分配--不连续内存分配

虚拟内存允许执行进程不必完全在内存中 。虚拟内存的基本思想:每个进程拥有独立的地址空间, 这个空间被分为大小相等的多个块, 称为(Page), 每个页都是一段连续的地址。 这些页被映射到物理内存, 但并不是所有的页都必须在内存中才能运行程序。 当程序引用到一部分在物理内存中的地址空间时, 由硬件立即进行必要的映射;当程序引用一部分不在物理内存中的地址空间时, 由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。 这样, 对于进程而言, 逻辑上似乎有很大的内存空间, 实际上其中一部分对应物理内存上的一块(称为帧, 通常也和帧大小相等), 还有一些没加载在内存中的对应在硬盘上,注意:请求分页系统, 请求分段系统和请求段页式系统都是针对虚拟内存的, 通常请求实现内存与外存的信息置换,虚拟内存实际上可以比物理内存大。 当访问虚拟内存时, 会访问内存管理单元去匹配对应的物理地址, 如果虚拟内存的页并不存在于物理内存中会产生缺页中断, 从磁盘取得缺的页放入内存, 如果内存已满, 会根据某种算法将磁盘中的页换出

15.页面置换算法有哪些?

  • FIFO先进先出算法:比如作业调度(实现简单)
  • LRU(least recently use)最近最少使用算法:根据使用时间到现在的长短来判断
  • OPT(optimal replacement)最优置换算法:理论的最优,就是要保证置换出去的页是不再被使用的页, 或者是实际内存中最晚使用的算法
  • LFU(least frequently use)最少使用次数算法:根据使用次数来判断

16.虚拟内存的应用与优点有哪些?

虚拟内存很适合在多道程序设计系统中使用, 许多程序的片段同时保存在内存中。 当一个程序等待它的一部分读入内存时, 可以把CPU交给另一个进程使用。

  • 在内存中可以保留多个进程, 系统并发提高
  • 解除了用户与内存之间的紧密约束, 进程可以比内存的全部空间还大 

17.颠簸是什么?(抖动) 

颠簸本质上是指频繁的页调度行为, 具体来讲, 进程发生缺页中断,这时,必须置换某一页。 然而, 其他所有的页都在使用, 它置换一个页, 但又立刻再次需要这个页。因此, 会不断产生缺页中断, 导致整个系统的效率急剧下降, 这种现象称为颠簸

18.如何解决内存颠簸(抖动)?

  • 如果是因为页面替换策略失误, 可以修改替换算法来解决这个问题
  • 如果是因为运行的程序太多, 造成程序无法同时将所有频繁访问的页面调入内存, 则要降低多道程序的数量
  • 否则,终止该进程增加物理内存容量 

19.局部性原理是什么?

  •  时间上的局限性:最近被访问的页在不久的将来还会被访问
  • 空间上的局限性:内存中被访问的页周围的页很可能被访问
全部评论

相关推荐

2 7 评论
分享
牛客网
牛客企业服务