日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Linux fork()一个进程内核态的变化

發(fā)布時間:2025/6/17 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux fork()一个进程内核态的变化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【前言】用戶態(tài)的變化,耳熟能詳不在贅述。現(xiàn)在支持讀時共享,寫時復(fù)制。

一、內(nèi)核態(tài)的變化

  1、fork一個子進程代碼

#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char * argv[]) {int pid;/* fork another process */pid = fork();if (pid < 0) { /* error occurred */fprintf(stderr,"Fork Failed!");exit(-1);} else if (pid == 0) {/* child process */printf("This is Child Process!\n");} else { /* parent process */printf("This is Parent Process!\n");/* parent will wait for the child to complete*/wait(NULL);printf("Child Complete!\n");} }

  2、創(chuàng)建一個新進程在內(nèi)核中的執(zhí)行過程

  fork、vfork和clone三個系統(tǒng)調(diào)用都可以創(chuàng)建一個新進程,而且都是通過調(diào)用do_fork來實現(xiàn)進程的創(chuàng)建;

  3、Linux通過復(fù)制父進程來創(chuàng)建一個新進程,那么這就給我們理解這一個過程提供一個想象的框架:
    (1)復(fù)制一個PCB——task_struct
? ? ? ? ? ? ? ? ? ? err = arch_dup_task_struct(tsk, orig);
? ? ? ? ? ? ? ?(2)要給新進程分配一個新的內(nèi)核堆棧
? ? ? ? ?? ? ? ??(注意,是內(nèi)核棧,不是用戶堆棧,用戶態(tài)的是復(fù)制的)

ti = alloc_thread_info_node(tsk, node); tsk->stack = ti; setup_thread_stack(tsk, orig); //這里只是復(fù)制thread_info,而非復(fù)制內(nèi)核堆棧

? ? ? ? ? ? ? (3)要修改復(fù)制過來的進程數(shù)據(jù),比如pid、進程鏈表等等都要改改吧,見copy_process內(nèi)部。
  4、從用戶態(tài)的代碼看fork()----子進程從哪里開始執(zhí)行?

  函數(shù)返回了兩次,即在父子進程中各返回一次,父進程從系統(tǒng)調(diào)用中返回比較容易理解,子進程從系統(tǒng)調(diào)用中返回,那它在系統(tǒng)調(diào)用處理過程中的哪里開始執(zhí)行的呢?這就涉及子進程的內(nèi)核堆棧數(shù)據(jù)狀態(tài)和task_struct中thread記錄的sp和ip的一致性問題,這是在哪里設(shè)定的?copy_thread in copy_process

*childregs = *current_pt_regs(); //復(fù)制內(nèi)核堆棧 childregs->ax = 0; //為什么子進程的fork返回0,這里就是原因! p->thread.sp = (unsigned long) childregs; //調(diào)度到子進程時的內(nèi)核棧頂 p->thread.ip = (unsigned long) ret_from_fork; //調(diào)度到子進程時的第一條指令地址

?



轉(zhuǎn)載于:https://www.cnblogs.com/huangfuyuan/p/9785142.html

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Linux fork()一个进程内核态的变化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。