Linux------进程的创建和终结

进程的创建:

Linux通过两个步骤创建新的进程:fork()和exec().其中fork可以创建当前进程(父进程)的一个副本,即子进程。父进程和子进程只有PID不同。在这之后,系统中有两个进程,执行同样的操作。父进程的内容将被复制,但是在Linux中运用了一种写时复写(copy on write)技术,使进程的创建更为高效。接下来exec将读取可执行文件载入地址空间中运行。这样一个进程就创建好啦!

其中fork系统调用的入口点为sys_fork,该函数和体系结构有关,任务是从处理器的寄存器中提取由用户空间提供的信息,并且调用与体系结构无关的do_fork()函数,进行进程复制。然后do_fork主要进行以下几项工作,进行进程生成的实际工作:

1.调用copy_process复制进程。

2.获取新进程的PID

3.用wake_up_new_taskhuanxing唤醒子进程,即将它的task_struct添加到调度器队列中,但这并不意味着它可以立即执行,而是调度器此时可以选择它执行。

其中进程的复制又包括以下几个步骤:

1.检查各种标识,类似于CLONE_FS(与父进程共享文件系统)等待,有些标识的组合是没有意义的,所以需要检查

2.调用dup_task_struct创建父进程task_struct的副本。父子进程的task_struct进程只有核心栈态这个成员不同

3.检查资源限制,因为每个用户能拥有的进程数是有限的,超过则要放弃创建进程

4.调用接口函数sched_fork,以便使调度器对新进程进行设置。防止内核的其他任何部分在进程设置完成前调度进程

5.调用许多类似于copy_xyz的例程,复制和共享内核子系统的各种资源

6.设置各个ID和进程关系

这样整个进程就复制结束啦!

exec()的实现,即用新代码代替旧代码,可启动新程序。

该系统调用的入口点是和体系结构相关的sys_execve函数,但是该函数很快将工作交给与系统结构无关的do_execve例程,该例程主要进行以下几个工作:

1.打开可执行文件

2.调用bprm_init来处理若干管理性事务:生成mm_alloc管理进程地址空间,init_new_context初始化该实例,__bprm_mm_init建立初始的栈

3.调用prepare_binprm提供父进程的一些相关值

4.复制环境和参数数组内容

5.调用search_binary_handler,在do_execve结束时查找一种适当的二进制格式,用于所要执行的文件。而二进制格式处理程序用于将新程序的数据加载到旧的地址空间中

这样,一个新的程序就开始执行啦!

进程的终结:

进程要终结的时候会调用exit()函数,不过和前面一样,最终都还是通过调用do_exit()这个函数来结束进程的。简单的说,就是将各个引用计数器减一,若有计数器归0,则释放相应的内存。然后调用exit_notify()告知父进程为子进程找养父,并把进程状态设置为EXIT_ZOMBIE.最后调用schedule()切换到其他进程。自此该进程不会被再次调用。此时该进程占用的内存仅为内存栈,thread_info和task_struct。当父进程检测到僵尸进程提供的信息之后,将进程所持有的剩余内存释放。至此进程终结。

Linux------进程的创建和终结,布布扣,bubuko.com

时间: 2024-10-12 23:22:08

Linux------进程的创建和终结的相关文章

Linux进程的创建函数fork()及其fork内核实现解析

进程的创建之fork() Linux系统下,进程可以调用fork函数来创建新的进程.调用进程为父进程,被创建的进程为子进程. fork函数的接口定义如下: #include <unistd.h> pid_t fork(void); 与普通函数不同,fork函数会返回两次.一般说来,创建两个完全相同的进程并没有太多的价值.大部分情况下,父子进程会执行不同的代码分支.fork函数的返回值就成了区分父子进程的关键.fork函数向子进程返回0,并将子进程的进程ID返给父进程.当然了,如果fork失败,

Linux内核分析:实验六--Linux进程的创建过程分析

