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 ...
随机推荐
- poj 1018 Communication System 枚举 VS 贪心
Communication System Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21631 Accepted: ...
- RobotFramework 自定义Library
RobotFramework 主要使用Python,这里简单自定义Library,以扩充RobotFramework的功能 新建一个python类,自定义需要的方法 例如: 保存成TestLibrar ...
- session对象和applicatione对象
ASP.NET 的常用对象有:response对象.request对象.application对象.server对象.session对象.下面主要讨论session对象和cookie对象. sessi ...
- form表单提交不成功提示
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- Windows 8 和 Windows 8.1 中对插件和 ActiveX 的支持
此文章将介绍页面在 Windows 8 适用于桌面版的 Internet Explorer 中与在新 Windows UI 的 Internet Explorer 中的不同表现. Windows 8 ...
- IE缓存的BUG 和其他浏览器的缓存问题
原文:IE缓存的BUG 和其他浏览器的缓存问题 1 .IE浏览器在异步请求的时候 为了偷懒 第二次请求的时候不会给后台请求相应,这样我们就无法从后台拿值, 这样的话 ,我们可以画个妆,蒙骗IE我们 ...
- ANTS Performance Profiler 破解使用
http://blog.csdn.net/wangjia184/article/details/7746089
- IOS中的id与nil
1 id id和void *并非完全一样.在上面的代码中,id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject) ...
- Hbase0.96源码之HMaster(一)
从main()函数開始 public static void main(String [] args) { VersionInfo.logVersion(); new HMasterCommandLi ...
- 【矩阵乘】【NOI 2012】【cogs963】随机数生成器
963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对照 时间限制:1 s 内存限制:128 MB **[问题描写叙述] 栋栋近期迷 ...