操作系统学习记录

目录

目录

学习日志

1.1_1操作系统的概念、功能

操作系统的功能和目标--作为系统资源的管理者

操作系统的功能和目标--向上层提供方便易用的服务

操作系统的功能和目标--作为最接近的硬件的层次

小结

1.1_2操作系统的特征

操作系统有四大特征:并发、共享、虚拟、异步。

1.并发

2.共享

3.虚拟

4.异步

小结

1.2_操作系统的发展与分类

手工操作阶段

批处理阶段

分时操作系统

实时操作系统

其他几种操作系统

小结

1.3_1操作系统的运行机制

内核态vs用户态

内核态、用户态的切换

小结

1.3_2中断和异常

中断的作用

中断的类型

内中断的例子

外中断的例子

中断的分类

中断机制的基本原理

小结

1.3_3系统调用

系统调用的作用

系统调用与库函数的区别

什么功能要用到系统调用

系统调用的过程

小结

1.4_1操作系统体系结构(上)

操作系统的内核​

大内核和微内核

操作系统的体系结构​

小结

1.4_2操作系统体系结构(下)

1.5操作系统引导

1.6虚拟机

2.1_1进程的概念、组成、特征

进程的组成

 程序是如何运行的?

进程的特征 

小结 

2.1_2进程的状态与转换、进程的组织

进程的状态--创建态、就绪态、阻塞态、终止态

​编辑 进程状态的转换

进程的组织方式--链接方式(大多数系统采用)

进程的组织方式--索引方式

 小结

2.1_3进程控制

如何实现进程控制?

如何实现原语的“原子性”?

进程控制相关的原语--创建原语

进程控制相关的原语--撤销原语

进程控制相关的原语--阻塞原语、唤醒原语

进程控制相关的原语--切换原语​

小结

2.1_3进程通信

为什么进程通信需要操作系统支持?

进程间通信的机制--共享存储

共享存储的两种方式:基于数据结构的共享、基于存储区的共享

进程间通信的机制--消息传递

进程间通信的机制--管道通信

小结

2.1_5线程的概念


学习日志

23.11.4 现在是第九周的星期六晚上,就从今晚开始学吧,第十六周结课,前面一大半的课都没听,什么也没学到。抓紧赶进度 ,但我相信还是可以学好滴,加油ヾ(◍°∇°◍)ノ゙(2/84)

23.11.5

23.11.7 (⊙o⊙)…怎么一下就穿越到7号了,5号和六号晚上都没学。(5/84)

23.11.8 学校运动会第一天 今天上午去考科二了(满分通过),下午去外面玩了看湖边日落晚上八点多才回学校。没学

23.11.9 今日来图书馆学习了 (11/84)

23.11.10 还是在图书馆里学习,不过今天没学操作系统。刷了一套六级的卷子23.6(一)

23.11.11依旧是在图书馆里学习,今日学完第二章的进程了。(15/84)

23.11.12 第2章的内容有点多,从P12到P41都是第二章的,一天学一点。(18/84)

23.11.14 学一点。进程调度开了。(20/84)

23.11.21 佛了,一晃一周没看操作系统了。三个调度算法(23/84)

23.11.22 赶紧学学。

今晚接着学的是P23的后两个算法。P24的RR、优先级调度和多级反馈队列没学。走了,明天上午三节操作系统,下午三节计组。明晚还要准备星期五的无线网实验。。(23/84)

23.11.23 上操作系统课啃王道课直接(24/84)

23.11.26 hah 又穿越了。怒了。现在是第十二周的周日晚上21:55(26/84)22:28走了 回去睡觉

23.11.27 进程互斥(28/84)

23.12.2 信号量机制(31/84)出走半生,归来还在第二章哈哈哈,慢笑了。明天势必学完第二章

23.12.3 经典同步问题--生产者消费者、吸烟者、读者写者问题 (35/84) 

23.12.4 学到管程了(37/840)

23.12.5 今天学完了2.4 第二章全部结束 明天开始学第三章 (41/84)

23.12.6 内存管理 (43/84)

23.12.7 学到动态分区分配算法,页表开了一点头,有点累了,明天再学。(46/84)

23.12.8 基本分页存储管理(47/50)

23.12.9 学完页面置换算法 怎么感觉今天时间都变慢了pm22:40 (55/84)下图红框里是今天学的。没有截屏放在文章里,直接在书上写写画画了。效率还可以。给自己点个赞

