fork源码分析

fork可以让我们创建一个和当期进程一模一样的进程,新的进程称为子进程,旧的进程称为父进程,子进程继承了父进程的文件描述符,进程上下文,地址信息和PCB。
父子进程:子进程继承了父进程的大部分属性,但还有一部分不同
父子进程的pid不同
fork的返回值不同
运行时间不同

fork

一:进程
由程序段,相关数据段和PCB三部分组成称为进程实体,一般情况下简称进程
进程是进程实体的运行过程,是系统资源分配和调度的基本单位

二,fork复制
fork复制通常为三个流程:申请pid,复制PCB,复制进程主体,
一 申请pid
linux中允许使用一个进程描述符的数来标识进程,在默认情况下进程pid最大数值为32767,内核中使用位图法来维护这些数
二,复制pcb,复制pcb通过函数copy_process()函数来进行复制,其中里面使用dup_task_struct(current)来分配进程描述符,其中current为当前进程
在这里插入图片描述
在函数里面首先定义了两个指针
struct thread_info *ti ,和struct task_struct *tsk
task_struct 为进程描述符,thread_info为记录进程信息的结构体,包括进程上下文信息

在这里插入图片描述
在这里插入图片描述
alloc_thread_info()来申请一块连续的内存空间,通过kmalloc实现
在这里插入图片描述
alloc_task_struct()来为申请一块pcb空间,其中通过slab实现

在这里插入图片描述
将current的thread_info赋值给新建立的thread_info,将原pcb中的值赋值给新建立的pcb
再将pcb和thread_info互相指向
在这里插入图片描述
复制进程实体:
在这里插入图片描述
copy_files()复制文件描述符
copy_mm()
/**

  • 当创建一个新的进程时,内核调用copy_mm函数,
  • 这个函数通过建立新进程的所有页表和内存描述符来创建进程的地址空间。
  • 通常,每个进程都有自己的地址空间,但是轻量级进程共享同一地址空间,即允许它们对同一组页进行寻址。
    */
    使用 copy_thread()函数用父进程内核栈来初始化子进程的内核栈将子进程中 eax 寄存器强制置为 0,所以子进程 fork()之后返回 0。
    在这里插入图片描述
    最后将父子进程时间片各分一半,防止通过fork恶意占有资源
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值