1、进程A和进程B共享页面,代码如下:
if (!(pid=fork())) {
压栈操作;//子进程B
}
if (pid>0){
压栈操作;//父进程A
}
2、我们假设现在系统有一个用户进程A,他自己对应的程序代码已经载入内存中,此时该进程内存中所占用的页面引用计数都为”1“,接下来他开始执行,通过调用fork函数创建一个新进程(进程B)。在新进程创建的过程中,系统将进程A的页表项全部复制给进程B,并设置进程B的页目录项。此时这两个进程就共享页面,被共享页面的引用计数累加为2,并将此共享页面全部设置为”只读“属性,即无论是进程A还是进程B,都只能对这些共享的页面进程读操作,而不能进行写操作。执行代码如下:
int copy_page_tables(unsigned long from,unsigned long to,long size)
{
......
for( ; size-->0 ; from_dir++,to_dir++) {
......
for ( ; nr-- > 0 ; from_page_table++,to_page_table++) {
this_page = *from_page_table;
if (!(1 & this_page))
continue;
this_page &= ~2;//进程A对页面的操作属性被设置为只读
*to_page_table = this_page;//进程B对页面的操作属性被设置为只读
if (thi

当进程A和进程B共享内存页面时,系统在创建进程B时将页面设置为只读。当尝试写入(如压栈)时,会触发"页写保护"异常。异常处理函数up_wp_page()会分配新页面备份原页面数据,原页面引用计数减1。之后,进程A和B可以分别在各自的新旧页面上进行读写操作,互不干扰。当不再需要共享页面时,引用计数减到0,页面变为可回收的空闲页面。
最低0.47元/天 解锁文章
8621

被折叠的 条评论
为什么被折叠?



