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