23.12.10 今天学P56、57、58、71,72没学完。pm19:04周报已交,回去了。


1.1_1操作系统的概念、功能

操作系统(Operating System,OS)是指控制管理整个计算机他系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境;它是计算机系统最基本的系统软件

操作系统的功能和目标--作为系统资源的管理者

功能:处理机(CPU)管理、存储器管理、文件管理、设备管理。

目标:安全、高效。

操作系统的功能和目标--向上层提供方便易用的服务

封装思想:操作系统把一些丑陋的硬件功能封装成简单易用的服务,使用户能更方便地使用计算机,用户无需关心底层硬件的原理,只需对操作系统发出命令即可。

我们最熟悉的操作系统提供的服务:GUI图形化用户接口,很多现代操作系统都提供GUI。

早期的操作系统都是用户通过命令接口的方式来和操作系统进行交互,也就是命令行。命令接口分为联机命令接口和脱机命令接口。

联机命令接口:又叫交互式命令接口,用户和操作系统交互。time命令

脱机命令接口:又叫做批处理命令接口。*bat文件

程序接口:可以在程序中进行系统调用来使用程序接口。普通用户不能直接使用程序接口,只能通过程序代码间接使用。

操作系统的功能和目标--作为最接近的硬件的层次

小结

1.1_2操作系统的特征

操作系统有四大特征:并发、共享、虚拟、异步。

其中并发和共享是两个最基本的特征,二者互为存在条件。

1.并发

并发是指两个或多个时间在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。

常考已混淆概念:并行--两个或多个时间在同一时刻同时发生。

操作系统的并发性:指计算机系统中“同时”运行着多个程序,这些程序宏观上看是同时运行着的,而微观上看是交替运行的。

操作系统就是伴随着“多道程序技术”而出现的。因此,操作系统和程序并发是一起诞生的

注意:(重要考点)

单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行。

多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行。

比如Intel的第八代i3处理器就是4核CPU,意味着可以并行地执行4个程序。[即使是对于4核CPU来说,只要有4个以上的程序需要“同时”运行,那么并发性依然是必不可少的,因此并发性是操作系统一个最基本的特性。]

2.共享

共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。

资源共享的两种方式:互斥共享方式、同时共享方式。

互斥共享方式:系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。

同时共享方式:系统中的某些资源,允许一个时间段内有多个进程“同时”对它们进行访问。

所谓“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问的(即分时共享)。

3.虚拟

虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体是实际存在的,而逻辑上的对应物是用户感受到的。

4.异步

异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。

小结

1.2_操作系统的发展与分类

手工操作阶段

批处理阶段

分时操作系统

实时操作系统

其他几种操作系统

小结

1.3_1操作系统的运行机制

内核态vs用户态

处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令

处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令

怎么区分到底是哪种状态呢?

CPU中有一个寄存器叫程序状态字寄存器(PSW),其中有个二进制位,1表示“内核态”,0表示"用户态”。

别名:内核态=核心态=管态;用户态=目态

内核态、用户态的切换

小结

1.3_2中断和异常

中断的作用

CPU上会运行两种程序,一种是操作系统内核程序,一种是应用程序

内核程序是整个系统的管理者,在合适的情况下。操作系统内核会把CPU的使用权主动让给应用程序。

“中断”是让操作系统内核夺回CPU使用权的唯一途径。中断会使CPU由用户态变为内核态,使操作系统重新夺回对CPU的控制权。

如果没有“中断”机制,那么一旦应用程序上CPU运行,CPU就会一直运行这个应用程序。

中断的类型

内中断的例子

外中断的例子

中断的分类

中断机制的基本原理

小结

1.3_3系统调用

系统调用的作用

“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求操作系统内核的服务

系统调用与库函数的区别

什么功能要用到系统调用

系统调用的过程

 

小结

1.4_1操作系统体系结构(上)

操作系统的内核

大内核和微内核

操作系统的体系结构

小结

1.4_2操作系统体系结构(下)

1.5操作系统引导

1.6虚拟机

2.1_1进程的概念、组成、特征

进程的组成

PCB、程序段、数据段。 

 程序是如何运行的?

进程的特征 

动态性、并发性、独立性、异步性、结构性。

小结 

2.1_2进程的状态与转换、进程的组织

