编程深水区之并发①:什么是并发编程

news2025/1/15 21:43:33

并发编程是一种让程序能够执行多个任务的编程技术,多个任务的执行时间有重合,如交替执行、同时执行等。相对于传统的从上到下依次同步执行代码,我们也称并发编程为异步编程。目前,常见的并发模型主要有两种,一是多线程模型,二是单线程事件循环模型

一、多线程模型

1、进程和线程

了解线程之前,需要知道进程和线程的区别。Windows和Linux的进程和线程表现略有差异,以下对比仅针对Windows操作系统。

  • 进程指操作系统中程序的一次执行过程,拥有独立的内存、文件等资源。一个应用可以有多个进程。
  • 线程指进程中的执行单元,线程共享进程的全局变量和资源,但有独立的堆栈和上下文
  • 进程是线程的容器,线程共享进程的资源
  • 进程有入口线程,一个进程可以创建更多线程
  • 进程和线程的图示:

image.pngimage.png

2、多线程模型之操作系统线程

目前多线程的实现方式,主要有两种,一是操作系统线程,二是用户态协程。
操作系统线程由操作系统进行管理,每个线程有独立的堆栈和上下文,但共享进程的全局变量和资源。操作系统线程在内核态调度,可以充分利用多核CPU等硬件资源,从而提高系统的整体性能,特别适合CPU密集型操作和长期运行的任务;同时,线程间共享全局变量,操作更加简便,且不存在消息通讯的开销。它主要存在以下几个问题:一是线程占用内存资源比较大;二是线程切换的性能开销比较大;三是共享资源的争抢和死锁问题。
由于传统多线程的弊病,现代框架大多引入了async/await模式,实现线程的池化管理。线程被框架提前创建,并托管在后台管理的线程池中,由后台自动管理线程的创建和销毁、动态调整线程数量,从而实现线程的高效复用。比如C#的Web框架 - AspNetCore,使用async/await后,处理高并发的性能,在很多测试中,并不比Go这类实现协程的框架差。
本系列后面的章节,我们将以C#和AspNetCore为例,展开叙述操作系统线程。

3、多线程模型之用户态协程

协程由程序语言或运行时进行管理,是比线程更轻量级的并发单位,特别适合高并发的场景。协程的创建和切换,只需要在用户态完成,避免了进入内核态的开销,降低了上下文切换的成本,开销更低;同时,协程不需要分配大量的内核资源,通常一个协程只需要几KB内存,占用内存少,可以创建更加的协程。协程的主要问题,是不同协程之间的消息通讯,操作比较复杂,通讯开销也比较大。
协程的具体实现方式,又分“有栈”和“无栈”。比如Go语言提供了goroutine,实现了有栈协程,虽然每个协程有独立的栈空间,但仍然支持同时运行成千上万个goroutine,它鼓励使用“消息传递”方式来完成不同协程之间的通信和同步,通过使用channel可以安全的在多个goroutine之间传递数据。而Swift语言则提供了Task,表示一个独立的并发执行单元,实现了无栈协程,更加轻量,但不同协程之间的通信,必须通过Actor来实现。而仓颉语言则实现了M:N线程模型,M个用户态协程在N个操作系统线程上执行,本质上还是一种用户态协程。
本系列后面的章节,我们将以仓颉为例,展开叙述用户态协程。

二、单线程事件循环模型

1、事件循环机制

JS是为Web而生的,Web有个特点,就是IO密集型,请求数据>浏览器渲染DOM,任务非常简单。大多数情况下,单线程是足够了,但Web请求有个异步等待的问题,容易造成同步代码的阻塞。所以,JS诞生时就有了事件循环机制,但一开始是很简陋的,主要通过使用回调函数和setTimeout来实现,后来逐渐有了任务对列、Promise、async/await,事件循环机制才逐步完善。

2、Chrome浏览器

传统浏览器有一个很严重的问题,就是一旦代码出现长时阻塞或异常,整个浏览器就崩了。所以Chrome带来了多进程,子进程托管在主进程下面,每个浏览器Tab,都是一个子进程,即使崩了,也不会影响其它Tab和主进程,而且Tab之间的资源独立,也更加安全。Chrome不仅解决了浏览器“爱崩迪”的问题,还带来了新一代的JS执行引擎-V8。听名字,就很NB的感觉。确实,V8一出,一统江湖。

