Linux中进程、线程和fork()

本文深入探讨了Linux系统中线程的实现方式,解释了Linux如何通过轻权进程模拟线程行为,并详细解析了fork()函数的工作原理及其在创建线程过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于Linux中的线程,Linux采用了一种“偷懒”的方法,Linux没有专门的线程对象,当需要建立一个线程时,实际上内核创建的是一个进程对象,也就是task_struct,只不过这个进程对象和父进程共享了大量资源,有时也称为轻权进程(LightWeight Process)。Linux建立进程和线程的接口也一致,比如都是fork(),而通过不同的参数来指定要建立的是进程还是线程调用fork()函数将返回两次,一次是在父进程中,一次是在子进程中,这一定会让大都数人疑惑。其实fork()就是把当前的进程对象task_struct复制一份,这样在进程队列中就多了一个进程对象,由于两个进程相同,所以调度器调度到父进程时,返回一次,调度到子进程时,返回一次。

那么fork()调用一次返回两次的原理是什么呢?这可通过do_fork()所调用的函数copy_thread()来回答。应用程序通过fork()系统调用进入内核空间,其内核态堆栈上保存着该进程的进程上下文(即该进程的各个寄存器),通过复制父进程的内核态堆栈上的进程上下文,同时将eax置为0(如linux 1.2*childregs = *regs;  childregs->eax = 0;),而父进程通过do_fork()的返回值(return last_pid)来得到fork()的返回值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值