刘畅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本次实验在MenuOS中加入fork系统调用,并通过GDB的调试跟踪,近距离的观察Linux中进程创建的过程.阅读Linux进程部分的源码,结合起来理解Linux内核创建新进程的过程. Linux中对进程的描述 Linux中task_struct结构体用于描述系统中的进程,对应x86机器的此结构体定义放在了/include/li

linux进程的创建、执行和消亡

在linux系统中,第一个进程是系统固有的,与生俱来的或者说是由内核的设计者安排好了的,内核在引导并完成了基本的初始化以后,就有了系统第一进程(实际上是内核线程).除此之外,所有其他的进程和内核线程都有这个原始进程或其子孙进程所创建,都是这个原始进程的后代. linux将进程的创建和执行分成两步. 第一步是从已存在的"父进程"中像细胞分裂一样地复制出一个"子进程".复制出来的子进程有自己的task_struct结构和系统空间堆栈,单与父进程共享其他所有的资源.例如要

linux 进程的创建

1. 进程号: 每个进程在被初始化的时候,系统都会为其分配一个唯一标识的进程id,称为进程号: 进程号的类型为pid_t,通过getpid()和getppid()可以获取当前进程号和当前进程的父进程的进程号: 2. 进程复制: fork函数,是以父进程为蓝本复制一个新的子进程,包括复制代码段,数据段,堆栈段等,除了代码段,子进程会有自己的物理内存空间,其中的内容是和父进程的数据段,堆栈段是一样的,当然进程号是不一样: 在linux下,fork函数是用写复制实现的.所谓写复制,只复制父进程的虚拟地

Linux下的进程类别(内核线程、轻量级进程和用户进程)以及其创建方式--Linux进程的管理与调度(四)

本文声明 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的创建 本文中出现的,内核线程,轻量级进程,用户进程,用户线程等概念,如果不太熟悉, 可以参见 内核线程.轻量级进程.用户线程三种线程概念解惑(线程≠轻量级进程) Linux进程类别 虽然我们在区分Linux进程类别, 但是我还是想说Linux下只有一种类型的进程,那就是task_str

Linux内核分析——进程的描述和进程的创建

Linux内核分析——进程的描述和进程的创建 20135111李光豫 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验内容 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235: 分析fork函数对应的内核处理过程sys_clone,理解创建一个新进

linux下守护进程的创建

最近在学习linux c编程 看到了守护进程的创建,感觉很好玩, 测试环境ubuntu 15.04 下面贴出测试代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/param.h> #include <sys/stat.h> #include <time.h> #include <

Linux进程创建和结束

在Linux中,进程的创建由系统调用fork和vfork完成.它们生成一个子进程并且子进程是父进程的一个复制品. Fork系统调用对应的kernel函数是sys_fork,此函数简单的调用kernel函数do_fork.一个简化版的do_fork执行如下: (1)alloc_pid().给新的进程分配一个新的pid,即进程号 (2)copy_process()此函数会做fork的大部分事情,它主要完成讲父进程的运行环境复制到新的子进程,比如信号处理.文件描述符和进程的代码数据等. (3)wake

Linux 下进程操作,----进程的创建与控制

---恢复内容开始--- 进程是一个程序一次执行的过程,是操作系统动态执行的基本单元. 进程的概念主要有两点:第一,进程是一个实体.每个进程都有自己的虚拟地址空间,包括文本区.数据区.和堆栈区.文本区域存储处理器执行的代码:数据区存储变量和动态分配的内存:堆栈区存储着活动进程调用的指令和本地变量.第二,进程是一个"执行中的程序",它和程序有本质区别.程序是静态的,它是一些保存在磁盘上的指令的有序集合:而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建.调度和消亡的过程,

LINUX内核分析第六周学习总结——进程的描述和进程的创建

LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 进程的描述 进程描述符task_struct数据结构(一) 进程描述符task_struct数据结构(二) 进程的创建 进程的创建概览及fork一个进程的用户态代码 理解进程创建过程复杂代码的方法 浏览进程创建过程相关的关键代码 创建的新进程是从哪里开始执行的