当前位置: 首页 > news >正文

【并发小知识】

计算机五大组成部分


控制器

运算器

存储器

输入设备

输出设备

计算机的核心真正干活的是CPU(控制器+运算器=中央处理器)

  • 程序要想计算机运行,它的代码必须要先由硬盘读到内存,之后cpu取指再执行

操作系统发展史


穿孔卡片处理系统:一个人占一个机房,输入卡片

联机批处理系统:(磁带)节省插入卡片的等待的时间,提升了CPU处理时间。

脱机批处理系统:输入机(硬盘) --> 卫星机 --> 高速磁带(内存)—> 主机,CPU运行的速度是非常快的,而数据从硬盘读取到内存速度相对来说是非常慢的。

多道技术


单核实现并发的效果

必备知识点
  • 并发

    看起来像同时运行的就可以称之为并发

  • 并行

    真正意义生的同时执行

ps:

  • 并行肯定算并发
  • 单核的计算机肯定不能实现并行,但是可以实现并发!!!

补充:我们直接假设单核就是一个核,干活的就是一个人。

多道技术图解

节省了多个程序运行的总耗时

  • 单道(串行)

    任务A: 输入过程 - 执行过程 - 输出过程 - 任务B:输入过程 - 执行过程 - 输出过程

  • 多道(在执行任务A的时候控制硬盘将任务B提前读取到内存) 时间线短了,节省了时间

    任务A输入过程 ----- 执行过程 ----- 输出过程

​ 任务B输入过程 -----执行过程 ------输出过程

多道技术重点知识

空间上的复用与时间上的复用

  • 空间上的复用

    多个程序公用一套计算机硬件

  • 时间上的复用

    例子:洗衣服30s, 做饭50s, 烧水30s

    切换+保存状态

    """
    切换(cpu)分为两种情况1.当一个程序遇到 IO操作时候,操作系统会剥夺该程序的cpu执行权限.作用:提高了cpu的利用率,并且也不影响程序的执行效率2.当一个程序长时间占用cup的时候,操作系统也会剥夺该程序的cpu执行权限.作用:降低了程序的执行效率(原本时间+切换时间)
    """
    

进程理论


必备知识点

程序与进程的区别

"""
程序就是一堆躺在硬盘上的代码,是"死"的
进程则表达程序正在执行的过程,是"活"的
"""
进程调度
  • 选来先服务调度算法

    """对长作业有利,对短作业无利"""
    
  • 短作业优先调度算法

    """对短作业有利,对长作业无利"""
    
  • 时间片轮转法+多级反馈队列

    """"
    时间片:将固定的时间切分成N多份,每一份就表示一个时间片
    越往下说明该任务需要的时间越长
    越往下任务的执行优先级越低(当第一队里中出现了新的任务,cpu会立刻停止当前任务,去执行新添加进来的第一层队列中的任务)在Linux中可以给任务设置优先级,一次性分配好几个时间片(了解)
    """"
    
    进程运行的三状转换图

    所有的程序要想被执行必须先经历就绪状态

    image-20240528144525897
两对重要概念
  • 同步和异步

    """描述的是任务的提交方式"""
    同步:任务提交之后,原地等待任务的返回结果,等待的过程中不做任何事(干等)程序层面上表现出来的感觉就是卡住了异步:任务提交之后,不原地等待任务的返回结果,直接去做其他事情我提交的任务结果如何获取?任务的返回结果会有一个异步回调机制自动处理
    
  • 阻塞非阻塞

    """描述的程序的运行状态"""
    阻塞:阻塞态
    非阻塞:就绪态, 运行态

    上述概念的组合:最高效的一种组合就是异步非阻塞

开启进程的两种方式


定心丸:代码开启进程和线程方式,代码书写基本是一样的.

