博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
fork,写时复制(copy-on-write),vfork
阅读量:5111 次
发布时间:2019-06-13

本文共 2506 字,大约阅读时间需要 8 分钟。

fork,写时复制(copy-on-write),vfork

进程创建

进程创建分为三种情况

1.共享
父进程与子进程共享数据段、堆栈段、代码段,也就是说子进程对数据进行的改变会直接影响父进程。
2.写时复制(Copy-On-Write)
我简单地将这种技术理解为,当子进程执行写操作时,内核会将被修改的部分单独copy,单独操作。
3.直接拷贝
直接复制父进程的数据段、堆栈段,共享代码段。

一、fork

fork()调用时,子进程会复制父进程数据段、堆栈段,并且使用新的物理地址以及虚拟地址存储。但父子进程共享代码段。但现在的实现采用了写时复制技术

二、vfork

vfork()调用时,父子进程共享所有资源。但在调度上,使用vfork将保证子进程先于父进程被调度。

下面给出参考书的代码用以说明两者区别:

  • fork
/**********************************************************************		> File Name: t_fork.c		> Author: 0nism		> Email: fd98shadow@sina.com		> Created Time: Sun 14 Oct 2018 02:41:39 PM CST	***********************************************************************/	#include 
#include
#include
static int idata = 111; // Allocated in data segment int main(int argc, char **argv) { int istack = 222; // Allocated in stack segment pid_t childPid; switch (childPid = fork()) { case -1: printf("err: fork\n"); return 0; case 0: idata *= 3; istack *= 3; break; default: sleep(3); break; } printf("PID=%ld %s idata=%d istack=%d\n", (long)getpid(), (childPid == 0) ? "child " : "parent ", idata, istack); exit(EXIT_SUCCESS); }

运行结果为

MISlike@10:56:~/process $ ./t_fork 	PID=5566 child  idata=333 istack=666	PID=5565 parent  idata=111 istack=222

无论是数据段还是堆栈段均完成了复制。

  • vfork
/**********************************************************************		> File Name: t_vfork.c		> Author: 0nism		> Email: fd98shadow@sina.com		> Created Time: Sun 14 Oct 2018 11:21:22 PM CST	***********************************************************************/	#include 
#include
#include
int main(int argc, char **argv) { int istack = 222; switch (vfork()) { case -1: printf("err: vfork\n"); return 0; case 0: // 子进程优先执行,在父进程的虚拟地址空间中 sleep(3); // 即使休眠一段时间,父进程仍然不会先执行 write(STDOUT_FILENO, "Child excuting\n", 16); istack *= 3; // 这个变化将会被父进程知晓 _exit(EXIT_SUCCESS); default: // 父进程被锁住直到子进程消亡 write(STDOUT_FILENO, "Parent excuting\n", 16); printf("istack = %d\n", istack); _exit(EXIT_SUCCESS); } }

运行结果如下

Child excutingParent excutingistack = 666

可见子进程操作影响到了父进程,且此时父进程被阻塞,知道子进程消亡或者执行excu()。

posted on
2018-10-15 11:04 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/0nism/p/9789862.html

你可能感兴趣的文章
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
UseIIS
查看>>
集合体系
查看>>
vi命令提示:Terminal too wide
查看>>
引用 移植Linux到s3c2410上
查看>>
人与人之间的差距是从大学开始的
查看>>
MySQL5.7开多实例指导
查看>>
hdu 1029 Ignatius ans the Princess IV
查看>>
JAVA学习札记
查看>>
[UOJ] #78. 二分图最大匹配
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
poj1201 查分约束系统
查看>>
简明Linux命令行笔记:chmod
查看>>
简明Linux命令行笔记:tar
查看>>
Red and Black(poj-1979)
查看>>
分布式锁的思路以及实现分析
查看>>
vue v-for下图片src显示失败,404错误
查看>>
腾讯元对象存储之文件删除
查看>>
jdk环境变量配置
查看>>
Hbase basic
查看>>