创建进程:

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------创建和终止进程的更多相关文章

  1. Linux查看命令终止进程

    Linux查看命令终止进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps PID TTY TIME CMD 2576 pts/0 00:00:00 ba ...

  2. Linux查看用于终止进程命令

    Linux查看用于终止进程命令 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps PID TTY TIME CMD 2576 pts/0 00:00:00 ...

  3. linux根据进程名终止进程

    2017年09月25日 19:44:32 aladdin_sun 阅读数 5235   linux根据进程名终止进程 实验环境 操作系统:CentOS Linux release 7.3.1611 ( ...

  4. linux 查看并终止进程

    1,查看port被那个进程占用 比如: netstat -anp | grep 1160 ps:查看port1169被那个进程占用. 2.查找进程 比如 :ps -ef | grep 'tomcat' ...

  5. Linux 通过端口终止进程

    以下命令可用于杀死占用某端口的所有进程. root 用户: kill -9 $(lsof -i tcp:进程号 -t) 非 root 用户: kill -9 $(sudo lsof -i tcp:进程 ...

  6. Linux系统编程之进程控制(进程创建、终止、等待及替换)

    进程创建 在上一节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建一个新进程.那么,系统是如何创建一个新进程的呢?这就需要我们更深入的剖析fork函数. 1.1 fork函数的返回值 调用 ...

  7. linux系统编程之进程(八):守护进程详解及创建,daemon()使用

    一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...

  8. Linux内核创建一个新进程的过程

    “平安的祝福 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 进程在 ...

  9. linux 创建守护进程的相关知识

    linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关 ...

  10. linux内核分析作业6:分析Linux内核创建一个新进程的过程

    task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  u ...

随机推荐

  1. Python WxPython 的安装以及使用

    WxPython 网址 学习网址 http://wiki.wxpython.org/How%20to%20Learn%20wxPython 安装网址 http://wiki.wxpython.org/ ...

  2. js实现class样式的修改、添加及删除的方法

    本文实例讲述了js实现class样式的修改.添加及删除的方法.分享给大家供大家参考.具体分析如下: 比较常见的js前端功能,通过修改标签的className实现相应的功能. 具体代码如下: <t ...

  3. JavaScript快速入门(一)——JavaScript概览

    JavaScript是什么? JavaScript的诞生 在1995年前后,当时世界上的主流带宽为28.8Kbps,现在世界平均下载带宽为21.9Mbps(数据来源于http://www.netind ...

  4. 关键部分CCriticalSection使用

    类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻仅仅同意一个线程存取资源或代码区.临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用.比如,在链 ...

  5. linux exec和文件描述符妙用技巧(转)

    最近在看<精通unix shell脚本编程>时,看到exec<$1 exec 1>$OUTFILE,一下看的我就蒙了.网上看了大半天,终于搞定,记录如下.对于 Linux 而言 ...

  6. CSS 控制应为Html页面高度导致抖动的问题

    在CSS中添加如下代码: html,body{ overflow-y:scroll;} html,body{ overflow:scroll; min-height:101%;} html{ over ...

  7. 怎么用CIFilter给图片加上各种各样的滤镜_1

    近期在做对图像处理的app,而要对图像进行处理,CoreImage是离不开的框架. 上网Google了一下,大部分的博客都是仅仅讲了怎么给图像加上怀旧(CISepiaTone).模糊(CIBloom) ...

  8. Swift - 使用UIView给页面添加4×4方格

    1,下面是一个利用UIView来给页面上绘制灰色方块的例子,效果图如下:    代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  9. go 冒泡排序

    package main import ( "fmt" ) func main() { a := [...], , , , , , , , , } num := len(a) fm ...

  10. boost库在工作(33)网络服务端之三

    在这个例子里,表示服务器与一个客户端的沟通渠道,就是一个连接,封装为类CConnect.它是当服务器接收到一个客户端连接请求之后创建的,主要用来就是管理这个连接的生命周期,以及数据的接收和发送.从生命 ...