【一】进程理论
【1】什么是进程
(1)理论
- 正在进行的一个过程或者说一个任务
- 而负责执行任务则是 cpu
(2)单任务
-
一个单独的任务
-
单核 + 多道,实现多个进程的并发执行
-
一段时间段只能做一件事:铺床、吹头发、睡觉(cpu 同一时间只能干一个活)
(3)多任务
- 一段时间可以做很多件事
- 铺会床---》打会游戏 ----》铺会床 ---》打会游戏 ---》睡觉
【二】进程与程序的区别
【1】理论
- 程序仅仅只是一堆代码而已
- 而进程指的是程序的运行过程
【2】示例
-
每个进程拥有各自的程序
-
同一个程序执行两次,那也是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播放西游记,一个可以播放水浒传。
【三】进程间的调度算法
- 要想多个进程交替运行
- 操作系统必须对这些进程进行调度
- 这个调度也不是随即进行的,而是需要遵循一定的法则
- 由此就有了进程的调度算法。
【1】先来先服务算法(FCFS)
- 谁先来的就先让谁做,是一种最简单的调度算法
- 适用场景
- 该算法既可用于作业调度,也可用于进程调度。
- FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。
- 由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。
【2】短作业优先调度算法
- 短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法
- 谁时间短就先执行谁
- 适用场景
- 该算法既可用于作业调度,也可用于进程调度。
- 但其对长作业不利;
- 不能保证紧迫性作业(进程)被及时处理;
- 作业的长短只是被估算出来的。
【3】时间片轮转法
-
时间片轮转(Round Robin,RR)法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例。能够合理分配时间和空间资源。
-
在时间片轮转法中,需要将CPU的处理时间分成固定大小的时间片
- 如果一个进程在被调度选中之后用完了系统规定的时间片,但又未完成要求的任务,则它自行释放自己所占有的CPU而排到就绪队列的末尾,等待下一次调度。
- 同时,进程调度程序又去调度当前就绪队列中的第一个进程。
-
显然,轮转法只能用来调度分配一些可以抢占的资源。并且这些资源可以随时被剥夺并且再分配给别的进程。CPU是可抢占资源的一种。
-
适用场景
- 由于作业调度是对除了CPU之外的所有系统硬件资源的分配,其中包含有不可抢占资源,所以作业调度不使用轮转法。
- 再轮转法中,时间片长度的选取非常重要。
- 首先,时间片长度的选择会直接影响到系统的开销和响应时间。
- 如果时间片长度过短,则调度程序抢占处理机的次数增多。
- 这将使进程上下文切换次数也大大增加,从而加重系统开销。
- 反过来,如果时间片长度选择过长
- 一个时间片能保证就绪队列中所需执行时间最长的进程能执行完毕
- 则轮转法变成了先来先服务法。
【4】多级反馈队列
- 前面介绍的各种用作进程调度的算法都有一定的局限性。
- 如短进程优先的调度算法,仅照顾了短进程而忽略了长进程,而且如果并未指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。
- 而多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。(将你的进程分为几级)
【5】并发和并行
-
无论是并行还是并发,在用户看来都是’同时’运行的
-
- 不管是进程还是线程,都只是一个任务而已
- 真正干活的是cpu,cpu来做这些任务
- 而一个cpu同一时刻只能执行一个任务
-
串行:
- 每个程序依次执行
-
并发:
- 伪并行,看起来是同时在运行,其实是一个 CPU 在不断的切换(多道技术:时间上的复用和空间上的复用)
-
并行:
- 多个任务在同时运行
【6】多道技术
- 内存中同时存入多道(多个)程序
- cpu从一个进程快速切换到另外一个
- 使每个进程各自运行几十或几百毫秒
- 这样,虽然在某一个瞬间
- 一个cpu只能执行一个任务
- 但在1秒内,cpu却可以运行多个进程
- 这就给人产生了并行的错觉,即伪并发
- 以此来区分多处理器操作系统的真正硬件并行(多个cpu共享同一个物理内存)
【7】同步/异步/阻塞/非阻塞
(1)同步
- 在进行一个程序执行之后,必须等待当前程序执行完成才能继续下一个任务
- 程序A运行之后 ---》等待结果 ----》程序B
(2)异步
- 在进行一个程序执行之后,不等待当前程序执行结果如何,继续下一个任务
- 程序A跑起来 ---》 程序B ---》等待A的结果出现 ---》获取A的结果
(3)阻塞
- 调用结果返回之前,当前程序一直会被挂起 IO阻塞
- 函数只有在得到结果之后才会将阻塞的线程激活。
- 有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。
- 对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
(4)非阻塞
-
非阻塞和阻塞的概念相对应
-
- 指在不能立刻得到结果之前也会立刻返回
- 同时该函数不会阻塞当前线程。
【8】总结
(1)同步 | 异步
-
同步与异步针对的是函数/任务的调用方式
-
同步就是当一个进程发起一个函数(任务)调用的时候
-
- 一直等到函数(任务)完成,而进程继续处于激活状态。
-
而异步情况下是当一个进程发起一个函数(任务)调用的时候
-
- 不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。
(2)阻塞 | 非阻塞
- 阻塞与非阻塞针对的是进程或线程
- 阻塞是当请求不能满足的时候就将进程挂起
- 而非阻塞则不会阻塞当前进程
【四】进程的创建(了解)
【1】进程的创建
- 创建和撤销进程的能力
- 创建进程是指启动某一个应用程序
- 撤销进程是指杀死指定的应用程序
# 【1】系统初始化
# Windows里面用的任务管理器
# 随着开机,这些自带的进程也会被启动成功
# 【2】在进程中开设子进程
# 双击腾讯会议就是一个主进程 ---> 需要共享屏幕 --> 开了屏幕共享 子进程
# 【3】交互式请求
# 通过双击应用的快捷方式启动一个主进程
# 桌面上的快捷方式是启动入口
# 【4】批处理作业
# 只会在大型的工厂中
【2】不同系统的新进程的创建方式
(1)Windows:
- 在 Windows 中该系统调用的是:
- CreateProcess, 既处理进程的创建,也负责把正确的程序装入新进程。
(2)linux:
- 内核就是 Unix
- 在 Unix 中该系统调用的是:fork, fork会创建一个与父进程一模一样的副本
【五】进程的终止
【1】正常的退出
- 如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出。
- 在 Linux 中用 exit,在 Windows 中用 ExitProcess
【2】出错退出
- 在程序执行过程中发生错误,导致程序退出。
- python a.py中a.py不存在)
【3】严重错误
- 执行非法指令,如引用不存在的内存,1/0等,可以捕捉异常
- try…except…
【4】被其他进程杀死
- linux:
- kill | pkill 杀死进程
- Windows:
- 任务管理器强制结束进程 ----》通过进程号杀死进程
【六】进程的状态
【1】介绍
- 进程状态反映进程执行过程的变化
- 这些状态随着进程的执行和外界条件的变化而转换。
【2】三态模型
-
在三态模型中,进程状态分为三个基本状态,
-
- 即运行态,
- 就绪态,
- 阻塞态。
【3】五态模型
-
在五态模型中,进程分为
-
- 新建态、
- 终止态,
- 运行态,
- 就绪态,
- 阻塞态。