3、Node.js

传统后端存在线程切换的问题,在处理IO密集型这类高并发任务时,表现并不理想,而这类异步任务就特别适合用单线程事件循环机制来处理,所以有人将V8引擎带到了后端,并创造出了Node.js。
Node.js不但能够利用单线程事件循环机制,处理高并发的IO密集型任务,而且也能使用子进程,处理一些CPU密集型的计算任务。但是,子进程毕竟不是多线程,它有两个问题:一是子进程虽然托管在主进程下面,但它本质还是进程,占用独立的内存和文件资源,所以创建和销毁的开销远高于线程;二是进程之间,需要通过消息机制进行通讯,通讯开销也比较大,尤其是子进程之间的沟通,还需要借助主进程桥接。
本系列后面的章节,我们将以JS和Node.js为例,展开叙述单线程事件循环机制以及Node.js的子进程。


*这是一个系列文章,将全面介绍多线程、用户态协程和单线程事件循环机制,建议收藏、点赞哦!
*你在并发编程过程中碰到了哪些难题?欢迎评论区交流~~~


我是functionMC > function MyClass(){…}
C#/TS/鸿蒙/AI/中美科技竞争等问题,以及如何写Bug、防脱发、送外卖等问题,都可以私信提问哦!

编程深水区.png

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

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

相关文章

MySQL --- 内置函数介绍

目录 一、日期函数 二、字符串函数 三、数学函数 四、 其他函数 一、日期函数 current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回datetime的日期部分date_add(date,interval d_value_type) 在date中添加时间/日期…

在没有备份的条件下,如何恢复微信聊天记录?

推荐2款数据恢复工具1个简单实用方法,帮你找回微信误删聊天记录! 操作简单,可用于iOS、安卓手机和PC电脑端 1、万兴数据管家 点击直达官网下载>>https://huifu.wondershare.cn 万兴数据管家是一款专业的微信数据恢复软件。 支持苹果…

鲁班上门维修安装系统源码开发之功能模式

鲁班上门维修安装系统在当今的趋势呈现出显著的增长与创新。随着物联网、智能家居的普及,以及消费者对便捷、高效生活方式的追求,鲁班上门维修安装系统凭借其多渠道预约、智能派单、在线支付与费用明细透明等优势,赢得了市场的广泛认可。 …

「面试必看」Vue百题斩~ Vue数据响应式原理的四个核心模块

vue 响应式原理的四个核心模块 Observe Observe 要实现的目标非常简单,就是把一个普通对象转换成响应式对象。 为了实现这一点,Observe 把对象的每个属性通过 Object.defineProperty 转换为带有 setter 和 getter 的属性,这样一来&#xf…

重头开始嵌入式第十二天(预处理和指针)

预处理 在 C 语言中,预处理是指在编译之前由预处理器对源代码进行的一些处理操作。 主要包括以下几个方面: 1. 宏定义:使用 #define 指令定义一个标识符来代表一个常量值、表达式或一段代码。 例如: #define PI 3.14159 2.…

亚马逊澳大利亚站 带绳窗帘认证步骤

带绳窗帘是一种室内用窗帘,可通过一根吊绳控制升降。此类商品包括但不限于蜂窝帘、水平百叶帘、百褶帘、卷式百叶帘、卷帘、透光帘、罗马帘、帘杆(包括使用帘杆的商品,如带帘杆的窗帘和布帘)、面板轨道和垂直百叶帘。 我们的带绳窗…

vue 开发工具 Hbuilder 简介及应用

一、简介 HBuilderX 是一款流行的前端开发工具,由DCloud公司开发。它支持多种编程语言,如HTML、CSS、JavaScript、Vue、UniApp等,非常适合用来开发Web应用、移动端应用和跨平台应用。 官网地址:https://www.dcloud.io/hbuilderx.…

ShardingSphere 内核工作原理

文章目录 内核工作原理配置管控SQL Parser: SQL解析引擎SQL Router- SQL 路由引擎SQL Rewriter : SQL 优化引擎SQL Executor : SQL执行引擎Result Merger: 结果归并 内核工作原理 ShardingSphere的整体架构图是这样的: 配置管控 在进入Shar…

