【并发小知识】

计算机五大组成部分


控制器

运算器

存储器

输入设备

输出设备

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

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

操作系统发展史


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

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

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

多道技术


单核实现并发的效果

必备知识点
  • 并发

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

  • 并行

    真正意义生的同时执行

ps:

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

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

多道技术图解

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

  • 单道(串行)

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

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

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

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

多道技术重点知识

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

  • 空间上的复用

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

  • 时间上的复用

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

    切换+保存状态

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

进程理论


必备知识点

程序与进程的区别

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

    python 复制代码
    """对长作业有利,对短作业无利"""
  • 短作业优先调度算法

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

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

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

两对重要概念
  • 同步和异步

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

    python 复制代码
    """描述的程序的运行状态"""
    阻塞:阻塞态
    非阻塞:就绪态, 运行态

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

开启进程的两种方式


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

join方法
python 复制代码
from multiprocessing import Process
import time


def 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中则是直接将代码完整的拷贝一份
"""
进程间数据相互隔离
python 复制代码
from multiprocessing import Process

money = 100


def task():
    global money  # 局部修改全局
    money = 666
    print('子', money)


if __name__ == '__main__':
    p = Process(target=task)
    p.start()
    p.join()
    print(money)

昨日回顾


  • 操作系统的发展史

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

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

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

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

    • 同步与异步

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

      python 复制代码
      """程序运行的状态"""
      阻塞:阻塞态
      非阻塞:就绪态, 运行态

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

  • 开启进程的两种方式

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

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

相关推荐
寻星探路1 天前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
崔庆才丨静觅1 天前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60611 天前
完成前端时间处理的另一块版图
前端·github·web components
掘了1 天前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅1 天前
实用免费的 Short URL 短链接 API 对接说明
前端
ValhallaCoder1 天前
hot100-二叉树I
数据结构·python·算法·二叉树
崔庆才丨静觅1 天前
5分钟快速搭建 AI 平台并用它赚钱!
前端
七夜zippoe1 天前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥1 天前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
猫头虎1 天前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven