Linux系统如何创建一个新进程
来源:互联网 发布:java求大于n最小素数 编辑:程序博客网 时间:2024/05/01 05:50
对于Linux系统是如何创建一个新进程的,关于fork函数又是怎样具体实现系统调用的,我们通过这次实验来做一个初步的了解。
在做实验前我们要先了解下fork函数具体完成了哪些功能,fork函数是创建一个子进程,但是子进程是处于就绪态的,它需要被调度才能进入运行态。而fork函数对应的系统调用为sys_clone,下面我们通过用gdb跟踪sys_clone来了解Linux系统是如何创建一个新进程的。
首先我们需要在sys_clone处设置一个断点来观察系统的运行过程,
我们可以看到,此时系统即便输入了fork指令,但是系统并未进行系统调度,接下来我们再通过list指令和单步调试来继续跟踪,
我们可以看到系统通过条件编译进入系统调用,并在内核态进行调度。
接着我们在do_fork处设置断点来继续观察,
通过do_fork函数我们可以看到系统主要是完成对父进程的一些标志的复制,以及设置子进程堆栈的起始和尺寸。
接下来在copy_process处设置断点,继续跟踪。
系统通过这个函数完成了对父进程的复制,接下来要做的就是复制线程了,所以我们在copy处设置断点来继续追踪。
从这里我们可以看到,系统开始复制寄存器中的值以及父进程的环境,并开始设置新进程的一些值(比如pid)以从父进程中分离出去。接着我们在ret_from_fork处设置断点来继续跟踪。顺便提一句,从ret_from_fork之后,子进程便开始执行了,所以我才把断点设在那里。
通过单步执行,我们继续观察可以看到,系统把堆栈指针都指向了新进程的寄存器,而新进程的寄存器的值都从父进程那继承过来的,并且新进程是处于就绪态的,然后新进程开始设置它自己的pid号。
之后便是执行do_fork函数,完成了新进程的创建,再之后通过ret_from_fork函数让新进程开始运行,此时可以看到系统显示了结果。
实验总结:
通过这次实验,我们可以看到Linux系统创建一个新进程的全过程,创建一个新进程需要通过内核调用sys_clone来完成,大体的过程便是先对父进程的数据和环境进行复制,然后修改新进程的一些属性,比如pid号等,之后通过do_fork函数和ret_from_fork函数完成对新进程的创建以及运行。
作者:叶涛
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
- Linux系统如何创建一个新进程
- Linux系统如何创建一个新进程进行
- Linux系统创建一个新的进程
- Linux内核如何创建一个新进程
- Linux如何创建一个进程?
- Linux如何创建一个进程
- Linux如何创建一个进程
- Linux如何创建一个进程
- Linux如何创建一个进程
- Linux如何创建一个进程
- 分析Linux内核创建一个新进程的过程(Linux)
- 分析Linux内核创建一个新进程的过程
- 分析Linux内核创建一个新进程的过程
- Linux内核创建一个新进程的过程
- 分析Linux内核创建一个新进程的过程
- Linux内核创建一个新进程的过程
- 分析Linux内核创建一个新进程的过程
- 分析Linux内核创建一个新进程的过程
- Java8 Lambda表达式介绍
- Java8 stream流介绍
- 【操作系统】计算机的启动过程
- Android小知识点一
- Go语言版HelloWorld
- Linux系统如何创建一个新进程
- NodeJS、NPM安装配置步骤(windows版本)
- 叶问
- 重装系统后怎么处理Mysql数据库
- 火眼睛睛查coredump(stl sort)------永远让比较函数对相同元素返回false
- 1.JAVA 编程思想——对象入门
- Python学习def函数的定义、使用及参数传递
- 2.JAVA编程思想——一切都是对象
- KL divergence