kaoYan-408

 学习方法:速度回顾,看书忘记的立马重看,模糊的过程详细写一遍,重复复习!!!知识点配上问题自己提问!不要跳一点点过!不断精简自己写的过程!!!不要重复抄写书上的知识点,要带有自己的理解记忆。学习最忌讳重复抄书本上的知识,没用!浪费时间低效率!!!

计组

软硬件逻辑功能是等价的,但是使用越频繁的功能使用硬件实现成本低,越不经常使用的功能用软件实现成本低!比如,加减乘除硬件快,但是要开发一个计时器或者更复杂的自然要是堆叠硬件,成本大了去了。

熟读并背诵流程

从主存取指令,读指令进行译码,计算下一条指令的地址,取操作数并执行,将结果送回存储器。

存储系统:cache主存三映射,多模块存储器(流水线),替换策略命中与否(替换算法),TLBcache页段,主存容量扩展

指令系统:栈,指令数据寻址,定长指令扩展操作码,精简和复杂指令集

CPU:中断周期流程

1.开机的时候为什么CPU可以一条条的读取命令!

书上讲,预先写好的程序会存在主存,那么这个cpu如何读取的呢?

通电,这个时钟信号就是计算机的心脏,从通电开始一直到关机,电脑的时钟信号始终是高低电平不停的跳动着,每个硬件都有自己的感知时钟信号的触发器(这个触发器能够做到极致的精确),触发器是构成时序逻辑电路的基本单元,它具有记忆功能,能够根据时钟信号的跳变来改变自己的输出状态。这样CPU就知道自己计算机内的“时间”了。

电脑硬件会自动将ROM当中的bios程序加载到内存当中去,然后在CPU的PC计数器存着这个bios程序的初始内存地址。接下来会执行bios开机程序,这个CPU是如何执行这个开机程序的呢?关键就是总线(cpu与内存有地址,数据,控制总线)

首先是CPU根据PC,把地址通过地址总线送到内存的地址译码器当中!(我觉得是先通过控制总线向内存发读信号),这个过程信息是如何传递的呢?我理解的是,CPU根据PC的地址信息,写的二进制数据,然后当获取地址总线使用权限后,通过总线按照时钟信号的跳动节奏有规律的发送地址信息。这个信息跟时钟信号不一样,时钟信号是一辈子的一高一低不变化的,但是这个数据信息就是有高有低(为啥要时钟信号?感觉就是计算机的沟通语言!多么长的低电平代表一个基本字符,假如发的信息是100个单位的低电平,因为地址译码器知道多长代表一个低电平,所以知道这数据是100个低电平。或者这样理解,发过来的100个电平是不知道多少,是根据时钟信号高低电平变化多少次记录的!就像是两条传送带,数据的那个传送带按照多长切一刀是根据时钟信号的传送带的高低变化的长度)跟计网一样,数据传递有数据头数据尾中间是要传递的数据!地址译码器当读取20个低电平就知道这下一个电信号就是数据的内容了,当读到连续的20个高电平就知道数据读取完毕了(至于纠错,这些都是一样的)

内存的地址译码器翻译出地址后,把数据通过数据总线传递到CPU,送到CPU的IR指令寄存器,然后翻译出来指令的地址信息!根据指令信息调度各个硬件资源!

这里的翻译指令的操作码字段使用的是什么部件?翻译出来的指令应该是在CU控制单元里对照是哪一种指令,然后CU开始下达各种控制信号!

2.还有数据流通在CPU当中IR和MAR以及CPU是如何交互的?

看图,应该是IR的所有信息交给控制器CU(按照网上搜的这句话理解的不对),然后CU负责拆分翻译IR当中的指令,对比CU当中的快存储器分析出这条操作码是做什么的?分析出地址码送给MAR(这里只有一条路先到PC后道MAR,有点不对,因为当读取到本条指令后PC就自增了,那么这里的要取数的信息再去PC不就覆盖了!应该CU到MAR有一条通路)。控制器CU可以给ALU下达操作指令也可以直接去控制总线向外下达控制指令,CU也可以

