zoukankan      html  css  js  c++  java
  • 作业六:分析Linux内核创建一个新进程的过程

    分析Linux内核创建一个新进程的过程

    进程描述符PCB----task_struct数据结构

    	操作系统:1.进程管理 2.内存管理 3 文件系统
    

    一、新进程如何创建和修改task_struct数据结构

    1.复制当前进程(创建新进程通过复制当前进程来实现)
    2.给新进程分配新的内核堆栈
    3.修改复制过来的进程数据(如pid,状态链表,内核堆栈,ip,sp)
    

    1.进程创建

    1.fork系统调用在父子进程各返回一次,子进程的返回值=0,父进程的返回值=子进程的PID
    2.fork、vfork、clone三个系统调用可创建一个新进程,最后通过do_fork实现进程创建。
    

    2.新进程的开始执行地点

    1.ret_from_fork开始执行。
    2.int指令和SAVE_ALL压倒内核栈的内容
    3.ENTRY(ret_from_fork){
    ...jmp syscall_exit...}  //跳转到system_call中的syscall_exit
    4.由system_call中前面save_all判断,实际syacall_call之前的堆栈状态是一样,继续往下执行,返回用户态。不是父进程,而是子进程。
    

    3.进程:处于执行期的程序以及相关的资源的总称。

    1.fork()创建新进程,父进程用fork创建子进程。fork系统调用从内核返回两次:一次回到父进程,一次回到子进程。
    2.在Linux内核中,fork()实际有clone()系统调用实现的。
    3.程序通过exit()系统调用退出执行。最终中介进程并将其占用的资源释放掉。
    

    4.进程描述符及任务结构

    内核把进程的列表存放在任务队列的双向循环列表中
    链表中每一项都是类型为task_struck,称为进程描述符的结构,该结构定义在<linux/sched.h>文件中
    

    5.进程状态

    	(1)TASK_RUNNING(运行)——进程是可执行。进程在用户空间中执行的唯一可能的状态,也可以应用到内核空间中正在执行的
    	(2)TSK_INTERRUPTIBLE
    	(3) TASK_UNINTERRUPTIBLE 
    	(4)_TASK_TRACED 
    	(5)_TASK_STOOPED
    

    6.进程上下文

    一般程序在用户空间执行。当一个程序调执行了系统调用或者触发了某个异常,它就陷入了内核空间。成内核“代表进程执行”,并处于进程上下文中。
    

    7.进程家族数

    所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程。
    

    二、使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone和分析fork函数对应的系统调用处理过程





    三、总结部分

    Linux系统创建一个新进程的理解

    1.fork实际开销是复制父进程的页表以及给子进程创建唯一的进程描述符**
    
    2.Linux通过clone()系统调用实现fork()**
    
    3.fork(),vfork(),和clone()库函数都是根据各自需要的参数标志去调用clone(),然后由clone()调用do_fork**
    
    do_fork函数调用了copy_process()函数,然后让进程执行
    
    	
    
      Linux通过复制父进程创建新进程,fork、vfork、clone都是通过do_exit实现进程的创建。
     -A.复制一个PCB
     -B.给新进程分配一个新的内核堆栈(复制了thread_info,不是复制了内核堆栈)	
     -C.修改复制的数据,即子进程初始化。
    
     从用户态代码看父进程和子进程各返回一次,而子进程从ret_from_fork函数开始执行,从函数中跳转到syscall_exit,即system_call中的语句。		
    

    注明:郑伟 + 参考资料:《Linux内核设计与实现》 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

  • 相关阅读:
    Stream概念的理解
    nodejs进程间通信
    nodejs多进程spawn execFile exec fok方法的区别
    socket这个名词的理解
    Object.defineProperty方法总结
    git中HEAD^和HEAD~区别
    http常见的9种方法
    java怎么建立JAVA工程项目?
    树莓派mjpg-stream摄像头监控
    制作OS X 10.9 Mavericks 安装U盘
  • 原文地址:https://www.cnblogs.com/zhengwei0712/p/5329496.html
Copyright © 2011-2022 走看看