黄岛开发区网站制作,wordpress页面模板怎么做,商城网站如何提高收录,lamp和lnmp wordpressLinux#xff0c;像多数现代内核一样#xff0c;采用了虚拟内存管理技术。该技术利用了大多数程序的一个典型特征#xff0c;即访问局部性#xff08;locality of reference#xff09;#xff0c;以求高效使用CPU和RAM#xff08;物理内存#xff09;资源。大多数程序…Linux像多数现代内核一样采用了虚拟内存管理技术。该技术利用了大多数程序的一个典型特征即访问局部性locality of reference以求高效使用CPU和RAM物理内存资源。大多数程序都展现了两种类型的局部性。
空间局部性Spatial locality是指程序倾向于访问在最近访问过的内存地址附近的内存由于指令是顺序执行的且有时会按顺序处理数据结构。时间局部性Temporal locality是指程序倾向于在不久的将来再次访问最近刚访问过的内存地址由于循环。
正是由于访问局部性特征使得程序即便仅有部分地址空间存在于RAM中依然可能得以执行。
虚拟内存的规划之一是将每个程序使用的内存切割成小型的、固定大小的“页”page单元。相应地将RAM划分成一系列与虚存页尺寸相同的页帧。任一时刻每个程序仅有部分页需要驻留在物理内存页帧中。这些页构成了所谓驻留集resident set。程序未使用的页拷贝保存在交换区swap area内—这是磁盘空间中的保留区域作为计算机RAM的补充—仅在需要时才会载入物理内存。若进程欲访问的页面目前并未驻留在物理内存中将会发生页面错误page fault内核即刻挂起进程的执行同时从磁盘中将该页面载入内存。
为支持这一组织方式内核需要为每个进程维护一张页表page table。该页表描述了每页在进程虚拟地址空间virtual address space中的位置可为进程所用的所有虚拟内存页面的集合。页表中的每个条目要么指出一个虚拟页面在RAM中的所在位置要么表明其当前驻留在磁盘上。 虚拟内存概览
在进程虚拟地址空间中并非所有的地址范围都需要页表条目。通常情况下由于可能存在大段的虚拟地址空间并未投入使用故而也无必要为其维护相应的页表条目。若进程试图访问的地址并无页表条目与之对应那么进程将收到一个SIGSEGV信号。
由于内核能够为进程分配和释放页和页表条目所以进程的有效虚拟地址范围在其生命周期中可以发生变化。这可能会发生于如下场景。
由于栈向下增长超出之前曾达到的位置。当在堆中分配或释放内存时通过调用brk()、sbrk()或malloc函数族来提升program break的位置。当调用shmat()连接System V共享内存区时或者当调用shmdt()脱离共享内存区时。当调用mmap()创建内存映射时或者当调用munmap()解除内存映射时。 虚拟内存的实现需要硬件中分页内存管理单元PMMU的支持。PMMU把要访问的每个虚拟内存地址转换成相应的物理内存地址当特定虚拟内存地址所对应的页没有驻留于RAM中时将以页面错误通知内核。 虚拟内存管理使进程的虚拟地址空间与RAM物理地址空间隔离开来这带来许多优点。 进程与进程、进程与内核相互隔离所以一个进程不能读取或修改另一进程或内核的内存。这是因为每个进程的页表条目指向RAM或交换区中截然不同的物理页面集合。 适当情况下两个或者更多进程能够共享内存。这是由于内核可以使不同进程的页表条目指向相同的RAM页。内存共享常发生于如下两种场景。 – 执行同一程序的多个进程可共享一份只读的程序代码副本。当多个程序执行相同的程序文件或加载相同的共享库时会隐式地实现这一类型的共享 – 进程可以使用shmget()和mmap()系统调用显式地请求与其他进程共享内存区。这么做是出于进程间通信的目的。 便于实现内存保护机制也就是说可以对页表条目进行标记以表示相关页面内容是可读、可写、可执行亦或是这些保护措施的组合。多个进程共享RAM页面时允许每个进程对内存采取不同的保护措施。例如一个进程可能以只读方式访问某页面而另一进程则以读写方式访问同一页面。 程序员和编译器、链接器之类的工具无需关注程序在RAM中的物理布局。 因为需要驻留在内存中的仅是程序的一部分所以程序的加载和运行都很快。而且一个进程所占用的内存即虚拟内存大小能够超出RAM容量。
和运行都很快。而且一个进程所占用的内存即虚拟内存大小能够超出RAM容量。
虚拟内存管理的最后一个优点是由于每个进程使用的RAM减少了RAM中同时可以容纳的进程数量就增多了。这增大了如下事件的概率在任一时刻CPU都可执行至少一个进程因而往往也会提高CPU的利用率。