内存管理和进程管理

CPU管理

CPU执行过程
将一段程序存放到内存里,设置PC程序计数器存放的指令地址,CPU将PC的值传递给地址总线,在内存中找到地址对应指令,再将指令通过数据总线传到指令寄存器IR中,然后使用指令译码器ID分析指令操作码,最后执行指令,(PC程序计数器自动递增)
在这里插入图片描述在这里插入图片描述在这里插入图片描述
管理CPU最直观的方法:设置好PC初值就完事
在这里插入图片描述
但是如上面代码,CPU的利用率只有50%,大部分时间到时在等待IO操作完成
解决方法:多道程序交替执行,让CPU忙起来(并发

在这里插入图片描述
在两个进程切换的过程中,切换出去只修改PC的值,切换回来也只修改PC的值行吗?
不行,这样原来进程的执行状态和数据都丢失了,所以在CPU切换进程的适合,需要保存现场
在这里插入图片描述
程序和进程的区别:
进程有开始、有结束、程序没有
进程会走走停停,走停堆程序无意义
进程需要记录ax,bx,…,程序不用

内存管理

重定位

运行时重定位:创建进程、创建PCB,再内存中找一段空闲的内存,将空闲基址(base)写入PCB,内存中载入进程,执行,上下文切换的时PCB的基址就变成了基址寄存器,每次执行都要基于base将逻辑地址转换为物理地址(地址翻译)
在这里插入图片描述
程序计数器PC记录下一行指令的地址,CPU取出指令存放到IR指令寄存器中,执行指令的时候根据基地址(PCB中)找到实际的物理地址,上下文切换的时候将基地址写入PCB基址寄存器中
在这里插入图片描述

分区管理

固定分区:用户内存空间划分为固定大小的分区,每个分区装入一道作业,问题:程序太大装不进去任何一个分区,程序小于固定分区大小时会造成内部碎片

可变分区:装入内存时,根据实际需要,动态为之分配内存,并使分区大小刚好适合进程需要

使用空闲分区表或者分区链管理内存分配和回收
在这里插入图片描述
分区分配算法:
首次适应法:空闲分区按地址递增的次序排列,每次分配内存时,顺序查找第一个能够满足大小的空闲分区
循环首次适应法:首次适应法的基础上,每次从上次查找结束的位置继续查找
最佳适应法:空闲分区按容量递增的次序排列,每次分配内存时,顺序查找第一个能够满足大小的空闲分区
最差适应法:空闲分区按照递减排列,每次分配内存时,顺序查找第一个能够满足大小的空闲分区
在这里插入图片描述

段式存储管理

将用户的逻辑地址空间划分为大小不同的段,不同段有不同特点,每段都从0开始编址,并分配一段连续的地址空间(段内要求连续,段间不要求连续)
在这里插入图片描述
逻辑地址由<段号,段内偏移>组成
每个进程都有一张段表(LDT),段表储存在内存中,PCB存放段表指针
CPU根据LDTR寄存器找到段表LDT
在这里插入图片描述
在这里插入图片描述
在CPU执行指令的时候,使用段表寄存器找到对应的段表,根据段表(偏移量W+基址b),计算出实际的物理地址访问内存

页式存储管理

将内存分为固定大小的分区,称为页框或者物理块,进程的逻辑地址空间也分为与块大小相等的若干区域,称为页或页面
逻辑地址:<页号P,页内偏移量W> 
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

快表

一组相联快速存储器,是寄存器
如果页表存放在内存中,取一个数据或者指令至少要访问两次内存,第一次访问页表,确定所存取得数据或者指令得物理地址,第二次根据该地址存取数据和指令,比通常执行指令得速度慢一半
在这里插入图片描述
在这里插入图片描述
时间局部性:指令重复执行,循环操作
空间局部性:存储单元连续访问可能性大,数据一般以数组,表等形式聚簇存储

多级页表

为了保证:页表既要连续(方便查找),又要占用内存少
(1) 对与页表所需内存空间,采用离散分配方式,用一张索引表来记录各个页表的存放位置,解决了页表占用连续内存的问题
(2) 只需将当前需要的部分页表调入内存,其余页表任驻留在磁盘,需要时再调入(虚拟内存的思想)内存,解决了页表占用内存过多的问题
逻辑地址空间格式:
在这里插入图片描述
在这里插入图片描述

段页式存储管理

程序员希望用段,物理内存希望用页

段页同时存在:段面向用户/页面向硬件
逻辑地址→虚拟地址→物理地址
在这里插入图片描述
在这里插入图片描述

内存的换入换出

在这里插入图片描述
在程序执行过程中,当使用段表访问到虚拟地址空间之后,然后会查找页表,当发现需要访问的页不在内存中时,产生缺页中断,从磁盘中找到缺页,将一页换入内存,并修改页表。当内存空间不够时,通过页面置换功能将内存中暂时用不到的页面换出外存
在这里插入图片描述
在这里插入图片描述

页面置换算法

最佳算法OPT:选择淘汰以后永不使用的页面,,或者最长时间内不再被访问的页面,理论上的算法,无法实现,用来评价其他算法
先进先出FIFO:淘汰最早进入内存的页面,会产生抖动现象,即分配的页数越多,缺页率越高
最近最久未使用算法LRU:淘汰最近长时间未使用的页面
时钟置换算法CLOCK

进程

定义

在这里插入图片描述

进程的状态

在这里插入图片描述

进程控制块

在这里插入图片描述
PCB通过链表的方式组织再一起,组成就绪队列和阻塞队列
在这里插入图片描述
除了链表的组织方式,还有索引的方式,将同一状态的进程组织再一个索引表中,索引表项指向相应的PCB,不同状态对应不同索引表

进程的控制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进程的上下文切换

在这里插入图片描述
CPU的上下文切换
在每个任务运行前,CPU需要知道任务从哪里加载,又从哪里开始,所以操作系统需要事先帮CPU设置好CPU寄存器(缓存)和程序计数器
所以说CPU寄存器和程序计数器是CPU在运行任何任务前,所以必须依赖的环境,这个环境就叫做CPU上下文
在这里插入图片描述
进程的上下文切换
切换涉及的内容:
寄存器状态:通用寄存器,程序计数器,状态标志等
堆栈指针
全局变量
进程状态
页表(虚拟地址空间)
资源:文件描述符列表等

在这里插入图片描述

线程

1.为什么使用线程
进程间通信并不方便
维护进程的开销较大,如创建进程时分配资源、建立PCB;终止进程时,回收资源、销毁PCB、进程切换时,保存当前进程的状态信息
2.什么时线程:CPU独立调度的最小单位
同一个进程内多个线程之间可以共享代码段、数据段、文件资源等等,但每个线程各自有有一套独立的寄存器和栈,这样确保线程的控制流是相对独立的
在这里插入图片描述
**1.为什**
3.进程和线程的区别
1.进程是分配资源的最基本单位,线程是CPU独立调度的最小单位
2.进程拥有完整的资源,线程只独享寄存器和栈空间
3.线程和进程都具有三种状态(就绪、阻塞、执行)
4.线程能减少并发执行的时间和空间开销

对于,线程比进程能减少开销,体现在:
(1)线程创建比进程快,因为进程在创建过程中,还需要资源信息(内存管理信息,文件管理信息),而线程在创建的过程中,不涉及这些资源管理信息,而是共享它们
(2)线程的终止时间比进程快,因为线程释放的资源相比于进程少很多
(3)进程切换比线程快,因为线程具有相同的虚拟地址空间,意味着同一个进程的线程都具有同一个页表,切换过程中不需要切换页表
(4)线程共享内存和资源,线程之间传递数据的时候,不需要通过内核,使得线程之间交互效率更高了

线程的上下文切换
在这里插入图片描述

调度算法

先来先服务
短作业优先
高响应比
优先级调度
时间片轮转
多级反馈调度

死锁

1.死锁产生的条件
资源互斥 + 持有并等待 + 不可剥夺 + 循环等待
2.死锁处理策略
死锁预防:
(1)破坏资源互斥条件:允许资源共享
(2)破坏不可剥夺条件:释放已经保持的所有资源,待以后需要再重新申请
(3)破坏持有并保持条件:允许进程只获得初期所需要的资源后,便可允许,运行过程中再逐步释放已分配给自己且已使用完毕的全部资源,才能请求新的资源
(4)破坏循环等待条件:采用顺序分配法,一个进程只有已经占有小编号的资源,才有资格申请更大的编号资源
死锁避免
每次分配资源的过程中,都要分析此次分配是否会带来死锁风险(银行家算法)
死锁检测
某时刻采用资源分配图检测死锁
死锁解除
挂起进程,撤销进程,回退进程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值