这是我自己看王道系列视频总结的,我是在专注笔记里写好然后粘过来的(给大家安利专注笔记,是我用过无数笔记软件后留下的😂),需要原笔记文件的可以给我评论哈
第一章计算机系统概述 总结:https://blog.youkuaiyun.com/Tangli_yzy/article/details/113737141
第二章进程管理 总结:https://blog.youkuaiyun.com/Tangli_yzy/article/details/113772355
第三章内存管理 总结:
内存管理/存储器管理
内存基础知识
- 内存:存放数据。用于缓和CPU和硬盘之间的速度矛盾
- 进程运行的基本原理
- 指令的工作原理:指令的工作基于地址
- 逻辑地址vs物理地址
- 逻辑地址:相对于进程起始地址而言
- 物理地址:实际地址
- 如何实现地址转换
- 绝对装入:先前就知道程序将放到哪个位置,编译连接后直接使用物理地址(适用于单道程序环境)
- 可重定位装入:在程序装入内存的时候进行“重定位”,逻辑变为物理。特点:在一个作业装入内存时必须分配其要求的全部内存空间;进入内存后,运行期间就不能移动,也不能再申请内存空间
- 动态运行装入:把地址转换推迟到程序真正要执行时才进行,所以装入内存后依然是逻辑地址。需要重定位寄存器(粗放装入模块存放的起始位置)。允许程序在内存中移动,并且可将程序分配到不连续的存储区中;在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
- 从写程序到程序运行的过程
- 编辑 源代码.c文件
- 编译成目标模块 .o文件
- 链接成一个完整的装入模块(可执行文件) .exe文件
- 装入:地址转换,装入内存运行
- 3种链接方式:
- 静态链接:在程序运行之前,将各个目标模块及所需要的库函数连接成一个完整的可执行文件(形成完整的逻辑地址),之后不再拆开
- 装入时动态链接:将各个目标模块装入内存时,边装入边链接的链接方式(边装入边形成逻辑地址)
- 运行时动态链接:在程序执行中需要该目标模块时才进行装入并链接(不需要的模块不用链接)。便于修改和更新和实现对目标模块的共享,也可提升对内存的利用率。
内存管理的概念
- 内存空间的分配与回收
- 连续分配管理方式
- 非连续分配管理方式
- 内存空间的扩充(实现虚拟性)
- 覆盖技术(下节)
- 交换技术(下节)
- 虚拟存储技术
- 地址转换/重定位
- os负责实现地址转换
- 三种装入方式(上节有)
- 存储保护
- 在CPU中设置一对上下限寄存器,存放进程的上下限地址。进程的指令要访问某个地址时,CPU检查是否越界
- 采用重定位寄存器(起始物理地址)和界地址寄存器(最大逻辑地址)进行越界检查。
覆盖与交换
- 覆盖技术:解决程序大小超过物理内存总和的问题(现在已经不使用了)
- 思想:将程序分段,常用的段常驻内存,不常用的需要时调入;内存分为一个固定区(常用段,调入后直到运行结束才调出)和若干个覆盖区(不常用段)。按照程序的逻辑结构,不可能被同时访问的程序段共享一个覆盖区。
- 必须由程序员声明覆盖结构,os完成自动覆盖
- 缺点:对用户不透明,增加了用户编程负担
- 交换技术:进程在内存与磁盘间动态调度
- 中级调度(内存调度):决定将哪个处于挂起状态(暂时换出外存等待)的进程重新调入内存
- 在外存的什么位置保存被换出的进程?对换区
- 磁盘空间:
- 文件区:存放文件,追求存储空间的利用率,采用离散分配方式
- 对换区(小部分):追求换入换出速度,采用连续分配方式,IO速度比文件区快
- 磁盘空间:
- 什么时候交换?许多进程运行且内存吃紧时,系统负载降低时暂停
- 换出哪些进程?优先换出阻塞进程,优先级低的进程,有时还考虑进程在内存的驻留时间(避免优先级低的被调入内存后很快调出产生饥饿)
- PCB会常驻内存,不会被换出
连续分配管理方式
连续分配:为用户进程分配的必须是一个连续的内存空间
内部碎片:分配给某进程的内存区域中,有的地方没用上
外部碎片:内存中某些空闲分区由于太小而难以利用
- 单一连续分配
- 内存分为系统区和用户区
- 内存用户区同一时间中只能有一道用户程序
- 优点:实现简单,无外部碎片,可采用覆盖技术,不一定需要采取内存保护(因为只有一道程序)
- 缺点:只能用于单用户单任务的os中;有内部碎片,内存利用率低,存储器利用率极低
- 固定分区分配:整个用户控件划分为若干固定大小的分区,每个分区只装入一道作业。需要分区说明表(各个分区的大小、起始地址、分配状态)
- 分区大小相等:适合用一台计算机控制多个相同对象的场合
- 分区大小不等:灵活,可满足不同大小的进程需求,根据常在系统中运行的作业大小情况进行划分
- 优点:实现简单,无外部碎片
- 缺点:当用户程序太大,则必须使用覆盖技术(会降低性能);会产生内部碎片,内存利用率低
- 动态分区分配:不会预先划分内存分区,在进程装入内存时根据进程的大小动态地建立分区
- os使用空闲分区表或空闲分区链记录内存的使用情况
- 当多个空闲分区都满足需求时,采用动态分区分配算法进行分配
- 如何进行分区的分配和回收:
- 回收:如果发现有一些空闲分区时相邻的,那么需要将它们合并
- 分配:没有内部碎片,有外部碎片(用“紧凑”技术解决)
- 应采用动态重定位装入方式(便于进程移动位置,实现紧凑)
动态分区分配算法
- 首次适应算法First Fit:从低地址进行查找,找到第一个能满足大小的分区
- 缺点:每次都从低地址查找,导致低地址部分出现很多小的空闲分区
- 综合看性能是最好的,算法开销小,回收分区后不需对空闲分区队列重新排序
- 最佳适应算法Best Fit:优先使用更小的空闲区,尽可能多地留下大片空闲区(保证大进程到时能有连续的大片空间)
- 缺点:会产生很多很小的外部碎片,算法开销大,回收分区后可能需对空闲分区队列重新排序
- 最坏/大适应算法Worst Fit:优先使用更大的空闲区,这样剩下的空闲区就不会太小,更方便使用
- 缺点:导致大的连续空闲区迅速用完,大进程可能没有空间可用;算法开销大,回收分区后可能需对空闲分区队列重新排序
- 邻近适应算法Next Fit:每次都从上次查找结束的位置开始检索(减少了开销),其他的和首次适应算法相同
- 缺点:导致高低地址部分的空闲分区有相同概率被使用,高地址部分的大分区更可能被使用划分成小分区,最后导致无大分区可用(最大适应算法的缺点)
- 算法开销小(理由同首次适应算法)