码迷,mamicode.com
首页 > 系统相关 > 详细

Linux中的进程 --fork,exec,守护进程分析

时间:2018-07-21 17:10:00      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:stopped   play   队列   操作   动态库   进程id   max   文件   僵死   

  操作系统经典的三态如下:

1、就绪态

2、等待(阻塞)

3、运行态

  其转换状态如下图所示:

技术分享图片

   操作系统内核中会维护多个队列,将不同状态的进程加入到不同的队列中,其中撤销是进程运行结束后,由内核收回。

  以上的三态是操作系统原理中给出的,但是各个操作系统的平台实现这些状态的时候是有差异的,例如linux操作系统中进程的状态有以下几种:

1、运行状态(TASK_RUNNING)

2、可中断睡眠状态(TASK_INTERRUPTIBLE)

3、不可中断睡眠状态(TASK_UNINTERRUPTIBLE)

4、暂停状态(TASK_STOPPED)

5、僵死状态(TASK_ZOMBIE)

这些状态之间的转换如下所示:

技术分享图片

 

  linux中的进程状态是包含经典三态的,只不过分类更加细化,可中断睡眠和不可中断睡眠对应于阻塞态,就绪态也被认为是运行态的一种,也用TASK_RUNNING标识,而运行态又分为用户空间运行态和内核空间运行态,此外还多出了暂停状态和僵死状态。

小知识:

  linux内核加载完成后会自己创建一个0号进程,创建方式不同于普通进程,然后再创建一个1号进程,其中一号进程就是/sbin/init。linux中进程的最大数量是有限的,可以通过命令  cat  /proc/sys/kernel/pid_max查看,一般默认值是32768。

  进程是操作系统对资源的一种抽象,一个进程包括代码段、数据段、堆栈段和进程控制块,进程控制块是操作系统管理进程的一个重要的数据结构。一个进程只能对应一个程序(这里的一个程序指的是一个可加载可执行程序。如果一个程序是一个文件,那么一个进程可以对应多个程序(文件),例如:可加载可执行程序和多个动态库程序(文件)可运行在一个进程中),一个程序可以对应多个进程。

  linux中创建进程的系统调用时fork,fork函数一次调用,两次返回,子进程和父进程在各自的用户空间返回。fork一个新进程时,具体有哪些东西被生成或者拷贝了呢?在暂时不考虑COW(写时拷贝)的情况下,fork一个进程时,内核会创建一个新的PCB(进程控制块),此外还会拷贝父进程的数据段、堆栈段等。新创建的进程进入内核中的就绪队列。

  查看fork的具体使用方法可以使用man命令查看。linux中的man命令共有以下几个章节:

技术分享图片

  fork失败时,只返回一次,返回值是-1,并设置全局的errno。fork成功返回时,父进程返回的是子进程的pid,这样可以让父进程知道子进程的pid,方便对子进程进行控制,父进程可能会fork很多子进程,将子进程id返回给父进程可以使父进程将这些pid保存组织起来,能轻松的对子进程进行控制,如果不是这样的话,那父进程要想找到一个子进程可能需要遍历很多复杂的数据结构,增加了复杂性。子进程从fork返回时返回的是0。父进程和子进程是一对多的关系,子进程获取父进程的pid是很方便的。

Linux中的进程 --fork,exec,守护进程分析

标签:stopped   play   队列   操作   动态库   进程id   max   文件   僵死   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9346438.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!