fork函数创建新进程过程分析
- 判断是否被跟踪
- 判断是否被创建为轻量级进程(vfork)
- 判断父进程是否被跟踪,
- 判断是否子进程获取新的PID或命名空间,如果是,则不允许其共享进程组、信号handler或父进程
- task_create在复制之前确认共享的权限
- 调用dup_task_struct复制task_struct(进程描述符)
- alloc_task_struct_node为task_struct分配内存
- alloc_thread_info_node为thread_info分配内存
- setup_thread_stack为进程新建一个内核栈
- copy_semundo
- copy_files
- copy_fs
- copy_sighand
- copy_signal
- copy_mm
- copy_namespaces
- copy_io
- 进入copy_thread
- struct pt_regs *childregs = task_pt_regs(p);给指针赋值,指向.thread.regs
- *childregs = *current_pt_regs();复制寄存器内容
- childregs->ax = 0; 给子进程pid返回值0;
- p->thread.ip = (unsigned long)ret_from_fork;子进程从ret_from_fork开始执行。
- ret_from_fork位于entry.S。子进程执行ret_from_fork后转到syscall_exit
- 父进程copy_thread完成,返回copy_process
- 给新进程分配新pid
- 设置子进程pid
- 子进程接下来进行关中断,检查信号(信号量不共享则不复制),继续restore_all最后恢复上下文,从内核态返回,继续执行程序中的代码。
- 父进程返回sys_clone,父进程执行fork()之后的代码。最后程序结束。
- 进程(task)是处于执行期的程序,通常还包括打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程,还有存放全局变量的数据段等。
- 线程是在进程中活动的对象。linux:不特别区分进程线程,线程是特殊的进程。
- 在现代Linux内核中,fork实际上是由clone系统调用实现的。
- fork从内核返回两次,一个回到父进程,一次回到产生的新的子进程。
- 程序通过exit()系统调用退出执行。此函数会终结进程并将其占用的资源释放掉。父进程可以通过wait4()系统调用查询子进程是否终结,这使进程拥有了等待特定进程执行完毕的能力。进程退出执行后被设置僵死状态。
- Linux系统通过c库提供wait(),waitpid(),wait3(),wait4()等函数。
- 内核把进程的列表存放在任务队列(task list)双向列表中,表中每项都是task_struct,被称为进程描述符,定义在<linux/sched.h>中。内核通过一个唯一的进程标示值PID来标记进程。PID为pid_t类型,实际为int。
- 进程状态:
- TASK_RUNNING表示进程可执行。
- TASK_INTERRUPTIBLE可中断。进程正在睡眠(阻塞),等待信号。
- TASK_UNINTERRUPTIBLE不可中断。处于此状态不受信号唤醒。其它同上。
- _TASK_TRACED被其他进程跟踪的进程。
- _TASK_STOPPED进程没有投入运行也不能投入运行。
- Unix将产生机制分解为fork和exec。fork复制exec负责读取可执行文件并将其载入地址空间开始运行。
- fork采用写时拷贝页实现。页的拷贝推迟到实际发生写入时。
- 内核有意选择子进程先执行,因为一般子进程马上会调用exec()。以避免写时拷贝的开销。
- 完成fork调用后存在两个进程,每个进程都会从fork()返回处继续执行。
- fork,vfork,clone都调用do_fork,vfork不拷贝父进程的页表。clone带参数。
参考文献:
《Linux内核设计与实现》
By:昆仑雪狐
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
fork函数创建新进程过程分析的更多相关文章
- 通过fork函数创建进程的跟踪,分析linux内核进程的创建
作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程 1.打开gdb, ...
- Linux内核分析— —创建新进程的过程
分析Linux内核创建一个新进程的过程 实验过程 要求:使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环 ...
- linux进程学习-创建新进程
init进程将系统启动后,init将成为此后所有进程的祖先,此后的进程都是直接或间接从init进程“复制”而来.完成该“复制”功能的函数有fork()和clone()等. 一个进程(父进程)调用for ...
- linux里面的fork函数创建一个新进程
由fork创建的新进程成为子进程,fork函数被调用一次,但是返回两次,
- 创建新进程,就三个函数CreateProcessAsUser CreateProcessWithLogonW CreateProcessWithTokenW(附网友的流程)
CreateProcessAsUser 怎么会还需要密码呢~~~ 先WTSGetActiveConsoleSessionId 得到当前的处理激活状态的SessionId OpenProcessToke ...
- Linux内核分析-创建新进程的过程
分析Linux内核创建一个新进程的过程 task_struct结构体分析 struct task_struct{ volatile long state; //进程的状态 unsigned long ...
- Go:创建新进程(os.StartProcess源码解读)
关于如何使用go语言实现新进程的创建和进程间通信,我在网上找了不少的资料,但是始终未能发现让自己满意的答案,因此我打算自己来分析这部分源代码,然后善加利用,并且分享给大家,期望大家能从中获得启发. 首 ...
- Win32 API编程:使用CreateProcess创建新进程
#include <windows.h> #include <tchar.h> #include <stdio.h> int main(int argc, char ...
- 第八篇:文件共享和使用 dup 函数创建新描述符的区别
前言 文件共享是指同时打开一个文件 用 dup 函数能对指定文件描述符再创建一个新的描述符,且这个新的描述符和旧的描述符指向的是同一个文件. 这两种行为有什么区别呢?下面给出的两张文件系统的图形象的解 ...
随机推荐
- SpringMVC文件上传注意事项
简介 我在使用 idea 上传文件时遇到一些问题,费了好些时间,最后还是的队友来帮忙. 问题出现在没有熟练使用 IDE,采用 SpringMVC 上传文件主要注意几个事项. 1. 配置 bean 在 ...
- SQL Developer新建连接
1.打开SQL Developer,新建sys连接(sys为系统管理员拥有最高权限): 2.新建system连接(system为本地管理员,拥有次高权限): 3.新建scott(scott为普通用户, ...
- CGI,FastCGI,PHP-CGI与PHP-FPM
CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI可以用任何一 ...
- maven+springmvc+spring+mybatis+velocity整合
一.ssmm简介 ssmm是当下企业最常用的开发框架架构 maven:管理项目jar包,构建项目 spring:IOC容器,事务管理 springmvc:mvc框架 myBatis:持久层框架 v ...
- ExtJs 之 ComboBox级联使用
刚接触ExtJs不到一周,项目使用ExtJs框架,有个版块用到了combobox的级联(两级),遇到了一系列的问题,两天来一直查API.网络资料,终于解决了. 先列出遇到的一系列问题(也许你也遇到过! ...
- CentOS 6.7 中安装Emacs 24.5
Emacs 版本:http://mirror.bjtu.edu.cn/gnu/emacs/emacs-24.5.tar.gz CentOS 内核版本:2.6.32-573.el6.x86_64 参考资 ...
- JavaEE Hibernate初级概念
1. Hibernate 是连接Java应用程序和关系数据库的中间件: 对JDBC API进行了封装.负责Java对象的持久化: 在三层软件架构中它位于持久层(数据访问层),封装了所有数据访问细节, ...
- [划分树] POJ 2104 K-th Number
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 51732 Accepted: 17722 Ca ...
- DeepLearning之路 (五) CNN
自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN),期间配置和使用过theano和cuda-convnet.cuda-convnet2. ...
- VBA唏嘘戏——简单单元格的设定(实例)
由于有很多个Word文件,所以应用宏会更加方便排版,而且版式较为统一. Sub 设置列宽() ' ' 设置列宽宏 ' ' ActiveDocument.Tables().Cell(, ).Width ...