软考
1.1 备考策略
txt
先建立体系,后整知识点
2.01 计算机组成与体系结构
txt
这一章知识点比较多,同时在考试的时候,分值也考得比较多,占到上午考试的6分这么一个比例,由于上午考察的科目很多,所以六分的分值,已经算是比较高的分值了,在这一章节,主要会考的哪些方面的内容,下面可以看一下:
首先会考到的是数据的表示,数据的表示简单一点涉及到进制的转换,我们知道在计算机当中,所使用的都是二进制数据,但是在日常生活中,习惯用到的是十进制的,为了计算的方便,还提出了八进制,十六进制,那这些进制计算某些问题的时候有可能问到,比如在存储体系有计算用多少块芯片组成多大的存储空间,这类问题就会用到进制的问题,然后呢,在网络部分,计算ip地址,子网掩码这些数据的时候也会涉及到进制,所以呢,这一块进制是为了后面的知识做铺垫,直接考察到的,像原码,反码,补码,以及浮点这些计算
计算机结构其实涉及到的内容很多,但是真正考察比较多的,是cpu当中寄存器如何分的问题。哪些寄存器是放在运算器里面,哪些是属于控制器的寄存器,这些要区分的清楚。对于常见的一些,这种寄存器我们要了解它们基本的特性,它是做什么用的。
接下来会讲到Flymn分类法,Flymn分类是提出来很长时间了,一种对计算机进行分类的一种方法,这种分类方法把计算机分成了四种大的类别,但真正实际用的过程中,我们会发现没有分那么多的类别,类别只是理论上的东西。
CISC和RISC呢,是计算机的指令集,这两种指令集,它们的特点,需要区分开
流水线技术呢,主要是考察一些计算方面方面的问题
存储系统里面既有概念也有计算,需要了解
总线系统主要是了解,最基础的总线的分类和概念
可靠性这一块,串联、并联的可靠性的计算,以及串并混合的情况
而校验码主要是了解校验码是有什么作用的,常见的校验码有哪几种,像CRC校验码,海明校验码,它们各自会有什么特点,它的运算过程,编码解码又是怎么样的,这些东西是要求我们了解的
数的表示:
R进制转十进制基本都是按权展开法
十进制转R进制使用短除法
原码,反码,补码,移码
在计算机中所使用的计算机编码,和我们日常生活中使用的编码数据,它们有一定的区别。下面是计算中所用到的几种编码;
原码,反码,补码,移码这些,原码怎么来算呢?就是我们把一个数组成二进制的表达形式,这是第一步,第二部就是把二进制的首位,最高位,一般呢我们是确定了一共多少个字节存这个数据,如果说是一个字节,八个bit,它的首位就是最高位,如果说转成的二进制不足八位,那就高位补0就可以了。比如说数字1,转成二进制也是1,那如果说是用一个字节来存储它,我们就会在左边补上7个0,最高位的这个就是符号位,对于正数而言符号位位0,对于负数而言符号位为1,所以如果是+1,它的原码就是0000 0001,-1就是1000 0001,那假如我们把1+(-1)结果应该是为0的,但是呢,用原码进行这样的操作,往往行不通。为什么行不通呢,我们把两个原码直接相加,,会变成1000 0010 ,就变成了-2的原码,所以呢像原码的这种操作方式,是不能用来直接在机器里面进行相关的运算的,所以呢提出来一些其他的编码方式,比如说反码
那反码呢,注意一点,也是区分正负,如果说是正数,它是和原码是完全一样,相等的。包括我们后面所讲的补码,正数的补码也是和原码完全相等的,负数就有差别,你比如说-1,它的反码怎么求呢?怎么体现呢?反码是这样来求的,先把符号位刨出来,单独处理了,符号位不动它,然后把后面所有位置按位取反,什么叫按位取反呢?就是一个位置原来是0,要变成1,原来是1要变成0,比如1的补码是0000 0001,-1的补码是1111 1110,相加的结果是1111 1111,那1111 1111 代表的是什么呢?首先代表它是一个负数吧,接着后面几个取反可以得到它的原始值是多少,0,说明呢,反码求解出来的是-0.其实呢,这与我们的结果是匹配的了,但是看起来呢,任然有一些怪异,就是0的话,一般讲的就是0,不分+0和-0。再来看到补码,补码刚才讲到,正数的补码和原码,反码是一样的,负数的补码呢,是在原码反码的基础上,+1,就比如-1的补码是,
1000 0001->1111 1110->1111 1111,这就是-1的补码,把两个补码相加,得到的是0000 0000,也就是+0,所以这才对。最后要看的是移码,注意一点,移码就是一个特定场合用的,它一般用来做什么呢?它用来做,浮点运算中的,编码。那移码是怎么产生的呢?它是在补码的基础上,把首位做取反,为什么要这么做呢?其实呢,我们可以画一条数轴,就明白,补码当中由于最高符号位负数符号位是1,正数符号位是0,这其实在数轴上表示,就有点混乱,颠倒了思想观念。但是如果我们反过来,在数轴上表现就非常漂亮了,就是正数的体现比负数要大一些。原来补码体现不出这一点,所以移码主要做了这么一件事情,同时它进行相关操作呢,也能得到正确的值。
最后看的是表示的范围,表示的范围也是经常考到的:
如果问你,1个字节的八位的来表示的原码,它的一个取值范围,反码又是个什么情况,补码又是一个什么情况?它们取值范围会有差别吗?就可以通过给出的表算出来。比如8位,
txt
一个字节8位,如果采用原码表示正整数(含0),可以表达0-255,即 2^8=256,一共256种状态,从全0到全1的各种排列组合。如果要表示负数,则符号位需要占用一位(最高位,1代表负数,0代表正数),因此其绝对值最大范围为0-127,即2^7=128,一共正负各128种状态,如果不采用特殊处理,这时候0占用2个编码(10000000和00000000),数据表示范围为-127到-0及+0到127,这样总体上一个字节只有255种状态,因为其中0具有正0和负0之分,这不符合数学意义也浪费一个编码。
除了以上的弊端,还有个原因是,早期硬件很昂贵,一位或者一个编码的浪费都是不可饶恕的,因此人们想到了另一种编码把负0利用起来,即当遇到负数时,采用补码来表示就可以解决这个问题,而遇到正数或0时还是保留原码表示。因此这个负0通过补码算法处理后自然而然地被利用起来,用来表示-128.
浮点数运算:
浮点数运算是针对浮点数进行相关运算的操作。那浮点数指的是什么数呢?其实就是我们以前在学数学的时候,称为科学计数法的一种表示数的方式,比方说,1000->我们用科学计数法呢,1.0 x 10 ³,这就是计算机里面所讲到的浮点数,我们要对浮点数进行运算呢,比如说我们要 119进行浮点数运算呢,结果是1.19*10²,但是如果我们要对两个数相加,它们都是浮点数表示的,那要怎么操作呢?首先我们直接加这个尾数,肯定是不行的吧,你看1.0就是这个尾数部分,3就是指数,10是基数,N=M * Rⁿ,直接相加肯定是不行的,那我们该怎么操作呢?首先我们要对阶,什么叫对阶啊?也就是说这个阶码也就是这个指数要是相同的,你才能直接对尾数进行操作,进行操作的时候,怎么对阶呢?比如说,3和2不对等啊,我是把3化成2,还是2化成3呢?化成2呢,那么1.0 x 10 ³变成10 x 10 ²,这跟1.0 x 10 ³是对等的,化成这样子行不行呢?不行,因为我们从经验来看待,如果我们真的这样化了,(10+1.19)*10的三次方,我们又得把结果化为,1.19 x 10的三次方,这就做了无用功。所以呢,一般是从低的往高的对,就是吧1.19 x 10的三次方化成0.119化成10的三次方,这样阶就对等了,然后,尾数相加就行了。最后呢需要对结果进行格式化,比如结果是0.1119 x 10的三次方, 我们就需要格式化,就是要确保小数点的前的第一个位置不能是0,确保这一点呢,格式化就成功了,当然左边除了不是0以外,不能是1位以上的数,比如说结果是11.19x10的三次方,就这个意思。他必须是几点几这种形式。
计算机结构:
主机:
txt
下面我们要看到的,是计算机结构当中的主机的基本构成,知道主机是计算机中的核心部分,计算机的组成呢,就是主机加外设,主机是不是我们平时所说的,主机箱里面的部件呢?不是那么回事。我们讲到的计算机结构里面的主机,远比我们所接触的主机箱里面的部件要少。主机呢,只包括两个部分,一个是cpu,另外一个部分是内存,又称为主存储器,这一点概念是需要明确的,那硬盘,像什么声卡,显卡这些东西呢,都归为外设,只有这两大部件是属于主机的,主机结构当中我们特别要注意的一点,cpu里面的运算器和控制器,因为在考试当中,运算器,控制器的构成是经常考到的一个知识点,所谓运算器,也称为算术逻辑单元,ALU,那么运算器它的一个基本思想呢,或者说基本所作的一个工作,是做运算的一个职能,比如说要做一些加法,减法,这些东西呢要在运算器里面去做,cpu里面仅仅只有运算职能还不够,还要去控制这个部件的相关运作,控制整个cpu间的交互之类的,这个职能呢,是由控制器来决定的,从整体上来讲,我们会发现,运算器里面包含的主要内容是什么呢?算数逻辑单元ALU,基本上就能识别它与算数相关,累加寄存器ACC,听这个名词呢,感觉它是做加法运算的,但事实上呢,它是一个通用的寄存器,运算的过程中,会存一些运算时需要用到的值信息,不仅仅是加法,减法也会用到ACC寄存器,第三个呢是数据缓冲寄存器DR,数据缓存寄存器它是用来做什么的呢?就是我们对内存储器进行读写操作的时候,用来暂存数据的寄存器,第四个是状态条件寄存器PSW,这个寄存器非常具有特色,经常考到,是用来存储运算过程中,相关标志位的。什么是标志位呢?你比如说,有时候涉及到进位,运算会溢出,然后还有什么中断,会涉及到一些状态的信息需要储存,这就需要存在psw里面。控制器里面也会存在多个相应的部件,里面的部件也比较好识别,第一类呢是跟指令相关的,指令寄存器IR,指令译码器,因为看到指令你会想到,我们是运行程序的时候,我们需要调取相应的内容,去调取相关指令代码的时候呢,就需要去控制。所以呢,指令相关的都是控制器里面的部件,程序计数器PC是什么东西呢?我们在进行程序运行的时候,运行的当前指令,接下来要运行下一条指令,运行下一条指令的时候,我们需要了解下一条指令在什么位置,这就是由程序计数器PC完成的,如果仅仅是顺序执行,比如是在源地址上加1得到新地址,若涉及到跳转呢,就加的幅度大一些,另外一点呢,就是时序部件。
Flynn分类法:
txt
Flynn是计算机体系结构的一种分类方法,通过这个分类方法,我们可以把常见的这些计算机进行分类。它的分类依据是什么呢?依据两个指标,一个指标是指令流,另外一个指标是数据流,无论是指令流还是数据流,它们都分成两种类型,一种是单的,一种是多的,所谓单就是一个,而多呢就是多个。通过这两个维度的分支方向,组成了四种不同的结构,包括单指令流单数据流SISD,单指令流多数据流SIMD,多指令流单数据流MISD,多指令流多数据流MIMD。这其实是一种以数学化的一种穷举的方式给它列出来的,那么这四种当中,有几种需要我们特别注意。或者说呢每一种都有它们特别独特的地方。是需要我们掌握的,因为这种题考察的时候就是给你一个代表性的,问你这是哪一种结构。或者说呢,哪一种体系结构不具备哪一种体系结构。 首先看到单指令流单数据流,在这种结构当中,指令流和数据流都是单个的,也就意味着在系统当中,控制器只有一个,处理器也只有一个,典型代表就是单处理器系统。像我们之前用的比较老式的pc机,386啊,486啊,到后来的586,奔腾啊,都属于单处理系统。到后来呢,出现了双核的处理器,四核的处理器,甚至于现在家用都可以用到八核的处理器,像这种呢,就不属于单处理器系统,这一点呢,大家要了解,所以说单指令流单数据流,在pc服务器领域基本上看不到了。但是呢,在单片机系统当中,还是存在的,而且呢比较多见。就是这样的一个情况。然后再看到单指令流多数据流,在这种结构当中,控制部件只有一个,但处理部件会有多个,也就是说,发了一条指令,会有多个运算指令同时去做同样的一些运算,也就是说呢,每一个运算部件它的输入会有差异,像这种结构,在哪里应用比较常见,主要就是正列处理器上,这里讲到多种处理机,但是呢主要就是考察阵列处理机作为一个典型的代表。阵列处理机呢,它适合去处理组类型的一些运算,比如说二维数组,我们要对数组与数组之间进行操作的时候,我们会发现呢,我们要对很多组数据进行同样的操作,比如加法,对应的进行加,这个时候呢,我们一条加法指令,然后呢,通过输入不同的数据,得到一组不同的结果,这是单指令多数据流。第三种是多指令单数据流,这种呢是由多个控制部件,处理器只有一个,像这种呢,属于一种理论模型,其实呢就是通过排列组合组合出来的一种分类,它并不具备实际的意义与价值,所以我们只需要知道它是一种理论的数据模型就可以了。第四种,多指令多数据流,这种呢就非常常见,因为呢你有多个处理器或者说把多个处理机把它联起来,来共同完成一些任务,比如说,集群的形式,都属于多指令流多数据流,我们不说多计算机连起来,但是多处理器就非常常见了,现在这些服务器都会有多处理机,都归属于多指令流多数据流的这么个分类,从目前的介绍来看呢,会发现呢,这其实是历史的发展趋势来选中了大家,开始有单指令单数据流,后面呢有多指令单数据流,后面又有多指令多数据流,这么些情况。
CISC和RISC
txt
这个知识点呢,考察频率也比较高,这个知识点考察的时候,基本上就是一种形式,给出ABCD四个选项,对于CISC和RISC的描述,然后呢让大家来选择哪些说法是对的,或者说哪个说法是错误的。或者直接问下列哪个不是CRSC的特点,哪一个不是RISC的特点,基本的考察形式就是这样。那要求我们掌握什么呢?需要掌握两种类型的区别比较,既然是死记硬背的,就不一一念出来的,那主要讲什么呢?主要就是将如何理解RISC和CISC,以便呢可以很顺利的把表中的内容记下来。CISC是以前提出来的一种环境系统,什么时候提出来的呢?是在计算机还没有大规模通用化的时候提出来的,在这个时候,计算机属于奢侈品,比如说一个机构,需要一台计算机,那这个时候需要怎么做呢?需要找到厂商来为我们定制一台计算机,这台计算机从硬件到指令系统,都是定制的,你比如说这台计算机用来处理天气预报的信息,那就会根据运算能力来设定这台计算机,计算机可能不是我们看到的笔记本的大小,不是台式机的大小,而是一间房子那么大,很多元器件组装起来的,你要进行什么样的业务处理,就需要设计哪些指令,在在指令基础上,去完成业务。这还是很多年前的事情。好了,有了这么些历史背景和环境,我们就能够理解,CISC为什么称为复杂指令集,因为呢这种指令系统根据不同的用户,做不同的指令,而且呢,指令的数量会相当的多,指令本身呢,很复杂,好,在计算机发展的历程中,原来都是各个单位的专用设备,现在呢计算机成为了通用设备,每一个机构呢,买了计算机装上软件呢,直接跑,人们就要考虑把这个指令系统呢进行精简化,让它适应力更强一些,而且呢要做优化,那这个时候我们开始把繁杂的指令系统开始简化,简化到最基本的操作,然后复杂的操作呢,都用基本的操作替代,比如一个乘法指令,可能比较复杂,那就把它剔除出去,只需要加法指令,把乘法看成多个加法,这样一来呢,大大降低了指令的数量,所以叫精简指令集,就是这样的一个情况,我们在来看表中的内容就比较好理解。
比如指令数量,复杂指令集会多,然后复杂指令集,很多个指令,那么有些个指令可能是频繁需要用到的,有的简单一点,有些复杂的呢,不见得使用频率会很高,这就是为什么需要把一些复杂指令需要排除掉的一些原因。所以使用频率差别比较大。一般是用可变长的指令,什么叫可变长的指令呢?就是我们指令在系统当中,会根据二进制的编码,长度可以不同,而在精简指令集中,指令的数量少,使用频率也比较接近,就用定长指令,就是所有指令长度都是一样的,就是这样的一个情况。同时精简指令集呢,为了提升效率,大量引入了寄存器,绝大部分都是针对寄存器来操作,那为什么需要针对寄存器操作呢?是因为寄存器速度极快,极高,后面我们会讲到寄存器,只有这个LOAD/Store,一个是读取,一个是存入,来操作内存。其他呢都操作寄存器。得到了比较高的效率。寻址方面呢,精简指令集也大大减少了,同时呢也会使用硬布线逻辑控制为主,因为硬布线逻辑有什么好处呢?就是效率高,软硬件对比呢,硬件一般就是设计比较复杂,但是一旦设计出来了,它的效率比软件实现同样的功能更高效,快,而且呢精简指令集更加适合流水线,支持高级程序,现在来讲,精简指令集的数量大大超过了复杂指令集。它是主流。就是这样的一个情况。
流水线
流水线这个知识点啊,在考试当中,几乎每一次考试会考到。考察的时候主要是考这一个,计算的问题。所以在这个部分,咱们会讲到流水线的概念,并且呢,会讲到流水线基本计算的一些公式和方法,和理念。首先我们需要了解到的,什么是流水线?流水线是通过什么样的原理,来提高各指令执行的速度和效率的问题?
好,我们首先来看一个简单的示意图,就是左边这个图,在没有使用流水线我们执行一条指令情况,因为执行一条指令会分为取值->分析->执行,三个步骤,好,如果说我们是顺次的,没有使用流水线,一条一条指令来执行,那么会是什么情况呢?
首先我们要执行第一条指令的取值,在执行第一条指令的分析,最后呢进行第一条指令的执行,好等第一条指令执行完成之后,立即开始第二条指令的取值,分析,执行,这样看来呢,我们是在每两条指令中间,没有留这个时间间隙,看上去我们觉得没有时间上的浪费,因为一条执行完,另外一条立即开始了,但真的是这样子的吗?不是这么回事?咱们看我们画的这个图,画的这个图就能够展示出以顺序执行的方式实际主要浪费在哪里?由于取值,分析,执行这三个步骤是由三个不同的部件来完成,所以我们把它细化来看,有大量部件大量时间是在空闲状态,比如说取值,只是第一条指令在整个执行里面的第一个步骤,在完成这个步骤之后,取值的部件是处于空闲状态的,这里可以看到两个空白的,空,接下来做分析部件,分析部件此时处于忙的状态,在完成这个小的时间片任务之后,它也处于空闲状态。同时呢,执行也是用到了一小块时间片。这样子,我们会发现顺序执行的时候,有大量的部件的时间片,属于空闲状态,而流水线所作的工作,是什么呢?是把这些空闲的片给利用起来,如何利用呢,在我们完成第一条指令的取值指令操作之后,第一条指令开始做分析,与此同时我们开始第二条指令的取值操作,也就意味着,不需要等到第一条指令完全执行完,我才开始第二条,而取值完成之后,我就开始第二条,这样子的一个过程,就好比第一次在工业上运用流水线技术是在什么场景呢?福特公司,汽车,原来在没有利用流水线技术的时候,各汽车是如何组装的呢?因为主要是考虑到组装这个环节,是分班组,一个班组负责把一台汽车装配完,才开始下一台汽车的装配,好在这个过程中,福特,就亨利福特,福特公司的老板,就发现了一个问题,什么问题呢?一个班组完成一辆汽车的组装,接下来立即完成下一台,看上去没有时间间隙,实际上在组装这一台车过程中,有大量人员,是属于休息状态,空闲状态,也就是说,有些人只装配发动机,我们知道,一台车的话,你不可能所有人一拥而上把这台机器组装起来,得先在车上先装发动机,在装变速箱,在装外壳,在装什么玻璃之类的,好这个过程中呢,开始装发动机的人在忙活,装玻璃的人在休息,等到装玻璃的人忙活的时候,装发动机的人是在休息,所以呢,就造成了这种人工的浪费,后来呢,福特就提出来,用流水线技术。
流水线计算
在了解了流水线基本概念之后,我们再来看,流水线相关的计算。在考试过程中,考的最多的就是计算相关的问题。计算第一个需要解决的就是,流水线执行时长的问题,好,我们以一个例题来看执行的问题。
首先我们来看到流水线周期,流水线周期指的是执行周期最长的一段。什么叫执行周期最长的一段呢?在整个的执行过程中,会分三个段,一个是取值,然后分析,最后执行。这三个段中最长的段叫流水线周期。所以流水线周期很明显是2ns,这个流水线周期呢,又可以理解为我们去完成一个事情,要分几个步骤,这个步骤中最耗时,最长的那一个,就是流水线的周期,这是流水线周期的意思。这里呢是2ns,再来看100条指令全部完成需要多少时间?
分析的时候如何来看待呢?我们看到第一条指令取值,第一条指令分析,第一条指令执行,消耗了三个周期,完成了一条指令的执行过程,接下来再看第二条指令,第二条指令呢,在第一条指令结束后,在走一个流水线周期,就完成了。就一个时间片就完成了。在到第三条指令,也是需要一个时间片,以此类推,4,5,6,7,8,9,10,n,每一条指令的完成都只需要占用一个周期,它们有叠在一起的部分,正是因为这一点,咱们可以把流水线执行过程,分两个段。前面一个段呢,称为流水线的建立时间,就是相当于流水线开始时的一个运作时间,运转起来后产出的第一个产物,他会非常有规律的每个周期都会产出一个物品,这个意思。所以呢计算的时候也分两部。第一部分呢就是第一条指令的执行时间,第二部分呢就是(n - 1) * 流水线周期,这样子计算呢,是因为第一条指令完成了,还剩n-1条指令执行,而着n-1条指令是在一个流水线周期内完成的。
这是理论上的,但是在具体执行中又有一个问题需要注意,计算指令第一条指令到底耗时多长?是有争议的,理论上来讲就是顺次的执行一条指令,但是呢有时候发现不工整的时间片很小就1ns,那我还不如工整的看成一个周期,就是第一条指令执行的时候,每个段我们都认为是一个周期,这样子的话呢图就非常工整,所以呢还有第二种计算方式,(k+n-1)xt,一般优先使用理论公式,若答案没有理论公式的答案,就使用实践公式。
流水线吞吐率计算
所谓吞吐率,实际上就是在单位时间,处理任务的数量,像我们平常,日常生活中,经常听到某港口的年吞吐率是,多少万吨?这种说辞,那他是以年为单位,来衡量,看这一年内进出港口货物的情况,这是吞吐率的基本概念,而在流水线这种工作环境当中,吞吐率如何去计算呢?思路很简单,就是将流水线执行到的指令条数/流水线的执行时间,比如,100/203 ,流水线最大吞吐率可以达到1/t。就是一种理想状态情况 n /(k + n - 1)t ,n->∞
流水线的加速比
所谓加速比,就是指完成同样一批任务,不使用流水线执行所花费时间/使用流水线所执行的时间的比值,这个很简单,但是我们真正要看的是,流水线的效率,所谓效率,是衡量整个时空图到底有多少这个时间片,属于有效利用的情况。有多少时间片是没有时间片去利用的。这样的一个情况。我们来看到一个示意图啊。假设我们要完成的任务分成了四部,四部分别是s1,s2,s3,s4,其中s1-s3的时长是t,s4是3t,这时候流水线周期取3t,我们发现带颜色标注的是正在运作的时间片,而白色块是空闲块,虽然利用了流水线技术,任然有很多时间片是浪费掉的,那么具体有多少时间片是利用上的呢?这就是流水线的效率。先把带阴影的块求出来,再把总块求出来,这样子一除就得到了流水线的效率,比如这个实际消耗的时间片有多少,如何计算,一条指令完成需要消耗的时间片是t,t + t + t + 3t,这是一条指令,需要消耗的真实时间片, 总共有四条,所以*4,这样就求出了所有颜色块的面积大小,然后总的来讲,一共有多少时间片呢?15t * 4个部件,面积为60.
那提出这个值的含义是什么呢?有什么价值呢?主要就会提醒我,要如何去设计流水线,让整个的流水线效率最高,像下图最高流水线呢,效率其实不是很高,为什么啊?因为有一个步骤非常耗时,其他步骤耗时基本上是均等的,什么样的流水线他的效率是最高的呢?就是每个流水线它的时长是相等的情况,效率往往最高。
层次化存储结构
在存储这一块,我们主要要了解这么几个方面与内容,第一个,是存储的整体的一个结构,第二个方面呢,是cache相关的一些知识,第三个方面就是内存。 首先我们看到,层次化的存储结构,在层次化的存储结构当中,我们需要了解到,基本的层次是如何划分的,哪些存储器性能比较好,哪些存储器容量比较大,为什么要以这种层次化的结构来组织,这些是我们需要理清楚的,在整个的层次化结构当中,速度最快效率最高的是寄存器,寄存器在什么地方呢?它存在于cpu当中,在cpu当中会有运算器,控制器,那么在运算器和控制器当中会有相应的寄存器,就是这样的一个情况。那么寄存器的容量是极小的,但是呢速度非常之快,所以呢它是属于存储结构中的最高层。接下来就是cache,cache是高速缓存存储器,在下一层呢是内存,内存以下呢是外存,那么速度最快呢,是寄存器,其次是cache,一层一层下来,越是上层的速度越快,但是从容量来看,容量最小的是寄存器,初步增大的一个顺序呢,是到cache,内存,外存,这是基于一种性价比的考虑,那多级是基于一种什么理念去完成这么一个过程,在加入了为数不多的寄存器如何提升性能呢?讲到最典型的一个,就是内存到cpu,cache不是必须的,我们可以拿到cache,因为cpu里面的一些数据呢,可以与内存直接做交换,但是这样子做速度极慢,比我们加入cache这个层次比要慢上百倍,cache一般都是以k,大一点就是M为单位来衡量的,多少k字节,多少m字节,而我们知道平常的内存啊,是什么样的级别呢?动不动就是多少G的内存,cache里面存储的内容均来自主存,所以cache存储的是主存一部分的内容,而这一部分呢量是相当之小,相差了几个单位的级别了,但就是加了cache后,效率却会成十倍上百倍增加,那为什么会出现这种情况?之所以出现这种情况就是因为局部性原理地存在,我们程序运行的过程中,如果说在执行某条指令,刚刚执行完这条指令,很可能要再次执行,他会频繁执行相同块里面的内容,这称之为时间局部性,比如说,这一个循环结构就有,你看循环体里面,要执行100万次,那循环体就要执行100万次,而初始化与输出的语句只需要一次就够了,所以呢我们把循环体的语句调入到cache里面,那这个时候呢,cpu与cache就会频繁的交互,这个时候不用跟内存进行交互,这样子的话呢,速度就极大的提升了,内存与外存呢,也有类似的情况存在,把需要运行的东西呢,把外存掉到内存里。提升效率的同时,没有增加很多成本。cache还有一个显著的特点,就是按内容存储。什么叫按内容存储,就是我们存信息的时候,就会考虑这个信息的内容,然后根据内容存到不同地方。我要读取这个,内容出来的时候,通过内容一算我就知道,内容存到哪一个块当中,这就是按内容存储,这种按内容存储呢,存储器呢又叫相连存储器,它的效率会远高于按地址存储的。
cache概念
下面我们看到存储体系中存储体中的一些存储器,比如说,首先看到的是cache,cache呢它工作于cpu与主存之间,他是为了提高访问的速度,而提出来的设计方案,在整个的存储体系当中,除了寄存器,cache是最快的,因为寄存器空间集成在cpu当中,所以我们没有把它当作最顶层的存储器来看待。有寄存器的情况选寄存器,没有寄存器就要考虑选cache,它之所以能大幅提高效率,依据就是局部性原理,之前大致了解了局部性原理,现在要具体了解其原理以及分类。重点就是引入cache之后,如何来计算使用cache加主存这种层次形的存储体系的存取的平均周期时间,这个要会算。计算起来很简单,就用到给出的公式,先举一个数据的例子,来说明公式如何去用它。他是一个什么含义。假如这里的t1代表cache存储的周期时间,假设cache存取的周期是1ns,t2是主存的周期,主存的周期往往比cache的时间大很多倍,假如是1ms,也就是1000ns,那比如说仅仅只用cache,不用主存,就把cache当主存用,那这个时候呢,系统的存取的周期是1ns,快的很,
那么我们不用cache,只用主存,那么这一个存储周期呢,会比较长,是1000 ns,好这个时候呢,我们用cache + 主存的形式会是什么情况呢?我们还要给出一个变量的值就是h,代表访问cache的命中率,什么意思呢?在多级的这种存储结构当中,我们cpu在处理某个数据的时候,首先会考虑在cache里面会读取,如果说需要读取的数据在cache当中,那么这个操作就叫做命中。因为一读cache,就拿到了我们想要的数据,就命中了。如果说,cache当中没有我们需要的数据,会怎么样呢?cpu会在内存里面去调用,基本的思想就是这样子。命中率就是我读取cache的时候,能够获取我需要数据的概率,假设这个概率是95%,这个时候呢,要算平均的周期,就很容易了,就是用t1也就是1ns x 95% + (1 - h)1000ns = 50.95ns,而没有引入cache呢需要1000ns,这样子呢效率提高了将近二十倍
局部性原理:
前面讲到了局部性原理,接下来讲一下局部性原理是怎么回事?局部性原理主要讲的是计算机在处理相关的数据程序的时候,一般呢,都会有某一个时段,集中的去访问某些指令,或者说,某一时段,集中的去读取某些空间的数据,这样子的特性,之所以要,这种特性,拉出来研究,是因为呢,他对于,我们采用这种多级存储体系,来解决存储的这一个量和速度之间的一种矛盾的解决方案,因为我们之前也讲了,速度快的成本太高,代价太大,所以呢只能做小容量,而成本便宜的效率上不去,所以有了局部性原理组合一下能够得到最高的性价比,我们来看到具体的一个实例,
int i,s = 0;
for (i = 1;i < 1000;i++) {
for (j = 1;j < 1000; j++) {
s += j;
}
}
printf(j)
其中初始化语句执行一遍就够了,到了中间的循环体,在执行的时候是什么情况呢?里面的语句要执行100万次,而要是把这个循环放入cache,这样就不需要每次从内存中取,这样子效率大大提升,这就是所谓的时间局部性,就是刚刚访问完的指令再次访问,那什么叫空间局部性呢,对于数组的处理,会比较明显,比如一个数组A,第一个空间是a0,第二个是a1,在是a3,a4...,这样子下来,我们对数组的值做初始化,每个空间值都要初始化为0,那操作的呢是邻近的一个一个的空间,当程序首先访问了这个空间,立即又访问了他临近的空间的时候,我们称之为空间的局部性,这就是空间局部性的概念,工作集原理就是把要频繁访问的页面集合给它打包起来,这样子就能够使得咱们就频繁访问的就可以一起调入进来,完了之后呢,短时间内不被替换出,cache这样子呢以提高效率。
主存-分类
下面要看到的是主存这一种存储器,在这一部分内容当中,我们将讲到主存的分类,和主存的编址,其中呢主存的编址考察的概率是比较高的。首先来看分类的问题的,主存的分类可以分为随机存取存储器和只读存储器两种,那么随机存取的存储器呢称为RAM,而只读的呢称为ROM,在计算机当中,这两类不同的存储器,有着不同的职能,比方说,我们常见的内存,就是属于随机存取存储器,他有什么特点呢?就是内存一旦断电,内存当中的所有数据都将被清除掉,保存不下来,一掉电,信息就丢失了,而ROM是只读存储器,在掉电之后,是任然能够存储相应信息的。比方说我们的bios,就用到的呢rom,就是存储bios这样的一个芯片,就属于rom的一个存储芯片
再来看到主存的编址,所谓主存的编址,实际上呢就是把,芯片组成相应的存储器,那么在用芯片组成存储器时候,咱们往往呢需要呢分析,什么样规格的芯片,多少块,能够组成按什么方式编址的存储空间,要解决的是这么一个问题。就好比呢,我们有一个芯片,这一块芯片他的容量是8x4个bit位,主要是为了展示方便,所以就用到了一个容量极小的一个芯片作为示例,在这块芯片当中,8x4位什么意思呢?8代表他又八个地址空间,而x4这个4呢代表呢,每一个地址空间是存储了4个bit位的信息,比方说000是一个空间,里面呢就有4个bit的容量,001,002依然如此,当然咱们这里呢是,用的二进制,002是用的010来表示,这是8x4位的存储器,如果说我们要用8x4位的存储器,组成一个8x8位的存储器,那我们将两片芯片呢这样子连起来就可以了。连起来之后,他的地址空间任然是8个,但每一个地址空间呢,能够存储的位数,已经有四位变成了八位,所以呢,这个存储器的整个含量呢,是有8x8位,当然咱们也可以用8x4的芯片,两块组成呢,16 x 4位的存储器。这也是可以的。那一般考察,是如何来考察的呢?是以这样一种形式,他告诉你内存地址,是从AC000H到C7FFFH,总共有多少k个地质单元?问有多少个?要如何计算呢?就是用大的地址减去小的地址+1,就ok了把,为了计算方便,我们往往会把呢?C7FFFH先 + 1,为什么呢? 因为+1之后呢?会变成C8000H,再来计算呢就会变得简单容易,结果为1C000H这么多地址空间,问有多少k?k = 2的10次方,固1c000 / 2的10次方 = 112.
磁盘结构与参数
下面看到的是磁盘结构以及呢依附于磁盘之上的相关的一些计算逻辑,像磁盘的这么一个部分,以前考察的知识点多,但是现在慢慢缩减,主要呢是两个方面的问题,值得我们注意,第一个呢就是磁盘他基本运作的大致的原理,就是我们要知道,在读取一次的数据过程中,磁盘要做哪些动作,需要消耗哪些方面的时间,这个是我们需要掌握的,磁盘呢有我们之前很早之前就用过的叫磁盘,像我们现在的硬盘,不是ssd这种,就是普通的机械硬盘,他也属于磁盘。磁盘呢,是用一个环形的盘片,上面涂上特定的材质,来保存数据,在磁盘的这种结构当中,盘面用来保存数据,读取数据要有专业的设备,就是磁头,像多蝶的磁盘他会有多张盘在里面,然后每一个盘面存取一定的信息,然后有这么一个磁头,用到这个盘面,位置栏,完了之后要读取的话呢,磁头要先挪到相应的磁道上面,什么叫磁道呢?就是在这么一个圆环上面,这一圈一圈的同心圆,就是磁道,存信息的时候呢,是存在磁道上面,所以咱们要读取磁盘的信息,首先要把磁头定位到,我们目标的磁道上面,这个需要消耗异地的一定的时间,这个时间被称为寻道时间,第二个是旋转延迟时间,称为等待时间,是什么意思?在一个磁道上面,会分很多个扇区,就画了很多线,一个磁道的一小块这个呢是扇区,我们存储数据的时候,就是存在扇区上面,假设我们磁头目前是在这么一个位置,我们扇区呢是在蓝色标识的这个区域,这个时候我们直接读取信息是不能够读的,因为没有对应到相应的磁道上面嘛,没有对应到相应的扇区上面嘛,那我们就要旋转这个磁盘,等他转到这个磁头底下来,就可以读取,所以呢会有一个等待时间,也称为旋转延迟时间,那么这么一个旋转延迟时间一般怎么计算呢?算的是平均时间,就是最好的情况是不需要转动,就在当前位置,是我需要读取的信息,就直接读,最差的情况呢,是要几乎转一圈,才能够定位到这么一个扇区,所以平均情况下,旋转的延迟时间,是磁盘转一圈的时间,所以如果说,告诉我们寻道时间,告诉我们等待时间,也称为延迟时间,我们就可以计算出读取一个盘块需要花多长时间。
总线:
计算机的总线根据所处的位置不同,通常可以分成三种类型,第一种是内部总线,第二种是系统总线,第三种是外部总线,这些总线它所代表的范围,是什么情况?得有一定的了解。内部总线往往是指的微机内部各个外围的芯片与处理器之间的总线。芯片这一级别的。系统总线,微机中各插件板,系统版之间的总线,是属于插件版这一层级的,你比方说我们平常所接触到的pci的接口,vjl这些接口,外部总线呢,是这个微机与外部设备的总线,这样的一个情况。我们进一步需要了解到的呢,是系统的总线,系统总线具体可以分为,数据总线,地址总线,和控制总线。数据总线是用来传输数据的,你比方说,我们有时候讲,计算机是32位的,64位的,这各32位就代表呢一个计算机就是32各bit位,说明呢总线的宽度32各bit位,我们一次或者说一个周期做传输的数据量,就是32个bit位,是这样的一个情况。地址总线,地址总线是32位说明,说明地址空间是多大呢?就是2的32次方,其实呢也就是4g,一个宽度,所以我们会发现,我们用到的操作系统,32位的操作系统,它能够管理的内存就只有4g,但需要剥取一些线用作其他用途的时候,可以寻址的空间会更小一些,所以呢我们往往用内存的时候,考虑会超过4g,就往往考虑用64位的操作系统。否则你的操作系统是管理不了那么多的内存空间,当然这只是一个距离哦。在系统里呢也有这种概念的区分,控制总线呢,就是控制信号的总线,这就是对总线的一个基本的了解。
系统可靠性分析-串联系统与并联系统
串联系统和并联系统主要是计算方面的问题。就是给你一个串并联交织在一起的模型,你要能够计算出相应的可靠度。首先看到串联模型。
n模冗余模型,是这么一个模型,软硬件领域,就是我们在面向一些高可靠性系统的一些要求的时候,会考虑如何提高系统的可靠性,提高可靠性的时候可以使用冗余的方式来进行,如何冗余呢?r1,r2到rn,模块是独立的,做同样的职能,做同样的计算,它们分别计算出结果,然后系统最终采纳哪一个结果呢,通过表决来决定,所以r1到rn多个子系统的结果全部汇总到表决器,像这个时候,r1得到的结果是1,r2得到的也是1,rm得到的是0,通过表决器,一计算就知道呢,输出应该是1,少数服从多数,好这时候rm虽然算错了,虽然出故障了,但是它不会影响到整个系统的正确性,整个系统输出的还是正确的结果,这就是n模的冗余模型。它通过这种表决的方式,把一些错误是相当于屏蔽掉了,这就是这么一个基本的思路,那至于计算呢,涉及到组合。用到这一个公式来计算。当然整个几乎不考,常考的就是串并联的计算。这种题怎么做呢?我们要先从整体来看它是串还是并
差错控制
差错部分主要讲到的是校验码,那校验码当中,CRC和海明校验码它的基本原理以及操作流程,这些东西呢是要求掌握的。在此之前呢,需要了解关于校验码相关的基本概念。首先什么是检错,什么是纠错,这个很好理解,检错就是检查出错误来,纠错呢是不但把错误检查出来还得把他纠正。要达到这样的目的,往往呢是通过,加冗余信息来实现。而在编码的过程中,往往呢就是通过增大码距的方式。来达到我们想要的效果。为什么这么讲呢?咱来来看到,如果,说我们两个码字,需要做编码,就是A,B两个字母,那我们看哦,我们设置的编码长度不同,会有什么样的影响。假设我们只给一位的二进制编码,A=1,B=0,那这种情况能不能检错?是不能够检错的,为什么呢?我给你发了一个编码1过去,结果传输过程中出现了问题,这里的1传到你那里变成了0,请问大家你能够识别,这个编码传错了吗?不能识别吧,因为0和1都是合法的码字,我无法识别你到底是要给我传1还是0.好,那我们如何去解决这个问题呢?我们可以通过增大码距的方式,怎么做呢?用2位二进制编码,两个位,然后字母编码是11,字母B是00,我要给你传一个A,那我就要传11过去,结果传的过程中,链路出现了问题,就把两个二进制位穿错了一个,传成0了,当你接受到这个信息,你能不能够发现这个错误啊?当然能啊,我们老早就约定了,11是A,00是B,压根就没有10这种编码,你发个10过来肯定是在过程中出现问题了,就是通过这种方式来发现错误。那这个时候能不能纠错呢?没法达到纠错的效果。因为可能是00前一位传错了变成了10,也有可能是11前一位穿错了变成10.那怎么拥有纠错呢?我们可以进一步提高码距,怎么做呢?采用3位的二进制编码,那这个时候111,000是合法。要是收到110,可不可以发现错误呢?当然可以,那能不能纠错呢?能?为什么呢?因为我们认为通信电路是比较可靠的,很难出现错多位的情况,在常规的统计看来,最多出错就1个bit位,我就把这个110和合法的码字来匹配,看哪个最接近,就是哪个编码。
提到了很多码字,码距等概念?
那什么叫码字,什么叫码距呢?
码距:一个编码系统的码距是整个编码系统中任意两个码字的最小距离。就是变化多少位,得到另外一个码距,你比如说采用一位的长度,A=1,B=0,改变一个位,把0改成1就变成另外一个编码了,这样的码距就是1.如果你要变化两个位才能把一个合法码字变成另外一个码字,那就是最小的码距就是2.同样的道理3.
怎样可以纠正,n个错误?怎么可以检测n个物码呢?
就可以通过码距和它们的关系,当然呢,这一块也不要求深究。CRC和海明校验码才是需要掌握的。
校验码-循环校验码CRC
下面我们看看循环校验码CRC,循环校验码,首先给它一个定性,就是这种校验码呢,他是可以检错但是不能够纠错的这么一种编码。那么具体来讲,基本的原理和思路是什么呢?就是咱们,在进行信息的编码的时候,在他的尾部,加入一些校验信息,加入这些校验信息之后,让编码后的数据,能够与循环校验校验码的的多项式相除,余数为0.按这种机制来走的.就是给它不上若干个校验位,如果说接收方校验的时候,发现呢,除生成多项式,它不能够让余数为0,那么这个时候呢,就说明传输过程中出现了错误。这是基本的一个思路。在这个过程中,我用到的除法,是一种模2的除法,那么模2的除法和普通的除法得到运算有什么区别,这一点咱们先要搞清楚。
10111 对 110 的模2除法:
足三位商1,不足商0。亦或做减法
海明校验码
海明校验码是考试的难点,同时考察频率也较高。我们要了解海明码编码的基本规则,要知道如何去编码,要会计算多少位的信息位,需要多少个校验位,要了解这些知识,首先我们要了解,海明码中,要完成的这种串中,哪些位置是校验位,哪些位置是信息位,在这种编码体系当中,明确规定了,校验位的位置,是位于整个信息编码完成当中的2的n次方的位置。比如说2的0次方位,也就是第一位,应该是方校验位,2的1次方位也就是第二个位,也是方校验位,2的平方位也就是2次方位,他把这个校验位的位置给定死了。定死之后,有什么好处呢?我们可以直接把这些位置的数据给跳出来,这些是校验位,其他位置在填充信息位。好,在这里我们先不讲理论化的一些公式。我们从客观规律来看,如果说我们有一个信息位,最终的编码长度是多长?大家想一想,我的信息位只有一个位,最终的编码,他会有多长,应该有三个位的长度吧,大家想想是不是这么回事哦,我要放一个信息位进来,发现呢第一位置不能放信息位,职能放校验位。然后再看第二个位置,还是只能放校验位,第三个位置才能把我的信息位放进去,此时就完成我的任务了。所以呢至少会有三个位。如果说,你要放两个信息位的话,最终的编码会有几位的长度呢?就会有5位的长度吧。
怎么求信息1011的海明码呢?
首先看,有四个信息位,1-2呢不能存信息位,第一个信息位是第三个位置,4不能存,故5,6,7刚好存剩余三个信息位。总结的客观规律就是 2的校验位次方 >= 信息位个数 + 校验位个数 + 1.
固需要列表:
1 2 3 4 5 6 7
r0 r1 i1 r2 i2 i3 i4
1 1 0 1
7 = 2的平方 + 2的一次方 + 2的0次方
6 = 2的平方 + 2的平方
5 = 2的平方 + 2的0次方
3 = 2的一次发 + 2的0次方
r0 = 7 亦或 5 亦或
3.01 操作系统
操作系统这一章呢,主要考5-7分,重要程度还是比较高的,对于操作系统这一概念,它的本身大家是不陌生的。因为使用计算机,天天需要跟计算机打交道,但对于它相关的一些原理,可能大家平时呢也不会那么深入的去研究。
首先在将具体的一些知识点之前,先讲讲操作系统的一些基本情况。首先操作系统是用来管理整个系统的软硬件资源。如果说我们把一台计算机,买回来之后,没有装操作系统,那么你是无法控制这台计算机的资源,只有装上操作系统,你才能控制这些资源,相当于呢,操作系统是人和硬件之间的一种接口,比如说我们可以通过点击鼠标,往硬盘里面去存放一些数据,把一些数据读取出来。这都要依赖于操作系统。其他的应用软件,你像我们用到的,office系列的办公软件,也是工作于操作系统之上的,所以呢,操作系统是人机接口,也是应用软件和硬件之间的接口。那这种接口呢,人和计算机之间而言啊,接口往往是命令,比如说原来的dos系统,那你就只能够呢通过命令的方式来控制计算机,好在这个过程中呢,要去学习一些命令的使用,而且呢感觉不是那么直观。所以呢,后来出现了windows系统,出现了windows系统呢,无型化的,你可以呢只管的去操控,所以你像命令的方式,窗口的方式,这些呢都是人和计算机之间的接口,而应用软件,和硬件之间的接口,是指的什么呢?是指的bi的这些接口,我们应用软件要调用硬件的一些资源的时候,可以使用操作系统专门为应用软件调用硬件的软件接口,来实现相关的功能。就是这样的一个基本情况。好,操作系统那具备哪些管理职能呢?包括进程管理,存储管理,文件管理,作业管理,设备管理,各个方面。而这几个大的方面,又可以具体包括很多小的知识点,比如说进程管理,就会包括进程的状态的一个情况,前驱图,PV操作,死锁问题。存储管理又会包括哪些,文件管理呢?像作业管理呢,设备管理呢,考得非常少,最后还会有微内核操作系统,会与普通操作系统有什么不同的特色?这是操作系统原理这一章会讲到的一些内容。
进程管理 - 进程状态
进程状态指的是,进程在操作系统当中对进程进行管理的时候,为进程指定了集中状态,便于给进程分配相应的资源,来管理。最初的时候,我们把进程分了运行态,等待态,和就绪态三种状态。其中的运行态,就是指的这个进程他所需要的所有资源都已经配足了,并且呢,给它cpu资源,他就处于运行状态。这是第一种状态。第二种状态呢,就绪状态,就绪状态是指其他的所有资源都已经配足了,只缺一样,缺哪一样呢?缺cpu资源,所以可以将这种状态是一种,万事俱备,只欠东风的状态,第三种状态是等待状态,是指除了没有cpu资源,还缺其他的资源,你比如说和外设有交互,或者说等待用户的一些指令,这呢称为等待状态。这是对三种状态的一种定性,完了就是看状态之间会有怎样的转换关系。
转换关系呢,表示在运行间呢,可以发生某个事件,发生什么样的事件呢?我需要等待某个事件的发生,意思是缺某种资源了,一旦缺某种资源了呢,就进入到了等待状态。如果说你等的这个资源,可以调配给你了,等待状态会变迁到就绪状态,注意哦,在这里,没有箭头从等待状态到就绪状态的,这说明什么问题呢?说明你在运行的时候,缺某个资源,你把资源补好之后,不能直接回到运行状态,你得到什么状态去呢? 到就绪态去。为什么要到就绪态去呢,你要重新排队才能获取到最为核心的cpu资源。所以等待事件发生的时候,你会到就绪状态去排队,就绪状态排队之后,等到cpu,给你调度指令,你就可以呢进入运行状态,进入到运行状态,不见得你把自身的任务全部完成,因为cpu资源是相当宝贵的,不需要用cpu资源,如果说你是一个大任务,进去之后,完整的占用了cpu资源,这个程序就无法运行。所以呢,很多时候,我们会采用时间片轮转的算法来分配资源。意思就是一个进程从就绪到运行,能够运行一个时间片,你的时间片用完了,即使你的任务还没有完成,那对不起,你得退出这个运行态,步入就绪态,下一次调度,等下一个时间片轮到你,你才能进入运行态。这就是三种状态的转换原则。等到三种状态应用比较成熟之后呢,我们发现一个问题,什么问题呢?
就是三种状态,不足以涵盖我们常见的各种情况,比方说人为的希望把某一个进程给它先暂停下来,管控起来,挂起来,这个时候呢用三态模型,就无法做到这一点。所以呢提出了五态模型。五态模型当中,运行态,活跃就绪态,活跃阻塞态,对应着三态模型。我们看到这个三角形呢就是原来的三台模型,增加了什么状态呢?静止就绪,静止阻塞,这两种状态,加起来就变成五态模型。那这两种状态和原来之间有什么关系?咱们来看一看,提出了一种挂起操作,当你是运行态,并且挂起,就会进入静止就绪态,因为这是你人为的想把进程先搁置在这里,并不缺其他资源,这是静止就绪态。静止就绪态我们如果恢复或者激活,通俗一点讲我正在听歌,然后呢突然来了一个电话,这个歌声呢会影响到我接电话,我就给它暂停,一个挂起的动作,挂起之后等待我接完电话,会点回复播放,这时候呢就激活了,就进入了活跃就绪态,活跃就绪态调度就可以运行了。同样的原则,在静止阻塞进行激活,也可以到达活跃阻塞的状态。阻塞和之前的等待是一个意思。
前躯图
前驱图是考试中经常考到的一个知识点,它往往和pv操作结合起来,在这里呢我们只会介绍前驱图的基本理念,至于和pv操作结合起来的部分,会在后面pv操作的时候再来讲到它。首先来看,前驱图试图解决什么问题?表达什么样的信息,我们来看到,这里有一个实例,这个实例我们要给它详细的描述。给大家介绍一下相关的情况就可以了,比如说在北方,中国有这种传统,就是过年的时候包饺子吃,那包饺子呢,会有多个工序,包括呢你需要去绞肉,就把买回来的肉啊,要去切葱末,切姜末,甚至还要切什么其他一些佐料,这里呢只列举这么几个出来,切好之后我们要把各种配料加上什么盐啊,什么味精啊,等等其他一些调料,进行搅拌,搅拌好了之后,做好饺子皮,才能够呢进行包饺子的动作。好,就是这样的一个事情,我们要完成这样的一个任务的话呢,可以采取顺序的流程,比如说,我先绞肉,再来切葱末。。。这个操作是没有问题的,但是呢,我们平常操作手法不是这样子的,大家人多力量大,大家一起来做嘛?就不要一个人从头忙到尾,一起来动手,做一些事情,那这个时候我们就要考虑,哪些任务是有先后关系的,而哪些任务呢是可以并行做的,如果我们用前面这个图来表达呢,就会给人一种误区,只能够先绞肉后切葱末,这个逻辑就有问题啊,所以前驱图表达的是要完成一系列活动他的先后约束关系,比如说我们通过刚才的讲解可以了解到,绞肉,切姜末,切姜末是可以并行这走,所以呢我们会把A,B,C画在同样的一条线上,它们之间呢没有说要先做完A,才有B这样子的关系,所以它们没有连线的,但是必须要完成前三个活动才能搅拌,所以呢会有这样的约束关系,就是你要做D活动,你先得把A,B,C都做完,所以会有A到D,B到D,C到D的制约关系。好D完成之后,才能开始包饺子的动作,所以呢D到E有一条线,表示约束,就是这样的一个情况,所以呢我们可以通过这么一个图就可以直观的知道哪些任务可以并行哪些任务可以先后执行。也就是前驱图所想要表达的内容,这就是前驱图基本的理念
进程的同步与互斥
进程的同步与互斥是进行PV操作分析的前提,如果说你没有了解什么叫进程的同步,什么叫进程的互斥,往往是难以解决PV操作中的一些实际问题的。所以呢,我们先得把这两个概念分析清楚。首先来看到互斥,什么叫互斥呢,互斥就是指的同一时刻,只允许某一个进程使用这一个资源。这同一个资源不同同时服务于多个进程。比如说千军万马过独木桥。独木桥就是一个资源,不允许很多人同时上独木桥,会出现安全事故。所以呢,要求人员是一个一个通过的,一个人占用了这个独木桥资源,其他人得等待,叫互斥使用资源,如果说不是独木桥,是一个人行天桥,多人同时使用,我们认为这是一个共享资源,就是这样的一个情况。同步与互斥在PV操作里面,题非常之多,它们像一对双胞胎,经常说同步与互斥问题。先请大家思考一个问题,同步与互斥是不是互为反义词,想一想?应该不是互为反义词吧?互斥的反义词是共享,同步的反义词是异步,这一点先要了解清楚。不要把概念给弄混,什么叫同步呢?举个简单例子,比如说张三和李四约着去逛商场,但是张三步行,李四骑自行车,它们从同样的起点到同样的终点,可以预见的是,步行速度慢,自行车速度快,如果说它们都以全速前进,毫无疑问李四会先到,这个时候它们就约定,要一起到,那怎么办呢?那就是李四发现超过张三太远了,就停下来等一等,这被称为同步的过程。同步说白了,是有速度匹配要求。
了解这点之后呢,我们看看PV操作里面经常考的问题,生产者与消费者问题?
哪里会存在同步,哪里会存在互斥?
讨论一种简单的情况,就是单缓存区的情况,单缓冲区很简单,就是市场容量只有1,放了一个东西就不能放第二个了。然后呢对于市场的操作,不能说既有生产者存东西,又有消费者去搬东西,同一时刻只允许一人进入市场进行操作。这就是互斥。市场是一个互斥资源。拿什么是同步呢?就是生产者把东西放到市场去,放了一个,而市场容量只有1,市场就满了吧,我能不能在往里面放一个资源呢?不允许,一旦你放资源进去,就会产生溢出的情况,所以不允许这么干。只有等到消费者把市场里面的东西消费完之后,才允许生产者再往里面放东西,大家想一想,这个过程跟我们平时等别人是不是一回事?生产者要停下脚步,等消费者消费完,你才能继续往里面放东西,这就是同步与互斥的问题,多缓冲区类似的情况,只是说呢,同步的时候放的步子大一点,原来只能放一个,现在运行放十个,放满之后呢才会停下来等消费者,这就是生产者与消费者的同步与互斥问题。PV操作你是要分析清楚同步在哪些地方,互斥在哪些地方,你才能知道哪里想要P操作,哪里想要V操作
进程管理PV操作
利用同步与互斥的一些理念,来解决一些实际的问题。首先用到的工具就是PV操作,PV操作在整个操作系统中是属于最难的部分。它们的操作很复杂吗?不是,主要是应用很灵活。首先先看一组概念:
临界资源:所谓临界资源,是值的,进程间要去互斥所需要访问的一些资源,比如打印机,磁带这类。
临界区:每个进程中访问临界资源的代码,也就是代码段
信号量:是一种特殊的变量。讲它特殊,主要是应用于PV操作当中,一种专属变量。其他也没有非常特殊的地方,好了解这些概念之后,看PV操作到底是怎么回事?其实PV操作,它就是两大原子操作的,一个组合。又P操作,有V操作,我们通常讲到PV操作。它代表的是有两种这样的操作,具体两种操作时怎么运作的呢?像P操作,在执行P操作的时候,假设时执行P(S)这样的操作,那具体会怎么走呢?会首先把这个信号量S做自减1的操作,s -= 1,比如s原来是=10,执行一次后就变成了9了,在来判断S是否小于0,如果说这时候S < 0,这个时候呢我们会阻塞当前进程继续往下执行,把它阻塞起来,就是当前有P(S)这个操作的进程阻塞起来,阻塞起来呢,把这个进程放到这个进程队列中去,然后呢这个进程呢就属于一个等待状态。如果说,这时候S不小于0,比如说等于1,等于2,这时候呢,我们会继续执行这个程序。V操作呢,就是一个反向的操作,V操作一开始会把信号量做自加1,就是S=S+1,然后再来判断S 是否 <= 0,注意哦,这两个判断条件是有差别的,一个判断S是否小于0,一个是判断S是否小于等于0,这个细节需要我们注意。如果说,执行+1的操作,S <= 0这个条件成立,我们就会去系统的进程队列去拿出一个进程来,唤醒它,让它继续去执行。否则的话呢就继续往底下走了。就这样的一个情况。其实,P操作和V操作本身并不复杂,都是一些非常简单的操作组合起来的,接下来我们把PV操作带到一个具体的问题。来看一看这个问题,就是利用PV操作解决了什么样的问题。
进程管理-死锁问题
死锁问题主要了解这么几个问题:第一个就是咱们待会要展示的这种题型,给定一定数量的进程,然后告诉你每一个进程,需要多少资源。计算的是系统最少的是需要多少个资源,不可能发生死锁。另外一点呢,就是涉及到,死锁的预防和避免的问题,会涉及到银行家算法。首先我们来看这一个简单的问题,给定资源,然后判断什么情况不可能发生死锁。在讲到这个问题之前,首先我们得了解什么是死锁,所谓死锁就是指的系统当中有一系列的资源,有一些需要用到这些进程的资源,这些进程呢需要系统给它分配资源才能够运行,如果说系统在某一个时刻,发现所有的可用的资源已经分配出去了,而所有进程都没有办法完成它产生的职责和任务,从而释放所占有的资源,就会产生死锁。所有的进程呢都在等待给他释放资源,自己呢又不愿意把资源给别人,这样呢导致系统无法正常完成一些任务,从而产生了这个死锁问题。
最少多少不会分配死锁呢?我们可以给所有进程分配所需总数-1个,在多出一个,这样就不会死锁了。
银行家算法:
在分析死锁问题时,我们先得知道死锁的一些必要条件,通过归纳总结呢,我们会发现,死锁有四大条件,这四大条件缺一不可,缺了一个条件就不会产生死锁。我们来看是哪四个条件,首先是互斥,如果说大家,不是互斥使用资源,大家同时使用,那就不存在死锁。保持和等待是指的,这个进程会保持自己的资源,并且呢等待别人释放更多的资源,第三个呢是不剥夺,什么叫不剥夺呢,就是系统不会去,把分配给某个进程的资源,剥夺掉,然后分配给其他进程,系统不这么干,最后是环路等待,所谓环路等待,就是指的这种情况,A,B,C三个进程,A等B给它释放资源,B等C,C等A。这么看来呢,,解决死锁有两种方案,第一种是死锁的预防,第二种是死锁的避免。所谓死锁的预防就是打破这四大条件,比如说打破互斥,大家呢同时互斥使用,保持和等待呢就是打破这种局面,比如说你得不到这种资源,你就把这种资源分配出去了,不会一直霸占自己已经有的资源,又等待别人给你资源,还有不剥夺就是剥夺,别人已经分配了资源,当然系统可能产生死锁,那咱们呢就把已分配的资源去剥夺过来,拿别人的资源去解决当前的问题,就是这样的一些情况,打破四大条件,这个呢考察的并不多。我们就简单的概括,完了呢,最重要的一点呢,死锁的避免这种解决方案。
死锁避免主要有两种解决方案,一个呢是有序的时间分配,就是呢我先吧资源分配给A进程,在分给C进程,在分给D进程,依次类推,好,这样一来,我们会发现呢,资源的利用率会比较低,所以呢,更加灵活有效的方案呢,采取比较多的,是银行家算法,银行家算法呢,在考试当中,考察的频率也是比较高的,我们呢会详细的来讲一讲。银行家算法其基本的思想,是以银行房贷的思路来做资源分配,因为对于银行家而言,他眼中的资源,就是钱,他分配资源也就是放贷出去的时候,他要考虑这个资源能不能按时收回来,如果评估这个资源收不回来,银行呢就不会放这笔贷款出去。基本思路就是这样,所以在银行家算法里面,也会有同样的考量,如果说明显,这个资源分配给你之后,你没有办法偿还,就是没有办法执行完这个程序,然后会造成系统的一些风险,就不会给你分配这个资源,大体意思就是这样子。那具体来讲呢,就是通过一个实例来分析
存储管理-分区存储组织
操作系统的存储原理,存储这一块呢,我们之前在组成原理这一章节,已经讲到了某些内容,比如说cache的应用,讲到了内存的一些基本情况,还讲到了磁盘的一些情况。下面呢,我们从软件的一些层次,考虑存储这一块的机制。首先是,看存储管理这一块的一些分配算法,这个分配算法是在什么场景之下去应用的呢?就是我们有一个存储区域,这个存储区域,除了给系统用的,还有一个大的区域呢是给用户来用的内存空间,像这个内存空间原来是一块连续的空白区域,等到有一些程序需要运行的时候,系统就会把用户当前要用的数据代码提交到分配的组织里去,然后就给它分配相应的需求匹配大小的这样的一个内存,比如说作业一要执行的时候,他需要33k的一个内存,系统就给他分配了33k的,作业2需要22k的,就给他分配了22k的内存,但是从图上看,可能就会有疑惑了,作业1在0开始的地址,但是作业2为什么间隔了25k地址空间呢?主要是这样的一种情况,可能作业一原来有一个33k的程序,接下来分配了一个25k的作业,在有一个22k的空间作业分配下来,再分配10k的,这样子的话呢,等原来25k的程序,执行完之后,他会把这一块空间给释放回来,所以呢就得到了一个25k的空白区域,是这样的一个情况。好,在这种体制当中,我们知道存储区间它是动态分配的,就是你需要用多少,我就给你分配多少,分配的过程中呢,要进一步考虑很细致的问题,我有一个作业,他需要9k的一个内存,现在整个系统当中呢有多个空白块,一个是25k的,一个是28k的,还有一个10k的,那我要分配作业4一个9k的空间,到底从哪一个空白区做切割呢?这是一个问题吧?所以这要有相应的算法来,如果我们采用的是首次适应算法,那么作业4 9k的作业空间会在这一个位置,就是在首次能容纳9k的地方,切一个9k的块出来,所以原来的25k就变成了16+9,这就是首次适应算法,就是我们顺次的找下来,找到第一个符合需求的空间就ok的。再来看到最佳适应算法,什么叫最佳适应算法呢?就是我们会把空闲空间呢按大小顺序连成一个链,首先是10k的这个空间,在是25k的这个空间,在是28k的这个空间,分配的时候,首先用最小的空间,10k跟9k比发现够用了,就从10k的空间里面切9k的空间,分配给作业4,这就是最佳适应算法。如果接下来还要分配一个作业5,
就是1k->25k->28k,连成一个链,先看1k的空间满不满足要求,满足要求就给它分配,不满足就到下一层25k的这个空间。发现够了,就分15k的空间给他用。把剩余的10k连到这个链中。再来看到,最差适应算法,为什么要提出最差适应算法呢?那必定是最佳适应算法有他的缺陷。什么缺陷呢?我们会发现,最佳适应算法运行一段时间之后,整个系统当中的内存碎块非常多,而这种内存碎块很不好利用。为什么讲他很不好利用呢?是因为这种碎块非常之小,都是几k几k的.最差呢,就是逆过来.循环首次适应法呢是按顺序来连接的,25-28-10-25,用循环算法呢,分配起来会均匀一些。他不会老是盯着第一个块来分,就是这样子的一个情况
存储管理-页式存储组织
页
段页式存储应用十分广泛,基本上所有操作系统都会支持这样的一些机制,那么在段页式存储这一块,需要我们掌握的其实最为主要的是页式存储当中的逻辑地址与物理地址之间的转化,除此之外呢,需要了解到页式存储,段式存储,段页式存储这几种形式的基本的特点以及运作的方式,首先我们来看到页式存储,为什么要提出要页式存储,我们之前提到分区化的管理,就是我们会在内存当中划定一个用户区域,然后这个用户区域是供用户程序调用内存的时候用的,在这种管理方式当中,我们往往是把用户程序整体的调入内存当中,那这也就意味着,如果说你的内存是4g大,用户空间2个g,那么这个时候,我说我要运行2g以上的运行空间,是完全不可能的,甚至还不用2g以上的程序,1g的程序可能够呛,因为在内存当中,运行的时候这个空间呢,可能被打碎了,不是连续的,这时候虽然空闲区的空间加起来,1个g大,但是呢你不能运行1个g那么大的程序,他无法一次性的装入,好为了解决这样的问题,我们提出了段页式的一些基本思路,你比如说页式存储,他的做法是怎样的呢?把用户程序分成等分大小的页,比如说这里有个用户程序,我们把用户程序等分4k一个块的,每个4k的块称为一个页,把内存当中的这个存储区也分成4k一个,然后呢我要调入程序到内存里面来运行的时候,不再是把整个用户的程序一次性调入,采取的机制呢是我要运行哪些块,就把哪些块调入进来,把哪些页调入进来,这样一来,就需要一个页表来记录它们之间的映射关系,就是用户程序的多少页对应着内存中的多少块,有这么一个页表,如果说采用这种方式,就把之前讲到的超过内存容量的这种程序问题给解决掉了,你比如说你的内存空间是2g,你甚至可以运行4g的程序,为什么?因为我要用到哪些程序页,我就调用哪些程序页,已经用完的就把它掉出去,这样子呢就能完成大的程序任务了。这种方式呢有多方面的优点,一个呢是内存的利用率会很高,因为我们把内存分成4k的一个块,不能利用上的呢只是块内的某一小块空间了,比如说我的程序是102k,那你就要分26个页,最后一个页呢只有2k的一个程序,给它分了4k的内存,就有2k的浪费,仅此而已。要是有4k那么大的基本上都利用上了,这样一来呢就让碎片非常小。利用率很高,这是优点。但是,它也有显著缺点,缺点就是增加了系统的开销,可能产生抖动的现象,什么情况下导致了系统开销的增加呢?像这种方式啊,有一个页表,表记录了两者的连接关系或者说呢映射关系,那也就意味着我要执行某个程序的时候,然后我要定位具体的代码,那么我就想要通过查表才能够准确的定位,不像之前是连续的空间,连续的空间就不需要做这种映射表,直接呢就调用相应的内存块,像页式呢就需要这种转换,转换无疑就增加了系统的开销,你要先读取页表,然后去查看页号,这样子就耗时一些。可能产生抖动现象,抖动现象是怎么一回事,后面再介绍。再这种段页式存储的页式存储当中,考得比较多的是逻辑地址和物理地址之间的转换,因为再运行当中需要用到这种机制,逻辑地址呢和物理地址呢之间呢有很多部分是相同的,哪一部分呢,具体来讲呢就是页内地址,页号不一样,因为逻辑地址的页号对应着物理地址的块号,当然也可以做到相等,也可以是不相等的,因为页表呢也没有严格的限制,所以说呢页号和块号需要查表才能得知。至于页内地址呢,都是一样的,因为我们调入的时候是以页为单位,以页为单位的偏移量不会有变化,那么如何通过逻辑地址来求物理地址呢?我们首先得知道逻辑地址哪一部分是页号,哪一部分是页内地址,知道了之后可以把页内地址直接写下来就是物理地址,然后呢通过页号去查找块号,把两部分拼接起来就得到了物理地址.
段式存储结构,看上去和页式差不多,其实有非常大的差异。这个段式是按照逻辑结构来划分的,意思就是咱们一个程序当中,如何来划段呢?我会main主函数一个段,一个function1做一个段,再来第二个子函数再来做一个段,段的大小不要求一致,有的段可能是40k,有的可能是80k,有的是150k,这都是可以的,但在页式存储中这是不允许的哦,规定了页是4k的大小,所有页都是4k的大小。而段呢,是可以有区别的,有些段长有些段短,按这种逻辑划分会有什么好处呢?便于共享,这是最大的好处。但是相对来讲,这种内存的利用率低一些,然后呢内存的碎片大一些,因为需要根据段的大小再内存中切相应的区块,来完成这个任务。我们要知道,段表里面存的是什么,存的是段号,断长,因为每个段可能不一样,然后呢还要存长度,然后呢还有基址,表示的是呢这个段呢是从哪一个地址开始,连续空间段,这里记录了段长是30k,起始地址呢是40k,这是段式存储。
第三种呢,式段页式存储,是结合了段式和页式两种,综合形成的。先分段再分页,优点呢就是会有段式和页式两种的有点,空间浪费小,共享比较容易,缺点呢就是增加了软件的复杂度,同时开销页增大了,速度必然降低了,它先要查段表,查了段表还要查页表,就是这样子的一个情况。
最后看到的是快表,快表是什么意思呢?是一块呢小容量的相联存储器,相联存储器之前讲过,按内容存取,它的特点呢就是速度非常快,效率非常高。像这个快表呢是放在了cache里面,就是告诉缓冲器里面,相对来讲放到内存里面,都称之为慢表。
存储管理-页面置换算法
页面置换算法广泛应用于分层的存储体系当中。像我们之前讲cache的时候,已经提到过cache数量有限,所以呢,当cache所有的块都被占了,要调入新的块进来的时候,就涉及到页面置换的问题,再内存的这一个体系,同样也面临这样的一个问题。比方说,100次存储当中,一个程序有100个页,但是内存可以给它分配的页是非常有限的,比如说只有3个页,这个时候就不可避免的在程序运行中,我们要把一些不用的页掉出来,把一些现在需要用到的页,把它调入进去,这呢需要依据一定的算法,来进行识别,哪些页淘汰是比较好的,这就涉及到页面的淘汰算法,页面淘汰算法具有典型代表性的,有这么几种,第一种是最优算法,第二种随机,第三种先进先出,第四个最近最少使用。那这几种算法,其实在考试过程中,一般是两种,一个是先进先出,一个是最近最少使用。因为前面两种,随机算法没什么好讲,就是随机的淘汰一个,它的性能是不稳定的,最优算法,opt是一种什么样的算法呢?是一种理论层面的,为什么这么讲呢?因为它是在整个事情发生之后,就是我们已经知道访问的序列是怎么样的?而且呢根据这个序列来分析,算出什么时间点淘汰什么页面,能够取得最高效率性能的,在把这个当作最优算法。它针对每一个实际场景,算法设计都是不一样的,没有普遍的规律,而且呢,我们在实际的执行过程中,往往没有办法从整体上面来了解要访问的页面顺序到底是增样的
先进先出这种算法,思路其实很简单,就是淘汰时,我去判断哪个页面是最新进入内存的.它有可能产生抖动,抖动是这一章第二次提到的概念,什么叫抖动呢?抖动就是我分配给你更多的资源,希望你把这个事情做的更好一些,结果,分配了更多的资源发现不但没有起到正面的效果,反而呢让这个效率降低了,在页面淘汰算法中体现的是什么呢?我在内存里面给你分配了三个页面,你的缺页率假设是10个,然后我给你分配4个页面,资源多一些了吧,但是你的缺页次数超过了10个,这就叫抖动。这种情况是我们不想看到的,因为加了资源,效率反而更低了,那很多时候该不该加资源,分析起来就比较复杂比较麻烦。这是先进先出这种算法。
最后呢是,最近最少使用,这种算法呢,不会产生抖动,就是给它分配的资源越多,表现的性能会越好一些,什么叫最近最少使用呢?就是根据你的使用情况来看,刚刚被访问过的,是不会淘汰出去的,为什么啊?因为我们有局部性原理,刚刚访问到的资源很可能马上再次被访问到,就是这样的一个情况。下面以一个实例来说明这些算法的差异。
文件管理-索引文件结构
索引文件结构是一种非常巧妙的一种文件结构,这种结构本身的容量很有限,就是说不做拓展很有限,但是引入了一种扩展机制,可以很方便的把这个文件的容量,扩大很多倍,而且她的操作手法呢,很有意思。这个题呢也是间歇性的在考试中出现,首先讲一件索引文件结构的基本情况。一般的索引文件结构是有13个节点,13个节点呢是从编号0-12号,在考试的时候也会涉及到不是13个节点,会给大家有说明。说明哪些节点是什么情况,如果没有说明,那就是标准的13个节点。索引的文件结构当中,分成了直接索引,一级间接索引,二级间接索引,三级间接索引,这么些情况,分几级间接索引呢,主要是考虑到,文件本身扩展的问题,举个例子,比方说,一个物理盘块假设是4k的一个物理大小,假设我们13个块都是直接索引,那这个文件最大多大呢?4k x 13 = 52 k,容量呢是在是太小了,所以有人想了一个办法进行拓展,怎么拓展呢?我们规定0-9的地址对应的是直接索引,就是这个地址呢对应的就是物理盘块。盘块存的文件索引的内容.像前面这13个索引呢,存的就是13个地址,地址对应的盘块,盘块对应的内容。直接索引多大呢?就是10 x 4 = 40k,接下来到第十个节点,情况就不一样了,10这个节点指向的这个物理盘块,不在存索引的直接内容,而存什么东西呢?存的是地址。盘块的地址,每个地址假设占4个字节,大家算一下,一个物理盘块可以存多少个地址啊?用4k / 4b = 1024,说明一个4k的盘块可以存1024个物理地址,一个地址对应一个物理盘块,物理盘块才存索引文件的内容,这是1级间接索引?为什么是一级呢?是因为呢我们知道10号盘块的地址,完了呢我们需要从盘块读取地址,地址在去读取物理盘块的内容。折了一次,叫一级间接索引。一级间接索引可以存放的大小多大呢?4k * 1024 吧,这个容量是不是比容量的总和大了很多倍了啊,在来看11号节点,11号节点对应的是2级间接索引,怎么操作的呢?11号地址的盘块存地址,地址对应的盘块还存地址,最后才指向物理盘块。可以算一下二级间接索引存放的大小是多大呢?4k * 1024 * 1024,又扩大了一个单位级别,三级间接索引还要x一个1024,所以索引文件结构就是这样来扩充自己的容量的。间接的级别越多,访问的效率越低
操作系统-文件和树形目录结构
在操作系统里面,文件结构都是采用的这种树形的结构,有相对路径和绝对路径之分
文件管理-空闲存储空间管理
所谓空闲空间存储管理,就是指的在磁盘上面,会有大量的空间,我们需要把这些空闲的区间管理起来,以便在某个文件需要在申请存储空间的时候,能够有依据的给它分配相应的空间,这个空闲空间的区域管理,有几种不同的管理方法,包括空闲区表法,空闲链表法,位视图法,成组链接法,其中空闲区表法,讲到的是我们可以用一个表来记录哪些地方是空闲的,以便把他管理起来。空闲链表法呢,是把这些空闲区都链接起来,连成一条链表,然后进行需要空间分配的时候,这条链表上面画出相应的空间来用就行了。位视图法是我们需要重点讲的,最后是成组链接法,成组链接法是分组也分链的方式。这几种最主要的是了解位视图法,位视图法考察的频度很高,虽然不难,但是有一些细节需要注意。什么是位视图法呢?就是我们画一个位视图,然后呢位视图当中,1表达的区域表示已被占用,0表达是空闲的,我们把整个的这个存储空间分成了很多个物理块,就能直观的表达出哪些物理块是被占用的,哪些物理块是空闲的,这么一种情况,其实像位视图,应用是非常广泛的,我们会发现在很多地方,比如说在电影院卖做,买票的时候你要选座位,选座位的时候我们会发现,有些位置是空的,有些是红色部分,红色部分是已经被人选了的,空白的位置是你可以选,那是一种位视图,同时呢,咱们出行出差的时候,坐飞机选仓位选座位的时候也是同样的情况.
设备管理-数据传输控制方式
所谓数据传输控制方式,主要值的内存和外设之间的数据传输控制问题,解决这个问题有几种解决方案,包括程序控制方案,程序中断方案,DMA方式,通道,输入输出处理机,像通道和输入输出机一般都是用于专用的计算机,来解决这个传输控制问题,所以呢,一般不在我们讨论的范围之内。要了解的主要是前面的三种,程序控制方式又称为程序查询方式,这种方式最为低级的,也是CPU介入最多的一种机制,就是整个的数据的传输控制,很多时候呢都需要cpu的介入,那么在这种方式当中,外设处于一种非常被动的方式,就是他不会主动的去反馈信息。比如传输完没完成,存放怎么样,都不会主动去反馈,是由cpu发出相应的查询指令,查询看也没有传输完,没有传输完就继续传输,传输完了之后就进行下一步的工作,但是在这个过程中呢,有可能出现什么情况呢?就好比你安排一个员工干活,要求他干这个事情,结果呢你每隔几分钟就要问一下,有没有干完啊,他说没干完,继续,可能这时候你去忙其他事情,在来问他,可能好长时间了,在问他有没有完成啊,他告诉你老早就完成了,这必然呢会带来一些问题,所以呢后来出现了程序中断的方式,程序中断很多方面和去控制方式都是一样的,但是主动性强一些,就是他会有中断机制在里面,如果外设完成了数据的一些传输发布,这时候呢它会发一个中断出来,发了中断呢,系统就会做下一步的处理,效率呢会比查询的效率高一些,第三种方式是DMA,DMA又称直接控制方式,那么直接存取控制方式是什么样的一种思路呢?就是会有专门的DMA控制器,只要是外设和内存之间的数据交换,过程之中就会有这个控制器去管控了,CPU只要在开头的时候,做一些介入,比如安排一些事务这种类型,做好一些初始化之类的,整个过程中都有DMA的控制器去完成,完成之后在由cpu接手过来,完成后续的工作。这样子的方式呢,效率就会高很多。
设备管理-虚设备和SPOOLING技术
用一个实例来进行说明
微内核操作系统
微内核操作系统,顾名思义就是做的更小的操作系统,那我们为什么考虑把操作系统做的更小呢?必然它是有它的好处与优势的,好处和优势主要体现在哪一块?主要体现在他的可靠性,稳定性,安全性,为什么呢?操作系统,作为核心的系统软件,如果说操作系统出现了问题故障,就会影响整个系统的正常运行,如果说我们把操作系统的内核,分的小一些,就会降低这种问题发生的概率,你只管把最为核心的内核放在里面,那这样子的话,只有这一小块的东西出故障才会产生根本性的影响。而原来放在操作系统中的内核部分,被抽出去了,作为其他的外接系统,这些系统即使出现故障问题,我们只需要重启这一小块的功能部件,就能解决问题吧。
4.01 数据库系统
这一章节的内容比较重要,因为不管是上午的综合题和下午的案例分析题,都可能会涉及到数据库相关的一些知识。在这一部分的章节当中,我们会讲到几个方面的内容。首先呢,是数据库模式,分级模式这一块,然后呢就是数据库的设计,那设计就会涉及到ER模型,关系代数,元组演算,以及呢规范化的理论,你像规范化理论和关系代数,是每次上午题当中都会出现的内容,接下来会讲到并发控制的相关内容,以及数据库完整性约束,这个呢比较简单,分布式数据库,数据仓库和数据挖掘以及数据库这一块的一些比较新的理念,新的应用,这些呢主要会在下午的案例分析题里面,或者说论文里面涉及到。所以呢,我们会按照这个体现把它乡试的讲下来。同时呢,也会讲一些新的技术,讲一讲它的特点以及优势缺点这一方面。这样子呢,可以利用这些知识做一些延展与探讨分析。
三级模式-两级映射
一般以选择题的形式出现,这个图中的知识点反复考过多次了,现在还经常考到。为什么呢?因为这种三级模式属于层次型的架构设计,那这种层次型的架构设计,为我们应用数据库的时候,提供了很多方面的便利,同时也让整个体系的可维护性,应变能力变的更好一些了。让我们看一看三级模式,两级映射到底是怎么回事?从这个示意图我们可以看到,最底层的是一个物理数据库,就是说白了物理数据库在系统上面,计算机上面,它的表现形式往往就是一个文件。你像access数据库,落到最后也就是一个文件。当然像sqlServe,除了有数据文件外,还有日志文件,内模式就是和物理数据库直接关联的,那么这个内模式管的是什么呢?其实管的是,我们如何去存储一系列的数据,它是管的这一个层次,我的数据要存到物理文件上面,那以什么格式来存储,如何去优化它,这是内模式所考虑的问题。第二个层次呢,是概念模式,所谓概念模式,其实就是我们平常数据库表这一个级别,就是数据库里面会有很多表嘛?这些表呢,其实对应的就是概念模式,这一级模式呢,就是相当于把数据呢,分成了若干张表,表呢是根据我们的业务,根据我们的应用划分出来的,表之间会有相应的关联,这是概念模式这一层次,在到外层称为外模式,它所对应的是数据库里面的视图,外模式的应用让我们呢,就对这些数据的控制呢,有了更进一步的手段,更加灵活的一些处置方式,为什么这么讲呢?你比方说,在概念模式里面,用户信息这样的一张表,那么这个用户信息可能包含了很多信息,有用户的用户名啊,密码啊,等等很多很多的内容,那么有这么多的内容,完了之后咱们再应用的过程当中,如果说任何一个功能的模块,不能直接的去调用用户的信息,可能觉得不是很按权。而且另外一点呢,如果说概念模式里面的这些表放生了变化,如果说应用程序是直接去调用这些表的,那应用程序也应该跟着变,但是说如果加了一层外模式情况就不一样了,因为加了外模式之后,我们外模式就是视图嘛,我们可以讲原来的数据进行处理之后,比如说登录的时候我不需要很多信息,我就把用户名,密码这些信息掉出来,形成一个视图,然后给登录模块用。好,在内部处理的时候,我只需要掉一些用户信息啊之类的,不需要用到用户的密码,那我就建一个视图不包含这个密码,这样就增加了安全性,也增加了灵活性,以后咱们这个概念模式表这以及发生变化,原来所有用户信息都是一张表存起来的,现在我们不这么做了,我们把有些字段分成一个表,有些字段分成另外一个表,那么也可以呢通过视图,然后呢也可以把表呢整合起来,就是我可以选择表的哪些列形成一个视图,这也是可以的。所以呢,这样子就增加了灵活性,其实表和视图是有一种映射关系的,这种映射关系叫外模式与概念模式的映射,这就是两级映射中的一个,有了这一级映射,表发生变化,我们只需要改映射,而不需要改应用程序,那概念模式-内模式的映射,主要是管的什么呢?这是内部的存储形式和表的情况映射关系,意思就是你把存储的结构进行了改变,我们只需要调整这种映射关系,不需要去修改用户的应用程序,就能够应对这种变化,这就是三级模式-两级映射。哪三级模式,每一级的模式对应的是什么?两层映射,每层映射对应的又是什么?我们需要了解。其实内模式呢,我们往往又会叫它呢物理数据库,概念层次呢是概念级的数据库,视图时用户级的层次。
数据据设计过程
在数据库设计这一块,需要我们了解到的就是,整个设计过程他的流程是怎样走下来的?然后每个阶段都会有不同的产出,这一点呢要求掌握。在整个数据库的设计过程当中,首先呢需要需求分析,做的就是呢,对数据这一块有什么要求。需要从用户那边收集过来的,同时转换的过程中又产生了一些需求,在这一阶段又会有相应的数据流图,数据字典,需求说明书,当然呢,需求分析呢严格来讲是属于上一阶段,需求阶段的任务。而数据库设计具体来讲呢,应该从概念结构设计算起的,概念结构设计首先就是做ER模型,所谓ER模型呢,就是这样的一种模型,ER模型呢是跟数据库管理系统没有关系的一种模型,就是你设计出这么一个ER模型出来,你最终可以转为SQLserve数据库,也可以转为Access数据库,还可以转成ORACLE数据库,这都是可以的。往往呢,ER图呢,跟真正的物理数据库呢还没有关系,它就是一种数据的表达,数据呢,会有哪些属性,看实体之间会有什么样的联系,分析这些方面的问题,接下来呢就要把ER模型呢转成关系模式,ER模型转成关系模式基本的流程后面会讲到,转成文字表达的,然后一个个表的这种形式。在转化过程中,就涉及到规范化理论之类的,概念结构设计完之后,我们就是逻辑结构设计,就会转为关系模式,产出物呢就是关系模式。最后就是动手实现物理设计了。
ER模型
关系代数
并
交
差
笛卡尔集
投影
选择
联接
规范化理论-函数依赖
函数依赖是规范化理论的一个重要知识点
规范化理论-价值与用途
规范化理论-键
规范化理论-范式
并发控制-基本概念
数据库完整性约束
数据库安全
数据备份
数据仓库与数据挖掘
反规范化技术
大数据基本概念
5.01 计算机网络
七层模型
TCP协议
计算机网络分类
网络规划与设计
IP地址和子网划分
特殊含义的IP地址
html
无线网
网络接入技术
IPV6
6.01信息安全分析与设计
信息系统安全属性
关于信息安全系统属性,会考到什么?
会有哪几个属性啊?密码管理?个人资料,隐私?浏览记录?
隐私性,保密性?
加密技术
信息摘要
数字签名
数字信封与PGP
设计邮件加密系统实例
网络安全-各个网络层次的安全保障问题
网络威胁与攻击
防火墙
7.01 数据结构与算法
数组
稀疏矩阵
数据结构的定义
顺序表与链表
顺序存储与链式存储对比
队列与栈
广义表
树与二叉树
二叉树的遍历
反向构造二叉树
树转二叉树
最优二叉树
线索二叉树
平衡二叉树
图的基本概念
图的遍历
拓扑排序
图的最小生成树
算法的特性
算法的时间复杂度和空间复杂度
顺序查找和二分查找
散列表查找
8.01 编译原理相关
9.1法律法规
10.01 多媒体基础
11.1 软件开发模型
12.1 面向对象
13-1 数据流图
![(C:\Users\001\AppData\Roaming\Typora\typora-user-images\image-20250127153413982.png)
14.1 数据库设计
15.1 UML
16.1 数据结构与算法应用
17.1面向对象程序设计
语法加设计模式
1、刷题
逆波兰式是什么?它是后缀表达式,前缀表达式是什么?会考到什么?
已知信息:常用的是中缀表达式,即符号放中间,先忙猜测一下答案,a+ (b-c)*d abcd,不知道哦?怎么还原后知道是原式子呢?
没那么复杂,直接就是最后遍历根就行了
还没有出现问题,只是给出背景?元组很熟悉,就是一个组吧,问题是什么?
A是什么东西?B是什么东西?后面就是解释,|符号是取一个短路就行,哪个为true选哪个
关键条件 至少 要怎么利用起来,不对,只是S的一个条件
把大写字母理解为非终结符,小写字母理解为终结符,产生式就是推导式,推导的前件是开始符,文法就是一个源程序编译的过程,**认识操作符,减号,加号...**排除法
软件工程会讲什么?肯定是偏软件的,如程序语言,编程思想,面向对象,uml图,系统分析
分值在5分
下午案例分析题比较多
瀑布模型
数据结构和算法