1.什么是进程?
进程是操作系统提供的抽象之一。有了进程的概念之后,CPU才有了并发或者伪并发的可能性。通俗的说来,当你的写的程序运行起来后,那么它就是一个进程了。
2.进程,伪并发,并发
首先说说并发,并发指的是在某一个时刻某些事件同时发生。
假设你的电脑只有一个CPU(这里一个指单核),然而你却有很多程序要同时运行,即你的电脑上将有很多进程存在,那么CPU就将提供一种伪并发的能力。具体来说就是运行一个进程,然后切换到下一个进程运行,如此往复。由于切换的速度太快了,并且CPU每次执行每个进程的时间片又很短,所以你几乎感觉不到这种切换的存在,你认为他们就是同时在执行的。
然而上面的这种并发是虚假的,因为每时每刻CPU上只有一个程序在执行指令。那么真正的并发是什么?只要你的CPU是多核的,那么CPU就能提供真正的并发,CPU能同时运行多个进程,每一个核心对应于一个进程。
3.进程的创建与销毁
进程的创建的时机
- 系统启动时
- 某个进程执行了创建进程的系统调用(函数)
- 用户请求创建一个进程
- 创建一个批处理任务
当系统启动的时候,会创建一些前台进程和后台进程。比如邮箱进程(后台进程),你几乎感受不到它的存在。然而当有邮件到来的时候,它却会通知你。这种后台进程又被叫做守护进程。
当某个程序要接收海量数据的输入时,这个程序可能会创建一个新的进程来接收这些数据,然后它向下继续执行其他的语句。
在交互式的系统中,当你点击程序图标运行的时候,也会创建一个新的进程。
最后一个批处理只有在大型主机上会存在。
进程的消亡时机
- 正常退出(自愿)
- 异常退出(自愿)
- 致命错误(非自愿)
- 被其它进程终结(非自愿)
当一个进程执行完它的所有指令,那么它就自动退出了
当一个进程遇到了异常,比如说一个c++编译器遇到了非.cc,.cpp结尾的文件,那么它也会自动结束运行。
当程序遇到了BUG,比如说内存的非法访问,分母是0的除法,那么它就会被操作系统给终结掉。
当别的程序执行了kill函数,那么对应的某个进程会被终结。
4.进程的状态及状态之间的转换
- 运行态
- 准备态
- 阻塞态
位于运行态及CPU正在执行该进程的指令。位于准备态指的是CPU即将可能要执行该进程, 这取决于操作系统的调度。阻塞态指的是进程被挂起了,暂时无法被CPU调度,于是就暂时失去了运行的可能。
图中2,3之将的转换取决与CPU的调度。当进程需要进行IO操作,然而IO的数据还没有准备好的情况下,进程被阻塞,转换1发生。当数据已经准备好后,进程由阻塞态转换成准备态,转换4发生。
5.进程的具体实现
操作系统为了控制每一个进程,其内部必须有相应的数据结构来存储每一个进程,这个数据结构被称作进程表(进程控制块),通常是一个链表。同时每一个进程也是一个数据结构,其内部保存着程序计数器,栈指针,内存分配情况,打开文件的状态等等的信息。当CPU切换进程的时候,必须要保留被换掉的进程中相应的信息同时也要恢复新进程中相关的信息。
进程数据结构通常包含的域
6.进程之间的继承结构
一个进程可以创建多个子进程,这些子进程每个又可以创建多个子进程,最终所有的进程会形成一个树状结构。
参考资料----《现代操作系统》