操作系统笔记一

概述

cpu的管理:cpu的调度,及进程线程相关

内存:物理内存管理,虚拟内存管理

disk:磁盘块作为底层,不方便用户存取数据,需抽象出文件系统管理

OS Kernel特征:
并发,一段时间运行多个程序(并行是一个时间点运行多个程序,需多核cpu),
共享,表面多个程序可以访问一个资源,实际一个时间点只有一个程序可以访问,互斥共享
虚拟,cpu虚拟化成进程,内存虚拟化成地址空间,磁盘虚拟化成文件,使每个程序感觉在独自拥有一个计算机
异步,程序走走停停,执行不是一贯到底,但只要运行前环境相同,os保证运行结果相同

启动,中断,异常和系统调用

OS存放在DISK,由bios检测各种外设,加载相应软件
系统调用:应用程序向操作系统发出服务请求,主动操作接口,调用请求。处理时间同步或异步
异常:应用程序意想不到的行为,非法指令或其他坏的处理状态(如内存出错)。操作系统应对意外事件的一种机制的支持。处理时间同步
中断:来自不同硬件设备的计时器和网络的中断。处理时间异步
同步:等到回应才继续下一步。异步:直接下一步,不用等待回应

响应:中断,持续,对用户应用程序透明,用户感知不到。异常,杀死或重新执行意想不到的应用程序指令。系统调用,等待和持续

中断:硬件设置一个中断标记,cpu根据标记确定中断的原因,将中断号发给操作系统。OS根据中断号找到对应的处理。软件保存被打断的执行现场,根据中断号查到对应处理的地址,跳过去执行。处理完后清除中断标记,恢复保存的处理状态
异常:触发异常事件时,有一个异常编号,保存现场,根据编号做相应处理,杀死异常程序,或修复异常原因重新执行异常指令。恢复现场
系统调用:用户通过库来访问系统调用的接口,访问接口后,会触发从用户态到内核态的转换(用户态指用户程序在执行程序过程中,cpu处于特权级别低的状态,不能直接访问某些特殊的机器指令和访问io指令。内核态是OS运行过程中cpu处于的状态,可以执行任何一条指令),使控制权从用户程序交到OS。应用程序发出函数调用时,是在一个栈空间完成。系统调用过程中,用户程序和OS拥有各自的堆栈,切换到内核执行时,要切换特权级的转换和堆栈。切换过程会有一定开销代缴,回报是更安全可靠

体系结构及内存分层体系

在这里插入图片描述
cpu完成对程序执行的控制
内存存放程序的代码和数据
外设配合程序发挥作用
在这里插入图片描述
寄存器和cache(现在已有L3)换成都位于cpu芯片内部,OS无法直接管理,速度很快,容量很小
主存(物理内存)放置OS本身及要运行的代码,容量大,速度慢些
在这里插入图片描述
OS管理内存的4个目标,抽象:不用考虑物理内存的位置,外设的位置,只要考虑逻辑地址。保护:多个程序的地址空间相互隔离。共享:进程间数据传递。虚拟化:把最需要的数据放在内存,暂时不需要的放在DISK

地址空间/地址生成

物理地址空间:硬件直接对应的,如内存条/DISK代表的存储空间。有硬件完成管理与控制。起始地址0,直到MAXsys
逻辑地址空间:运行的程序所看到的地址空间,一维的线性地址空间。起始地址0,知道MAXproj

c程序里函数的位置,变量的名字就是一种地址

编译器会把基于符号的地址空间变成逻辑地址空间,OS完成逻辑地址到物理地址的映射

OS建立和维护表,通过一个起始地址和长度确定程序可以访问的有效地址空间

连续内存空间

外部碎片:在分配单元间的未使用内存
内部碎片:在分配单元中的未使用内存

OS需要把应用程序从DISK加载到内存中,需要给内存分配一块连续区域供程序运行。
运行过程需分配一块连续内存空间用来访问数据

分配算法

首次适配算法:为了分配n字节,使用第一个满足需求的可用空闲块
需求:空闲块列表需要按地址排序,分配需要寻找一个合适分区,重分配需要检查,看是否自由分区能合并相邻空闲块。
优点:简单,易于产生更大空闲块,向着地址空间结尾
缺点:容易产生外部碎片
最优适配算法:寻找整个空闲块列表中,最接近需求大小(最小可用)的空闲块。
避免分割大空闲块,最小化外部碎片产生的尺寸
需求:空闲块列表按尺寸排列,分配需要寻找一个合适分区,重分配需要检查,看是否自由分区能合并相邻空闲块。
优点:较简单,大部分申请内存是小尺寸时效率高
缺点:重分配慢,容易产生外部碎片,易产生很多没有的微小碎片(因此碎片被拆分的很细)
最差适配算法:与最优相反,找到与需求内存尺寸差距最大的空闲块。
避免产生大量琐碎小碎片
需求:空闲块列表按尺寸排列,分配很快(获得最大分区),重分配需合并相邻空闲块,然后调整空闲块列表
优点:如果分配请求多是中等尺寸效果最好
缺点:重分配慢,产生外部碎片。破碎大的空闲块会影响申请较大块内存

