标签: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是很方便的。
标签:stopped play 队列 操作 动态库 进程id max 文件 僵死
原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9346438.html