fork源码简析

好久没写博客了,正好最近老师布置了看linux源码的任务,于是决定写一篇关于看fork源码的相关博客,废话少说,进入正题\

准备工作

首先,你需要一份linux的源代码,我下载的是linux-3.10.108版本的代码,下载链接:linux-3.10.108
其次,你需要一个优秀的IDE,来助力你更好的看源码,我推荐CLion,下载链接:https://www.jetbrains.com/clion/
剩下的,就需要有一个好的心情,就这样

开始看源码

用CLion打开源码,修改CMakeLists.txt文件(没有就创建,就在项目根目录下),此文件会自动寻找makefile,有助于更好的阅读代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是 `sched_post_fork` 函数的部分源码,代码摘自 Linux 内核版本 5.15.5: ```c void sched_post_fork(struct task_struct *p) { struct rq_flags rf; struct sched_entity *se = &p->se; struct task_struct *parent = p->parent; struct sched_entity *parent_se = &parent->se; if (parent_se->on_rq && !se->on_rq) { /* * parent is on a runqueue, but we just forked the child and it's * not on any runqueue yet. This means we need to do a few things * to get the child properly accounted for. */ p->se.load.weight = 0; se->vruntime = parent_se->vruntime; se->sum_exec_runtime = parent_se->sum_exec_runtime; se->prev_sum_exec_runtime = parent_se->prev_sum_exec_runtime; se->avg_overlap = parent_se->avg_overlap; /* * We need to add the child to the runqueue. This is tricky, as * we cannot just add it to the parent's runqueue, as that would * mess up the order of the tasks. Instead, we need to add it * to the right runqueue based on its priority. */ raw_spin_lock_irqsave(&rq_lock(p), rf); enqueue_task_rq(p, task_cpu(p), ENQUEUE_WAKEUP); raw_spin_unlock_irqrestore(&rq_lock(p), rf); } /* * We need to reset the child's CPU time and other accounting * information, as it is starting fresh. */ schedstat_set(p->se.statistics.wait_start, 0); cpuacct_clear_stats(p); memset(&p->sched_info, 0, sizeof(p->sched_info)); } ``` 该函数主要做了以下几件事情: 1. 复制父进程的调度实体信息,包括进程的优先级、调度策略、调度参数等; 2. 为子进程创建新的调度实体,并将其加入到任务队列中; 3. 重置子进程的 CPU 时间和其他计算信息,以确保子进程可以从头开始执行。 需要注意的是,`sched_post_fork` 函数只是为子进程更新调度信息和创建调度实体,并将其加入到任务队列中。具体的调度过程和调度策略等信息,是由 CFS 调度器来进行实现和维护的。因此,在理解 `sched_post_fork` 函数的实现时,需要结合 CFS 调度器的内部实现和调度策略等信息进行理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值