上一篇有关地址空间的博客
(入门自用)--Linux--程序地址空间--程序的创建--0907-0913_Gosolo!的博客-CSDN博客
很久之前写的,最近会完善。
1. 进程地址空间在线程方面的补充
线程由于资源都是从主进程直接拿来的,所以他们的pcb结构体中的地址空间结构体(mm_struct)是相同的。
线程在程序内部执行,是操作系统调度的基本单位。
1.1 在堆上申请空间是连续的吗
我们在堆上申请空间,malloc、new我们只表明了空间的大小,没有表示申请空间的起始位置和结束位置。
struct vm_area_struct
{
unsigned long vm_start;
unsigned long vm_end;
struct vm_area_struct *vm_next,*vm_prev;
}
在pcb内部有这样一个结构体的指针,可以帮助OS做到进程资源的细粒度划分。
1.2 页帧和页框
由于操作系统和磁盘进行IO的基本单位是4KB,为了方便OS运作,起始磁盘和物理内存已经将自己的内存划分好了区域,供操作系统读取。
.exe就是一个文件。我们的可执行程序本来就是按照地址空间方式进行编译的。
可执行程序,其实已经按照区域被划分为了以4KB为单位。每一个4KB称为页帧。
物理内存的4KB用于接受页帧,称为页框。所以每一次的IO操作其实就是页帧放入页框的过程。
1.3 page结构体
物理内存假如是4GB,分成4KB的小区域,那就需要100w+个小区域,操作系统如何管理?
假如程序终止,那他占用的物理内存就要被删除,删除需要全部置零吗?
我们需要一个结构体,里面有很多标记位来表示该物理内存是否有效、是否过期等很多功能。
struct page
{
int flag;
}
具体结构体可见大佬博文
Linux内存描述之内存页面page--Linux内存管理(四)_CHENG Jian的博客-CSDN博客
所以在操作系统层面,就需要一个struct page mem[1000000+]来管理每一个page
1.4 页表的操作模式
在32位系统中,有2^32次个地址,如果页表采用Key,Value的模式会导致页表占用的内存过高。
所以将32位的地址划分为10位,10位和12位。