- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux进程创建分析
进程
创建分析
传统的unix操作系统以统一的方式来创建所有的进程:子进程复制父进程的所有资源。因为子进程不必读和修改父进程的所有资源,所以这种方法使进程的创建效率低速度非常慢。
现代Unix操作系统通过引入了写时复制技术,轻量级进程,和vofork来解决了这个问题。
1写时复制技术:写时复制技术允许父子进程读相同的物理页。只要两者中有一个试图写一个物理页内核就把这个页的内容复制到新的物理页,并把新的物理页分配给正在写的进程。
2轻量级进程允许父子进程共享进程在内核的数据结构,包括页表,打开的文件列表,信号处理等。
3vfork()创建的新进程能够共享父进程的内存地址空间。父进程在这个过程中被阻塞,直到子进程退出或者执行一个新的程序。
Linux提供了几个系统调用Fork,vfork和clone系统调用创建新进程,其中,clone创建轻量级进程,必须指定要共享的资源,exec系统调用执行一个新程序,exit系统调用终止进程(进程也可以因收到信号而终止)。
创建进程的函数层次结构
通过以上的层次结构可以看出,fork(),vfork() clone()最终都调用了函数最终都是调用do_fork进行创建进程的。可以看到 do_fork 是进程创建的基础。在 ./linux/kernel/fork.c 内找到 do_fork 函数(以及合作函数 copy_process),并进行如下分析:
*/
以上代码的作用是:判断当前进程是否处于被跟踪状态。如果当前进程处于被跟踪调试状态,调用“fork_traceflag()”函数(该函数根据clone_flags和一些其他量来设置trace,如果 clone_flags 没有使用标记 CLONE_UNPTRACED 强调子进程可被跟踪,那么在标记 clone_flags 中添加标记 CLONE_PTRACE ,使创建的进程也处于被跟踪调试状态!
调用copy_process()(这个函数很重要,我将在分析完do_fork()后对其进行详细分析)创建task_struct并对其进行初始化,如果所有必须的资源是可用的,返回task_struct的地址,新创建的task_struct是父进程的一份拷贝。
的值是4905,上面给出了函数间的调用关系,通过这一系列的调用来判断返回的task_struct地址是否大于4905来判断地址是否合法。若不合法,说明描述错误,调用如下函数来返回一个长整形值。
如果合法说明描述符创建没有问题,按如下步骤继续执行:
该语句的作用是把子进程的pid写入由ptid参数所指向的父进程的用户态变量。继续执行下面的代码:
以上代码的含义:如果执行的是vfork(),那么就设置p(task_struct的指针)的vfork_done指向刚刚分配的vfork结构(的含义是把子进程插入等待队列,并挂起父进程,直到子进程执行结束或执行新的程序才唤醒父进程)。初始化刚刚分配的vfork结构的各个成员。执行下面的代码:
上面代码的含义是:如果要调试进程p(子程序被追踪),或者要求将进程p的起始状态设置为暂停状态,在新建进程处理链表中添加信号SIGSTOP,并设置进程的有信号处理标记 TIF_SIGPENDING,这样在进程 获得处理器时会立即处理信号 SIGSTOP,此时进程会立即放弃处理器进入睡眠状态。继续执行下面的代码:
以上代码的含义是:
???若含有CLONE_STOPPED 标记则将新创建进程状态设置为 TASK_STOPPED ,表示进程现在是暂停状态,新创建的进程不会运行,除非有进程通过信号唤醒它。若没有则把当前进程添加到当前处理器队列中等待下一次调度!继续分析后面的代码:
上面的代码分析如下:如果执行vfork(),把父进程插入等待队列挂起父进程,在子进程退出或通过系统调用 exec() 执行其他程序时,激活该等待队列中的进程!
()分析
以上代码的含义是:验证 CLONE 标志以确保这些标志是一致的 。首先检查是否同时设置了CLONE_FS 和CLONE_NEWNS,这两个标志不能同时设置的原因是:CLONE_FS的含义是共享根目录和当前目录所在的表,CLONE_NEWNS的含义是 子进程需要自己的命名空间,因此如果两个同时设置时非常矛盾的。
在第一步正确的情况下检查CLONE_THREAD和CLONE_SIGHAND的设置是否矛盾,如果矛盾则返回一个错误信号。原因是:CLONE_THREAD的作用是把子进程插入到父进程的同一个线程组,因此子进程要共享父进程的资源。CLONE_SIGHAND的含义是处理程序的阻塞信号表挂起信号表,因此CLONE_THREAD和CLONE_SIGHAND要同时设置为true.
第三步是检查和的设置是否矛盾(是否同时设
您可能关注的文档
最近下载
- 卒中绿色通道时间节点控制表.docx VIP
- 部编版七年级(上)第四单元教学设计集(包括综合性学习、作文指导).pdf VIP
- 2025年新人教版四年级(上)期中数学试卷及答案.docx VIP
- MoCA量表及评分指导.doc VIP
- Lysholm膝关节评分表.docx VIP
- Unit3+Family+matters+Understanding+ideas+Like+father+like+son+高中英语外研版(2019)必修第一册.pptx VIP
- 《“探界者”钟扬》同步练习(含答案).docx VIP
- 无人机植保技术全套课件.pptx VIP
- 《机械设计与创新》轴上零件轴向定位与固定 课件.pptx VIP
- 数学与应用数学专业职业生涯报告.pdf
原创力文档


文档评论(0)