0%

《趣谈linux操作系统》小结(十三) - fork进程创建

fork进程创建

第一步就是复制task_struct, 调用copy_process。

  • 申请新的task_struct, 申请新的内核栈空间,赋值给 task_struct 的 void *stack 成员变量;拷贝task_struct的内容, 调用 setup_thread_stack 设置 thread_info。
  • 调用copy_creds,设置权限相关的配置
  • 重新设置进程运行的统计量
  • 设置调度相关的变量 sched_fork, 设置状态、优先级、运行量,调度类等。是否可抢占。
  • 初始化与文件和文件系统相关的变量。复制一个进程打开的文件信息。复制一个进程的目录信息。
  • 初始化与信号相关的变量。 拷贝信号处理函数
  • 复制进程内存空间
  • 分配 pid,设置 tid,group_leader,并且建立进程之间的亲缘关系。

第二步,唤醒新的进程wake_up_new_task。

  • 将进程的状态设置为 TASK_RUNNING
  • 将 sched_entity 加入到红黑树里面,然后将 se->on_rq = 1 设置在队列上。
  • 调用 check_preempt_curr,看是否能够抢占当前进程。如果可以抢占,给当前进程设置标志。

OK, fork系统调用结束后,触发抢占。

图片替换文本

行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。