【一】什么是进程
【1】进程概念
- 正在进行的一个过程或者说一个任务
- 而负责执行任务则是cpu
- 进程其实就是一个正在运行的程序
【2】单任务
-
单核+多道,实现多个进程的并发执行
-
同一时刻只能做一个任务(cpu同一时间只能干一个活)
【3】多任务
- 同一时刻可以做多个任务
【二】程序和进程的区别
- 程序仅仅只是一堆代码而已
- 而进程指的是程序的运行过程
【三】进程的调度问题
【1】先来先服务算法
- 该算法既可用于作业调度,也可用于进程调度
- FCFS算法比较有利于长作业,而不利于短作业
- 由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业
【2】短作业优先调度算法
-
短作业优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法
-
该算法既可用于作业调度,也可用于进程调度
-
但其对长作业不利,不能保证紧迫性作业被及时处理,作业的长短只是被估算出来的
【3】时间片轮转法
-
时间片轮转法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例
-
由于作业调度是对除了CPU之外的所有系统硬件资源的分配,其中包含有不可抢占资源,所以作业调度不使用轮转法
-
在轮转法中,时间片长度的选取非常重要
-
时间片长度的选择是根据系统对响应时间的要求和就绪队列中所允许最大的进程数来确定的
【4】多级反馈队列
-
前面介绍的各种用作进程调度的算法都有一定的局限性
-
- 如短进程优先的调度算法,仅照顾了短进程而忽略了长进程,而且如果并未指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用
-
而多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法
-
调度算法的实施过程:
- 为多个就绪队列设置优先级
- 新进程等待调用
- 按顺序调度队列
【四】并发与并行
【1】并发
- 是伪并行,即看起来是同时运行。
- 单个cpu+多道技术就可以实现并发,并行也属于并发
【2】并行
- 多个任务同时运行,只有具备多个cpu才能实现并行
【3】多道技术
- 内存中同时存入多道(多个)程序
- cpu从一个进程快速切换到另外一个
- 使每个进程各自运行几十或几百毫秒
- 这样,虽然在某一个瞬间
- 一个cpu只能执行一个任务
- 但在1秒内,cpu却可以运行多个进程
- 这就给人产生了并行的错觉,即伪并发
- 以此来区分多处理器操作系统的真正硬件并行(多个cpu共享同一个物理内存)
【4】总结
- 并行肯定算并发
- 单核的计算机肯定不能实现并行,但是可以实现并发。
【五】同步/异步&阻塞/非阻塞
【1】同步
-
在进行一个程序执行之后,必须等待当前程序执行完成才能继续下一个任务
-
所谓同步就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回
【2】异步
-
在进行一个程序执行之后,没等待当前程序执行完成就能继续下一个任务
-
异步就是当一个异步功能调用发出后,调用者不能立刻得到结果,当该异步功能完成后,通过状态、通知或回调来通知调用者
【3】阻塞
- 阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)
- 函数只有在得到结果之后才会将阻塞的线程激活
(1)同步调用
- apply一个累计1亿次的任务,该调用会一直等待,直到任务返回结果为止,但并未阻塞住(即便是被抢走cpu的执行权限,那也是处于就绪态)
(2)阻塞调用
- 当socket工作在阻塞模式的时候,如果没有数据的情况下调用recv函数,则当前线程就会被挂起,直到有数据为止
【4】非阻塞
- 指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程
【5】小结
(1)同步/异步
-
同步与异步针对的是函数/任务的调用方式
-
同步就是当一个进程发起一个函数(任务)调用的时候
-
- 一直等到函数(任务)完成,而进程继续处于激活状态。
-
而异步情况下是当一个进程发起一个函数(任务)调用的时候
-
- 不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。
(2)阻塞/非阻塞
- 阻塞与非阻塞针对的是进程或线程
- 阻塞是当请求不能满足的时候就将进程挂起
- 而非阻塞则不会阻塞当前进程
【六】进程的创建
-
只要有操作系统,就有进程的概念,就需要有创建进程的方式
-
需要有系统运行过程中创建或撤销进程的能力
-
创建进程是指启动某一个应用程序,撤销进程是指杀死指定的应用程序
【1】通用系统创建新进程的4种形式
(1)系统初始化
- 查看进程linux中用ps命令,windows中用任务管理器
- 前台进程负责与用户交互,后台运行的进程与用户无关
- 运行在后台并且只在需要时才唤醒的进程,称为守护进程
(2)进程中开启子进程
-
一个进程在运行过程中开启了子进程
-
- 如nginx开启多进程 ---> os.fork --> subprocess.Popen
(3)交互式请求
- 用户的交互式请求,创建一个新进程(如用户双击暴风影音)
(4)批处理作业的初始化
- 一个批处理作业的初始化,只在大型机的批处理系统中应用
【2】不同系统的新进程的创建方式
(1)UNIX
- 在UNIX中该系统调用是:fork,fork会创建一个与父进程一模一样的副本
- 二者有相同的存储映像、同样的环境字符串和同样的打开文件,在shell解释器进程中,执行一个命令就会创建一个子进程
(2)Windows
- 在windows中该系统调用是:CreateProcess,CreateProcess既处理进程的创建,也负责把正确的程序装入新进程。
【七】进程的终止
【1】正常退出
- 正常退出属于自愿退出程序,如程序执行完毕调用发起系统调用正常退出
- 在 Linux 中用 exit,在 Windows 中用 ExitProcess
【2】出错退出
- 出错退出也属于自愿退出程序,在程序执行过程中发生错误,导致程序退出。
【3】严重错误
- 属于非自愿退出程序,执行非法指令,如引用不存在的内存,1/0等,可以捕捉异常
- try…except…
【4】被其他进程杀死
- 属于非自愿退出程序,如使用命令 kill -9 在 Linux 中强制终止进程。
【九】进程的状态
【1】什么是进程的状态
- 进程状态反映进程执行过程的变化,这些状态随着进程的执行和外界条件的变化而转换。
【2】三态模型
-
运行态:已经在使用过程中的状态
-
就绪态:双击应用程序启动的过程中
-
阻塞态:上传文件需要读取文件数据的过程
【3】五态模型
- 新建态:双击应用程序启动的过程中 --- 双击 LOL图标
- 终止态:应用程序已经准备好了 --- 进入到 LOL客户端
- 运行态:应用程序正在执行 --- 正在打游戏
- 就绪态:应用处于等待状态 --- 正在匹配队友
- 阻塞态:应用程序结束 --- 主动将LOL退出