CPU中翻译指令的操作码字段使用的部件是指令译码器。操作码经过译码后,控制器会根据译码结果生成相应的控制信号来执行特定操作。指令中的地址字段传递到存储器地址寄存器(MAR)的方法通常是这样的:当CPU需要访问内存以读取或写入数据时,如果该地址信息包含在指令中,这个地址会首先被放置到指令寄存器(IR)中。之后,CPU控制逻辑会从IR中取出地址字段,并通过内部总线将其传递到MAR。这个过程不是直接从控制器(CU)到MAR,而是通过IR作为中介。简而言之,地址信息的流动路径大致为IR → MAR,而非CU直接到MAR。控制器在此过程中起着协调和控制的作用,确保数据在正确的时间被正确地路由到MAR中。

这里有一步需要注意,当第一次是指令信息动刀IR后,然后拆分成操作码op以及地址码ad之后,MAR根据ad去内存取数,这时候取出来的经过数据总线送到CPU应该不再放在IR了,应该直接进入到ALU或者寄存器组GPRs了。

3.要执行的是一段加法程序,两个数据都在内存,然后现在CPU要执行这两个数据的加法操作,并把结果写回内存当中

首先是PC指向当前指令在内存当中的位置,然后取指令。

取指令,PC通过控制总线向内存发送读信号,(这个当中的交互,必定是内存同意后CPU才发指令)然后通过地址总线(从CPU过去的数据都是地址总线,从内存过来的都是数据总线)到内存的地址译码器,译码结束发信号给CPU,通过数据总线传给CPU。

译码阶段,IR得到指令然后进行译码(不是IR译码而是指令译码器),这个时候PC自动指向下一条指令(跳动的距离是当前指令的宽度,比如说4B,那么加一就是加4B)。译码结束好,是加法操作,这个时候把送过来的32位数据的后面部分(除了操作码字段外)按照规则进行截取不同的地址,然后送到地址总线到内存得到对应的操作数,循环两次后,两个操作数都到了CPU的寄存器,然后进行执行操作

执行阶段,ALU从CPU当中的寄存器取数,然后运算得到结果,这个结果会暂存寄存器当中。

回写阶段,这个阶段CPU会根据指令当中的需要回写的地址,把数据要么写回内存要么存到寄存器当中。

如果没有影响控制流的指令(如跳转、返回等),CPU将继续按照PC指向的地址取下一条指令执行。如果有特殊控制指令,CPU将根据指令要求更新PC的值,改变执行流程。

注意这里的最初的指令一定会包含所有的地址信息,这里的加法操作,一定会包含要取数的地址信息以及要写回哪的地址信息或者是写回寄存器,有没有那种可能?

在这里的加法操作,pc从内存取出的指令,能否包含所有的操作数地址信息?以及要返回的地址信息?有没有可能包含不完呢?假如一条指令需要的操作数很多,不能够在读取一条指令的条件下把所有的操作数的地址信息都读取到位,计算机如何解决这种情况?

在大多数典型的指令集架构(ISA)中,一条指令通常不会直接包含所有操作数及其地址信息,尤其是在操作数较多的情况下。这是因为指令的长度是有限的,比如在32位架构中,指令大小通常也是32位,这限制了能直接编码的信息量。因此,指令通常只会直接包含一些基本信息,如操作码(表明要执行的操作类型,如加法)、一个或两个操作数的直接引用(寄存器索引或立即数),或者一个基址寄存器加上偏移量的形式来间接引用内存中的数据。对于需要更多操作数或返回地址的情况,有以下几种解决方法:

寄存器操作:

大多数指令会优先使用CPU的寄存器来存储操作数,因为访问寄存器比访问内存快得多。如果操作数已经在寄存器中,指令可以直接引用这些寄存器的索引,无需在指令中包含完整的内存地址。

间接寻址:

指令可以包含寄存器的索引或一个基址寄存器加上偏移量的形式来间接寻址内存中的数据。这样,虽然一条指令本身不包含完整地址,但可以通过计算得到实际地址。

多条指令序列:

对于需要大量操作数的复杂操作,可能需要多条指令来完成。第一条指令可能加载第一个操作数到寄存器,接下来的指令加载第二个操作数,然后才是执行操作的指令。如果有更多操作数,就需要更多的加载指令。

变长指令编码:

一些架构(如x86)支持变长指令编码,可以根据需要扩展指令长度来包含更多操作数信息。但这仍然受限于指令总线宽度和解码复杂度。

