并发、并行、同步、异步、阻塞、非阻塞

一、多核、多cpu

(一)多核 Multicore
核是CPU最重要的部分。负责运算。核包括控制单元、运算单元、寄存器等单元。
多核就是指单个CPU中有多个核。

(二)多cpu Multiprocessor
多cpu就是一个系统拥有多个CPU。每个CPU可能有单个核,也可能有多个核。

(三)区别
多核CPU和多CPU的区别主要在于性能和成本。
多核CPU性能最好,但成本最高;
多CPU成本小,但性能较差。

二、并发、并行

(一)并发 Concurrency
并发是多个事件在同一时间段内发生,并不是在同一个时刻发生。通过频繁的分时交替运⾏,给⼈的感觉是同时运⾏,因为分时交替运⾏的时间是⾮常短的。比如执行0.001sA,然后暂停A,执行0.001sB,然后暂停B,执行0.001sA,如此反复。

(二)并行 Parallelism
并行是指多个事件在同一时刻发生。比如同时执行A和B。

(三)并发和并行的区别
并发是轮流处理,而并行是同时处理。
并发和并行的区别就是一个人同时吃三个菜和三个人每人吃一个菜;
单核不能并行,只能并发。
多核或者多cpu既能并行,也能并发。

1.并行,但不并发
执行完A才能执行B,但执行A时,其中的各个子任务可以在同一时刻同时执行。
2.并发,但不并行
执行A时,可以突然中断A转去执行B,执行完B后再去执行A。
3.并发且并行
执行A和B时不仅可以互相打断,还可以在同一时刻同时执行A和B。

三、进程、线程、协程

(一)进程 Process
进程是程序的一次执行过程。
每个进程都有⼀个独⽴的内存空间,拥有自己独立的堆和栈,既不共享堆,亦不共享栈。
同一个程序可以执行多次,这样就产生了多个进程,这多个进程都是独立的。类似于一个类产生多个实例。
进程由操作系统调度。
进程可以创建子进程。

(二)线程 Thread
线程是进程中的⼀个执⾏单元,负责当前进程中程序的执⾏,⼀个进程中⾄少有⼀个线程。
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈。
线程亦由操作系统调度。

单线程和多线程
1.单线程
当进程只有一个线程时,就是单线程。
2.多线程
当进程有多个线程时,就是多线程。

(三)协程 Coroutine
协程,又称微线程,纤程。
协程和线程一样共享堆,不共享栈,但协程由程序员调度。同时,协程也无法使用多核。

(四)多线程与多进程的区别
多线程与多进程的目的都是想尽可能的利用CPU资源,减少CPU的空闲时间,特别是多核环境。
多进程:它最大的优点是稳定性高,因为一个子进程崩溃,不会影响其他进程;但创建进程的开销巨大,操作系统能同时运行的进程数也是有限的。
多线程:比多进程快,但是致命缺点是任何一个线程崩溃都造成整个进程的崩溃,因为所有线程共享进程的内存。

四、同步、异步

同步和异步关注的是消息通信机制。

(一)同步 synchronous
同步就是一个任务在执行某个请求的时候,如果这个请求返回需要很长时间,那么这个任务会不断询问是否已返回信息,直到收到返回信息才继续执行。

(二)异步 asynchronous
异步就是一个任务在执行某个请求的时候,它不会询问是否已返回,而是继续执行下面的操作,当返回信息时再通知这个任务。

(三)区别
区别在于消息通信方向相反。同步是调用方通知被调用方,异步是被调用方通知调用方。同步是调用方主动查询,异步是调用方被动接收。
比如,甲方委托乙方生产衣服,甲方隔两天问乙方生产完了吗,这叫同步;甲方不问,而是等到乙方生产完了通知甲方,这叫异步。

多线程和异步都可以避免阻塞,但异步和多线程不是一个概念。
多线程编程简单。有调度开销。并且线程间的共享变量可能造成死锁的出现。
异步使用回调的方式,没有调度开销,在设计良好的情况下,处理函数可以不必使用共享变量,减少了死锁的可能。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些出入,而且难以调试。

适用范围
当需要执行I/O操作时,使用异步操作比使用多线程更合适。
长时间CPU运算的场合,使用多线程更合适。例如耗时较长的图形处理和算法执行。

五、阻塞、非阻塞

阻塞与非阻塞关注的是程序在等待调用结果时候的状态。涉及CPU线程调度。

(一)阻塞 Blocking
就是调用结果返回之前,该线程会挂起,不释放CPU执行权,但也不做其它事情,只能等待,只有等到调用结果返回了,才能接着往下执行

(二)非阻塞 Non-blocking
就是在没有获取调用结果时,会释放cpu,cpu不会等待。
如果是同步的,通过轮询的方式检查有没有调用结果返回,如果是异步的,会通知回调

(三)区别
在于是否释放cpu
阻塞是cpu空转,白白浪费;
非阻塞是cpu不会空转。

