日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

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

【前言】用戶態的變化,耳熟能詳不在贅述?,F在支持讀時共享,寫時復制。

一、內核態的變化

  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、創建一個新進程在內核中的執行過程

  fork、vfork和clone三個系統調用都可以創建一個新進程,而且都是通過調用do_fork來實現進程的創建;

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

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

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

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

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

?



轉載于:https://www.cnblogs.com/huangfuyuan/p/9785142.html

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。