堆栈操作:

对于某些指令集(如x86的某些操作),可以利用堆栈来传递和存储操作数。操作数可以在执行加法之前先压入堆栈,加法操作可能仅需指定堆栈指针的调整量,从而间接引用操作数。

寄存器间接寻址与索引:

在某些架构中,可以通过寄存器间接寻址结合索引来访问一组连续或相关地址上的操作数,这样一条指令可以通过较少的直接信息间接引用多个数据项。

综上所述,当一条指令不能直接包含所有必要地址信息时,通过分多步执行、利用寄存器、间接寻址技术、堆栈操作等方式

5.流水线

流水线核心就是,这次我有五个阶段(取数,译码,执行,访存,回写)我在执行完取数之后,后续的操作交给CPU做,之后再执行取数,一直不停!(按照交叉编制的思想,第一个内存块使用过后隔着m个r次后再次使用第一个内存块,依旧可以使用而不是第一个内存块的指令周期还没执行完毕)

运算类指令,load指令,store指令,条件转移指令,无条件转移指令的流程

对于运算类指令,访存这步骤通常没有操作(操作结果直接送往 WB)。运算结果不需要访问内存,因为它不涉及对数据存取。它只是计算并等待下一步写回寄存器。对于纯运算类指令,结果通常直接送往 WB(写回)阶段,因为它们只是寄存器之间的数据操作,不涉及内存访问。没有数据需要从内存中读取或者写入到内存中。

无条件转移指令,WB 阶段有时候的确是为了特定操作,例如更新 PC 值,尽管称为写回阶段,但它并不是典型的寄存器数据写回,而是控制流的更新。

6.数据表示与运算

有无符号数的加法:只需要保持位数相同后,直接按无符号数的方式直接相加。有符号数高位需补充符号位

无符号8(1000)和 -3(1101)相加,结果为(1)0101,高位溢出,但有效位表示的值为5

无符号F0000000H + 有符号FF12H,FF12H补全后为FFFFFF12H,相加得到EFFFFF12H

补码最小值1000 0000=-128可以这么理解别的都可以按照特殊方法化成原码就这个那个特殊方法不行所以为最小值。而1111 1111按照特殊即为1000 0001=-1
1000 0001=-127


移码-128到127
0000 0000 - 1 111 1111
1 111 1111移码(255)0111 1111补码127
1 000 000移码(128)0000 0000补码0

对于浮点数的规格化形式,要知道为什么正数浮点数范围是[1/2  1-2^(-n)]。负数的是[-(1-2^(-n))-1/2  ],因为有阶码兜着不允许出现正数小于0.5的,负数大于0.5的,如果出现都以及化成标准值的

1 8 23
1 11 52
尾数必须是1.xxx这种形式的。

浮点数加减法:对阶,尾数和,规格化,舍入,溢出判断。
这个小阶像大阶看齐,不可能会有1xxx.xxx+1.xxx这种情况对阶。必须只能1.xxx+1.xxx这种形式后。然后小阶向大阶看齐。
为什么右规只需要一次,左规要多次,因为能右规也只能是两个数相加,而相加按照二进制来算再怎么加也只能1.xxx加或减1.xxx。这样结果为两种1x.xxx  0.00001xxx前者需要右规,后者需要左规。

舍入,是尾数的长度超过可以表示的23 52 64 (8 11 15)的范围了,要舍入。零舍1入,入1可能会导致1.1111 1111 1变成10.0000 0000 这样要右规,阶码变大会可能上溢
左规可能阶码下溢右规有可能阶码上溢

127=7FH 1023=3FFH
因为阶码的规定范围1-254且规定偏移值127
规定,阶码最低-126,-1022,最高127或1023
对应。最低1,254,2046
正数上溢(127,1023)负数下溢(-126,-1022)
上限最大值1111 1110=254-127=127
上溢出1111 1111 =255-127=128
下线最小值0000 0001 =1-127=-126
下溢出0000 0000=0-127=-127下溢出

注意双符号位的要求可能阶码跟尾数要补码表示,见到
10.xx要右规→11.0xx
01.xxx要右规→00.1xxx

00.01xx要左规,00.1xxx
11.10xxx要左规,11.0xxx
核心也就是科学记数法。
IEEE754用的舍入方法是零舍一入方法

