对Linux0.11 "内核空间不使用写时复制机制" 本质理解

来源:互联网 发布:神通数据库日期 编辑:程序博客网 时间:2024/05/17 21:48

      一个页面被多个进程共享,每当一个进程产生一次写保护 错误,内核将给进程分配一个新的物理页面,将共享页面的内容复制过来,新的页面将设置为可读写,而共享页面仍然是只读的,只是共享计数减小了。当其他共享进程都产生了一次写保护错误后,共享页面的共享计数减成了1,其实就是被一个进程独占了,但此时该共享页面仍然是只读的,如果独占它的进程对它进行写操作仍然会产生写保护出错。为什么不在共享计数减成了 1 之后就将共享页面置为可写呢?原因很简单,因为系统并不知道最后是哪个页表项指向这个共享页,如果要把它查找出来会有很大的系统开销,这是中断处理程序应当尽量避免的,所以采用了以逸待劳的办法。如果当初共享的页面不属于主内存块,在共享时就没有作共享计数的处理,就不存在共享计数的问题,直接复制就可以了。

      以上这段话是出自Linux0.11内存管理分析的一本书上的,在这个网址下载的:http://oldlinux.org/Linux.old/study/Ref-docs/Linux011-Mem-YuanYi.pdf。基本完全讲述了linux0.11内存管理的内容。之前写过一篇博客分析linux0.11内核些事复制机制:http://blog.csdn.net/yihaolovem/article/details/34204265。现在看来还有很多错误,故重新分析一下对内核写时复制机制的理解。

       写时复制机制,即是先通过系统调用fork使多个进程共享同一个进程的目录表项和页目录项,从而共享同一物理内存(可以这么说吧,准确来说是不对的)。假设有一个物理页面M,通过fork后由进程A、B、C(都是用户进程)共享。假设M一开始属于A。若C要写M,则会产生写时复制,重新在主内存申请一页内存newC替代M(newC页面内的内容完全复制自M)供C使用,此时,M由A、B进程共享使用。此后,进程A要对M进行写操作,又会发生写时复制,重新申请一页内存newA给A使用。这时,M仅由进程B独占了。但是,此时若B进程对M进行写操作,则同样会重新申请newB供B使用。那么,开始的M呢?呵呵,被释放了。因为A B C进程读写M的顺序不一定,所以最后一次写M的进程是不确定的,可能是B(所上如上分析过程),也可能是A,还可能是C。所以正如开头一段话所述,如果要查出最后是谁独占M的,从而改变其页表项的读写位,则要对页目录项表和页表项进行顺序遍历查找,是很费效率的。所以才用了以逸待劳的方法。

       以上就是写时复制机制的全过程。

       但是,对于内核空间来说,却是不同的---内核空间不使用写时复制机制!这也是Linus在其内核代码注释中提到的,一开始很不理解。但读了开头第一段话之后便慢慢地理解了。对于内核空间来说,还是以特殊的进程0和进程1来说。进程0是系统中第一个手工创建的程序,其特殊在其地址空间属于内核空间,也就是说,进程0是内核空间的物理页面。系统通过fork函数产生了进程1,此时进程0和1共享内核物理页面(假设为KM)。但是其特殊就特殊在在fork时,内核针对内核空间是特殊对待的,在fork函数过程中调用的函数copy_page_tables中有这样一段代码:

       if (this_page > LOW_MEM) {
     *from_page_table = this_page;
     this_page -= LOW_MEM;
     this_page >>= 12;
     mem_map[this_page]++;
}

       也就是说,只有对于非内核地址空间的页面,才会将被fork共享的页面所对应的页表项设为只读,从而在最后一次写操作的时候,将源页面释放。而对于内核地址空间的地址共享,只将进程1的页目录的属性设置为只读,而源目录表项(进程0)依然是可读写的。这就导致进程1fork进程0而产生之后,只有进程1对共享的物理页面(内核地址空间)进行写操作的时候才会产生写时复制,为进程1在主内存中申请一页新的物理页面作为独属于进程1的物理页面。而进程0对其共享内存的写操作不会引起写时复制,即KM就好像独属于进程0一样。也正是因为如此,所以要保证在进程1写(拥有独属于自己的内存页面)之前保持KM页面的干净,主要是为了保证进程1的堆栈中不含进程0的多余信息,以免弄乱进程1的堆栈空间。

      总体来说,就是"内核空间不使用写时复制机制"的意思就是,对于内核空间的写操作,并不会去申请新的内存页面,即内核空间这种情况下是可读可写的。

       又写了一篇博客,感觉对这块内容完全理解了,呵呵。

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 护士证过期4年了怎么办 护士资格证延续注册过期了怎么办 护士资格证过期没注册怎么办 护士资格证注册时间过期怎么办 辅警体检视力不行怎么办 护士延续注册体检怀孕怎么办 护士资格证没有延续注册怎么办 申请信用卡没有座机号码怎么办 网上申请信用卡没有座机号码怎么办 我叫上门服务被骗了怎么办 上门服务被骗了3000多怎么办 微信被骗9000元怎么办 奥迪a8气囊灯亮怎么办 驾考站岗迟到了怎么办 老板欠员工工资不给怎么办 如果有一天我没头发了怎么办 苏州公积金密码忘了怎么办 科二考试第二把怎么办 科一老是记不住怎么办 科目二考试没去怎么办 网约车驾龄不到怎么办 科四预约不上怎么办 教练不退钱怎么办找谁 驾考出入证丢了怎么办 科二成绩单丢了怎么办 考驾照的准考证丢了怎么办 驾考预约去不了怎么办 科目一预约没去怎么办 打狂犬疫苗期间感冒了怎么办 公司社保欠费不交怎么办 25号社保不交怎么办欠费 会计从业停考了怎么办 黑龙江龙育黄了档案怎么办 科目四档案丢了怎么办 从上海调档案到杭州怎么办 户口迁移身份证变更护照怎么办 有中国签证的孩子怎么办户口 大学生户口在学校怎么办签证 户口在南方人才市场怎么办签证 报警电话接到说方言的怎么办 学生去新加坡旅游签证怎么办