内容转载自:
操作系统缓存机制
计算机操作系统核心知识点总结&面试笔试要点
操作系统面试问题汇总(超详细)
中断和轮询
临界区和冲突解决
缓冲区溢出
缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,可以进行高速数据交换的存储器,它先于内存与CPU交换数据
。
在每个指令周期中,CPU至少会访问内存一次,来抓取下一条执行的指令,而且经常会附带着更多次的访问,来获取操作数,以及存储结果。而CPU执行指令的速度就因此大大受限于对内存的访问速度,而且随着CPU的速度提高大大快于内存的访问速度提高,这个问题会越来越严重。理论上来说,我们可以制造一种存取速度与CPU寄存器相同的内存,但那样的话内存就会相当昂贵,所以为了解决这个问题,就需要利用短时间内指令的聚合特性来设计一个在CPU和主存之间工作的缓存。
缓存持有主存的一部分拷贝,当处理器试图访问内存中的一个地址时,会首先判断该地址中的内容是不是已经在缓存中了,如果是的话,则数据直接从缓存传送到处理器中,不是不是的话,则首先将该指令以及该指令附近的数据读取到缓存中,然后再从缓存中读取数据到处理器中。
1.缓存大小
合理的缓存大小可以大大加快cpu访问数据的速度
2.缓存单次数据交换大小
起初随着缓存单次交换数据增长,缓存命中率会增加,因为更多目标数据附近的数据被加载到了缓存中,但是随着缓存单次交换数据继续增长,性能反而会下降,这是因为此时将过多的数据从内存中加载到缓存中,这个数据交换花费了过多时间,而缓存命中率并不会继续显著的增加。
3.缓存替换算法
缓存替换算法是当一块新的内存数据被加载到缓存中时,来确定将哪部分缓存中已经存在的数据交换回去,好的缓存替换算法会维持缓存的一个高命中率,但是算法本身也会耗费时间,所以需要权衡。
数据局部性原理
是缓存能大幅度提高性能的原理
数据局部性在以下四个方面中起作用:
FCFS(先来先服务,队列实现,非抢占的)
:先请求CPU的进程先分配到CPUSJF(最短作业优先调度算法)
:平均等待时间最短,但难以知道下一个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),而物理内存划分为同样大小的帧
,程序加载时,可以将任意一页放入内存中任意一个帧,这些帧不必连续,从而实现了离散分离。页式存储管理的优点是:没有外碎片
(因为页的大小固定),但会产生内碎片
(一个页可能填充不满)。
段页式存储管理
:现将逻辑空间
按照段式管理
分成若干段,再将内存空间
按照页式管理
分成若干页,分页可以有效提高内存利用率,分段可以更好的满足用户需求。
两者的不同点:
分页
是由于系统管理的需要而不是用户的需要,它是信息的物理单位
;分段
的目的是为了能更好地满足用户的需要,它是信息的逻辑单位
,它含有一组其意义相对完整的信息;1).内存的发展历程
没有内存抽象(单进程,除去操作系统所用的内存之外,全部给用户程序使用)
—>
有内存抽象(多进程,进程独立的地址空间,交换技术(内存大小不可能容纳下所有并发执行的进程))
—>
连续内存分配(固定大小分区(多道程序的程度受限),可变分区(首次适应,最佳适应,最差适应),碎片)
—>
不连续内存分配(分段,分页,段页式,虚拟内存)
2).虚拟内存
虚拟内存允许执行进程不必完全在内存中
。虚拟内存的基本思想是:每个进程拥有独立的地址空间,这个空间被分为大小相等的多个块,称为页(Page),每个页都是一段连续的地址。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序
。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻进行必要的映射;当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。
这样,对于进程而言,逻辑上似乎有很大的内存空间
,实际上其中一部分对应物理内存上的一块(称为帧,通常页和帧大小相等),还有一些没加载在内存中的对应在硬盘上,如图所示。
注意,请求分页系统
、请求分段系统
和请求段页式系统
都是针对虚拟内存
的,通过请求实现内存与外存的信息置换
。
由图可以看出,虚拟内存实际上可以比物理内存大
。当访问虚拟内存时,会访问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)