进程的状态--创建态、就绪态、阻塞态、终止态

 进程状态的转换

进程PCB中,会有一个变量state来表示进程的当前状态。如:1表示创建态、2表示就绪态、3表示运行态...为了对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来。

进程的组织方式--链接方式(大多数系统采用)

进程的组织方式--索引方式

 小结

绿框部分是考研时的常考点

2.1_3进程控制

进程控制就是要实现进程状态的转换

如何实现进程控制?

如何实现原语的“原子性”?

进程控制相关的原语--创建原语

进程控制相关的原语--撤销原语

进程控制相关的原语--阻塞原语、唤醒原语

阻塞原语和唤醒原语应该成对使用

进程控制相关的原语--切换原语

小结

2.1_3进程通信

进程间通信是指两个进程之间产生数据交互。

为什么进程通信需要操作系统支持?

进程间通信的机制--共享存储

进程申请共享存储区,共享存储区可以被多个进程访问。

共享存储的两种方式:基于数据结构的共享、基于存储区的共享

基于数据结构的共享灵活性差、速度慢;基于存储区的共享灵活性高、速度快。

进程间通信的机制--消息传递

直接通信、间接通信

进程间通信的机制--管道通信

管道是一个特殊的共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的内存缓冲区FIFO(循环队列)。

小结

只要管道没空,读进程就可以从管道中读数据。

2.1_5线程的概念

线程是轻量级的进程。

线程是一个基本的CPU执行单元,也是程序执行流的最小单位。

2.1_6线程的实现方式和多线程模型

用户级线程     

内核级线程

多线程模型

小结

2.1_7线程的状态与转换

2.2_1调度的概念、层次

调度的基本概念

当要处理的任务很多时,需要按照某种规则去处理这些任务。

调度的三个层次--高级调度(作业调度)

高级调度:按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调度时会建立PCB,调出时才撤销PCB

调度的三个层次--低级调度(进程调度/处理机调度)

低级调度:按照某种策略从就绪队列中选取一个进程,将处理机分配给它。

进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。

进程调度的频率很高,一般几十毫秒一次。

调度的三个层次--中级调度

内存不够时,可将某些进程的数据调出外存。等内存空闲或者进程需要运行时再重新调入内存。暂时掉到外存等待的进程状态为挂起状态。被挂起的进程PCB会被组织称挂起队列。

进程的挂起态与七状态模型(自主命题可能会考)

暂时调到外存等待的进程状态为挂起状态(挂起态,suspend)

挂起态又可以进一步细分为就系挂起、阻塞挂起两种状态。

三层调度的联系、对比

小结

2.2_2进程调度的时机切换与过程调度方式

进程调度的时机

需要进行进程调度与切换的情况:

①当前运行的进程主动放弃处理机:进程正常终止、运行过程中发生异常而终止、进程主动请求阻塞(如等待I/O)。

②当前运行的进程被动放弃处理机:分给进程的时间片完、有更紧急的事需要处理(如I/O中断)、有更高优先级的进程进入就绪队列。

不能进行进程调度与切换的情况:①在处理中断的过程中。中断过程复杂,与硬件密切相关,很难做到在终端处理过程中进行进程切换。②进程在操作系统内核程序临界区中。③在原子操作过程中(原语)。原子操作不可中断,要一气呵成。

临界资源

临界资源:一个时间段内只允许一个进程使用的资源。个进程需要互斥地访问临界资源。

临界区:访问临界资源的那段代码。

内核临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由个就绪进程的PCB组成)

进程调度的方式

  • 非剥夺调度方式,又称非抢占方式。即,只允许今晨主动放弃处理机。在运行过程中见有更紧迫的任务到达,当前进程依然会继续使用处理机,指导该进程终止或主动要求进入阻塞态。

    实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统。

  • 剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的过程,将处理机分配给更重要紧迫的那个进程。

   可以优先处理更紧急的进程,也可以实现让各进程按照时间片轮转的功能(通过时钟中断)。适合分时操作系统,实时操作系统。

进程的切换与过程

小结

2.2_3 调度器和闲逛进程

调度器/调度程序

闲逛进程idle

指令周期末尾的例行检查中断可以周期性的唤醒调度程序,来检查此时到底有没有其他的程序已经就绪,如果有的话就让闲逛进程下处理机,让其他进程上处理机。

