目录
1.内存管理
2.写时拷贝技术
1.内存管理
简单分页
逻辑页
物理页
页表
将虚拟内存空间和物理内存空间划分为大小相同的页面(4k、8k、16k等)
虚拟内存:在磁盘上划分一块空间
![](https://img-blog.csdnimg.cn/111e712633104ceaba93e292142f3b1f.png)
为什么要有逻辑页面和物理页面:
物理页面很长,不能确定那一段空闲(查页表)
2.写时拷贝技术
对fork复制进程做了一个优化——写时拷贝技术
![](https://img-blog.csdnimg.cn/7bfac9ac4f034017b39fc76e0d1406fb.png)
2.3号页面没有被修改,父子进程共享一个页面,待到子进程被修改,分配内存,拷贝,进行页表修改。
写时拷贝是一种可以推迟甚至免除拷贝数据的技术。
子进程没有修改,则父子进程共享一个页面,不复制。
子进程修改后,数据才会被复制。
![](https://img-blog.csdnimg.cn/9aee85b182c940a79125df780a981d5f.png)
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
int i=0;
for(;i<2;i++)
{
fork();
printf("A\n");
}
exit(0);
}
![](https://img-blog.csdnimg.cn/854ce482d31643de804d55989d6bd9b2.png)
四个进程六个A
![](https://img-blog.csdnimg.cn/c9b451c267ed4c048813e2ddcb56305a.png)
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
int i=0;
for(;i<2;i++)
{
fork();
printf("A");
}
exit(0);
}
![](https://img-blog.csdnimg.cn/5b50d27db3864db0afbae6a171598da6.png)
8个A
去掉\n,有缓冲区,将缓冲区中的A也复制了。
![](https://img-blog.csdnimg.cn/b560e1ef98654d12ac04cc4105c8c345.png)
打印两个A
总结:
有\n不带缓冲区:i<n,SUM(A)=2^1+...+2^n
无\n带缓冲区:
![](https://img-blog.csdnimg.cn/ececa89256ec4ad1b9d15f6ebfa430bb.png)
![](https://img-blog.csdnimg.cn/7c797fa8c92e46e6a63617453172bd03.png)
打印结果:3个A
![](https://img-blog.csdnimg.cn/5dcc1fc484a249b1a638d8a44a2fa457.png)
前一个fork(执行打印A,复制出3,4个fork)的返回值为子进程PID>0,则不执行第二个fork
第三个fork=0(执行过了),执行第四个fork,打印A,出现5,6个fork
第五个fork=0(执行过了,复制第三个,同3),执行第六个fork,打印A(第四个执行过了,不再执行复制)
![](https://img-blog.csdnimg.cn/9b90ac062a5d4b7bb34493cd9f5a31ee.png)
3个A