碎片整理

压缩式
在压缩过程中,所有的空闲分区都是连续的,所有加载的分区都集中在一起

需要考虑,何时压缩,开销大小
无法在程序运行时压缩,会导致访问地址不对。可以等程序停止运行时压缩,还要考虑开销大小,频繁压缩内存拷贝开销很大,会影响OS运行。纯靠软件完成开销很大
在这里插入图片描述
交换式
把DISK当成内存后备。
将等待的程序交换到磁盘里去
3个问题:选择哪一个程序换出去?到底在什么时候坐着换入换出操作?
另外一方面这个换入换出是以当个程序为粒度的,如果这个程序比较大,那么换入换出的开销就很大

后续虚拟内存管理的内容有优化交换的机制

非连续内存分配

连续分配内存的缺点:分配一个程序的物理内存是连续的,内存利用低,有外碎片、内碎片问题

菲连续内存分配的优点:一个程序的物理地址空间非连续,更好的利用管理内存,运行共享代码、数据,支持动态加载和链接
缺点:建立虚拟地址和物理地址间的转换,使用软件方案开销大,因此要考虑能否和硬件管理结合

分段

考虑亮点:1.内存地址空间如何寻址 2.如何实现分段寻址机制
在这里插入图片描述
代码:主程序,子程序,共享库
数据:栈,堆,共享数据段
在这里插入图片描述
从应用程序的编写或者运行来说,它的虚拟的逻辑地址空间是连续地址空间,虽然是连续空间,通过分段之后,可以把它隔离开来

好处:让用户代码段和主程序段共享,相互之间访问,可以让有些数据之间相互隔离,有些数据是可以读写的,另外一些是只读的,而且位于不同的区域。这样可以更有效的进行管理和分配
在这里插入图片描述
一维逻辑地址是由不同段组成,可以不连续。
在这里插入图片描述
一个段:一个内存“块”。
程序访问内存地址需要:2维二元组(段号s,段内偏移addr)
在这里插入图片描述
物理地址空间是由不同段组成

CPU寻址:把一个逻辑地址分成两块,上半部分可以理解是段号,下半部分是段内的偏移。
通过段号希望能找到这个段所在物理内存的其实地址。通过硬件机制,称之为段表,segment table,段表里面真好存着逻辑地址与物理地址的映射关系。
每个段大小不一,段表的信息,1:段的起始地址,2段的长度的限制。
段表里面的index称之为段表的索引,段号就决定了在段表中哪一项的位置,就是所谓的index,即segment num。
找到对应物理段后,CPU会对比本身表示的地址,是否满足段的限制,是合法地址。非法地址访问会根据前面的异常机制,CPU会产生异常,交给操作系统去处理
物理内存段的起始地址加上逻辑地址的offset便宜就是访问数据的物理地址

段表是由操作系统建立,在正式寻址之前操作系统建立好段表,建立好段表之后,段机制就可以正常工作

分页

分页同样需要页号和页的偏移,与分段区别与段大小是可变的,页大小是固定的

划分物理内存至固定大小的页帧 2的幂, 物理内存的组织方式,一个内存物理地址是一个二元组(帧号f,帧内偏移o),
物理地址 = 2 S 2^S 2S * f + o
物理地址前F位为帧号,后S位为偏移,共有 2 F 2^F 2F个帧,每帧 2 S 2^S 2S字节

划分逻辑地址空间至相同大小的页,同样是2的幂

逻辑地址页号size和页帧号size可能不一样,但是offset即页号大小和页帧号大小相等
一个逻辑地址(页号p,页内偏移o)
前P位为帧号,后S位为偏移,共有 2 P 2^P 2P个页,每页 2 S 2^S 2S字节

cpu通过逻辑地址页号,查询页表对应索引项,找到对应帧号(页表基址加上p),帧号加上逻辑地址的o(偏移量一样),形成了帧的物理地址(f,0)。根据公式,得到物理地址

页是连续虚拟内存,帧是非连续物理内存
页映射到帧,不是所有页都有对应帧。内存不够时,需要虚拟内存

页表

在这里插入图片描述
CPU会查找页表起始地址位置,然后通过pagenum算出index,寻址到对应的页表项,把相应的frame num给取出来,有了帧号和偏移就可以按公式计算出对应的物理地址

除了帧号外,还有相应的bit。比如表示这个页表项是否是合法的页表项,对应的物理页在内存中是否存在。逻辑地址空间可能很大,有一部分逻辑地址空间没有对应的物理地址空间
在这里插入图片描述
上述p和f不等,逻辑地址页和物理页帧不对等

注意红色resident bit表示,1存在物理页帧,0不存在,cpu访问将产生异常,对应页帧号100为4。

页表建立过程由OS完成。

