OS知识点复习

OS知识点复习

  • 一些概念
  • 操作系统中的缓存
    • 起源
    • 缓存工作原理
    • 缓存设计
    • 数据局部性
  • 进程 & 线程
    • 进程调度策略
    • 进程间的通信的几种方式
    • 进程同步与互斥
    • 进程同步机制
    • 线程间通信
    • 线程同步的方式
  • 存储管理
    • 内存分配与回收
    • 分页和分段有什么区别(内存管理)?
    • 虚拟内存
    • 颠簸
    • 局部性原理
  • 内存映射 mmap

内容转载自:
操作系统缓存机制
计算机操作系统核心知识点总结&面试笔试要点
操作系统面试问题汇总(超详细)

一些概念

中断和轮询

  • 中断:指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程
  • 轮询:定时对各种设备轮流询问一遍有无处理要求

临界区和冲突解决

  • 临界资源:一次仅允许一个进程使用的资源
  • 临界区:每个进程中访问临界资源的那段程序
  • 解决冲突:如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入;任何时候,处于临界区内的进程不可多于一个;进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区;如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象

缓冲区溢出

  • 缓冲区溢出:指当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上
  • 缓冲区溢出的危害:程序崩溃导致拒绝服务、跳转并且执行一段恶意代码
  • 缓冲区溢出的原因:程序中没有仔细检查用户输入的参数

操作系统中的缓存

缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,可以进行高速数据交换的存储器,它先于内存与CPU交换数据

起源

在每个指令周期中,CPU至少会访问内存一次,来抓取下一条执行的指令,而且经常会附带着更多次的访问,来获取操作数,以及存储结果。而CPU执行指令的速度就因此大大受限于对内存的访问速度,而且随着CPU的速度提高大大快于内存的访问速度提高,这个问题会越来越严重。理论上来说,我们可以制造一种存取速度与CPU寄存器相同的内存,但那样的话内存就会相当昂贵,所以为了解决这个问题,就需要利用短时间内指令的聚合特性来设计一个在CPU和主存之间工作的缓存。

缓存工作原理

缓存持有主存的一部分拷贝,当处理器试图访问内存中的一个地址时,会首先判断该地址中的内容是不是已经在缓存中了,如果是的话,则数据直接从缓存传送到处理器中,不是不是的话,则首先将该指令以及该指令附近的数据读取到缓存中,然后再从缓存中读取数据到处理器中。

缓存设计

1.缓存大小
合理的缓存大小可以大大加快cpu访问数据的速度

2.缓存单次数据交换大小
起初随着缓存单次交换数据增长,缓存命中率会增加,因为更多目标数据附近的数据被加载到了缓存中,但是随着缓存单次交换数据继续增长,性能反而会下降,这是因为此时将过多的数据从内存中加载到缓存中,这个数据交换花费了过多时间,而缓存命中率并不会继续显著的增加。

3.缓存替换算法
缓存替换算法是当一块新的内存数据被加载到缓存中时,来确定将哪部分缓存中已经存在的数据交换回去,好的缓存替换算法会维持缓存的一个高命中率,但是算法本身也会耗费时间,所以需要权衡。

数据局部性

数据局部性原理是缓存能大幅度提高性能的原理
数据局部性在以下四个方面中起作用:

  1. 除了占整个程序小部分的跳转指令(调用函数),以及条件分支,大部分程序都是线性执行,这代表在大部分情况下,当前要执行的下一条指令就在当前指令的后面。
  2. 许多循环指令都是在短时间内执行大量的重复指令,这些指令都聚集在相对接近的地址段中。
  3. 在许多程序的运算中,都会处理线性数据结构,如数组,以及C语言中的结构体,这些数据结构item的地址都是连续的

进程 & 线程

进程调度策略

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

进程间的通信的几种方式

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

几种方式的比较:

  • 管道:速度慢、容量有限
  • 消息队列:容量收到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
  • 信号量:不能传递复杂信息,只能用来同步。
  • 共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全。

进程同步与互斥

  • 互斥:指某一个资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的
  • 同步:是指在互斥的基础上(大多数情况下),通过其它机制实现访问者对资源的有序访问。大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

同步:体现的是一种协作性。互斥:体现的是排它性。

进程同步机制

1.信号量机制
一个信号量只能置一次初值,以后只能对之进行p操作或v操作。 由此也可以看到,信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。

2.自旋锁
旋锁是为了保护共享资源提出的一种锁机制。 调用者申请的资源如果被占用,即自旋锁被已经被别的执行单元保持,则调用者一直循环在那里看是否该自旋锁的保持着已经释放了锁,自旋锁是一种比较低级的保护数据结构和代码片段的原始方式,可能会引起以下两个问题;
(1)死锁
(2)过多地占用CPU资源

3.管程
信号量机制功能强大,但使用时对信号量的操作分散,而且难以控制,读写和维护都很困难。因此后来又提出了一种集中式同步进程——管程。其基本思想是将共享变量和对它们的操作集中在一个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。

4.会合
进程直接进行相互作用

5.分布式系统
由于在分布式操作系统中没有公共内存,因此参数全为值参,而且不可为指针。

线程间通信

(1)同步
多个线程通过synchronized通讯,类似于共享内存

(2)while轮询
线程A不断改变条件,线程B不断查看条件是否满足需求(比方说=5),从而实现通讯。
效率不高,因为B一直在查看,没做别的

(3)wait/notify
进入阻塞,而不是像轮询一样一直占用CPU资源

(4)管道通信
通过管道,将一个线程的消息发送个另一个线程

线程同步的方式

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

存储管理

内存分配与回收

内存分配的过程:单一连续分配、固定分区分配、动态分区分配(根据实际需要,动态的分配内存)。

动态分区分配算法:

  • 首次适应算法:分配内存时,从开始顺序查找适合内存区,若无合适内存区,则分配失败。
  • 最佳适应算法:要求空闲区链表按照容量大小排序,遍历以找到最佳适合的空闲区。
  • 快速适应算法:要求有多个空闲区链表,每个空闲区链表存储一种容量的空闲区。

内存回收的过程:

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

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

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

段页式存储管理:现将逻辑空间按照段式管理分成若干段,再将内存空间按照页式管理分成若干页,分页可以有效提高内存利用率,分段可以更好的满足用户需求。

两者的不同点:

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

OS知识点复习_第1张图片

虚拟内存

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

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

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

OS知识点复习_第2张图片
由图可以看出,虚拟内存实际上可以比物理内存大。当访问虚拟内存时,会访问MMU(内存管理单元)去匹配对应的物理地址(比如图5的0,1,2)。如果虚拟内存的页并不存在于物理内存中(如图5的3,4),会产生缺页中断,从磁盘中取得缺的页放入内存,如果内存已满,还会根据某种算法将磁盘中的页换出。

3). 页面置换算法

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

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

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

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

颠簸

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

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

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

局部性原理

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

内存映射 mmap

参考文章:
内存映射 mmap的理解(转载+整理)
认真分析mmap:是什么 为什么 怎么用
内存映射机制(mmap)

你可能感兴趣的:(OS)