进程理论
Posted runnermark
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程理论相关的知识,希望对你有一定的参考价值。
程序与进程
- 隐藏丑陋复杂的硬件接口,提供良好的抽象接口
- 管理、调度进程,并且将多个进程对硬件的竞争变得有序
并发与并行
无论并行还是并发,在用户看来都是“同时”运行的,不管是进程还是线程,都只是一个任务而已,真正活的是 cpu ,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务:
- 并发:是伪并行,即看起来像是“同时”运行的,单核(单个cpu) + 多道技术就可以实现并发
- 并行:同时运行,只有具备多个CPU才能实现并行。
单核下,可以利用多道技术,多个核,每个核也都可以利用多道技术(多道技术是针对单核而言)
进程的创建
但凡是硬件,都需要有操作系统去管理,只要有操作系统,就有进程的概念,就需要有创建进程的方式,一些操作系统只为了一个应用程序设计,这类系统一旦启动所有的进程就都已经存在。而对于通用型系统(跑多个应用程序),需要有系统运行过程中创建或者撤销进程的能力。主要分为下面四种形式创建新进程。
- 系统初始化
- 一个进程在运行过程中开启了子进程
- 用户的交互式请求,而创建的一个新进程
- 一个批处理作业的初始化(只在大型机的批处理系统中应用)
无论哪一种,新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的:
- 在UNIX中该系统调用是:fork,fork会创建一个与父进程一模一样的副本,二者有相同的存储映像、同样的环境字符串和同样的打开文件(在shell解释器进程中,执行一个命令就会创建一个子进程)
- 在windows中该系统调用是:CreateProcess,CreateProcess既处理进程的创建,也负责把正确的程序装入新进程。
关于创建的子进程,UNIX和windows:
- 相同的是:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程的在其地址空间中的修改都不会影响到另外一个进程。
- 不同的是:在UNIX中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于windows系统来说,从一开始父进程与子进程的地址空间就是不同的。
进程的终止
- 正常退出(自愿,如用户点击页面的叉号,或程序执行完毕调用发起系统调用正常退出,在Linux系统中用 exit,在Windows中用ExitProcess)
- 出错退出(自愿)
- 严重错误(非自愿,执行非法指令,如引用不存在的内存,I/O等,可以捕获异常,try…except)
- 被其他进程杀死(非自愿,如 kill -9)
进程的层次结构
无论UNIX还是windows,进程只有一个父进程,不同的是:
- 在UNIX中所有的进程,都是以init进程为根,组成树形结构。父子进程共同组成一个进程组,这样,当从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员。
- 在windows中,没有进程层次的概念,所有的进程都是地位相同的,唯一类似于进程层次的暗示,是在创建进程时,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程,但是父进程有权把该句柄传给其他子进程,这样就没有层次了。
进程的状态
tail -f access.log |grep ‘404’
执行程序 tail,开启一个子进程,执行程序 grep,开启另外一个子进程,两个进程之间基于管道 ’|’通讯,将tail的结果作为grep的输入。
进程grep在等待输入(即I/O)时的状态称为阻塞,此时grep命令都无法运行
其实在两种情况下会导致一个进程在逻辑上不能运行,
- 进程挂起是自身原因,遇到I/O阻塞,便要让出CPU让其他进程去执行,这样保证CPU一直在工作
- 与进程无关,是操作系统层面,可能会因为一个进程占用时间过多,或者优先级等原因,而调用其他的进程去使用CPU。
进程并发的实现
进程并发的实现在于,硬件中断一个正在运行的进程,把此时进程运行的所有状态保存下来,为此,操作系统维护一张表格,即进程表(process table),每个进程占用一个进程表项(这些表项也称为进程控制块)
该表存放了进程状态的重要信息:程序计数器、堆栈指针、内存分配状况、所有打开文件的状态、帐号和调度信息,以及其他在进程由运行态转为就绪态或阻塞态时,必须保存的信息,从而保证该进程在再次启动时,就像从未被中断过一样。
以上是关于进程理论的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 多处理进程中运行较慢的 OpenCV 代码片段