网站的连接二维码怎么做,广东如何做网站设计,wordpress播放视频,免费主机空间回顾
进程 内核相关数据结构 代码和数据#xff0c;一个可执行程序加载到内存变成进程#xff0c;不仅仅是把代码和数据加载进去就完事了#xff0c;得“先描述#xff0c;再组织”#xff0c;每个进程都有内核数据结构#xff0c;地址空间#xff0c;进程相关页表 内核相关数据结构 代码和数据一个可执行程序加载到内存变成进程不仅仅是把代码和数据加载进去就完事了得“先描述再组织”每个进程都有内核数据结构地址空间进程相关页表CPU寄存器的上下文数据被打开的文件进程通信进程信号等等由操作系统统一管理进程要访问资源OS要对进程本身和进程要访问的资源进行管理就必须要有对应的数据结构来描述那么进程与访问资源的关系就变成了对相关的数据结构的关系。代码和数据通过页表进行映射页表分为用户级页表和内核级页表原本的mm_struct地址空间本质也是一个结构体里面包含着很多start和end但是我们使用mm_struct申请空间时由于地址空间的划分的每个区域很大所以需要对里面的区域更细致地划分vm_area_struct就是对地址空间进行更细致地划分当上层调用malloc或者其他系统调用来申请内存时会申请一个个vm_area_struct里面有start表示虚拟地址起始end表示虚拟地址结束然后把很多个结构体用双链表描述起来问题虚拟地址是如何通过页表映射到物理地址的呢 ①从文件系统地角度来说我们所说的.exe本质就是一个文件 ②可执行程序本来就是按照地址空间方式进行编译的 ③可执行程序其实在磁盘中也按照区域被划分为以4KB为单位的小文件将这4KB存储的代码和数据我们称为“页帧”而物理内存的4KB大小称为“页框”IO说白了就是把页帧装进页框里物理内存也按照4KB为单位划分的OS在进行IO的时候是以4KB为单位的但问题是OS怎么知道这么多4KB空间哪些用了哪些没用呢 所以OS肯定是要管理的而对于这100多万个4KB的管理就是我们的struct Page。我们通过一个数组struct page mem[100w]来把这一百万个page管理起来结构体里有个字段为int flag就表示该page在数组的下标
缺页中断
进程加载时通过虚拟地址和页表找到位于磁盘上特定位置的文件同时页表上也有一些二标志位字段代表当前页表对应的要访问的代码和数据是否已经加载到内存中假设是第一次加载就直接从物理内存申请一段空间然后把磁盘上的可执行程序搞到物理内存中返回虚拟地址在这步操作中操作系统一般会介入进行特殊处理称为缺页中断操作系统会把已经加载到物理内存的地址替换掉原本页表映射到磁盘上的那个指针简单来说就是如果再次运行这个程序就直接去物理内存找了不再去磁盘上找了从用户的视角来看这样做的最直接的感受就是第一次打开一个软件时慢一点但是第二次往后重复打开是速度会快很多
二级页表
映射就一定有KVK就是虚拟地址V就是物理地址KV两个都是4字节页表中一行映射关系就是KV还有其他字段一共8字节假设我们一共有2^32映射关系就是8*2^32就是32G页表也是在物理内存当中保存的光光保存页表就要这么多空间不可能虚拟地址32位就是32个0使用虚拟地址的时候并不是把这个32个虚拟地址全部使用的它把32个比特位划成三份左10个中10个右12个页表也不是只有一个结构他是多种结构集合里面有一个一级页表页目录它的任务就是只拿着虚拟地址的左10个比特位进行索引一共需要2^10也就是1024个映射关系条目每个条目是10个字节一共就是10KB就能表示这里的一级页表了K是左10个通过KV模型找到V但是V也不是直接映射到物理内存而是映射到匹配的二级页表也是KV关系的然后再次通过中10个比特位在二级页表再次进行索引然后二级页表的V指向物理内存中一个页的起始地址这样只需要用20个比特位就能通过一级二级页表找到对应的物理内存的4KB的起始地址 -- page起始地址 页内偏移右12位 找到具体位置为什么是12位呢 -- 因为2^12刚好是4KB一级页表和二级页表只需要维护虚拟地址到页的关系后面就是通过数值计算加偏移量的方式就算把32个比特位的前面20个全部干满也就是2^20大概1MB再加上一二级页表的KV一共20个也就是20*1大概20MB空间,而一般二级列表数量很少所以前面说的空间大小关系完全不用担心