本文描述进程控制块的地址管理以及linux分页存储机制。还包括linux的数据存储方式。
想到哪里就写到哪里。
进程缓冲区是为进程分配的一块缓冲区,内核缓冲区是内核自带的缓冲区,当进程需要调用数据时,先查找数据是否存在于内核缓冲区中,如果存在则把数据从内核缓冲区复制到进程缓冲区,如果不存在,则把数据从磁盘拷贝到内核缓冲区,此时可以切换到其他进程等到内核缓冲区已经拷贝好数据时再切换回来。
缓冲区的出现是为了减少频繁的系统调用,并且可以在磁盘IO的同时切换到其他进程去做其他的事。高速缓存很好的利用了局部性原理,能够加快IO速度。
写时复制是与fork相关的。而内存映射和sendfile均是为了减少数据拷贝,降低CPU的使用而存在的。
虚拟内存使程序地址空间有了统一性,且互不干扰,并且能够更大效率地利用主存。
虚拟内存是存在于磁盘上的,页表存在于物理内存中,页表是对虚拟内存和物理内存的一个映射。提供一个标志位,标志位为1时,地址字段指向物理内存,标志位0时地址字段指向虚拟内存即磁盘。
MMU是提供地址转化功能,配合TLB缓存能够提高效率。
2、 Cache(缓存)则是系统两端处理 速度不匹配时的一种 折衷策略。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。
3、假定以后存储器访问变得跟CPU做计算一样快,cache就可以消失,但是buffer依然存在。比如从网络上下载东西,瞬时速率可能会有较大变化,但从长期来看却是稳定的,这样就能通过引入一个buffer使得OS接收数据的速率更稳定,进一步减少对磁盘的伤害。
4、TLB(Translation Lookaside Buffer,翻译后备缓冲器)名字起错了,其实它是一个cache.TLB是一个用于改进虚拟地址到物理地址的一个缓存。
库函数IO是一种缓冲IO,它封装了系统调用,在用户空间提供了一个缓冲区,而内核缓冲区就是页缓存,在系统调用中也是存在的。使用数据时,从磁盘拷贝到内核缓冲区,再从内核缓冲区拷贝到用户空间,使用内存映射的方式可以减少一次拷贝,在linux中,vm_area_struct就是采用内存映射方式的。直接IO是跳过内核缓冲到用户空间,比较慢速,一般搭配异步IO使用,基本上只用在数据库结构中。
带缓冲的I/O在往磁盘写入相同的数据量时,会比不带缓冲的I/O调用系统调用的次数要少。当缓冲区满时才向内核缓冲区复制数据,会减少系统调用次数。
内核为每个进程提供一个进程控制块PCB。进程内核栈是操作系统为管理每一个进程而分配的一个4k或者8k内存大小的一片内存区域,里面存放了一个进程的所有信息,它能够完整的描述一个正在执行的程序:它打开的文件,进程的地址空间,挂起的信号,进程的状态,从task_struct中可以看到对一个正在执行的程序的完整描述。
虚拟地址空间分为内核虚拟存储器和进程虚拟存储器,内核虚拟存储器中对每个进程都不一样的东西包括与进程相关的数据结构。
程序启动时,操作系统会新建一个进程来执行该程序,主要分为三个步骤:
(1)操作系统分配一个独立的进程地址空间,主要是在内存的内核区域中新建一个描述进程的结构体(linux中为task_struct),结构体中包含了进程的相关信息,比如进程运行状态,进程的寄存器,进程打开的资源,以及进程的内存管理结构(在linux中为mm_struct,进程的内存管理结构就描述了进程的虚拟地址空间的布局). 同时,为该进程创建一个页目录表。
(2)读取可执行文件头,建立可执行文件中各个段和进程虚拟地址空间中各个段之间的映射关系。当程序运行时需要将可执行文件中的内容载入内存来执行,比如在进程访问某全局变量时,该全局变量还没有被载入内存,此时需要知道该全局变量对应在可执行文件的什么位置。于是我们就需要知道进程中虚拟地址到可执行文件中位置的对应。
(3)将PC指针指向进程的代码入口处,开始执行
执行的时候会不断的发生缺页中断,发生缺页中断时会将实际的可执行文件中的内容载入到物理内存中,然后建立虚拟内存页和物理内存页的映射关系。
接下来描述linux数据存储方式:inode表和数据存储区,这是针对在磁盘上存储的数据,通过inode表我们能够在磁盘上找到具体的数据,和页表没有直接的关系。
页式 段式 固定分区 可变分区:
页式管理的优缺点:
1、由于它不要求作业或进程的程序段和数据在内存中连续存放,从而有效地解决了碎片问题。
2、动态页式管理提供了内存和外存统一管理的虚存实现方式,使用户可以利用的存储空间大大增加。这既提高了主存的利用纽,又有利于组织多道程序执行。
1、要求有相应的硬件支持。例如地址变换机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。
2、增加了系统开销,例如缺页中断处理机,
3、请求调页的算法如选择不当,有可能产生抖动现象。
4、虽然消除了碎片,但每个作业或进程的最后一页内总有一部分空间得不到利用果页面较大,则这一部分的损失仍然较大。
动态分区会导致外部碎片
段式存储管理要求每个作业的地址空间按照程序自身的逻辑划分为若干段,每个段都有一个唯一的内部段号。