彩色科技|linux内核写时复制机制源代码解读( 五 )
下面给出实验代码案例:
程序中有一全局变量num=10 打印num的值, 然后fork子进程 , 在子进程中修改全局变量num=100 然后打印num的值,父进程中睡眠1s故意等待子进程先执行完 ,然后再次打印num的值
1 #include2 #include 大家可以思考一下:第13 , 22, 27分别得出的num是多少?
我们编译执行:
hanch@hanch-VirtualBox:~/test/COW$ gcc fork-cow-test.c -o fork-cow-testhanch@hanch-VirtualBox:~/test/COW$ ./fork-cow-test ###main:13pid=26844 num=10###### This is child process pid=26845num=100###### This is parent processpid=26844num=10###可以发现父进程中的全局变量num =10, 当fork子进程后对这个全局变量进行了修改使得num =100,实际上fork的时候已经将父子进程的num这个全局变量所在的页修改为了只读 , 然后共享这个页 , 当子进程写这个全局变量的时候发生了COW缺页异常 , 然而这对于应用程序来说是透明的 , 内核却在缺页异常处理中做了很多工作:主要是为子进程分配物理页 , 将父进程的num所在的页内容拷贝到子进程 , 然后将子进程的va所对应的的页表条目修改为可写和分配的物理页建立了映射关系 , 然后缺页异常就返回了(从内核空间返回到了用户空间) , 这个时候处理器会重新执行赋值操作指令 , 这个时候属于子进程的num才被改写为100 , 但是要明白这个时候父进程的num变量所在的页的读写属性还是只读 , 父进程再去写的时候依然会发生COW缺页异常 。
【彩色科技|linux内核写时复制机制源代码解读】最后我们用图说话来理解COW的整个过程:
推荐阅读
- 所持股份|万兴科技:公司控股股东、实际控制人吴太兵质押150万股
- 发布公告|数量过半!博创科技:天通股份累计减持约150万股
- 英雄科技聊数码|蔡崇信有实力买下篮网,那身价3200亿的马云,能买下几支NBA球队
- 科技前沿阵地|涨疯了!海思安防芯片遭哄抬“围剿”
- 月影浓|吴亦凡机械造型走秀 垫肩披风搭银框眼镜科技感足
- 中国历史发展过程|中国历史发展过程.中国的科技史界过去半个多世纪
- 天津|桂发祥:不再持有昆汀科技股份
- 消费|减持!天通股份:减持博创科技约32万股
- 处罚|老周侃股:吉鑫科技大股东应补偿踩雷投资者
- 华中科技大学|杯具!超本科线95分,本科有路不走,却梦幻般碰瓷,撞开专科的门
