一、概述:
在操作系统理论中,进程是资源分配的基本单元,每个进程的资源都是独立的,除非刻意的去共享。在多进程中每个进程的内存是如何保持独立的,互相之间不可以进行访问这是内存管理需要讨论的一个话题,另一个我们内存的资源是有限的,然而程序运行时的大小确实不可以估计的,可能远远大于内存的容量,那么如何运行比内存空间大的程序呢?第三关于空闲的内存如何管理,进程需要时如何分配,释放时如何安排这些释放的进程
总的来说就是讨论三个问题:
- 进程之间的内存如何独立
- 如何运行大于内存容量的进程
- 内存空间的分配与释放
二、无存储器抽象(了解):
每个进程直接访问物理地址,每个时间片只能运行一个进程,当切换到下一个进程时将数据保存到磁盘文件中,然后把下一个程序读入内存中在运行即可,这样就不会发生冲突,还有种方式就是将内存划分成等分大小的块,每个块对应一个保护建,当访问到的块的保护键和psw字不同硬件会发现到这一个事件,但是这样也避免不了进程之间的内存存在互相越界,就是因为使用物理地址。
使用物理地址带来的严重问题:
- 直接使用物理地址会破坏操作系统
- 运行多进程困难
三、地址空间【重要】:
解决进程之间的内存如何独立
3.1:要保证多个进程处于内存中不受影响的需要解决两个问题:
- 保护(访问到不该访问的发生错误)
- 重定位(访问0实际上会通过偏移量会访问到实际的100)
3.2:地址空间的概念:
地址空间就是对内存的抽象,可以理解为网络中的频分复用,每个进程有一段独立的地址空间,其他进程无法进入,自身来说也不能访问其他进程的空间(除非有意的去共享)
3.3:基址寄存器和界限寄存器:
用于解决上面说的两个问题
基址寄存器和界限寄存器是两个特殊的CPU寄存器
- 基址寄存器:存放程序运行的起始地址
- 界限寄存器:程序的长度
每个程序都会有不同基址,访问一个地址时使用基址加上地址(比如一个进程的基址是100 之后需要访问30 那么真实的地址时130)会这样进行一个重定向,同时不能超过界限
虽然这样可以解决重定位的问题,但是这样每次访问内存都需要进行加法和比较运算,这样效率就会很低
四、交换技术:
解决如何运行大于内存容量的进程
4.1:两种方案
即使是现在也还没有足够的内存,去让用户随意的开启任意多/大的进程,因此出现了两种内存超载技术
- 交换技术:将空闲的进程中的内存数据一次性换出到磁盘中
- 虚拟内存技术:将空闲的进程中的内存数据一部分换出到磁盘中
首先先理解交换技术
4.2:内存紧缩技术
因为进程的大小不同因此在多次换出还换入的操作中,容易形成很多的小的空隙,因此需要有程序需要将空隙不断往下挪动,这个技术叫做内存紧缩技术
按时这个操作非常浪费时间,一般不做
4.3:交换技术问题分析
当一个进程不断扩大进程使用时,如果相邻的空间是空闲的就直接拿