day38 并发编程(理论)
一、操作系统发展史
参考博客即可:https://www.cnblogs.com/Dominic-Ji/articles/10929381.html
二、多道技术
1 单核实现并发的效果
并发
看起来像是同时运行的可以称之为并发
并行
真正意义上的同时执行
总结:
并行肯定是并发
单核的计算机不能实现并行,但是可以实现并发
补充:我们直接假设单核就是一个核,干活的就一个人,不要考虑cpu里面的内核数
2 多道技术图解
3 多道技术重点
- 空间上的复用
- 多个程序共用一套计算机硬件
- 时间上的复用
只需要做时间长的那个,可以节省切换时间
保存状态,用户态和内核态的切换
切换+保存状态
切换(CPU)分为两种情况
1.当一个程序遇到IO操作的时候,操作系统会剥夺该程序的CPU执行权限
作用:提高了CPU的利用率 并且也不影响程序的执行效率
原因:在io延迟的时候程序对cup没有任何执行的空间,所以剥夺了也不会影响程序运行
2.当一个程序长时间占用CPU的时候,操作吸引也会剥夺该程序的CPU执行权限
弊端:降低了程序的执行效率(原本时间+切换时间)
三、进程理论
1 必备知识点
'''
程序和进程的区别
程序是一堆躺在硬盘上的代码,是‘死’的
进程则是表示正在执行的过程,是‘活’的
'''
2 进程调度
- 先来先服务调度算法
- 对执行时间长的作业有利,对短作业无益。
- 因为一个长作业先到的话,后面一个短作业就得等长作业执行完毕才能把cup空间空给短作业
- 短作业优先算法
- 对短作业优先
- 如果一个长作业正在运行,来了一个短作业,这时候会先暂停长作业,把短作业运行完毕后回到长作业继续执行
- 时间片轮转法+多级反馈队列
- 不管长作业还是短作业都先放到一个队列中,统一执行一个规定的单位时间
- 如果没在规定时间执行完,会掉入第二优先级队列,再执行一个较长的单位时间
- 此时来了一个作业会直接暂停第二梯队去执行第一梯队的工作
- 总结:活用了切换和保存状态,优化了不同大小作业的执行效率
3 进程的三状态
在了解其他概念之前,我们首先要了解进程的几个状态。在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。
(1)就绪(Ready)状态
当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
(2)执行/运行(Running)
状态当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
(3)阻塞(Blocked)状态
正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
4 两对重要概念
描述的是任务提交的方式
- 同步
- 解释:任务提交之后,在原地等待任务的返回结果,等待的过程中不去做任何事情,看上去像是程序卡住了
- 异步
- 解释:任务提交之后,不等待任务的返回结果,直接去做别的事情
- 任务的返回结果会有一个异步回调机制自动处理
就像要把一份作业交给老师批改,小红交给老师了,站在原地等老师批改完,小红的行为叫做同步。而小李交给老师后就跑去完了,这种行为叫做异步。
描述的是程序运行的状态
- 阻塞(阻塞态)
- 是我们程序运行基本都会遇到的状态,等待io操作
- 非阻塞(就绪态,运行态)
- 是我们程序运行的理想状态,只在就绪态和运行态之间切换,减少io延迟
四、开启进程的两种方式
# 方式一
from multiprocessing import Process
import time
def task(name):
print(f'{name} is running')
time.sleep(3)
print(f'{name} is over')
if __name__ == '__main__':
p = Process(target=task, args=('hz',))
p.start()
print('^(* ̄(oo) ̄)^')
# 方式二 类的继承
from multiprocessing import Process
import time
class MyProcess(Process):
def run(self):
print('hell 1')
time.sleep(3)
print('hello 2')
if __name__ == '__main__':
p = MyProcess()
p.start()
print('^(* ̄(oo) ̄)^')
总结
"""
创建进程就是在内存中申请一块内存空间将需要运行的代码丢进去
一个进程对应在内存中就是一块独立的内存空间
多个进程对应在内存中就是多块独立的内存空间
进程与进程之间数据默认情况下是无法直接交互,如果想交互可以借助于第三方工具、模块
"""
join方法
join是让主进程等待子进程代码运行结束之后,再继续运行。不影响其他子进程的执行
具体使用:在进程开始后,进程对象.join()
进程之间的数据相互隔离
from multiprocessing import Process
import time
a = 100
def task(name):
print(f'{name} is running')
time.sleep(3)
global a
a = 101
print(a)
print(f'{name} is over')
if __name__ == '__main__':
p = Process(target=task, args=('hz',))
p.start()
print(a)
p.join()
print('^(* ̄(oo) ̄)^')
'''
day38 并发编程(理论)的更多相关文章
- Python并发编程理论篇
Python并发编程理论篇 前言 其实关于Python的并发编程是比较难写的一章,因为涉及到的知识很复杂并且理论偏多,所以在这里我尽量的用一些非常简明的语言来尽可能的将它描述清楚,在学习之前首先要记住 ...
- python学习之并发编程(理论部分)
第一章 操作系统 管理控制协调计算机中硬件与软件的关系. 操作系统的作用? 第一个作用: 将一些对硬件操作的复杂丑陋的接口,变成简单美丽的接口. open函数. 第二个作用: 多个进程抢占一个(CPU ...
- python之并发编程初级篇8
一.进程理论 1)进程介绍 .什么是进程 一个正在进行的过程,或者说是一个程序的运行过程 其实进程是对正在运行的程序的一种抽象/概括的说法 进程的概念起源操作系统,进程是操作最核心的概念之一 操作系统 ...
- Python开发【第九篇】: 并发编程
内容概要 操作系统介绍 进程 线程 协程 二. 进程 python并发编程之多进程理论部分 在python程序中的进程操作 运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...
- Java 并发编程:核心理论
并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这样才能写出高效.安全.可靠的多线程并发程序.本系 ...
- [Java并发编程(四)] Java volatile 的理论实践
[Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ...
- 【转】Java 并发编程:核心理论
并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这样才能写出高效.安全.可靠的多线程并发程序.本系 ...
- (转)Java并发编程:核心理论
原文链接:https://www.cnblogs.com/paddix/p/5374810.html Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及 ...
- Java 并发编程:核心理论(一)
前言......... 并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这样才能写出高效.安全.可 ...
随机推荐
- mysql导入超大sql文件
mysql导入超大sql文件 在网上找了个2017年行政区划的sql文件,需要导入到本地mysql库中,同事使用navicat导入的时候直接卡死了,该SQL文件差不多112MB大小.通过百度.goog ...
- 如何在微信小程序中使用阿里字体图标
第一步:下载需要的字体图标 进入阿里图标官网http://iconfont.cn/搜索自己想要的图标. 如这里需要一个购物车的图标,流程为: 搜索“购物车”图标 ---> 点击“添加入库” ...
- Python使用wxpy模块实现微信两两群组消息同步
python使用wxpy模块提供的微信API接口实现两两群组的消息同步 安装模块: pip install wxpy 注意:需要同步的微信群需要保存到通讯录中 以下是自己闲来无事写的代码,暂时还存在以 ...
- EIGRP-10-弥散更新算法-计算距离,报告距离,可行距离和可行性条件
对于某个目的网络,EIGRP持续关注它的各种距离参数.EIGRP使用复合度量参数,不过为了简化,这里使用一个没有单位的数值.同样出于简化,这里的EIGRP路由器都不使用水平分割.
- 在CentOS8下利用seafile软件搭建私有云
一.安装前准备工作 1. 安装EPEL源 EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用 ...
- Shiro反序列化复现
Shiro反序列化复现 ——————环境准备—————— 目标靶机:10.11.10.108 //docker环境 攻击机ip:无所谓 vpsip:192.168.14.222 //和靶机ip可通 1 ...
- css方法1(清除ul边距间隙,两端对齐,字母大写,首字放大)
一.清除ul自带左边间距 ul{ margin:; padding:; } 二.ul li 与li 之间隙 1.ul 设置font-size:0 ; 子li 设置字体大小 2.把li写到一起,不换行 ...
- fatal error C1083: Cannot open include file: '_defs.h': No such file or directory
b-PAC SDK: https://www.baidu.com/link?url=p6FcG0fvFl6XJf9QdSFLBP16eaS03jOQsdr0zd8cYprHWwqVy5t53bzMrA ...
- git 的使用:
git 的官方网址是: https://git-scm.com/downloads github 的官方网址: https://github.com/ git 的原理图: git 和 github ...
- 1.尚硅谷_MyBatis_简介.avi
hibernate旨在消除mysql语句.程序员不写sql语言,要实现复杂的功能需要学习hibernate的hql语句 mybatis把编写sql语言交给程序员,程序员自己在xml控制sql语句的编写 ...