Loading

进程理论基础

什么是进程

  进程就是一个程序在一个数据集上的一次动态执行过程。是用来描述程序执行过程的虚拟概念。进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统其它所有的概念都是围绕进程来的。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

进程与程序的区别

  程序仅仅只是一堆代码而已,而进程指的是程序的运行过程

  需要强调的是:同一程序执行两次,那也是进程,比如登录QQ,虽然都是同一个软件,但是一个可以视频聊天,一个可以逛空间。

并发和并行

并发:单CPU,多进程并发

  无论是并行还是并发,在用户看来都是 “同时” 运行的,不管是进程还是线程,都只是一个任务而已,真实干活的是 CPU,CPU 来做这些任务,而一个 CPU 同一时刻只能执行一个任务

  并发是伪并行,即看起来是同时运行。单个 CPU + 多道技术就可以实现并发(并行也属于并发)

并行:多CPU(同时运行,只有具有多个cpu才能实现并行)

  单核下,可以利用多道技术,多个核,每个核也都可以利用多道技术(多道技术是针对单核而言的

  有四个核,六个任务,这样同一时间有四个任务被执行,假设分别被分配给了 CPU1,CPU2,CPU3,CPU4,一旦任务 1 遇到 I/O 就被迫中断执行,此时任务 5 就拿到 CPU1 的时间片去执行,这就是单核下的多道技术,而一旦任务 1 的 I/O 结束了,操作系统会重新调用它(需知进程的调度、分配给哪个 CPU 运行,由操作系统说了算),可能被分配给四个 CPU 中的任意一个去执行

  所有现代计算机经常会在同一时间做很多件事,一个用户的PC(无论是单 CPU 还是多CPU),都可以同时运行多个任务(一个任务可以理解为一个进程)。

多道技术:内存中同时存入多道(多个)程序,CPU 从一个进程快速切换到另外一个,使每个进程各自运行几十或几百毫秒,这样,虽然在某一个瞬间,一个 CPU 只能执行一个任务,但在 1 秒内,CPU 却可以运行多个进程,这就给人产生了并行的错觉,即伪并发,以此来区分多处理器操作系统的真正硬件并行(多个 CPU 共享同一个物理内存)

同步和异步

同步执行:一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行

异步执行:一个进程在执行某个任务时,另外一个进程无需等待其执行完毕,就可以继续执行,当有消息返回时,系统会通知后者进行处理,这样可以提高执行效率

举个例子,打电话时就是同步通信,发短息时就是异步通信。

进程的创建

但凡是硬件,都需要有操作系统去管理,只要有操作系统,就有进程的概念,就需要有创建进程的方式,一些操作系统只为一个应用程序设计,比如微波炉中的控制器,一旦启动微波炉,所有的进程都已经存在。而对于通用系统(跑很多应用程序),需要有系统运行过程中创建或撤销进程的能力,主要分为四种形式创建新的进程

   1)系统初始化(查看进程 Linux 中用 ps 命令,Windows 中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且只在需要时才唤醒的进程,称为守护进程,如电子邮件、Web 页面、新闻、打印)

  2)一个进程在运行过程中开启了子进程(如 nginx 开启多进程,os.fork,subprocess.Popen 等)

  3)用户的交互式请求,而创建一个新进程(如用户双击暴风影音)

  4)一个批处理作业的初始化(只在大型机的批处理系统中应用)

无论哪一种,新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的:

  1)在 UNIX 中该系统调用是:fork,fork 会创建一个与父进程一模一样的副本,二者有相同的存储映像、同样的环境字符串和同样的打开文件(在 shell 解释器进程中,执行一个命令就会创建一个子进程)

  2. 在 Windows 中该系统调用是:CreateProcess,CreateProcess 既处理进程的创建,也负责把正确的程序装入新进程。

  关于创建的子进程,UNIX 和 Windows

  1)相同的是:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程的在其地址空间中的修改都不会影响到另外一个进程。

  2)不同的是:在 UNIX 中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于 Windows 系统来说,从一开始父进程与子进程的地址空间就是不同的。

进程的终止

  1、正常退出(自愿,如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在 Linux 中用 exit,在 Windows 中用 ExitProcess)

  2、出错退出(自愿,python a.py 中 a.py 不存在)

  3、严重错误(非自愿,执行非法指令,如引用不存在的内存,1/0 等,可以捕捉异常,try...except...)

  4、被其他进程杀死(非自愿,如 kill -9)

进程的层次结构

无论 UNIX 还是 Windows,进程只有一个父进程,不同的是:

  1)在 UNIX 中所有的进程,都是以 init 进程为根,组成树形结构。父子进程共同组成一个进程组,这样,当从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员。

  2)在 Windows 中,没有进程层次的概念,所有的进程都是地位相同的,唯一类似于进程层次的暗示,是在创建进程时,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程,但是父进程有权把该句柄传给其他子进程,这样就没有层次了。

进程的状态

 

进程并发的现象

  进程并发的实现在于,硬件中断一个正在运行的进程,把此时进程运行的所有状态保存下来,为此,操作系统为每个进程定义了一个数据结构——进程控制块 PCB(Process Control Block)。它是进程实体的一部分,是操作系统中最重要的记录型数据结构。PCB 中记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息。进程控制块的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。或者说,OS 是根据 PCB 来对并发执行的进程进行控制和管理的。PCB 是进程存在的唯一标志。

 

posted @ 2018-11-07 19:15  湫兮  阅读(246)  评论(0编辑  收藏  举报