join方法
from multiprocessing import Process
import timedef task(name,n):print('%s is running' % name)time.sleep(n)print('%s is over' % name)if __name__ == '__main__':# 1.创建一个对象# p1 = Process(target=task, args=('jason', 1))# p2 = Process(target=task, args=('egon', 2))# p3 = Process(target=task, args=('tank', 3))# # 2.开启进程# start_time = time.time()# p1.start()  # 告诉操作系统帮你创建一个进程# p2.start()# p3.start()# p1.join()# p2.join()# p3.join()# print('主',time.time() - start_time)start_time = time.time()p_list = []for i in range(1,4):p = Process(target=task, args=('%s' % i, i))p.start()p_list.append(p)for i in p_list:p.join()print('主', time.time() - start_time)"""
windows操作系统下,创建进程一定要在main内创建
因为Windows下创建进程类似于模块导入方式
会从上往下依次执行代码
linux中则是直接将代码完整的拷贝一份
"""
进程间数据相互隔离
from multiprocessing import Processmoney = 100def task():global money  # 局部修改全局money = 666print('子', money)if __name__ == '__main__':p = Process(target=task)p.start()p.join()print(money)

昨日回顾


  • 操作系统的发展史

    """其实主要就是围绕cpu的利用率问题"""
    
  • 多道技术

    """
    单核实现并发的效果并发:看起来像是同时运行的就可以叫做并发
    并行:真正意义上的同时运行空间和时间上的复用	空间上多个程序公用一套计算机硬件时间上切换+保存状态
    """
    # 切换分为两种
    # 1.当一个程序遇到IO操作,操作系统会立刻剥夺该程序的执行权限(提高了cpu的利用率,并且不影响程序的执行效果)
    # 2.当一个程序长时间占用cpu,操作系统会立刻剥夺该程序的执行权限(降低了程序的运行效率,但是玩出了并发的效果)
    
  • 进程

    """
    程序:就是一堆死代码
    进程:程序正在执行的过程
    """# 进程的调度算法
    """
    先来先服务调度算法
    短作业优先调度算法
    时间片轮转法+多级反馈队列
    """
    
  • 进程运行的三状态图

    """
    就绪态:一切程序必须要先经过就绪态,才能进入运行态
    运行态:正在被cpu执行
    阻塞态:程序遇到IO操作了理想:我们希望我们开发的程序一直处于就绪态和运行态之间
    """
    
  • 两对重要概念

    • 同步与异步

      """任务的提交方式"""
      同步任务提交之后原地等待返回结果期间不做任何事情
      异步任务提交之后不原地等待返回结果执行下一行代码结果由异步回调机制做处理
      
    • 阻塞与非阻塞

      """程序运行的状态"""
      阻塞:阻塞态
      非阻塞:就绪态, 运行态
      

      上面的两对概念通常组合出现,但是最常用的就是异步非阻塞

  • 开启进程的两种方式

    """参考之前的代码"""
    
  • join方法

    """主进程等待子进程代码运行完毕后再往下执行代码"""
    
  • 进程间数据是相互隔离的

相关文章:

  • Redis 中 List 数据结构详解
  • 2023、2024国赛web复现wp
  • 【vue】el-select选择器实现宽度自适应
  • Py列表(list)
  • 2024/5/28 P1247 取火柴游戏
  • 【Linux学习】进程间通信 (3) —— System V (1)
  • pygame raycasting纹理
  • 整理好了!2024年最常见 20 道 Rocket MQ面试题(一)
  • JavaScript面试 题
  • JavaScript与版本控制:编译时光机的双重奏——git仓库
  • redis基本数据结构与应用
  • 【vue-1】vue入门—创建一个vue应用
  • vue+echart :点击趋势图中的某一点或是柱状图,出现弹窗,并传输数据
  • 淘宝扭蛋机小程序:探索未知,扭出惊喜
  • (C11) 泛型表达式
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • bootstrap创建登录注册页面
  • DOM的那些事
  • E-HPC支持多队列管理和自动伸缩
  • IDEA常用插件整理
  • Java精华积累:初学者都应该搞懂的问题
  • MySQL主从复制读写分离及奇怪的问题
  • Python 基础起步 (十) 什么叫函数?
  • SOFAMosn配置模型
  • Twitter赢在开放,三年创造奇迹
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 简单数学运算程序(不定期更新)
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何优雅地使用 Sublime Text
  • 删除表内多余的重复数据
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​力扣解法汇总946-验证栈序列
  • ​业务双活的数据切换思路设计(下)
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • ## 基础知识
  • #HarmonyOS:Web组件的使用
  • #include
  • (03)光刻——半导体电路的绘制
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (备份) esp32 GPIO
  • (二)原生js案例之数码时钟计时
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)插入排序
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .net core 6 集成和使用 mongodb
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。