当前位置: 首页 > 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方法

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

相关文章:

【并发小知识】

计算机五大组成部分 控制器 运算器 存储器 输入设备 输出设备 计算机的核心真正干活的是CPU(控制器运算器中央处理器) 程序要想计算机运行,它的代码必须要先由硬盘读到内存,之后cpu取指再执行 操作系统发展史 穿孔卡片处理…...

python将多个音频文件与一张图片合成视频

代码中m4a可以换成mp3,图片和音频放同一目录,图片名image.jpg,多线程max_workers可以根据CPU核心数量修改。 import os import subprocess import sys import concurrent.futures import ffmpeg def get_media_duration(media_path): probe ffmp…...

JavaEE:Servlet创建和使用及生命周期介绍

目录 ▐ Servlet概述 ▐ Servlet的创建和使用 ▐ Servlet中方法介绍 ▐ Servlet的生命周期 ▐ Servlet概述 • Servlet是Server Applet的简称,意思是 用Java编写的服务器端的程序,Servlet被部署在服务器中,而服务器负责管理并调用Servle…...

【Python设计模式15】适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而无法一起工作的类能够一起工作。通过使用适配器模式,可以使得现有的类能够适应新的接口需…...

【Python设计模式05】装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类来包裹原始类,从而在不修改原始类代码的情况下扩展对象的功能。 装饰模式的结构…...

kafka 消费模式基础架构

kafka 消费模式 &基础架构 目录概述需求: 设计思路实现思路分析1.kafka 消费模式基础架构基础架构2: 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,…...

nginx安装部署问题

记一次nginx启动报错问题处理 问题1 内网部署nginx,开始执行make,执行不了,后面装了依赖的环境 yum install gcc-c 和 yum install -y pcre pcre-devel 问题2,启动nginx报错 解决nginx: [emerg] unknown directive “stream“ in…...

揭开Java序列化的神秘面纱(上)Serializable使用详解

Java序列化(Serialization)作为一项核心技术,在Java应用程序的多个领域都有着广泛的应用。无论是通过网络进行对象传输,还是实现对象的持久化存储,序列化都扮演着关键的角色。然而,这个看似简单的概念蕴含着丰富的原理和用法细节&…...

深度学习——自己的训练集——图像分类(CNN)

图像分类 1.导入必要的库2.指定图像和标签文件夹路径3.获取文件夹内的所有图像文件名4.获取classes.txt文件中的所有标签5.初始化一个字典来存储图片名和对应的标签6.遍历每个图片名的.txt文件7.随机选择一张图片进行展示8.构建图像的完整路径9.加载图像10.检查图像是否为空 随…...

goimghdr,一个有趣的 Python 库!

更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - goimghdr。 Github地址:https://github.com/corona10/goimghdr 在图像处理和分析过程中,识别图像文件的类型是一个常见的需求。Python自带的imghdr…...

每小时电量的计算sql

计算思路,把每小时的电表最大记录取出来,然后用当前小时的最大值减去上个小时的最大值即可。 使用了MYSQL8窗口函数进行计算。 SELECT b.*,b.epimp - b.lastEmimp ecValue FROM ( SELECT a.deviceId,a.ctime,a.epimp, lag(epimp) over (ORDER BY a.dev…...

自动化您的任务——crewAI 初学者教程

今天,我写这篇文章是为了分享您开始使用一个非常流行的多智能体框架所需了解的所有信息:crewAI。 我将在这里或那里跳过一些内容,使本教程成为一个精炼的教程,概述帮助您入门的关键概念和要点 今天,我写这篇文章是为了…...

K8s集群中的Pod调度约束亲和性与反亲和性

前言 在 K8s 集群管理中,Pod 的调度约束——亲和性(Affinity)与反亲和性(Anti-Affinity)这两种机制允许管理员精细控制 Pod 在集群内的分布方式,以适应多样化的业务需求和运维策略。本篇将介绍 K8s 集群中…...

kafka之consumer参数auto.offset.reset

Kafka的auto.offset.reset 参数是用于指定消费者在启动时如何处理偏移量(offset)的。这个参数有三个主要的取值:earliest、latest和none。 earliest: 当各分区下有已提交的offset时,从提交的offset开始消费&#xff1b…...

回答篇二:测试开发高频面试题目

引用之前文章:测试开发高频面试题目 本篇文章是回答篇(持续更新中) 1. 在测试开发中使用哪些自动化测试工具和框架?介绍一下你对其中一个工具或框架的经验。 a. 测试中经常是用的自动化测试工具和框架有Selenium、Pytest、Postman…...

React18 apexcharts数据可视化之甜甜圈图

03 甜甜圈图 apexcharts数据可视化之甜甜圈图。 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式: 基本甜甜圈图个性图案的甜甜圈图渐变色的甜甜圈图 面包圈 import ApexChart from react-apexcharts;export function DonutUpdate() {// 数据…...

如何通过OpenHarmony的音频模块实现录音变速功能?

简介 OpenAtom OpenHarmony(以下简称“OpenHarmony”)是由开放原子开源基金会孵化及运营的开源项目,是面向全场景、全连接、全智能时代的智能物联网操作系统。 多媒体子系统是OpenHarmony系统中的核心子系统,为系统提供了相机、…...

探索 Rust 语言的精髓:深入 Rust 标准库

探索 Rust 语言的精髓:深入 Rust 标准库 Rust,这门现代编程语言以其内存安全、并发性和性能优势而闻名。它不仅在系统编程领域展现出强大的能力,也越来越多地被应用于WebAssembly、嵌入式系统、分布式服务等众多领域。Rust 的成功&#xff0…...

Log360:护航安全,远离暗网风险

暗网有时候就像是一个神秘的地下世界,是互联网的隐蔽角落,没有任何规则。这是一个被盗数据交易、网络犯罪分子策划下一步攻击的地方。但仅仅因为它黑暗,不意味着你要对潜在的威胁视而不见。 暗网 这就是ManageEngine Log360的用武之地&…...

react使用antd警告:Warning: findDOMNode is deprecated in StrictMode.

警告信息: Warning: findDOMNode is deprecated in StrictMode. findDOMNode was passed an instance of DOMWrap which is inside StrictMode. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: htt…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂&#xff…...

Robots.txt 文件

什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...