2.2_4 调度算法的评价指标

CPU利用率

CPU利用率:指CPU“忙碌”的时间占总时间的比例。

利用率:忙碌的时间/总时间

系统吞吐量

系统吞吐量:单位时间内完成作业的数量

系统吞吐量=总共完成了多少道作业/总共花了多少时间

周转时间

周转时间:从做也被提交给系统开始,道祖业完成为止的这段时间间隔。

(作业)周转时间=作业完成时间-作业提交时间    (用户关心的单个作业的周转时间)

平均周转时间=各作业周转时间之和/作业数量          (操作系统更关心系统整体的表现)

带权周转时间=作业周转时间/作业实际运行的时间=作业完成时间-作业提交时间/作业实际运行的时间

等待时间

等待时间,指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。

响应时间

响应时间,指从用户提交请求到首次产生响应的时间

小结

2.2_5 调度算法(1)先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN)

  • 先来先服务FCFS算法思想:

主要从“公平”的角度考虑(类似于日常生活中排队买东西)

  • 算法规则:

按照作业/进程到达的先后顺序进行服务

  • 用于作业/进程调度:

用于作业调度时,考虑的是哪个作业先到达后备队列

用于进程调度时,考虑的是哪个进程先到达就绪队列

  • 是否可抢占?

非抢占式的算法。

  • 优缺点

优点:公平、算法实现简单

缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即。FCFS算法对长作业有利,对短作业不利(Eg:排队买奶茶)

  • 是否会导致饥饿

不会

  • 短作业优先(SJF)算法思想:

追求最少的平均等待时间,最少的平均周转时间,最少的平均带权周转时间。

  • 算法规则:

最短的时间/作业优先得到服务(所谓“最短”,是指要求服务时间最短)

  • 用于作业/进程调度:

即可用于作业调度,也可用于进程调度。“短作业优先(SJF,Shortest Job First)算法”

用于进程调度时称为“短进程优先(SPF,Shortest Process First)算法”

  • 是否可抢占?

SJF和SPF是非抢占式的算法,但是也有抢占式的版本——最段剩余时间优先算法(SRTN,Shortest Remaining Time Next)

短作业优先调度算法:每次调度时选择当前已到达运行时间最短的作业进程。

  • 优缺点

优点:“最短的”平均等待时间,平均周转时间

缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先。

  • 是否会导致饥饿

会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死”。

对FCFS和SJF两种算法的思考 

  • 高响应比优先(HRRN)算法思想:

要综合考虑作业/进程的等待时间和要求服务的时间

  • 算法规则:

在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。

响应比=(等待时间+要求服务时间)/要求服务时间   ≥1 

  • 用于作业/进程调度:

用于作业调度时,也可用于进程调度。

  • 是否可抢占?

非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时(正常/异常完成,或主动阻塞),才需要进行调度,调度时计算所有就绪进程的响应比,选响应比最高的进程上处理机。

  • 优缺点

综合考虑了等待时间和运行时间(要求服务时间)
等待时间相同时,要求服务时间短的优先( SJF的优点)要求服务时间相同时,等待时间长的优先(FCFS 的优点)对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题

  • 是否会导致饥饿

不会

小结

2.2_6 调度算法(2)时间片轮转(RR)、优先级调度、多级反馈队列

2.2_7 调度算法(3)

 

2.3_1 进程同步、进程互斥

什么是进程同步?

异步:各并发执行的过程以各自独立的、不可预知的速度向前推进。

同步:亦称为直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要再某些位置上协调他们的工作次序而产生的制约关系。进程间的直接制约的关系就是源于它们之间的相互合作。

什么是进程互斥?

小结

2.3_2 进程互斥的软件实现方法

如果没有进程互斥?

单标志法

算法思想:两个进程在访问完临界区后会把使用临界区的权限交给另一个进程,也就是说每个进程进入临界区的权限只能被另一个进程赋予。

int trun=0;//表示当前允许进入临界区的进程号
P0进程:
while (turn != 0);①
critical section;②
trun = 1;③
remainder section;④
P1进程:
while(turn != 1);   //进入区⑤
critical section;   //临界区⑥
turn = 0;           //退出区⑦
remainder section;  //剩余区⑧
//turn的初值为0,即刚开始只允许0号进程进入临界区。
若P1线上处理机运行,则会一直卡在⑤,直到P1的时间片用完没发生调度,切换P0上处理机运行。代码①不会卡主P0,P0可以正常访问临界区,在P0访问临界区期间几十切换回P1,P1依然会卡在⑤。

 单标志法可以实现“同一时刻只允许一个进程访问临界区”。(互斥)