容易忘记

机器字长,存储字长,指令字长,数据字长

翻译程序,解释程序,汇编程序,编译程序

TLB 页表 Cache 磁盘

用户可见PSW PC ACC
用户不可见MAR MDR IR DR
 

要CPU写数据!回写法与写分配条件下是:命中cache等到要换cache再写内存,不命中就把数据调入cache后再写cache。搭配的原因是,局部性原理,一个数据块被调入cache后很可能下一次还会访问这个内存。这样不管如何修改都不会重复回写到主存!!全写法和非写分配,就是如果命中就把cache和主存都写上!不命中cache,就直接修改内存,省了还要把数据写回cache这一步!不命中省了把数据再写回cache的步骤,因为写回去没意义,执行的是全写法,下一次命中cache后内存的也要改,何必调进去!

进制之间的转换,2Binary 8Octal 10Decimal 16Hexadecimal。2到816 是因为有位数刚好能表示,但是到10就是因为没有一个完整的位能表示就只能一点点加。 10 ->2 8 16之间都靠除基取余法乘基取整法来转换!理解一下除基取余,32d->100000b

OS

提问:

1.进程三个组成部分?PCB包含哪些信息?进程的四个特点?五种状态?进程三种通信?进程线程六比较?线程的两种实现?

1.CPU调度各个进程的过程,相应的pcb以及一些状态信息

PCB的功能:

  • 程序计数器PC:指示进程下一次要执行的指令地址。
  • 进程状态:新建、就绪、运行、阻塞、终止等
  • CPU寄存器集合:通用寄存器、索引寄存器、堆栈指针等,存储进程执行时必要的数据和指令指针。
  • CPU调度信息:如进程优先级、调度队列指针、时间片剩余等,帮助os进行调度决策。
  • 内存管理信息:如基址、界限寄存器、页表地址等,用于虚拟地址到物理地址的转换。
  • I/O状态信息:记录进程相关的I/O请求和完成状态。
  • 记账信息:如CPU使用时间、等待时间等,用于系统监控和性能分析。

操作系统如何感知到有进程的?就是根据PCB常驻内存,有一个PCB就知道内存空间有一个进程!

进程是程序的执行,是一个动态的概念时时刻刻都发生着变化;进程映像是某时刻进程的内容与状态的集合,包括:进程控制块(PCB),程序,数据(私有栈等),核心栈;

操作系统使用进程映像来创建和管理进程实体。当启动一个程序时,操作系统会根据进程映像加载程序的代码和数据到内存中,并分配资源给进程实体。进程实体执行程序,修改自己的状态,并与其他进程进行交互。进程实体是正在执行的程序实例,而进程映像是程序的静态快照(很像是一个进程在某时刻的所有寄存器pcb等信息的整合)

线程切换仍需保存和恢复寄存器状态,但不涉及地址空间切换,开销比进程切换小。用户级线程切换成本较低,因为它们通常在用户空间进行,不需要系统调用。

进程上下文是处理器的一个执行环境,包括:用户级上下文(程序 ,数据,私有栈等)、系统级上下文(PCB,页表,核心栈等)、寄存器上下文(PSW,PC,SP,控制寄存器,通用寄存器等)

创建进程,一般来说,程序员写好的程序会存在外存,现在就当这个程序是一个进程。在创建进程的时候,首先会创建PCB,初始化一些进程的信息,这个PCB会保存进程的地址信息,存在外存的哪个地方?创建的PCB块会放到PCB组当中(记得是在内存里),之后os把程序从外存调到内存(这里也有涉及调度的问题,内存空间不足的时候的调度算法)内存管理单元(MMU)负责将虚拟地址转换为物理地址,确保进程间的地址空间隔离。这个时候更新PCB块在内存的位置信息,大小信息,数据段,代码段等的位置,还有一些上下文信息,比如PC值,psw的数值等。还有一点就是要把pcb当中进程的状态改为就绪状态加到就绪队列当中去。

执行进程,CPU首先会读取该进程的pcb的信息到CPU当中,可以体会到有了这些状态,CPU就知道要执行的进程在内存的那个位置(根据pc的信息)

