Python并发编程之进程理论

news/2024/11/8 3:13:46/

前言

本文将详细介绍进程相关概念。

进程和程序

计算机上的未运行的QQ、Wechat等都属于程序,但是一旦当这些程序运行起来的话,就可以被称为进程。因此可以如下定义程序和进程:

程序:就是存在硬盘上的一堆代码。

进程:就是正在运行的程序。

程序就是一堆代码的集合,本身并没有任何意义,就是一堆静态文件,进程是程序的执行过程,是一个动态的过程,程序可以作为数据长期存在与硬盘上,但是进程是有一定生命周期的,因此程序是永久的,进程是暂时的。

同样一个程序运行两次,就会在操作系统中出现两个进程,虽然是同一个软件程序,但是可以做不同的事情,比如打开两个QQ,一个可以登陆自己的账号,另一个可以登陆男朋友的账号---查岗(O(∩_∩)O哈哈~),但是这两个进程之间是互不影响的。

进程调度算法

如果想要多个进程交替进行,操作系统就必须对这些进程进行调度,这种调度并不是随机的,而需要遵循一定的法则,由此就有了进程的调度算法。

先来先服务(FCFS)调度算法

用户首先执行哪个任务,这个任务就会一直占用CPU直至这个程序运行结束,后面想要执行的任务必须等上一个任务运行完成。这种算法对于长作业比较有利,对短作业就没有那么友好了。

短作业优先调度算法

哪个任务运行的时间短CPU就先运行哪个程序,但对长作业不利,不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。

时间片轮转法 & 多级反馈队列

时间片轮转的基本思路基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例。在时间片轮转法中,需要将CPU的处理时间分成固定大小的时间片,例如,几十毫秒至几百毫秒。如果一个进程在被调度选中之后用完了系统规定的时间片,但又未完成要求的任务,则它自行释放自己所占有的CPU而重新排队,等待下一次调度。同时,进程调度程序又去调度当前队列中的第一个进程。

前面介绍的各种用作进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程,而且如果并未指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。 而多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。在采用多级反馈队列调度算法的系统中,调度算法的实施过程如下图所述。

并发 & 并行

我们知道如果想让一个服务端同时对不同的客户端进行服务,该服务端就需要并发处理多个客户端的不同请求,而并发的核心就是单核CPU实现并发,并发的概念马上就会介绍哦。

并行 & 并发

无论是并行还是并发,在用户看来都是同时运行的,比如计算机上同时运行QQ、微信、浏览器等,真正干活的是CPU,一个CPU同时只能执行一个任务。

并行:是指两个或者多个任务同时执行,比如鸣人有分身术,做饭和洗衣服两个任务可以同时执行,并行需要多个CPU。

并发:是伪并行,在资源有限比如只有单核的CPU的情况下,实现看起来是同时运行的效果,单核CPU + 多道技术就可以实现并发。

单道技术 & 多道技术

单道技术就是一个程序执行完毕才会执行下一个程序,如下图所示:

多道技术就是针对单核CPU实现并发,现在的主机一般是多核,那么每个核都会利用多道技术。内存中同时存入多道(多个)程序,cpu从一个进程快速切换到另外一个,使每个进程各自运行几十或几百毫秒,这样,虽然在某一个瞬间,一个cpu只能执行一个任务,但在1秒内,cpu却可以运行多个进程,这就给人产生了并行的错觉,即伪并发,以此来区分多处理器操作系统的真正硬件并行(多个cpu共享同一个物理内存)。因此多道技术就是CPU切换执行任务并保存任务执行状态。

进程运行的状态

一般说来,一个进程并不是自始至终连续不停地运行的,它与并发执行中的其他进程的执行相互制约。在一个进程的活动期间至少具备三种基本状态,即运行状态、就绪状态、阻塞状态。

1.当进程被创建完成并初始化后,会变成就绪状态。

2.处于就绪状态的进程被操作系统的进程调度器选中后,就分配给 CPU 正式运行该进程,进入运行状态;

3.当进程已经运行完成或出错时,会被操作系统作结束状态处理;

4.处于运行状态的进程在运行过程中,由于分配给它的运行时间片用完,操作系统会把该进程变为就绪态,接着从就绪态选中另外一个进程运行;