双标志线检查

算法思想:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0]=true”意味着P0现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。

bool flag[2];  //表示进入临界区意愿的数组
flag[0]=false;
flag[1]=false; //刚开始设置为两个进程都不想进入临界区
P0进程:
while ([flag[1]);
flag[0]=true;
critical section;
flag[0] = false;
remainder section;
P1进程
while(flag[0]);
flag[1]=true;
critical section;
flag[1]=false;
remainder section;

双标志后检查

Peterson算法

算法思想:

小结

2.3_3进程互斥的硬件实现方法

中断屏蔽方法

利用“开/关中断指令”实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就是不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)

TestAndSet(TS指令/TSL指令)

Swap指令

小结 

2.3_4互斥锁

锁:用于实现互斥的一种方法

 

2.3_5信号量机制

信号量机制:整型信号量、记录型信号量

 

整型信号量

用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。

与普通整数变量的区别:对信号量的操作只有三种:即初始化

P操作、V操作。

Eg:某计算机系统中有一台打印机
int S=1;//初始化整型信号量S,表示当前系统中可用的打印机资源数

 void wait(int S) { //wait原语。想当年嘎鱼“进入区”
     while(S<=0);   //如果资源数不够,就一直循环等待
     S=S-1;         //如果资源数够,则占用一个资源
} 

void signal(int S) { //signal原语,相当于“退出区”
     S=S+1;          //使用完资源后,在退出区释放资源
}


进程P0
...
wait(S);         //进入区,申请资源
使用打印机资源... //临界区,访问资源
signal(S);       //退出区,释放资源
...

进程P1
...
wait(S);         //进入区,申请资源
使用打印机资源... //临界区,访问资源
signal(S);       //退出区,释放资源
...


进程P2
...
wait(S);         //进入区,申请资源
使用打印机资源... //临界区,访问资源
signal(S);       //退出区,释放资源
...

记录型信号量 

整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。

/*记录型信号量的定义*/
typeof struct {
    int value;             //剩余资源数        
    struct process *L;     //等待队列
}semaphore;
/*某进程需要使用资源时,通过wait原语申请*/
void wait(semaphore S) {
   S.value --;
   if( S.value<0) {
//剩余资源数不够时使用block原语使进程从运行态进入阻塞态,并挂到信号量S的等待队列(阻塞队列)中
       block(S.L);
   }
}

/*进程使用完资源后,通过signal原语释放*/
void signal (semaphore S) {
     S.value++;
     if(S.value <= 0){
//释放资源后若还有别的进程在等待这种资源则使用wakeup原语唤醒等待队列中的一个进程,该进程从阻塞态变为就绪态。
        wakeup(S.L);
     }
}

Eg:某计算机系统重有2台打印机,则可在初始化信号量S时将S.value的值设为2,队列S.L设置为空

 

小结

若考试中出现P(S)、V(S)的操作,除非特别说明,否则默认S为记录型信号量。

2.3_6用信号量实现进程互斥、同步、前驱关系

信号量机制实现进程互斥

1.分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)

2.设置互斥信号量mutex,初值为1。信号量mutex表示“进入临界区的名额”

3.在进入区P(mutex)--申请资源

4.在退出区V(mutex)--释放资源

信号量机制实现进程同步

进程同步:要让各并发进程按要求有序地推进。

信号量机制实现进程的前驱关系

小结

2.3_7生产者-消费者问题 2.3_8多生产者-消费者问题

操作系统||经典进程同步问题之生产者-消费者问题

2.3_9吸烟者问题

操作系统||经典进程同步问题之吸烟者问题

2.3_10读者写者问题

操作系统||经典进程同步问题之读者-写者问题

2.3_11哲学家进餐问题

【问题描述】

【问题分析】

【如何实现】 

①可以对哲学家进程施加一些限制条件,比如最多允许四个哲学家同时进餐,这样可以保证至少有一个哲学家是可以拿到左右两双筷子的。

②要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一支筷子,另外一个会直接阻塞。这就避免了占有一支后等待另一支的情况。