切换进程,首先要保存当前执行进程的上下文信息,就是CPU各个组件(控制器,运算器部件)的数值到PCB当中,把老的进程设置为阻塞或者就绪。这样再读取新的就绪队列上的进程的PCB(这个时候涉及到进程状态的转换)到CPU上,并把状态改为运行态。

销毁进程,销毁的是PCB,然后一般来说不会把内存当中的信息回写到外存,新来的信息直接占用老信息的位置就实现了对老信息的覆盖,这样很方便。除非内容发生改变!还要把信息回写到外存!

2.异常(内中断),外中断

这里当异常和中断来的时候,到底是立刻执行还是要等到,到中断周期再执行?异常不能被屏蔽,有异常就立刻执行。但是中断是可以到中断周期执行的!所以也相当于当前指令执行完毕后,而响应完中断回来后,就自然下一条指令了。保存断点,CPU状态都是为了回来到这条指令的下一条继续。

系统调用的概念是用户态要进入核心态的一个程序,用户要使用系统调用要使用trap指令(陷入异常[内中断],trap指令),trap指令是运行在用户态的。

哪几种异常会使CPU重新执行命令,哪几种中断会使CPU继续执行命令?这个不好说,就算是保存了寄存器数值到内核栈,也不一定就返回的时候继续执行。但是做题对于中断应该是继续,系统调用也是继续,而异常要重新执行。

至于异常出现后执行完处理程序后返回的时候是重新执行指令还是到下一条指令执行,看题目吧,但是中断是必定下一条指令!异常书上讲是包含陷入指令。这个跟系统调用没关系,是用户要系统调用才会trap异常,这个时候直接执行trap指令!至于反不反回到trap,我想的是一般一条指令要trap的话,也应该到了最后阶段了!

3.什么叫同一进程当中的线程拥有相同的地址空间?

“同一进程中的线程拥有相同的地址空间”时,指的是在一个进程内的所有线程共享相同的虚拟内存空间。这意味着所有的线程都能访问到这个进程所拥有的全部内存区域,包括代码段、数据段、堆和栈等。不太好理解,如果线程共享进程的空间,那么线程的数据存放在哪?进程的空间都存放了进程的数据了!

当说线程共享进程的地址空间时,意味着它们共享进程的代码段、全局数据、静态数据和堆内存。但是,每个线程也拥有自己私有的部分,主要是栈空间和一些线程局部存储(TLS, Thread Local Storage)。

  1. 栈空间:每个线程都有自己的栈空间,用于存储函数调用的局部变量、函数参数和返回地址。这意味着即使两个线程调用了相同的函数,它们各自栈上的局部变量也是完全独立的,不会相互干扰。

  2. 线程局部存储(TLS):TLS是专门为线程设计的存储区域,每个线程都可以在TLS中保存私有数据,这些数据不会被其他线程访问。TLS通常用于存储线程ID、线程特定的配置或状态信息等。

  3. 共享数据:除了栈和TLS之外的内存区域,如全局变量、静态变量和堆上分配的内存,都是所有线程共享的。这意味着如果一个线程修改了全局变量,这种改变对其他线程也是可见的。因此,需要使用同步机制来控制对共享数据的访问,防止数据竞争和不一致性。

所以说可以这样理解,一个进程包含的信息代码段,数据段,堆,栈还有TLS。就相当于给线程留一些空间!这里所有的线程有相同的地址空间就代表,所有的进程空间线程都可使用(除了一些TLS)

4.进程通信是如何通信的以及线程通信如何通信的?

进程通信通常需要通过内核提供的机制来实现,涉及更多的系统调用和资源管理,而线程通信则更直接,主要要关注原子操作以及互斥,防止多个线程同时访问临界资源或者说共享的变量。

5.如何理解内核级线程和用户级线程的区别?

内核创建内核级线程,而进程里面可以有很多的内核级线程,这里的内核级线程是内核空间创建的,只不过内核级线程的空间是被存在进程的线程空间当中去了!进程管不了线程,而进程里的资源被内核级线程使用!(感觉这个内核级线程很像是被保养的人,使用有钱人的资源最后还是被自己亲爹管着!)

内核不知晓用户级线程的存在,只看到进程本身。所以说用户级线程再多,一旦卡住所有都卡住(在单处理器),内核(其实也可以理解内核为OS)只分配给这个进程资源,具体操作是进程分配给下面的线程的,单核中,一旦一个线程卡柱了!那么整个进程的运行都卡住了。

