进一步学习操作系统 - 哈工大李治军老师 - 学习笔记 L19L20L21

L19 死锁处理

多个进程由于互相等待对方持有的资源而造成的谁都无法执行的情况叫死锁

死锁的4个必要条件:
互斥使用(Mutual exclusion)-资源的固有特性,如道口
不可抢占(No preemption)-资源只能自愿放弃,如车开走以后
请求和保持(Hold and wait)-进程必须占有资源,再去申请
循环等待(Circular wait)-在资源分配图中存在一个环路

死锁处理方法概述
1.死锁预防:破坏死锁出现的条件

2.死锁避免:检测每个资源请求,如果造成死锁就拒绝
找到一个安全序列(银行家算法)
死锁避免的代价太大了
因为每一个进程Pi每次申请的时候,都要进行一次银行家算法,看是否会引起死锁,时间复杂度太高


3.死锁检测+恢复:检测到死锁出现时,让一些进程回滚,让出资源

4.死锁忽略:就好像没有出现死锁一样
在这里插入图片描述

L20 内存使用与分段

内存使用:将程序放到内存中PC指向开始地址,取指执行

1.将程序放到内存中
重定位:修改程序中的相对地址(逻辑地址)
什么时候完成重定位?
编译时重定位的程序,只能放在内存固定位置
载入时重定位的程序,一旦载入内存就不能动
一般是载入时完成重定位,这样更灵活,但是效率更低一些;
如果是编译时完成重定位,一般只有在定死了每个程序位置的那些嵌入式系统中采用编译重定位。

以下参考我的王道笔记
在这里插入图片描述
编译时重定位,和载入时重定位,都是静态重定位,是在程序开始运行前,对地址进行“重定位”,将逻辑地址变换为物理地址,作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。

但是内存空间肯定是不够的,阻塞的进程会被调出到外存,就绪的进程也会被调入内存,所以如果按静态重定位,就会有问题。

所以不应该固定进程的绝对地址,而应该在需要运行的时候,动态重定位(动态运行时装入):

编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器(存放装入模块存放的起始位置)的支持。
采用动态重定位时允许程序在内存中发生移动
并且可将程序分配到不连续的存储区中;在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

在这里插入图片描述
在这里插入图片描述
将整个程序分段,每段有自己的段号,通过段号和段内偏移定位具体指令或数据
在这里插入图片描述
将每段的信息:段号、基址、长度等记录到进程段表LDT中(操作系统对应的段表是GDT)

jmpi段间跳转指令,用于x86实模式下。jmp是段内跳转。

mov [DS:100],%eax
DS=1,说明段号为1,基址为360K,段内偏移为100,重定位为360K+100
jmpi 100,CS
CS=0,说明段号为0,基址为180K,段内偏移为100,重定位为180K+100
jmp 500K
段号为当前段号,段内偏移为500K,重定位为当前段基址+500K
(俺也不晓得可不可以偏移500K,若有懂得朋友,感谢解答)

L21 内存分区与分页

结合实验六

内存分区

固定分区-等分-不可取
可变分区:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
物理内存分页、虚拟内存分区

引入分页:解决内存分区导致的内存效率问题

在这里插入图片描述
在这里插入图片描述
经典套娃:
整个程序太大了,所以将程序分成一段一段的,又因为段大小不一,内存分区会有浪费,所以把段也分成更小的段,浪费就少了
这里我有个小小的疑问,分页不就是 等分且区很小分区
还有段和页,内存分过段吗?还是只是一种口语表达,就是指把程序分段放入内存?

在这里插入图片描述

CR3含有存放页目录表页面的物理地址,因此CR3也被称为PDBR。因为页目录表页面是页对齐的,所以该寄存器只有高20位是有效的。而低12位保留供更高级处理器使用,因此在往CR3中加载一个新值时低12位必须设置为0。
参考https://blog.csdn.net/SweeNeil/article/details/106171361

上图右上角,可以看到:某程序的段0分了4页,放在内存的4个页框里
上图中间部分,可以看出:页中仍然是逻辑地址,逻辑地址由页号和页内偏移组成,每页尺寸为4K
上图左下角,可以看到:PCB里有页表指针的值,页表指针指向该段的页表,页表里包含页号对应的页框号等信息

所以根据逻辑地址 0x2240 = 0010 0010 0100 0000(2)
页号为0010(2) = 2(16) = 2(10), 页内偏移为 0010 0100 0000(2) = 240(16)
页表
页框号为3(10),
由每页尺寸为4K得
物理地址为3(10) × 4K(10) + 240(16) =12288(10) + 240(16) = 3000(16) + 240(16) = 3240(16) = 0x3240
3(10)×4K(10) = 3(16) × 212(10) = 3(16) × 1000(16) =3000(16)

猜你喜欢

转载自blog.csdn.net/tfnmdmx/article/details/119491299