在Linux中,进程的创建由系统调用fork和vfork完成。它们生成一个子进程并且子进程是父进程的一个复制品。
Fork系统调用对应的kernel函数是sys_fork,此函数简单的调用kernel函数do_fork。一个简化版的do_fork执行如下:
(1)alloc_pid()。给新的进程分配一个新的pid,即进程号
(2)copy_process()此函数会做fork的大部分事情,它主要完成讲父进程的运行环境复制到新的子进程,比如信号处理、文件描述符和进程的代码数据等。
(3)wake_up_new_task()。计算此进程的优先级和其他调度参数,将新的进程加入到进程调度队列并设此进程为可被调度的,以后这个进程可以被进程调度模块调度执行。
简化的copy_process()流程:
(1) dup_task_struct()。分配一个新的进程控制块,包括新进程在kernel中的堆栈。新的进程控制块会复制父进程的进程控制块,但是因为每个进程都有一个kernel堆栈,新进程的堆栈将被设置成新分配的堆栈。
(2)初始化一些新进程的统计信息,如此进程的运行时间
(3)copy_semundo()复制父进程的semaphore undo_list到子进程。
(4)copy_files()、copy_fs()。复制父进程文件系统相关的环境到子进程
(5)copy_sighand()、copy_signal()。复制父进程信号处理相关的环境到子进程。
(6)copy_mm()。复制父进程内存管理相关的环境到子进程,包括页表、地址空间和代码数据。
(7)copy_thread()。设置子进程的执行环境,如子进程运行时各CPU寄存器的值、子进程的kernel栈的起始地址。
(8)sched_fork()。设置子进程调度相关的参数,即子进程的运行CPU、初始时间片长度和静态优先级等。
(9)将子进程加入到全局的进程队列中
(10)设置子进程的进程组ID和对话期ID等。
简单的说,copy_process()就是将父进程的运行环境复制到子进程并对某些子进程特定的环境做相应的调整。
应用程序使用系统调用exit()来结束一个进程,此系统调用接受一个退出原因代码,父进程可以使用wait()系统调用来获取此代码,从而知道子进程退出的原因。对应到kernel,此系统调用sys_exit_group(),它的基本流程如下:
(1)将信号SIGKILL加入到其他线程的信号队列中,并唤醒这些线程。
(2)此线程执行do_exit()来退出。
do_exit()完成线程退出的任务,其主要功能是将线程占用的系统资源释放,do_exit()的基本流程如下:
(1)将进程内存管理相关的资源释放
(2)将进程ICP semaphore相关资源释放
(3)__exit_files()、__exit_fs()。将进程文件管理相关的资源释放。
(4)exit_thread()。只要目的是释放平台相关的一些资源。
(5)exit_notify()。在Linux中进程退出时要将其退出的原因告诉父进程,父进程调用wait()系统调用后会在一个等待队列上睡眠。
(6)schedule()。调用进程调度器,因为此进程已经退出,切换到其他进程。
Linux 进程创建一(system和fork)
一:system系统调用 #include int system(const char *string); system函数传递给/bin/sh -c 来执行stri ...
Linux 进程创建二(execve和wait)
三:execve系统调用 int execve(const char *filename, char *const argv[],char *const envp[]); fork创建了一个新的进程, ...
linux 进程创建clone、fork与vfork
目录: 1.clone.fork与vfork介绍 2.fork说明 3.vfork说明 4.clone说明5.fork,vfork,clone的区别 内容: 1.clone.fork与vfork介绍 ...
linux进程创建
1. 进程是程序的执行,会被加载到内存中,每个进程包括程序的代码和数据,其中数据包括程序的变量的数据,外部数据,程序堆栈. 2. Linux中,输入命令,如vi main.c 通过shell来执行, ...
【Linux】进程的结构,创建,结束,以及程序转化为的进程的过程
本文内容: 1.进程的结构 2.程序转化为进程的过程 3.进程的创建 4.进程的结束 背景知识: 1.进程是计算机中处于运行的程序的实体 2.进程是线程的容器 3.程序本身只是指令,数据以及组织形式的 ...
linux内核分析作业6:分析Linux内核创建一个新进程的过程
task_struct结构: struct task_struct { volatile long state;进程状态 void *stack; 堆栈 pid_t pid; 进程标识符 u ...
分析Linux内核创建一个新进程的过程
一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct ...
Linux内核创建一个新进程的过程
“平安的祝福 + 原创作品转载请注明出处 + MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 进程在 ...
linux进程解析--进程的创建
通常我们在代码中调用fork()来创建一个进程或者调用pthread_create()来创建一个线程,创建一个进程需要为其分配内存资源,文件资源,时间片资源等,在这里来描述一下linux进程的创建过程 ...
随机推荐
thinkphp nginx配置
安装和配置: http://www.cnblogs.com/Bonker/p/4252588.html spawn-fcgi 要先安装和启动:(已过时) sudo spawn-fcgi -a -u ...
Exception Handling Statements (C# Reference)
Exception Handling Statements (C# Reference) C# provides built-in support for handling anomalous sit ...
HDOJ(HDU) 2521 反素数(因子个数~)
Problem Description 反素数就是满足对于任意i(0< i < x),都有g(i) < g(x),(g(x)是x的因子个数),则x为一个反素数.现在给你一个整数区间[ ...
iOS7初体验(1)——第一个应用程序HelloWorld
iOS7 Beta已经发布了,迫不及待地下载了iOS 7及Xcode 5并体验了一下.先做一个简单的Hello World看看都有哪些变化吧. 1. 启动Xcode5-DP: 2. 从菜单选择File ...
phpcms:二、头部尾部包含
1.index.html是默认的首页{template "content","header"}引入头部的模块{template "content&qu ...
sql server选取第m行到第n行的元组
现在有一个表Questioin,主码是qid,要求选择第m行到第n行的元组 //方法一:效率最低 //错误:如果n=m,将选取从m+1开始的n条数据 sel ...
python实现windows Service服务程序
python实现windows Service服务程序 win32serviceutil.ServiceFramework是封装得很好的Windows服务框架,本文通过继承它来实现. 通过SvcDoR ...
编写线程安全的Java缓存读写机制 (原创)
一种习以为常的缓存写法: IF value in cached THEN return value from cache ELSE compute value save value in cache ...
bzoj 4823 [Cqoi2017]老C的方块——网络流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 一个不合法方案其实就是蓝线的两边格子一定选.剩下两部分四相邻格子里各选一个. 所以这个 ...
Eclipse自动编译NDK/JNI的三种方法
一.Eclipse关联cygwin 1. 工程->右击选择Properties->选择Builders,在Builders中选择New创建一个Program 2. 参数配置 二.Eclip ...