主要问题:空间开销大和时间开销
64位计算机以为着寻找空间2的64次方,一个页的大小只有1024b,1k。需要建立2的64次方除以1k,即2的54次方的页表才能把映射关系表示完。因此逻辑地址空间很大,可能导致页表很大
另外多个运行程序为了地址隔离,需要每个程序有自己的页表。意味着n个程序,需要n份页表

既然页表空间很大了,整个页表的组织结构,不能够放到CPU里面,因为CPU空间很小,CPU有cache,但是最多也就几M。CPU放不下之后就只能放在内存里面。每次寻址,寻找访问一个内存,我们要访问一个页表,而这个页表本身也在内存里面,意味着去做一次内存寻址,要访问两次内存,这个开销很大

解决办法:1.缓冲,把常用数据放在离cpu很近的地方。2 通过间接的方式,可以把很大的空间拆成比较小的空间,多级页表机制可以有效的缓解页表空间占用过大
在这里插入图片描述
TLB,就是在CPU里面有个MMU,MMU里面有个TLB,这是一个缓冲cache,缓冲的就是页表里面的内容。
里面包含了两个项,一个是p值,一个是f值,p值是个key,f值是个value,这一个k-v就形成了TLB的表项。如果未命中,查页表,对应项为1时,将映射关系更新到缓冲

32系统里面,一个页一般是4K大小,要访问4K次,如果每个地址都要访问的话,访问4K次才有引起1次TLB的缺失,是一个可以接受的访问

因此写程序的时候,写的程序尽量有一定的局部性,就是有访问的局部性,把它平时访问集中在一个区域,这样可以有效的减少TLB的缺失。尽量避免对内存页表的访问,从而使得整个寻址开销得到极大的降低

TLB miss 后的过程根据不同cpu有的由硬件有的由OS实现
在这里插入图片描述
空间上,让页表所占空间尽量小可以通过多级页表来实现。
把单一的page table分层两块,变成两个table,既然变成两个table,其实对应的逻辑地址,也有区分,它把刚才的page num、page offset又进行了一个细化,offset没变,page num分成两部分,一个p1的page num 一个p2的 page num.对应1级页表的页号,和2级页表的页号,使得对一个大的地址的寻址,变成对N个小的page table来进行寻址,而不是对一个很大的page table寻址

寻址过程:把大的page num 分成两块,p1 p2,寻址的时候首先要找这个1级页表,1级页表地址已知, 把p1 num作为index,去查找对应的1级页表的页表项。存的是二级页表的起始地址。根据二级页表的p2,把p2 num作为二级页表的index,查找2级页表的页表项。存的是frame num

多了一次寻址/一次查找/一次处理,而且这个页表都放到内存中的,开销很大。但是可以通过这种方式使得,某一些不存在映射关系的页表项就没必要占用内存
如p1指向的1级页表项不存在的话,即驻留位为0,对应的p2的二级页表整个都没必要存在,没必要在内存中放着

单一的页表的话,即使映射关系不存在,对应的空间还需要保留
在这里插入图片描述
时间的开销由空间换时间,空间的开销由时间换空间
在这里插入图片描述
页表的大小和逻辑地址的空间大小,是有一个对应关系的,l逻辑空间越大,寻址空间也就越大。
反向页表,使得页表项不和l逻辑地址空间有直接的关系,尽量和物理地址空间建立关系
在这里插入图片描述
方法一,页寄存器
有一个页寄存器的一个数组,他里面的index是页帧号,根据物理页号可以查出来对应的页号是多少,跟页表项内容一样,有属性和对应的页号,使得寄存器大小只与物理地址大小有关,而与逻辑地址空间大小是无关的。
在这里插入图片描述
弊端是信息对调了,需要遍历查询.搜索想要的页表
关联内存方案
在这里插入图片描述
key是页号,value是页帧号。
可以设计一个类似TLB专门存放。但设计可以做的很好,实现成本太高

基于哈希查找的方案
hash函数本身计算可以用软件实现也可以用硬件加速,很明显使用硬件加速计算更好。
为了提高效率可以把这个hash函数再加一个参数,加一个pid,当前运行程序的ID,PID+page num可以很好的作为input,来设计一个比较简洁的hash函数,来算出对应的帧号

从基于寄存器的组织变成了基于关联存储器的组织,再变成基于hash table的组织。

问题:1.查找的时候可能发生hash碰撞 2.需要把整个反向页表放到内存里面去,所以做hash计算的时候也需要到内存中取数,说白了内存的开销还是很大,为此还需要一个类似TLB的机制缓存起来。降低访问方向也表的时间

好处:1.不受制于逻辑地址的大小,容量可以做到很小,只和物理地址空间有关 2.每一个运行的程序都需要page table,对于单一或者多级页表来说,都需要一个page table.但对于这里面而言,整个系统只需要一个,因为它用的是物理页帧的页帧号来作为index,而这表和我们有多少个进程也没有多少关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值