树是什么?
每个节点(下面如果有几个子节点的话)之间都不能互相交错。
二叉树就是只有一个左右子节点。
有很多性质运用。用于计算。
节点数。
度为1的节点数是n1
度为0的节点数是n0
度为2的节点数是n2
有一个关系是n0 = n2 +1
证明:
如果节点总数是k+1
那么边的数量是k(根据树性质,节点数和度数关系,度数+1=节点数)
所以有一个公式: k+1 = n0+ n1+ n2
k = n1 + 2n2
相减 一下:1= n0- n2
所以n0 = 1 + n2
这个关系经常被用上。
// 叶子节点是767
森林就是加上了一个父节点的很多子树组成。
请求分页系统,
这主要是在基本分页系统的基础上增加了几个功能:
页表机制也 是在基本分页系统上增加了点功能。不是段表机制哦。补充了:请求分页和页面替换是增加的功能部分。它是发现和处理哪些页面不在内存里这两个问题 ?
表被分成几个页是实现请求分页系统的基本。之前说过的分页系统和分段系统和分段页式系统有什么优缺点吗?
分段系统,印象中,是按照逻辑上把主存地址分成几段,每一段长度都不同。每一段不像分页那样。
分页系统:均分为几页。均分为几页,是不太可能分成整页数的。最后一页肯定是破碎的。如果一个逻辑段
分段页是啥?分段 页 是段在前,页在后啊。。。
在分段的基础上,分页 。每一个段先逻辑上分好了,如果太长了的话,就再分成几页去了。如果段太短了呢?段好像没必要分页了,如果很短的段,再分页。就很多页数啦。很多页数就得频繁得进行页面调度啦。执行时间很短,这样会造成页面的颠簸。
缺页率增加,离最佳替换算法的性能就差的很远; 效率会下降的。
cache的地址是怎么划分的呢?
分成行列形式。每一行有很多个块。行列存储矩阵形式。
主存也是和cache一样分配的。主存地址连续分块,分行 来分配自己的地址区间。
cache必须处理好和主存的地址映射。
cache的块block 的大小设置和 时间片 大小设置 需要考虑多点。
block设置得刚刚好的话,cache才能最优化发挥自己的效用。block太大的话,我找一个内容很大概率上就不在block里,我就要把这个block调出去,把含有我的内容的调进来。页面调度算法发挥作用啦。多调度几次,我就不要执行进程啦,各种时间进行各种调度。
block太小的话,在cache里和主存里都有很多块。很大情况下,我要找的一个内容,就在block,就不用调度去了。直接在cache里命中了。命中率高的话,系统cpu执行得很好。
页面替换:凭借什么策略把页换进换出呢?
分三种:
请求分页
请求分段
请求分段页
缺页中断机制,
缺页中断,
一般中断就是在指令执行完成后,cpu才能处理中断信号
访管指令是什么?trap指令,自我陷入指令。访问管态(kernel态)指令。和访问目态(user mode指令对应起来)
访问内核态指令。如果用户态指令使用管态指令的话,只有自己陷入,中断,访问管态后,又去回来用户态。而不是像外设给一个中断信号的外中断。
访管指令本质上就是在运行目态指令时候设置访管标志为1 ,就直接去调用内核的功能了。
特权指令:有特殊权限的指令。 指的是用户态程序没有的权限。但是如果用户态程序要转入 进入内核态。就需要特权的指令。
命令接口:
脱机接口:用于批处理系统中,雇主把要做的事写在一个清单里,工人按照清单一步一步执行。不用动脑子。
联机接口:用在分时系统里,交互性强。雇主说一句话,计算机就开始做一件事,工人同时给出反馈。
系统调用:通过美丽的封装好的接口,用户直接使用核心态功能。比如,用户是无法自己写一个时钟中断系统的。只能是系统程序员做好了,隐藏各种细节。
是虚拟存储技术需要实现的几个硬件吗
物理帧是什么?
帧增加了几个状态标志。
访问位:该块在cache 里吗?如果在,访问位就是
状态位P:该块 如果被查询到了在内存里,状态位就是1,没在就是0
修改位:如果该块的页在放入内存后被修改了,被替换出去或者被换进来了 修改位为1。
外存地址:根据物理块号和块内地址算出实际的物理块号。
哪个算法最靠近opt,才是最优算法。
FIFO性能比较差,不是最优的算法,容易实现,硬件支持需要不多,
LRU算法:有点难实现,需要栈,后进能先出去。缺页率是不如先进先出的队列实现法。先进先出的,缺页率太高,很多时间浪费去了调页,调入调出。
还有啥硬件呢?缺页中断机构也是一种硬件啊。
如何实现缺页中断,和普通的中断信号有什么区别呢?
缺页中断在一条指令执行过程之中频繁得被中断。
FIFO会发生页面belady异常,但是会抖动的(缺页中断)吗?
belady异常是什么?是在FIFO算法的时候,如果 一个进程 没有分配全部页,就会出现分配页面数量增加而缺页率反而升高这种现象。只有这种现象就叫做belady异常。
抖动是什么?有缺页中断就会处理中断而进行页面调度。 这是种频繁进行页面调度的行为。如果一个进程花在页面调度的时间,多过执行的时间就是在颠簸。颠簸降低了cpu的性能。
为什么频繁缺页中断呢?就是进程需要频繁访问的页面数量大于实际可用的物理帧数量。
cache 地址和主存地址怎么对应,换算,需要一定的方法地址映射算法。在组成原理书介绍该点。
总得来说:主存块数量会比cache块数更多,成倍数。那么两者对应起来也需要一定的策略。
cache 和主存地址映射:
评价三种算法的标准就是 实现难度,和cache命中率。cache 命中率太低的话,算法是不好的,cache的功能没用好。实现再容易也别用。
(八路)组相连映射:一个区分为几个组,区之间是随机映射。组内是每个每个对应起来。
区之间随机,组内按顺序 ,会导致实现很快,命中率也有一定的保证。应该是比较常用的算法。
全相连映射:不分区了,直接每个cache和每个主存按顺序对应起来。
花费时间太长了,命中率也很低。
优点是什么?按顺序查找了,命中率按序查找就好。命中率挺高,但是实现效率非常低,代价非常大。
直接相连映射:cache地址和主存地址随机映射,主存多个块随机和cache对应起来。
块任意关系进行对应,实现上很轻易,花费代价不高,但是cache能否命中很悬啊,命中率很低。
虚实地址的转换:这部分知识需要结合组成原理的cache地址转换,知识点一起结合进行讲解。虚地址实地址转换。
除了先入先出和最近最少使用算法,还有别的什么页面置换方法呢
访问位是什么意思呢?是访问的页,最近被修改过置为1
简单的时钟替换?clock算法:只是设置一个访问位。
改进版本:设置访问位和一个修改位。写命令时候需要重置修改位,表示该页面被修改过。
为什么队列的数据结构比栈的不好,造成缺页中断率更高呢?栈后进先出去。先进来的一段时间没访问了,程序局部原理,访问概率比刚刚出去的概率大。缺页中断率不太高。
belady异常和抖动(缺页中断)是一个概念吧?
程序经常使用 表 数组,队列等数据簇集形式。所以数据总是在循环来去。循环就导致了空间和时间轮转。
分配几个物理块和选择哪个页进行换出去,换进来,需要一定思路进行考量。
基于什么因素,操作系统常常采用什么策略:
这些策略有啥用的?
固定分配,局部替换(分配的是物理块数,替换的是要把可能不用的页拿出去,给要调入的页使用。)
每个进程都有一定数量的物理块,整个运行期间都不改变。当发生缺页时,只从里面选择一页换出,然后调入需要的页。实现这种策略,很难确定到底要分配多少个物理块。分配少了,频繁缺页中断,太多又会使得cpu和其他资源的利用率下降。
可变分配,全局替换(全局和局部区别)
最容易实现的,它为系统中进程分配一定数量的物理块,也有空闲的块的队列。如果需要调入的时候,从空闲的队列里取出一块物理块给进程使用,这种方法比固定分配,局部替换更加灵活)。
可变分配,局部替换 (为每个进程分配一定数量的物理块,当发生缺页时,只从里面选择一页进行替换,因此不会影响其他进程的运行)