【操作系统和强化学习】1.内存管理策略


前言

CPU的调度可以提高CPU的利用率和计算机的响应用户的速度。为了改进性能,应该将多个进程保存在内存中。也就是说必须共享内存。
本文讨论的是如管理内存。


1.内存是什么

内存是现代计算机运行的核心,由一个很大的字节数组来组成,每个字节都有各自的地址。
CPU根据程序计数器的值(PC指针的值)从内存中取指令。
与内存管理技术有关的问题:基本硬件/符号内存地址绑定到实际物理地址以及逻辑地址与物理地址的差别等。最后是动态链接与共享库。

1.1 基本硬件

CPU可以直接访问的通用储存只有内存和处理器内置的寄存器。机器指令可以用内存地址作为参考。
CPU内置寄存器可以在一个CPU时钟周期内完成访问。大多数CPU可以在一个时钟周期内解释并执行一条或多条指令。而对于内存访问则需要多个CPU时钟周期。CPU缺少数据,通常需要暂停stall。
弥补这一不对等的问题,增加高速缓存。
增加告诉缓存要考虑的问题:1.关心物理内存的 访问速度。 2.确保操作正确,不能在用户态执行 3.保护用户进程互相不受影响。
这种保护通常通过硬件来实现,因为操作系统通常不干预CPU对内存的访问。

1.1.1 保护措施

基地址寄存器 base Register: 含有最小的合法的物理内存地址。
界限地址寄存器Limit Register: 指定了范围大小。
内存空间保护是通过cpu硬件对用户模式下产生的地址与寄存器的地址进行比较来完成的。

指令和数据绑定到储存器地址可以发生在:
1.编译时 compile time
2.加载时 load time
3. 执行时 runtime time
从虚拟地址到物理地址的运行时映射是MMU,内存管理单元,MMU中有一个重定位寄存器。

1.1.2 碎片

外部碎片和内部碎片
外部碎片的解决方法是紧缩,通过移动内存内容,将所有空闲空间合并成一整块。只有重定位是动态的,并且再运行是进行的,才能采用紧缩。

1.2 分段机制

分段:支持用户视图的内存管理方案,逻辑地址空间是由一组段构成。每个段都有名称和长度。地址指定了段名称和段内位移。
在这里插入图片描述

1.2.1 分段硬件

通过段表来实现,段表的每个row,都有端基地址和段界限。

1.3 分页

分段运行进程的物理地址空间是非连续的。分页paging是提供这种优势的另一种内存管理方案,并且避免了外部碎片和紧缩。二分段不可以。

在这里插入图片描述

1.4 虚拟存储

局部性原理: 程序执行过程呈现出明显的局部性规律,即在一段较短的时间内,程序的执行仅局限于某个部分.相应的,所访问的存储空间也局限于某个区域.
时间局部性:刚访问的数据不久可能再次被访问.---------循环结构
空间局部性:程序在一段时间内访问的地址空间可能几种在一定范围之内.-----------pc+1

请求分页储存管理:页面置换方法

什么是抖动现象?

1.4 程序运行的必要条件

程序运行之前必须要为其建立进程,而创建进程的首要任务是将程序和数据装入内存,用户源程序执行流程如下:
1.编译: 将用户源代码编译为目标代码的过程
2.链接:将编译后形成的一组目标代码以及所需要的库函数链接在一起,形成完整的装入模块
3.装入:将装入模块装入内存
4.执行:运行内存中的可执行文件

1.4.1 链接

静态链接:程序执行前,将若干从0地址开始的目标模块及所需库函数链接为完整、从唯一"0"地址开始的装配模块.
装入时动态链接:边装入内存边链接的各目标模块.
运行时动态链接:程序执行过程中需要目标模块时,才对其进行链接.

1.4.2 各种地址

符号地址: 用户源程序中使用的指令助记符、变量名、函数名等,所对应的地址空间成为符号地址空间或名空间. + ~~~~ ADD
逻辑空间:用户源程序编译后的目标模块汇总使用的,从0开始编号的地址,又称为相对地址、或虚地址,所对应的地址空间称为逻辑地址空间.
物理地址:内存中每个存储单元的编号,又称为绝对地址,或实地址,所对应的地址空间称为物理地址空间、内存空间.

