【计算机基础】操作系统常见问答

2022-03-31 10:44:16 浏览数 (1)

32和64位系统?

操作系统只是硬件和应用软件之间的一个平台。32位操作系统针对32位的CPU设计。64位操作系统针对的64位的CPU设计。

寄存器字长与分页地址关系:寄存器单位是字(word),CPU一次处理一个字长的信息。寄存器也存储内存地址,那么,CPU一次可以寻址的长度就是寄存器存储的一个字长单位的长度的地址,又因为内存地址的单位是字节B,那么,例如32位的机器,一次可寻址32位的内存地址。

进程线程

  1. 系统资源分配的单位:进程是对运行时程序的封装,是系统资源分配的基本单位,实现操作系统的并发;
  2. CPU调度的单位:线程是进程的子任务,是CPU调度的基本单位,实现进程内部的并发;
  3. 执行从属关系:一个程序至少有一个进程,一个进程至少有一个线程,线程依赖于进程而存在;
  4. 资源从属关系:线程的独占资源很少,线程可以共享进程的资源,并且相同进程的线程切换不会引起进程切换。资源从属关系:线程的独占资源很少,线程可以共享进程的资源,并且相同进程的线程切换不会引起进程切换。
  5. 上下文切换开销:进程切换需要保存运行现场到上一个进程的进程控制块,再将下一个进程的进程控制块信息设置到运行现场。由于进程是资源分配的基本单位,这种切换的耗时大。而线程切换时只需要保存和设置少量的寄存器信息。

进程状态

  • 就绪:进程已分配到除CPU以外的所有资源
  • 运行:获得CPU后执行。单处理机一个时刻只有一个
  • 阻塞:等待某请求(I/O请求、申请缓存等)完成
  • 挂起:由于客观原因,暂停进程,例如:调试(阻塞是进程自身的一种主动行为,挂起是一种被动行为)

进程通信


  1. 无名管道及命名管道:管道可用于具有亲缘关系的父子进程间的通信,命名管道还允许无亲缘关系进程间的通信
  2. 消息队列:消息队列是消息的链接表,它克服了信号量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新信息;对消息队列有读权限的进程则可以从消息队列中读取信息
  3. 共享内存:可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁或信号量等
  4. 信号量:它是一个计数器,用于实现进程间的互斥与同步,而不是用于存储进程间通信数据
  5. 套接字:用于网络中不同机器之间的进程间通信

进程调度

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

死锁

概念

在两个或者多个并发进程中,如果每个进程都持有其他进程等待的资源而又等待其它进程持有的资源在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲,就是两个或多个进程无限阻塞、相互等待的一种状态。

死锁产生的四个必要条件

  1. 互斥:某资源只能由一个进程使用
  2. 请求和保持:保持了至少一个资源,但又提出新的资源请求
  3. 不剥夺:在未使用完不可剥夺资源
  4. 环路等待:必然存在一个“进程—资源”的环形链。

处理死锁

1. 预防死锁:破坏死锁的必要条件(“互斥不可摒弃”)

  1. 摒弃“请求和保持”:进程必须一次性的申请所需全部资源。
  2. 摒弃“不剥夺”:当进程申请新资源得不到满足,必须释放已保持的资源。
  3. 摒弃“环路等待”:所有进程对资源的请求必须严格按照资源序号递增的次序提出。

2. 避免死锁:防止系统进入不安全状态。银行家算法。

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

3. 检测死锁:Java用各种,例如jconsole工具检测死锁

4. 解除死锁:死锁解除的常用两种方法为进程终止和资源抢占。所谓进程终止是指简单地终止一个或多个进程以打破循环等待,包括两种方式:终止所有死锁进程和一次只终止一个进程直到取消死锁循环为止;所谓资源抢占是指从一个或多个死锁进程那里抢占一个或多个资源,此时必须考虑三个问题:

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

线程同步


1. 互斥量 Synchronized/Lock:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问

2. 信号量 Semphare:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量

3. 事件(信号) Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作

虚拟内存

1. 内存的发展历程

没有内存抽象(单进程,除去操作系统所用的内存之外,全部给用户程序使用) à有内存抽象(多进程,进程独立的地址空间,交换技术,内存大小不可能容纳下所有并发执行的进程)à连续内存分配,固定大小分区(多道程序的程度受限),可变分区(首次适应,最佳适应,最差适应),碎片à不连续内存分配(分段,分页,段页式,虚拟内存)

2. 虚拟内存

虚拟内存允许执行进程不必完全在内存中。虚拟内存的基本思想是:每个进程拥有独立的地址空间,这个空间被分为大小相等的多个块,称为页 (Page),每个页都是一段连续的地址。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻进行必要的映射;当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。这样,对于进程而言,逻辑上似乎有很大的内存空间,实际上其中一部分对应物理内存上的一块(称为帧,通常页和帧大小相等),还有一些没加载在内存中的对应在硬盘上,如下图所示。

注意,请求分页系统、请求分段系统和请求段页式系统都是针对虚拟内存的,通过请求实现内存与外存的信息置换。

3. 页面置换算法

1. FIFO(First in First out):在操作系统中经常被用到,比如作业调度;

2. LRU(Leastrecently use)最近最少使用算法:根据使用时间到现在的长短来判断;

3. LFU(Leastfrequently use)最少使用次数算法:根据使用次数来判断;

4. OPT(Optimal replacement)最优置换算法:理论的最优,理论;就是要保证置换出去的是不再被使用的页,或者是在实际内存中最晚使用的算法。

4. 虚拟内存的应用与优点

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

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

分页分段

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

2. 段式存储管理:将程序的地址空间划分为若干段(segment),如代码段,数据段,堆栈段;这样每个进程有一个二维地址空间,相互独立,互不干扰。段式管理的优点是:没有内碎片,因为段大小可变,改变段大小来消除内碎片。但段换入换出时,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片)

3. 对比

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

局部性原理

  1. 时间上的局部性:最近被访问的页在不久的将来还会被访问;
  2. 空间上的局部性:内存中被访问的页周围的页也很可能被访问。

颠簸

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

内存颠簸的解决策略包括:

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

0 人点赞