参考资料:
参考视频1https://www.bilibili.com/video/BV1Hs421M78w/?spm_id_from=333.999.0.0&vd_source=97411b9a8288d7869f5363f72b0d7613
参考视频2https://www.bilibili.com/video/BV1jE411W7e8/?spm_id_from=333.337.search-card.all.click&vd_source=97411b9a8288d7869f5363f72b0d7613
相关阐述:
- 进程和线程
- 进程
- 执行磁盘上由代码编写的程序,并将程序从磁盘加载到内存中,变成一个可执行的程序,我们称之为进程
- 每一个进程都拥有一块独立的虚拟内存(下面会讲),认为自己独占了整个物理内存(即内存条)
- 线程
- 当进程的作用机制比较复杂,一个主线程不能满足同时处理多个事件,就需要开启多个线程来进行处理;
- 进程中的多个线程,共享着进程的虚拟内存
- 进程是可执行程序的一个独立工作单位,拥有者独立的内存和工作逻辑
- 计算机的内存分层
- 分层存储器体系
计算机的存储器大致分为三类:
- 永久存储:磁盘
- 临时存储:内存条
- 临时存储:高速缓存(通常位于CPU,寄存器等元件中)
它们速度越来越快,价格缺越来越高
- 虚拟内存
通常情况下,计算机系统运行的进程所需要的内存空间是远大于计算机实际的内存条的大小的,为了应对这种情况
- 原始的方式
- 最原始的办法是利用基址寄存器和界限寄存器,为进程分配一段连续的物理内存,即一部分内存条;
其中,基址寄存器存储的是进程在物理内存上开始的地址,界限寄存器存储的是进程基于开始地址的偏移量
- 但是这样显然物理内存不够每个进程分,我们就需要在磁盘中开辟一部分空间来临时存储未分配到物理内存的进程,当物理内存中有进程关闭,就将磁盘中的进程拷贝至物理内存中,或者当物理内存中有进程处于休息状态,就将休息的进程拷贝至磁盘中,将磁盘中的待执行的进程拷贝至物理内存中执行。这项技术叫内存交换技术(swapping)
- 在频繁的物理内存和磁盘的进程交换过程中,物理内存会产生很多间隙,称之为空洞(hole),整理物理内存空洞,将进程的物理内存地址尽可能向下移动,使他们紧密的排列在一起的技术,叫内存紧缩(Memory Compaction);内存紧缩效率很低,需要很多时间。
- 新的内存管理方式-虚拟内存
使用基址寄存器和界限寄存器管理内存的方式因为其效率低下,已经不再使用,取而代之的是虚拟内存
- 虚拟内存其实就是将进程所需要的物理内存,以及磁盘文件进行切分,通常4kb为一个单位,只加载CPU使用的部分到物理内存中,其余不使用的部分仍然留在磁盘文件中,使得内存的有效使用率达到最大;其中内存中叫页框,磁盘中叫页,都是4KB
- 当然CPU并不是直接通过物理地址访问物理内存的,它是通过内存管理单元(MMU),将逻辑上的虚拟内存地址转换为物理内存地址(具体原因下面说)
- 当进程启动时,进程会在逻辑上分配整个物理内存甚至比物理内存更大的内存,但是只加载CPU需要的页到物理内存中,以应对进程更为复杂的运行;
- 并且会内存中的页表生成虚拟内存到物理内存的映射关系;
- 当进程需要对虚拟内存中的页进行读写时,MMU就会通过页表到物理内存中寻找,如果物理内存没有加载,就到磁盘中进行加载
- 当物理内存中的页框,不被CPU使用时,就会被释放,写入到磁盘中
- 当然操作系统有缓存机制,物理内存会保存近期使用的页表项,来提高效率