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------创建和终止进程的更多相关文章
- Linux查看命令终止进程
Linux查看命令终止进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps PID TTY TIME CMD 2576 pts/0 00:00:00 ba ...
- Linux查看用于终止进程命令
Linux查看用于终止进程命令 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps PID TTY TIME CMD 2576 pts/0 00:00:00 ...
- linux根据进程名终止进程
2017年09月25日 19:44:32 aladdin_sun 阅读数 5235 linux根据进程名终止进程 实验环境 操作系统:CentOS Linux release 7.3.1611 ( ...
- linux 查看并终止进程
1,查看port被那个进程占用 比如: netstat -anp | grep 1160 ps:查看port1169被那个进程占用. 2.查找进程 比如 :ps -ef | grep 'tomcat' ...
- Linux 通过端口终止进程
以下命令可用于杀死占用某端口的所有进程. root 用户: kill -9 $(lsof -i tcp:进程号 -t) 非 root 用户: kill -9 $(sudo lsof -i tcp:进程 ...
- Linux系统编程之进程控制(进程创建、终止、等待及替换)
进程创建 在上一节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建一个新进程.那么,系统是如何创建一个新进程的呢?这就需要我们更深入的剖析fork函数. 1.1 fork函数的返回值 调用 ...
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...
- Linux内核创建一个新进程的过程
“平安的祝福 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 进程在 ...
- linux 创建守护进程的相关知识
linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关 ...
- linux内核分析作业6:分析Linux内核创建一个新进程的过程
task_struct结构: struct task_struct { volatile long state;进程状态 void *stack; 堆栈 pid_t pid; 进程标识符 u ...
随机推荐
- c# in depth之泛型的类型约束详细
类型约束 1.引用类型约束 这种约束(表示成T:class,必须是为类型参数指定的第一个约束)用于确保使用的类型实参是引用类型,这可能是任何类,接口,数组,委托或者已知是引用类型的另一个类型参数. 例 ...
- boost.asio系列——buffer
创建buffer 在io操作中,对数据的读写大都是在一个缓冲区上进行的,在asio框架中,可以通过asio::buffer函数创建一个缓冲区来提供数据的读写.buffer函数本身并不申请内存,只是提供 ...
- hdu 4090 GemAnd Prince
题目大意: 别人说是消消看,至于你玩没玩过.反正我是没玩过的. 就是选择一个钻石,可以消除与它相连的所有钻石.并获得 消除数量*消除数量 的分 思路: 直接暴搜,然后用一个cnt数组表示每一种钻石剩 ...
- C#实现环形队列
概述 看了一个数据结构的教程,是用C++写的,可自己C#还是一个菜鸟,更别说C++了,但还是大胆尝试用C#将其中的环形队列的实现写出来,先上代码: public class MyQueue<T& ...
- bat执行java程序的脚本解析
使用java执行带Package的class文件java package1.package2.className 或java -cp . package1.package2.className - ...
- Mysql 官方Memcached 插件初步试用感受 - schweigen - ITeye技术网站
Mysql 官方Memcached 插件初步试用感受 - schweigen - ITeye技术网站 Mysql 官方Memcached 插件初步试用感受
- MySQL :: MySQL 5.0 Reference Manual :: 14.4 The MEMORY (HEAP) Storage Engine
MySQL :: MySQL 5.0 Reference Manual :: 14.4 The MEMORY (HEAP) Storage Engine The MEMORY (HEAP) Stora ...
- script:查看redo产生的历史信息
script:查看redo产生的历史信息 SQL> alter session set nls_date_format='dd-mon-yy'; SQL> set lines 160 p ...
- 基于FPGA的红外遥控解码与PC串口通信
基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...
- (并查集)POJ 1308 & HDU 1325
一开始以为两道题是一样的,POJ的过了直接用相同代码把HDU的交了,结果就悲剧了.最后发现HDU的没有考虑入度不能大于一. 题意:用树的定义来 判断吧,无环,n个结点最多有n-1条边,不然就会有环.只 ...