5.当进程请求某个事件且必须等待时,例如请求 I/O 事件的时候就会从运行状态变为阻塞状态;

6.当进程等待的事件完成的时候,就会从阻塞状态变成就绪态

同步 | 异步 & 阻塞 | 非阻塞

同步和异步描述的是任务的提交方式。

同步:任务提交之后,原地等待任务的返回结果,等待过程中不做任何事情,就是干等,程序层面上表现出来的就是卡住了,比如你去吃饭点了菜之后,就站在那等老板把菜给你端来....

异步:任务提交之后,不原地等待任务的返回结果,直接去做其他事情。比如去吃饭点了菜,老板给了你号码牌,等做好了,老板会喊你,不必站在那等菜做好。

阻塞和非阻塞描述的是程序的运行状态。阻塞和非阻塞这两个概念与程序等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。

还拿上述点菜的例子来说,在等待菜做好的过程中,有的人就是干巴巴的等,什么也不做,这种机制就是阻塞态,表现在程序中就是程序一直阻塞在函数调用的地方无法继续执行;另外有些人在等上菜时会边打游戏边等,这样的状态就是非阻塞态。

同步阻塞形式的程序是效率最低的,拿上面的例子来说,就是你专心排队,什么别的事都不做。

异步阻塞状态,拿上面的例子来说就是拿着号码牌什么都不做。

同步非阻塞,实际效率也不高,以上面例子的来说就是站在那等菜顺便玩个游戏。

异步非阻塞是效率最高的,打游戏是你的事情,通知你拿菜的是老板的事情,再比如说这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉服务员说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。

很多人会把同步和阻塞混淆,是因为很多时候同步操作会以阻塞的形式表现出来,同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO操作处被阻塞


http://www.ppmy.cn/news/64103.html

相关文章

pytest+allure实现接口自动化框架(1、yml管理case 2、变量的处理 3、参数的传递 4、相互依赖接口的处理)

目录 前言: 1.1 源码: 1.2 实现功能 1.3 yml管理case功能 框架详细介绍: 一、使用git远程连接&上传&下载项目 1.1 用户权限问题:本地生成密钥,gitlab后台端绑定公钥 1.1.1 本地生成密钥 1.2 项目里没有…

scratch绘制直尺 中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析2023年3月

目录 scratch绘制直尺 一、题目要求 1、准备工作 2、功能实现 二、案例分析

QT中的模态对话框及非模态对话框

QT中的模态对话框及非模态对话框 [1] QT中的模态对话框及非模态对话框[2] Qt工作笔记-主界面往模式对话框emit信号,有注意的问题正常情况下:不正常情况下:下面给出正常情况下的代码: [1] QT中的模态对话框及非模态对话框 原文链接…

web前端 --- CSS(02) -- 样式修饰

CSS本质是用来修饰HTML标签的 常用CSS属性 (1)字体及文本属性 文字相关效果 属性含义font字体及其属性(复合属性,不建议直接使用)font-family设置文本字体,电脑中存在字体font-size字体大小font-weight字…

gazebo仿真

常用的仿真器 nvidia 场景非常真实,收费 物理仿真比较好,渲染差一点 为什么用仿真器,因为比较穷 gazebo与ros集成的比较好,有很多插件,机器人开发 刚体仿真器 ode 安装gazebo ros自带 机器人算法开发与验证 打开…

【EKF】卡尔曼滤波原理

前言 本篇是最近在学习云台以及姿态融合时,想学习一下卡尔曼滤波的原理,基于 DR_CAN 老师的卡尔曼滤波的视频做的笔记,基本上是按照 DR_CAN 老师的思路自己推导计算了一遍,推荐还是看一下原视频,讲解得很不错&#xf…

代码随想录算法训练营第三十四天 | 加油站题、左右贪心

1005. K次取反后最大化的数组和 文档讲解:代码随想录 (programmercarl.com) 视频讲解:贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和_哔哩哔哩_bilibili 状态:能做出…

C++语言练习题位运算

位运算(01)基础 位运算(02)从一个 16 位的单元中取出某几位 题目描述 从一个 16 位的单元中取出某几位(即该几位保留原值,其余位为 0. 使用 value 存放该 16 位的数,n1 为欲取出的起始位,n2 为欲取出的结束位。&#xff…