③仅当一个哲学家左右两支筷子都可用时才允许他抓起筷子 

【小结】

2.3_12管程

 为什么要引入管程?

管程的定义和基本特征

拓展1:用管程解决生产者消费者问题

拓展2:Java中类似于管程的机制

小结

管程应用封装的思想,把进程同步互斥的细节隐藏在函数内,对外只提供一些简单应用的函数接口

2.4_1死锁的概念

死锁

死锁、饥饿、死循环的区别

死锁:各进程都互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。

饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短作业优先(SPF)算法中,若有源源不断地短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。

死循环:某进程执行过程中一直跳不出某个循环的现象,有时因为程序逻辑bug导致的,有时是程序员故意设计的。

死锁产生的必要条件

必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。

  • 互斥条件
  • 不剥夺条件
  • 请求和保持条件
  • 循环等待条件

什么时候会发生死锁



死锁的处理策略

 

 小结

2.4_2死锁的处理策略--预防死锁

破坏互斥条件

破坏不剥夺条件

破坏请求和保持条件

破坏循环等待条件

小结 

2.4_3死锁的处理策略--避免死锁

安全序列 

 安全序列、不安全状态、死锁的联系

银行家算法

  

快速对比

找不到安全序列的例子

 银行家算法代码实现

小结 

2.4_4死锁的处理策略--检测和解除

死锁的检测

 

死锁的解除

小结 

第二章终于!!!!!!!!!!终于结束了      2023.12.5    值得记录的日子 欧耶


3.1_1内存的基础知识

内存的作用

内存可存放数据,程序执行前需要先放到内存中才能被CPU处理--缓和CPU与硬盘之间的速度矛盾

几个常用的数量单位


指令的工作原理

装入的三种方式--绝对装入

装入的三种方式--可重定位装入(静态重定位)

装入的三种方式--绝对装入(动态重定位)

从写程序到程序运行

链接的三种方式

小结

3.1_2内存管理的概念

内存空间的分配与回收

内存空间的扩充

地址转换

存储保护

方法一:在CPU中设置一对上下限寄存器,存放进程的上下限地址。

方法二:采用重定位寄存器和街地址寄存器进行越界检查。

小结

3.1_3覆盖与交换

解决程序大小超过物理内存总和的问题

覆盖技术 

交换技术

(注意:PCB会常驻内存,不会被换出外存) 

小结

3.1_4连续分配管理方式

单一连续分配

固定分区分配



分区说明表

动态分区分配

1.系统要用什么样的数据结构记录内存的使用情况? 空闲分区表、空闲分区链。

2.当有很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?动态分区分配算法

3.如何进行分区的分配和回收操作?合并相邻空闲分区

动态分区分配

小结

3.1_5 动态分区分配算法

首次适应算法

算法思想:每次都从地地址开始查找,找到第一个能满足大小的空闲分区。

如何实现:将空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

最佳适应算法

算法思想:由于动态分区分配时一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片空闲区,即,优先使用更小的空闲区。

如何实现:将空闲分区按容量递增的次序链接,每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

最坏适应算法

算法思想:为了解决最佳适应算法的问题--留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。

如何实现:将空闲分区按容量递减的次序链接,每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

邻近适应算法

算法思想:首次适应算法每次都从链头开始查找,这可能会导致地地址部分出现很多小的空闲分区,而每次分配查找时都要经过这些分区,因此增加了查找的开销,如果每次都从上次查找结束的位置开始检索,就能解决上述问题。

如何实现:空闲分区以地址递增的顺序排列(可排成一个循环链表),每次分配内存时从上次查找结束的位置开始查找空闲分区链(表),找到大小能满足要求的第一个空闲分区。

综合来看,四种算法中,首次适应算法的效果反而更好。 

小结

3.1_6基本分页存储管理的基本概念

什么是分页存储?

将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”(页框=页帧=内存块=物理块=物理页面)。每个页框有一个编号,即“页框号”(页框号=页帧号=物理块号=物理页号),页框号从0开始。

页表 

为了能知道进程的每一个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。

注:页表通常存在PCB (进程控制块)中

问题一:每个页表项占多少字节?

问题二:如何实现地址的转换

如何确定一个逻辑地址对应的页号、页内偏移量?

为何页面大小要取2的整数幂?

逻辑地址结构

小结

3.1_7基本地址变换机构

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值