三个地址空间的关系以及变换:在这里插入图片描述
装入:
在这里插入图片描述
动态重定位和静态重定位的比较:
在这里插入图片描述

1.5 连续储存管理

特征:在内存用户区为每个用户程序,分配一片连续的内存空间。
单一连续分区、固定分区、可变分区

1.5.1 单一连续分区

单一=单道
在这里插入图片描述

1.5.2 固定分区

事先分成若干个不同的区域。
在这里插入图片描述
一个分区只能装入一个用户程序, 可能存在有内部的浪费.
固定分区的数据结构:分区使用表
在这里插入图片描述

1.5.2 可变分区

来一个作业,要多少给你多少,第二个作业来了,在第一个作业内存的后面,来多少给多少。。。分配起来容易,回收起来难。
在这里插入图片描述

1.5.6 分区的分配算法

首次适应算法
在这里插入图片描述

循环首次适应算法
在这里插入图片描述
最佳适应算法—最佳就是最好么??未必!!
在这里插入图片描述
最差适应算法
在这里插入图片描述
最快适应算法
在这里插入图片描述
伙伴系统:
大小是2^k起始地址为X的内存块,其伙伴块的地址为buddyk(x)
下连续分区或者上连续分区
在这里插入图片描述
哈希算法
在这里插入图片描述
动态可重定位分区算法:
在这里插入图片描述
在这里插入图片描述
进程是怎样运行的?
进程控制,os对进程实现有效管理,包括创建新进程/撤销已有进程、挂起、阻塞和唤醒、进程切换等多种操作。OS听过原语(Primitive)操作实现进程控制。
原语的概念:由若干条指令组成,完成特定的功能,是一种原子操作(Action Operation)
原语的特点:
原子操作,执行过程不会被中断。
再内核态下执行,常驻内存,是内核三大支撑功能(中断处理/时钟管理/原语操作)之一。
关于软件控制的各种高速缓存的置换算法:
在这里插入图片描述
高速缓存的一致性 cache coherence 通常是硬件问题。

1.7 进程状态

在这里插入图片描述

1.8 PCB

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

1.8 进程间通信 IPC InterProcess Communication

两个模型:共享内存、消息传递
共享内存比较快。消息传递实现经常使用系统调用。对分布式系统,消息传递比共享内存更容易实现。
在这里插入图片描述

1.9 线程

每个线程是CPU使用的一个基本单元;它包括线程ID、程序计数器、寄存器组合堆栈。
它同进程的其它线程共享代码段、数据段和其它操作系统资源。如打开文件和信号。
单线程和多线程的区别:
在这里插入图片描述

2.0 问题, 一个进程里面有多个线程? 这多个线程可能分配到多个cpu上同时执行么?

可以,因为cpu调度的最小单位是线程

2.1 进程的阻塞与唤醒,挂起与激活有啥区别和联系?

阻塞和挂起的区别:
阻塞是指进程由于等待某些事件发生(如输入输出、信号量等)而停止运行,并将资源让渡给其他进程使用。阻塞是由操作系统内核发起的,进程本身不能主动阻塞。

挂起则是进程主动要求暂停自己的执行,直到再次被激活才能继续执行。挂起是由进程本身发起的,常用于进程间通信。

唤醒和激活的区别:
唤醒是指操作系统从阻塞状态中将进程移回就绪队列,以待分配 CPU 资源并继续执行。唤醒是由操作系统内核发起的。

激活则是指进程在未被挂起的情况下被调度器选中,获得 CPU 资源,开始执行。激活是由调度器发起的。

联系:阻塞和挂起的目的都是使进程暂停执行,等待某些事件发生或被其他进程激活。唤醒和激活则是将进程转移到就绪状态,以等待分配 CPU 资源执行。两者都是进程状态转移的过程,是进程调度的基本操作。
from chatgpt 不一定对

猜你喜欢

转载自blog.csdn.net/weixin_40293999/article/details/130448309
今日推荐