火车站NTP电子钟,自动授时,保证时间精准

在现代交通体系中,火车站作为重要的交通枢纽,每天承载着大量乘客的出行需求。为了确保列车运行的准时性和乘客信息的准确性,火车站NTP电子钟成为不可或缺的一部分。本文将详细介绍火车站NTP电子钟的特点及其在不同场景中的应用优势。 一、火车…

【STL】String的底层构造

1.String类对象的构造&#xff08;后面有每一个接口的实现&#xff09; #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<iostream> #include<assert.h> using namespace std;namespace bit {class string{public:typedef char* iterator;typedef const…

字节实习面试

1.比左边的数都小&#xff0c;比右边的数都大 public class Test3 {/*** 从左往右找当前位置往左最小的* 从右往左遍历找当前位置往右最大的* 比较* param args*/public static void main(String[] args) { // int[] arr new int[]{9,8,7,3,4,2,1};int[] arr new int[…

【第十届泰迪杯数据挖掘挑战赛A题害虫识别】-农田害虫检测识别-高精度完整更新

农田害虫检测识别项目-高精度完整版 一、说明&#xff1a; 该版本为基于泰迪杯完整害虫数据重新制作数据集、优化增强数据集、重新进行模型训练&#xff0c;达到高精度、高召回率的最优模型代码。包含论文、最优模型文件以及相关文件、原始数据集、训练数据集XML版、增强扩充…

五款超好用的报表软件推荐,其中一款竟然完全免费

与以往需要通过繁琐的数据表格和复杂的数字分析不同&#xff0c;可视化报表通过表格、图表和图形&#xff0c;将数据以更加直观的方式呈现出来&#xff0c;使得原本繁杂无序的数据变得清晰易懂。无论是管理层的决策分析&#xff0c;还是一线员工的日常工作&#xff0c;可视化报…

vs+qt一些问题

一直遇到的两个问题&#xff0c;今天解决了 1、 因为前后端分离&#xff0c;前端写完了&#xff0c;后端还在一直修改&#xff0c;但是每次都是单独打开的后端的sln&#xff0c;所以会出现这个&#xff0c;把前端的模块删掉就好了。 2、打开vs项目&#xff0c;很多报错&#…

怎么在视频上加文字?归纳了简单好用的方法

怎么在视频上加文字&#xff1f;在数字媒体制作中&#xff0c;为视频添加文字是一种常见的需求。无论是为了提供字幕、注释、标题还是视觉效果&#xff0c;文字元素都能增强视频的传达力和观赏性。因此&#xff0c;今天本文将介绍四种简单好用的方法&#xff0c;帮助你轻松地在…

硬盘数据恢复:所需时长、全面指南及注意事项

在数字化时代&#xff0c;硬盘作为我们存储重要数据的核心设备&#xff0c;其重要性不言而喻。然而&#xff0c;由于各种原因&#xff0c;如误删除、格式化、硬盘故障等&#xff0c;我们时常面临数据丢失的困境。数据恢复不仅关乎个人隐私和信息安全&#xff0c;更可能影响到我…

Platform Designer各模块(2)

1.On-Chip Memory&#xff08;存储器&#xff09; (RAM or ROM) Intel FPGA IP RAM&#xff1a;主存&#xff0c;与CPU直接交换数据的内部存储器&#xff0c;可读可写&#xff0c;断电不丢失数据&#xff1b; ROM&#xff1a;只能读取数据&#xff0c;断电丢失数据。 2.Syste…

如何利用matlab将现有的地基雷达回波数据调制为机载雷达回波数据???

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Bug太多,苹果手机升级到18.1后怎么降级

最近苹果公司发布了iOS 18.1开发者测试版和macOS Sequoia 15.1的开发者测试版&#xff0c;此次发布的iOS18.1开发者测试版本苹果给其带来了两个重要的新功能。 1、通话录音功能 现在只要拨打或者是接听电话&#xff0c;界面左上角就会出现通话录音按键&#xff0c;点击即可开启…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第五篇 文件系统构建篇-第七十四章 buildroot构建文件系统

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…