这里内核级线程对应一个进程?这句话不对。首先是OS知道进程的存在,然后会创建内核级线程,比如给了3个内核级线程那么这个进程就可以同时运行三个用户级线程,一个卡了换其他的,进程能正常运行!如果OS不创建内核级线程给进程,那么进程创建再多的线程,卡一个所有的都不能正常运行(并发性很差)

引入线程后进程就不是CPU分配的基本单位了(线程才是处理机分配的基本单位),也就是说进程能够执行是依赖于内核级线程的!而每一个用户级线程之所以能够运行根本是也是对应有内核级线程在,OS才会分配给这些用户级线程CPU的使用权!

这个内核级线程和用户级线程还有进程还有OS。可以做个比喻理解一下。

进程比作不复当年风范的爹

内核级线程比作最吊的后代

用户级线程比作最屌的后代的儿子

OS比作有资源的人(这里资源指的是CPU)

当初OS没见到进程的内核级线程的时候,看进程还有点用,就把资源给他了。后来这个内核级线程出现了,觉得利用价值更高把资源都给这个内核级线程了。后来呢这个内核级线程有了后代,很飞扬跋扈,但是这个OS看在他爹的面子上也给这些用户级线程一些面子!但其实背后里靠的还是他爹内核级线程。一旦他爹g了,那好了,你这个儿子要啥也不可能给你了!你爷爷更不管用,外面的资源就不可能再给你家!

这样这个进程就阻塞了!只有当OS再为这个进程分配内核级线程的时候,这个进程才会继续执行!

OS能感受到进程,能感受到内核级线程,但是感受不到用户级线程就在此。内核级线程共享进程的资源,但调度和管理由内核负责。进程通过用户空间的线程库来管理用户级线程的创建、销毁、调度和同步。

为什么用户级线程一个被阻塞整个进程都被阻塞?归根结底还是内核级线程被阻塞了!

怎么感觉不太对呢?早期的计算机不支持线程,所谓的线程是通过线程库实现的!那这里的一个线程被阻塞整个进程都被阻塞是因为什么?(OS只能感知到进程,但这里的进程把一些操作让线程库分给一些所谓的线程了,这些线程每个人得到一些CPU资源但是不足够)

用户级线程库:提供线程创建、销毁、切换、同步等功能,但这些功能在进程用户空间内实现,不涉及内核。线程切换比进程切换更快,因为没有上下文切换开销(如陷入内核态)

是说,这些线程的切换啥的都没啥问题也可以并发的使用,但是一旦涉及到内核的指令的时候一旦阻塞,整个所有的线程都将阻塞(好好理解,没完)

6.进程同步互斥的软硬件实现+经典问题

PV---消费者,哲学家,读者

生产消费问题,服务被服务问题,读写者(同类不互斥,异类互斥)历年从未考过,哲学家(只有一类进程,每个进程需要同时多个资源)

生产消费问题-进程之间是生产和消费资源的关系!具体操作必须写注释!干得是什么!

  1. 几类进程?一个进程一个函数!
  2. 函数内部中文描述动作!动作重复与否?重复加while(1)
  3. 做动作之前是否要先申请资源?(也就是P一下)P的时候是否要互斥的访问缓冲区,有P必有V写完P就快写V。
    1. 写semaphore的时候要给注释!rice=0 ;//注释!
    2. 先P同步,后P互斥!一百个坑位拿走一个就少一个(同步),互斥就是,我把产品放在这个坑位的动作是互斥访问的!我放坑位的时候你不能放!
    3. 互斥访问缓冲区。P(mutex)这个mutex放在最里面最好,最不容易产生死锁。
  4. 先写pv之后再定义信号量!定义后思考初值
  5. 多个P连续出现是否可能出现死锁!要是PV之间没有其他P就不可能产生信号量死锁!破坏了请求和保持这个条件!(我既然可以申请A,那么在释放A之前没有申请其他资源,不可能有请求保持!即破坏死锁必要条件)
  6. 多梳理一下看看合理与否!

小和尚打水,老和尚喝

