在学习liinux的过程中,多处渗透着操作系统的知识,我们先来谈一谈进程及页表
进程,主要包含三个元素:
o. 一个可以执行的程序;
o. 和该进程相关联的全部数据(包括变量,内存空间,缓冲区等等);
o. 程序的执行上下文(execution context)。
o. 一个可以执行的程序;
o. 和该进程相关联的全部数据(包括变量,内存空间,缓冲区等等);
o. 程序的执行上下文(execution context)。
一个进程表示的,就是一个可执行程序的一次执行过程中的一个状态
。
操作系统对进程的管理,典型的情况,是通过进程表完成的。进程表中的每一个表项,记录的是当前操作系统中一个进程的情况。对于单CPU的情况而言,每一特定时刻只有一个进程占用CPU,但是系统中可能同时存在多个活动的(等待执行或继续执行的)进程。
一个称为" 程序计数器(program counter,pc)"的寄存器,指出当前占用CPU的进程要执行的下一条指令的位置。
当分给某个进程的CPU时间已经用完,操作系统将该进程相关的寄存器的值,保存到该进程在进程表中对应的表项里面;把将要接替这个进程占用CPU的那个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为"上下文交换(process context switch)",程序寄存器pc指出程序当前已经执行到哪里,是进程上下文的重要内容,换出CPU的进程要保存这个寄存器的值,换入CPU的进程,也要根据进程表中保存的本进程执行上下文信息,更新这个寄存器)。
一个称为" 程序计数器(program counter,pc)"的寄存器,指出当前占用CPU的进程要执行的下一条指令的位置。
当分给某个进程的CPU时间已经用完,操作系统将该进程相关的寄存器的值,保存到该进程在进程表中对应的表项里面;把将要接替这个进程占用CPU的那个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为"上下文交换(process context switch)",程序寄存器pc指出程序当前已经执行到哪里,是进程上下文的重要内容,换出CPU的进程要保存这个寄存器的值,换入CPU的进程,也要根据进程表中保存的本进程执行上下文信息,更新这个寄存器)。
下面说一说进程页表的知识:
页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。 每一个进程都拥有一个自己的页表,PCB表中有指针指向页表。
通过画图来帮助理解:
基本分页存储管理方式:
用固定大小的
页(Page)来描述逻辑地址空间,用相同大小的
页框(Frame)来描述物理内存空间,由操作系统实现从逻辑页到物理页框的
页面映射,同时负责对所有页的管理和进程运行的控制。
页表实现从页号到物理块号的地址映射:
逻辑地址转换成物理地址的过程是:用页号p去检索页表,从页表中得到该页的物理块号,把它装入物理
地址寄存器
中。同时,将页内地址d直接送入物理
地址寄存器
的块内地址字段中。这样,物理
地址寄存器
中的内容就是由二者拼接成的实际访问内存的地址,从而完成了从逻辑地址到物理地址的转换。
注:
逻辑地址空间:由程序所生成的所有逻辑地址的集合。
物理地址空间:与逻辑地址相对应的内存中所有物理地址的集合,用户程序看不见真正的物理地址。
也就是说我们之前学习的时候都被欺骗啦?我们在学习c时取地址&一直获取的是其逻辑地址,并非真正的物理地址。
在古老的操作系统里面,所有进程都是共用同一物理内存空间的,这种方法会有一些问题,比如两个进程之前相互踩内存,一个进程污染(踩内存)后,无法隔离,必须整个系统复位,才能恢复干净的环境。在这种操作系统下,进程之间无法隔离。
为了解决进程之间内存隔离,提供了虚拟内存这个概念。
进程看到的是虚拟内存,这根本看不到物理内存,物理内存是OS给它分配的,它不需要感知物理内存。对于同一程序运行起来的两个进程,它们的虚拟空间布局可能完全一样,但他们真实使用的物理内存空间则不相同,通过这种方式来实现进程之间的隔离。