【linux内核分析与应用-陈莉君】进程的一生

博客围绕进程创建展开,介绍了进程与线程,探讨了TASK_STRUCT结构的特点,阐述了进程API的实现,分析了do_fork()的代码流程,还提及了进程的生命周期,为理解进程创建提供了多方面视角。

目录

 

1.进程与线程

2.TASK_STRUCT结构的统一性与多样性

3.进程API的实现

4.do_fork()的代码流程

5.进程的生命周期


1.进程与线程

2.TASK_STRUCT结构的统一性与多样性

推荐阅读

3.进程API的实现

我们可以看到fork()调用的sys_fork()中的do_fork(),
除了SIGCHLD参数以外,后面的三个参数空手而来,第二个和第二个参数似乎
也没有明确的目标,作为子进程,它完全有自己的个性,根本不想共享父进程
的任何资源,而是让父进程将所有的资源都给自己复制一份,父进程就真的
给它复制一份吗?老爸没有那么傻,而是假装复制了一下,也就是用一个指针
指过去了而已,等真正需要的时候,比如要写一个页面,这时候写时复制技术
就登场了,只有父子进程中不管谁想一个页面的时候,这个页面才被复制一份.

sys_vfork()比sys_fork()还狡猾,调用do_fork()时直接传递了两个标志过去,
CLONE_VFORK表示孩子优先老爸等待,于是父进程去睡觉了,等子进程结束以后
才会醒来;CLONE_VM,表示儿子干脆和父进程待在一个进程地址空间中,父子
进程共享地址空间,但是父进程的页表除外,sys_vfork()看起来很聪明,
但实际上聪明反被聪明误,因为写时复制的招数更高,也就是更高效,因此
它就没有了生存空间,直接被取代.

clone()调用的sys_clone(),线程就是这么诞生的,怎么克隆呢?听起来很神秘,
其实很简单,就是传递一堆参数告诉老爸想要和老爸共享什么资源,于是老爸就把
地址空间,文件系统,打开的文件,信号处理函数等因为儿子的一句话给分享了,
看起来就是四个参数的或:CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND.


如果我是一个内核线程,是不是我的出生更有优势呢?
没错.
用户空间对内核线程来说根本没有任何意义,早期内核中创建线程是通过kernel_thread()
创建的,目前内核中是采用kthread_create()创建的,其本质也是向do_fork()提供特定的
标志而创建.

TASK_STRUCT结构体带来的统一性,到底谁给进程,线程,内核线程的诞生带来了方便?
说到底还是因为它们在一个战壕中,也就是说它们用的都是TASK_STRUCT结构,也因此
它们的生命历程都有诸多的相似,不管是被调度到CPU上面去跑,还是分配各种资源,
最后的诞生都是调用了相同的函数do_fork().

4.do_fork()的代码流程

 

 

5.进程的生命周期

随着一句fork(),新进程呱呱落地,但是此时它只是老进程的一个克隆,然后随着exec的调用,
新进程脱胎换骨,离家独立,开始自己独立工作的职业生涯,就像人一样,进程也有生老病死,
它可以是自然后的死亡(运行到主函数的最后一个大括号)从容离我们而去,也可以是中途退场,
退场有两种方式:1.调用exit函数;2.主函数中调用return函数.无论哪种方式它都可以留下
遗言,放在返回值中保存下来,甚至进程还可能被谋杀,被其他进程通过另外的方式结束自己的
一生.进程死掉以后会留下空壳,wait站好最后一岗,打扫战场,使其最终归于无形,至此就是
进程完整的一生.


问题:
wait这个系统调用做了什么?

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值