例子
1.同步阻塞:
老张在厨房用普通水壶烧水,一直在厨房等着(阻塞),盯到水烧开(同步)
2.同步非阻塞:
老张在厨房用普通水壶烧水,在烧水过程中,就到客厅去看电视(非阻塞),然后时不时去厨房看看水烧开了没 (同步,主动询问)
3.异步阻塞:
老张在厨房用响水壶烧水,一直在厨房中等着(阻塞),不用盯着,而是等到水壶发出响声(异步),老张知道水烧开了
4.异步非阻塞:
老张在厨房用响水壶烧水,在烧水过程中,就到客厅去看电视(非阻塞),当水壶发出响声(异步),老张就知道水烧开了

例子
如果你想吃一份宫保鸡丁盖饭:
同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊!
同步非阻塞:在饭馆点完餐,就去遛狗了。不过溜一会儿,就回饭馆喊一声:好了没啊!
异步阻塞:你到饭馆点餐,然后在那等着,不喊,而是等做好了给你端上来。
异步非阻塞:在饭馆点完餐,就去遛狗了。等做好了,饭店给你打电话。

六、io

I/O操作包括文件读写、数据库操作、网络请求等。
I/O操作不消耗CPU时间

在这里插入图片描述

同步阻塞IO(Blocking IO)BIO
同步非阻塞IO(Non-blocking IO)NIO
异步阻塞IO (IO multiplexing)IO多路复用
异步非阻塞IO 异步IO(Asynchronous IO)AIO

适用场景:
BIO适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,但程序直观简单易理解。
NIO适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂。
AIO使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂

七、多任务

要实现多任务,通常会设计成Master-Worker模式,Master负责分配任务,Worker负责执行任务;因此多任务环境下,通常是一个Master,多个Worker。
多任务可以使用多线程或者多进程。
如果用多线程实现Master-Worker,主线程就是Master,其他线程就是Worker。
如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker。
无论是多线程还是多进程,只要Worker数量一多,效率肯定上不去,因为Worker一多,CPU就忙着切换工作,根本没多少时间去执行任务了。

是否采用多任务,还得考虑任务类型。
可以把任务划分为计算密集型和IO密集型。
计算密集型任务的特点是大量的计算,消耗CPU的资源,比如视频解码、计算圆周率。这种任务同时进行的数量应当等于CPU的核心数,这么做是为了降低切换任务所需要的时间,并且它还适合使用运行效率高的代码编写
IO密集型任务特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成。对于这类任务,任务越多,CPU效率越高,但也有一个限度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京股票开户的佣金手续费是多少?北京股票开户选择哪家券商?

北京股票开户的佣金手续费是多少?北京股票开户选择哪家券商? 股票注册开户是非常简单的,在2015年前也就是互联网还不发达的时候,投资者只能去券商的营业部柜台办理,而自从各大券商都可以网上开户后,更多的投资者会选择网上开户…

【运维】一些团队开发相关的软件安装。

gitlab 安装步骤 (1) 下载镜像,并且上传到服务器 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.2.8-ce.0.el7.x86_64.rpm (2)rpm -i gitlab-ce-16.2.8-ce.0.el7.x86_64.rpm (3)安装成功后…

vue elementui <el-date-picker>日期选择框限制只能选择90天内的日期(包括今天)

之前也写过其他限制日期的语句,感觉用dayjs()的subtract()和add()也挺方便易懂的,以此记录 安装dayjs npm install dayjs --save dayjs().add(value : Number, unit : String); dayjs().add(7, day); //在当前的基础上加7天dayjs().subtract(value : N…

在硅云上主机搭建wordpress并使用Astra主题和avada主题

目录 前言 准备 操作 DNS解析域名 云主机绑定域名 安装wordpress网站程序 网站内Astra主题设计操作 安装主题 网站内avada主题安装 上传插件 上传主题 选择网站主题 前言 一开始以为云虚拟主机和云服务器是一个东西,只不过前者是虚拟的后者是不是虚拟的…

练[GYCTF2020]EasyThinking

[GYCTF2020]EasyThinking 文章目录 [GYCTF2020]EasyThinking掌握知识解题思路还得靠大佬正式开始 关键paylaod 掌握知识 ​ thinkphpV6任意文件操作漏洞,代码分析写入session文件的参数,源码泄露,使用蚁剑插件disable_functions绕过终端无回…

尚硅谷CSS学习笔记

什么是css css&#xff08;层叠样式表&#xff09; 它是一种标记语言&#xff0c;用于给HTML结构设置样式。简单理解css可以美化html&#xff0c;实现结构与样式的分离。 <link rel"shortcut icon" href"favicon.ico" type"image/x-icon"&g…

encoding/json vs json-iterator

encoding/json vs json-iterator 100% Compatibility 默认情况下&#xff0c;jsoniter 不会像标准库那样对映射键进行排序。如果你想要 100% 的兼容性&#xff0c;就这样使用 m : map[string]interface{}{"3": 3,"1": 1,"2": 2, } json : json…

