fork()函数详解以及进程创建的过程

本文详细介绍了Linux中fork()函数的工作原理,包括进程创建、写时拷贝技术以及fork()执行的流程。在Linux2.6以后,通过slab分配器动态分配task_struct,提高了进程创建效率。fork()使用写时拷贝技术,仅在写入时才复制资源,减少了不必要的内存拷贝。创建进程时,首先调用fork()创建子进程,然后通过exec()加载可执行文件。
摘要由CSDN通过智能技术生成

进程控制块(PCB):用来标识一个进程的,它包含了该进程的各个信息。它是task_struct这个结构体。

那这个task_struct结构体是怎样在内核中存在的呢?接下来我来说一下。

内核在为每一个进程分配PCB的时候,实际上是分配了两个连续的物理页面(共8K),这两个页面的底部1K空间用作进程的PCB结构,剩余7K就是这个进程的系统空间堆栈了,如图:

内核把进程的列表存放在任务队列的双向循环链表中,链表中的每一项都是类型为task_struct,称之进程控制块的结构,该结构包含着一个具体进程的全部信息。

task_struct在32位操作系统上大小约为1.7KB,看着挺大,但是要考虑到该结构体内包含着一个进程的所有信息,那么也就挺小的了。task_struct包含的信息包括:打开的文件,进程的地址空间,挂起的信号,进程的状态,等等。
 

不过上面所说的进程控制块是系统会在内核中开辟连续的两个物理页面(共8K),其中底部放task_struct结构,其余为这个进程的系统空间堆栈。

这只是Linux2.6版本之前的方式了,便只通过栈指针就可以计算出其task_struct的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值