2.19 清华操作系统笔记

非连续存储

非连续存储的发明主要是因为每次申请连续存储太难了,一言不合就会产生内外碎片,这个时候就想出了不连续的做法,方法有段式,页式,段页式,基本思想的话:我不连续,但是我也不是每个单元都不连续。单位不是一个字节,而是一个段或者一个页,段就是分配的比较大的块,页就是分配的比较小的块,段内和页内都还是连续的,这样也尽量避免了复杂性,逻辑地址是连续的,但是其实中间会有一个段表 页表与

物理地址做了一个映射,实现了逻辑上连续

段式存储,页式存储

段式存储里面的类型都相同或者相似的,分配这么大空间,一段是段号,一个是段内偏移,这个挺好理解的,页的话也一样,就是一个页号,一个页内偏移

页表

实现逻辑地址和物理地址映射的一个东西,但是呢也带来一些问题,因为页表采用的是,一对一的映射,当64位系统的时候,那么页表可能会非常大,那个时候一个页就分配很大的空间,非常不划算。

还有就是用页表会访问比连续存储慢,连续存储直接加上偏移就能得到实际的物理地址,但是这个的话要先去访问页表,然后才能去访问物理地址,速度上慢了一点

解决办法:

1,多级页表,也就是有个类似目录一样的玩意儿,然后去寻找,好处就是如果全部排满倒是花费的内存比普通页表多,但是大部分情况来说都是用不满的,所以我们开始只用建立一层目录,然后动态创建即可

但是普通的话像是一维数组必须先创建完空间,所以实现了页表过大的优化

扫描二维码关注公众号,回复: 9272240 查看本文章

2,快表:为了优化页表时间上过慢的一个东西,在CPU寄存器中存了一个小一个点表,存储的都是最近访问的,因为是CPU内,所以访问起来特别快,相当于缓存

段页式存储

就是利用了两个的优点然后建立出来的一个东西,因为段式里面相同类型,所以在内存保护上比较完善,页的话因为块比较小,比较灵活,利用效率比较高

然后存储就是   第一段  段号    第二段   页号    第三段   页内偏移

段页式存储的内存共享

进程的结构  :共享段,堆数据段 ,代码段

其实就是利用共享段,他们实现共享就是两个进程指向的页表是一样的,所以他们使用的物理地址也是一样的,然后实现了共享

虚拟内存

虚拟内存是为了跟进时代,要运行的程序越来越大,然后内存不够使用,程序可能都放不下内存中然后发明的一种技术,最开始前期有两种方法解决这个问题,覆盖和交换

覆盖:代表是一个程序就已经大于内存了,思路:将程序划分成很多模块,然后划分成会可能同时运行的和不会同时运行的,不会同时运行的就共享一块内存区域,到了需要执行的块时就进行块的一个置换。在外存和内存中置换一个模块

缺点:这些划分模块的工作全都是程序员做的事,极大的增加了编程复杂度

交换:运行的程序可以装入内存,但是因为内存中有其他进程,所有装不下,这个时候就进行一个置换,将一些进程都放入外存中,然后当前运行就可以放入内存中了

缺点:每次都直接把一个进程的空间转移,开销太大

基于上面两个然后结合了优点,弱化了缺点研究出了虚拟内存,虚拟内存把分模块的工作交给了操作系统,然后把进程转移改成了进程页的转移

大概流程

1,去访问页表

2,发现页表中标记在外存中,报缺页异常

3,然后去寻找外存中的页面

4,转移到内存中

5,将页表项修改

6,重新执行访问命令

页面置换算法

也就是虚拟内存中缺页的时候选择内存中哪一块被置换出去的一个算法,有很多,最优算法,FIFO  LRU

最优算法一般是用其他算法跑完,然后最优算法再去跑一遍做比较的

最优算法思想:比较每个的下一次访问时间,然后选择最长的置换

FIFO:选择呆在内存块中最久的那个

LRU:比较上一次的访问时间,最早的被置换

LRU结构有链表和栈两种形式,复杂度差不多

猜你喜欢

转载自www.cnblogs.com/Lis-/p/12330912.html