某寺庙有小和尚、老和尚若干,有一水缸,由小和尚提水入缸供老和尚饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个桶取水。水桶总数为3个。每次入缸取水仅为1桶水,且不可同时进行。试给出有关从缸取水、入水的算法描述。

第一次写,没考虑清楚老和尚喝水也要桶,以及小和尚取水是需要互斥访问井的!以及把水倒进缸里也是需要互斥的(有老的喝就不能倒水!有人倒水别的人就不能喝以及不能倒水)

问题就是,老和尚喝水之前不能先拿桶,要先判断一下是否有水,没有水就不拿桶,不然三个老和尚都拿桶了,卡死了也没水!进行不下去了!同时小和尚也一样!也不能都打水!那样要是满了老和尚就喝不了水!也卡死!(也就是看有没有死锁就看,当多个P连续出现会不会出现死锁!最里面用缸PV成对出现不会产生死锁!只有P(桶)P(缸有水)P(互斥使用缸)这三者之间会出现死锁!)

对待这种容量有增有减的,必须配两个自变量,也是需要同步访问(这叫同步还是互斥?)为什么水缸需要两个?而水桶也是有增有减的只需要一个自变量就可以表示的??

读写,哲学家还不难

哲学家进餐问题就可以无脑用一下子取得所有的资源来做!比如干饭人,要碗要座位要筷子要菜,这种类型就一下子全拿所有的资源就行!互斥拿!互斥p(mutex)mutex初值为1,一个个申请!申请完释放!

前驱后继的问题,先V后P,

7.页面置换的方法

时钟置换算法
最佳置换算法性能最好,但无法实现;先进先出置换算法实现简单,但算法性能差;最近最久未使用置换算法性能好(LRU),是最接近OPT算法性能的,但是实现起来需要专门的硬件支持,算法开销大。
时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU,NotRecently Used)
简单的CLOCK算法实现方法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描)


改进型的时钟置换算法
简单的时钟置换算法仅考虑到一个页面最近是否被访问过。
如果被淘汰的页面没有被修改过,就不需要执行IO 操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。
因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免l/O操作。
这就是改进型的时钟置换算法的思想。修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。用(访问位,修改位)的形式表示各页面状态。如(1,1)表示一个页面近期被访问过,且被修改过。
算法规则:将所有可能被置换的页面排成一个循环队列
第一轮:从当前位置开始扫描到第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位
第二轮:若第一轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。本轮将所有扫描过的帧访问位设为0
第三轮:若第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位
第四轮:若第三轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。
由于第二轮已将所有帧的访问位设为0,因此经过第三轮、第四轮扫描一定会有一个帧被选中,因此改进型CLOCK置换算法选择一个淘汰页面最多会进行四轮扫描
 

记忆-口诀

参数

死锁的四个必要条件

互斥,不可剥夺,请求和保持,循环等待

两个资源:平板和厕所!我在上厕所想要用平板看电影,但是平板在我室友那!我室友有平板,但是他想上厕所看电影!这个就构成死锁了!我占有的资源我不放手而且这个资源就一个,我用你不能用,你不能抢,同时我有一个资源我还想要另外一个资源。对方也是,这个时候就有一个圈。所以就行成了死锁,除非打破这个死锁。

打破互斥:俩人用一个马桶上厕所!【这个不可行,这有点无赖】

打破不可剥夺:室友把我从马桶上拽出来他上厕所,或者我抢他的平板。

打破请求和保持:我自己主动让出马桶,或者对方主动让出平板(这个就是一下子把需要的资源都给你,但是坏处就是可能浪费资源,比如便秘的时候满脸通红拉不出来没心情看电影,这个时候平板就浪费了)

打破循环等待:我不要平板看电影了,我干拉;我室友不要厕所了拉裤子里也要看电影。

有循环等待不是产生思索的充要原因,是因为每一个资源都只有一个,才是充要原因。

进程的状态

原本的五个状态要记得

针对就绪挂起和阻塞挂起,这样想。

1.这两个挂起都可以分别跟就绪态和阻塞态互相转换!

2.阻塞挂起可以转换为就绪挂起,反之不行[这个跟就绪和阻塞的关系一样都不能反过来]

3.运行态可以立刻转为就绪挂起!

计网

1.遗忘

物理,集线器+中继器(集中)❌❌
链路,交换机+网桥(交往)✓❌

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值