zoukankan      html  css  js  c++  java
  • Linux fork()一个进程内核态的变化

    【前言】用户态的变化,耳熟能详不在赘述。现在支持读时共享,写时复制。

    一、内核态的变化

      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!
    ");
        } 
        else 
        {  
            /* parent process  */
            printf("This is Parent Process!
    ");
            /* parent will wait for the child to complete*/
            wait(NULL);
            printf("Child Complete!
    ");
        }
    }

      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; //调度到子进程时的第一条指令地址



  • 相关阅读:
    斐波那契数列的两种解法:1.递归2.字典
    逆向工程,调试Hello World !程序(更新中)
    python计算和媳妇在一起天数的小程序,最后绘制成花.
    Python 3.10 第二个 alpha 版来了!一些可以关注的新特性
    pandas:使用函数批量处理数据(map、apply、applymap)
    机器学习 --- k-means
    自定义注解!绝对是程序员装逼的利器!!
    某网站出现自己电脑的搜索记录,这是怎么回事呢?
    《Linux操作系统》——教学进度表20140218——张同光
    Java Web整合开发(27) -- Spring的Core模块
  • 原文地址:https://www.cnblogs.com/huangfuyuan/p/9785142.html
Copyright © 2011-2022 走看看