线性代数 --- 矩阵的QR分解,A=QR

矩阵的QR分解&#xff0c;格拉姆施密特过程的矩阵表示 首先先简单的回顾一下Gram-Schmidt正交化过程的核心思想&#xff0c;如何把一组线性无关的向量构造成一组标准正交向量&#xff0c;即&#xff0c;如何把矩阵A变成矩阵Q的过程。 给定一组线性无关的向量a,b,c&#xff0c;我…

Transformer预测 | Pytorch实现基于mmTransformer多模态运动预测(堆叠Transformer)

文章目录 文章概述程序设计参考资料文章概述 Transformer预测 | Pytorch实现基于mmTransformer多模态运动预测(堆叠Transformer) 程序设计 Initialize virtual environment: conda create -n mmTrans python=3.7# -*- coding: utf-8 -*- import argparse import os

推荐高效的电脑磁盘备份解决方案!

该怎样实现电脑磁盘备份&#xff1f; 接下来&#xff0c;我们将为你介绍两种磁盘备份方法。一种是利用操作系统自带的功能&#xff0c;另一种则是通过第三方工具实现。 方法一. Windows自带的备份还原功能 要在Windows 11/10/8/7中备份软件&#xff0c;你可以使…

一文带你了解 Linux 的 Cache 与 Buffer

目录 前言一、Cache二、Buffer三、Linux 系统中的 Cache 与 Buffer总结 前言 内存的作用是什么&#xff1f;简单的理解&#xff0c;内存的存在是为了解决高速传输设备与低速传输设备之间数据传输速度不和谐而设立的中间层&#xff08;学过计算机网络的应该都知道&#xff0c;这…

【内网穿透】Docker部署Drupal并实现公网访问

目录 前言 1. Docker安装Drupal 2. 本地局域网访问 3 . Linux 安装cpolar 4. 配置Drupal公网访问地址 5. 公网远程访问Drupal 6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。…

【Python】实现excel文档中指定工作表数据的更新操作

在做数值计算时&#xff0c;个人比较习惯利用excel文档的公式做数值计算进行对比&#xff0c;检查异常&#xff0c;虽然计算量大后&#xff0c;excel计算会比较缓慢&#xff0c;但设计简单&#xff0c;易排错 但一般测试过程中使用到的数据都不是最终数值&#xff0c;会不停根据…

红队专题-从零开始VC++远程控制软件RAT-C/S-[1]远控介绍及界面编写

红队专题 招募六边形战士队员[1]---远控介绍及界面编写1.远程控制软件演示及教程简要说明主程序可执行程序 服务端生成器主机上线服务端程序 和 服务文件管理CMD进程服务自启动主程序主对话框操作菜单列表框配置信息 多线程操作非模式对话框 2.环境&#xff1a;3.界面编程新建项…

实现基于 GitLab 的数据库 CI/CD 最佳实践

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节&#xff0c;也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中&#xff0c;像处理代码那样处理数据库变更呢&#xff1f; DORA 调研报告 DORA&#xff08;DevOps Research &am…

前后端分离项目-基于springboot+vue的足球青训俱乐部管理后台系统的设计与实现(内含代码+文档+报告)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

Netty深入浅出Java网络编程学习笔记(一) Netty入门篇

目录 一、概述 1、什么是Netty 2、Netty的优势 二、入门案例 1、服务器端代码 2、客户端代码 3、运行流程 组件解释 三、组件 1、EventLoop 处理普通与定时任务 关闭 EventLoopGroup 处理IO任务 服务器代码 客户端代码 分工细化 划分Boss 和Work 增加自定义EventLoopGroup 切换…

银河麒麟安装arm架构mysql8

1. 准备工作 2. 查看麒麟系统版本 使用命令 Linux version 4.19.90-25.21.v2101.ky10.aarch64 (KYLINSOFTlocalhost.localdomain) (gcc version 7.3.0 (GCC)) #1 SMP Wed Sep 28 16:37:42 CST 2022可以看出这是麒麟 v10 &#xff0c;aarch64 &#xff08;ARM 架构的&#xff…

【d2l动手学深度学习】 Lesson 10 多层感知机 + 代码实现 试验结果对比

文章目录 1. 介绍2. 单层Softmax回归2.1 手写Softmax训练效果 2.2 调用pytorch内置的softmax回归层实现调用pytorch内置softmax实验结果总结 3. 一层感知机&#xff08;MLP&#xff09; Softmax实验结果 Reference写在最后 1. 介绍 在第十节课 多层感知机 的代码实现部分&…

机器学习1:k 近邻算法

k近邻算法&#xff08;k-Nearest Neighbors, k-NN&#xff09;是一种常用的分类和回归算法。它基于一个简单的假设&#xff1a;如果一个样本的k个最近邻居中大多数属于某一类别&#xff0c;那么该样本也很可能属于这个类别。 k近邻算法的步骤如下&#xff1a; 输入&#xff1a…