并发编程——2.基础概念及其它相关的概述

news2025/1/16 2:39:55

这篇文章我们来讲一下并发编程中的线程及其相关的概述内容。

目录

1.J.U.C

2.进程、线程、协程

2.1进程

2.2线程

2.3纤程(协程)

2.4概念小结

3.并发、并行、串行

3.1并发

3.2并行

3.3串行

3.4概念小结

4.CPU核心数和线程数的关系

5.上下文切换

6.总结


1.J.U.C

要学习并发编程,首先我们应该清楚什么是并发编程

JUC:JUC是java.util.concurrent包的缩写,包的结构如下所示,说白了就是并发场景进行多线程编程的工具类

我的总结:JUC就是在并发场景下,怎么让程序尽量通过有限的硬件,高效的处理请求,并且保证程序“线程安全”,其中涉及到的内容非常多。

学习并发编程说白了就是学怎么样使用线程,怎么在多线程的情况下保证线程安全。就这两点。

2.进程、线程、协程

下面来讲一下并发编程的前置内容:进程、线程、协程

2.1进程

什么是进程?

专业的说法:在操作系统中,进程是基本的资源分配单位,操作系统通过进程来管理计算机的资源,如CPU、内存、磁盘等。每个进程都有一个唯一的进程标识符(PID),用于区分不同的进程。

通俗说法:可看做是正在执行的程序。如QQ.exe

解释:当我们的一个程序,没有执行的时候,它在磁盘中就是一个死的文件。当我们执行它的时候,操作系统就会为它创建一个进程,然后给其分配CPU的资源,比如内存,磁盘资源等。一个进程就会占用我们计算机的一个资源。

拓宽:我们常常会遇见CPU占用过高的情况,这个时候我们就会打开任务管理器,去看一看是哪一个进程占用过高了,如果该进程没用的话,我们就可以手动的去结束该进程,释放被占用的CPU资源了。

2.2线程

什么是线程?

底层角度:线程是操作系统中的基本执行单元(能够直接执行的最小代码块)它是进程中的一个实体,是CPU调度和分派的基本单位。一个进程可以包含多个线程,每个线程都可以独立执行不同的任务,但它们共享进程的资源。
同一时刻,一个CPU核心只能运行一个线程,也就是CPU内核和同时运行的线程数是1:1的关系,也就是说8核CPU同时可以执行8个线程的代码。
通俗角度:通俗地说,线程可以理解为一个饭店的饭桌,每个饭桌可以点不同的菜,但是都可以共享饭店服务员、厨师,饭桌的多少决定客户的处理效率。

这张图可以很好的解释一下。

2.3纤程(协程)

底层角度:

1.纤程可以在一个线程内部创建多个纤程,这些纤程之间可以共享同一个线程的资源

2.纤程是在同一个进程内部运行的,不需要操作系统的介入,可以在用户空间(java的就是JVM)内实现协作式多任务处理。因此纤程的创建和销毁开销很小,可以更高效地利用系统资源。

通俗角度:

通俗地说,如果线程是饭店的饭桌,协程就是座椅。

注意:Java19才支持虚拟线程(纤程)或者使用第三方协程库quasar(据说这个大神已经入职oracle了,并且正是java的虚拟线程的开发者。)

2.4概念小结

1)先有进程,然后进程可以创建线程,线程是依附在进程里面的,线程里面可以包含多个协程

2)进程之间不共享全局变量,线程之间共享全局变量,但是要注意资源竞争的问题

3.并发、并行、串行

下面,我们来讲一下并发、并行和串行的概念

3.1并发

通俗:并发是多个客户在同一时间段内不约而同来到饭店,但是都想快点上菜,却只有一个厨师,厨师想了个办法,给每一桌上一个菜,然再轮流炒第2、3...个菜,达到雨露均沾,不至于后面来的客户闹情绪。
底层:在操作系统中,安装了多个程序,并发的是同一时间段内宏观上有多个程序同时运行,这在单CPU系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的。

3.2并行

通俗:并行是多个客户在同一时刻一起来到饭店,没人愿意排队,好办!饭店有多个厨师
每桌安排一个厨师。
底层:在多核CPU系统中,这些同一时刻的程序可以分配到多个处理器上(CPU),实现多任务并行执行,即利用每个处理器来处理一个可以并发执行的程序,这样多个程序便可以同时执行。目前电脑市场上说的多核CPU,便是多核处理器,核越多,并行处理的程序越多,能大大的提高电脑运行的效率。

3.3串行

通俗:串行就很好理解了,按照客户下单顺序,先到先得,厨师按菜单顺序炒菜。但是后面的客户就要等得比较久了,如果第一个客户吃的是满汉全席,后面的客户可能就不想等了。
底层:如单核CPU,同一时刻只能运行一个程序,如果存在多个程序,需要按照先后顺序执行。我打开qq后,不能再同时打开微信,只能等qq执行完成(关闭)后才能打开微信,线程的串行亦是如此,一次只能执行一个线程代码指令,其他线程需要排队等待。

3.4概念小结

并发,一般是针对线程级别的,指多个线程在点个CPU核心上交替执行。并行,可以说线程也可以说进程。指同一时刻,多个线程在多个CPU核心上执行。串行就是多个线程按顺序在单个CPU核心上执行。

综合来说:
并发Concurrent,指应用能够交替执行不同的任务;比如单CPU核心下执行多线程并非是同时执行多个任务,如果你开两个线程执行,就是在你几乎不可能察觉到的速度不断去切换这两个任务,已达到"同时执行效果",其实并不是的,只是计算机的速度太快,我们无法察觉到而已。
并行Parallel,指应用能够同时执行不同的任务,例:吃饭的时候可以边吃饭边打电话,这两件事情可以问时执行
两者区别:一个是交替执行,一个是同时执行。

4.CPU核心数和线程数的关系

前面说过,目前主流CPU都是多核的,线程是CPU调度的最小单位。同一时刻,一个CPU核心只能运行一个线程,也就是CPU内核和同时运行的线程数是1:1的关系,也就是说8核CPU同时可以执行8个线程的代码。但Intel引入超线程技术后,产生了逻辑处理器的概念,使核心数与线程数形成1:2的关系。在我们前面的Windows任务管理器贴图就能看出来,内核数是6而逻辑处理器数是12。

在Java中提供了Runtime.getRuntime().availableProcessors(),可以让我们获取当前的CPU核心数,注意这个核心数指的是逻辑处理器数。

获得当前的CPU核心数在并发编程中很重要,并发编程下的性能优化往往和CPU核心数密切相关。

5.上下文切换

由于现在大多计算机都是多核CPU,多线程往往会比单线程更快,更能够提高并发,但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、上下文非常频繁,你的程序反而不能支持更高的TPS。
时间片:
多任务系统往往需要同时执行多道作业。作业数往往大于机器的CPU数,然而一颗CPU同时只能执行一项任务,如何让用户感觉这些任务正在同时进行呢?操作系统的设计者巧妙地利用了时间片轮转的方式
时间片是CPU分配给各个任务(线程)的时间!

线程上下文是指某一时间点CPU寄存器和程序计数器的内容,CPU通过时间片分配算法来循环执行任务(线程),因为时间片非常短,所以CPU通过不停地切换线程执行。换言之,单CPU这么频繁,多核PU—定程度上可以减少上下文切换。

总结

  1. (单核CPU)同一时间,cpu只能处理1个线程,只有1个线程在执行
  2. 多线程同时执行:是CPU快速的在多个线程之间的切换
  3. cpu调度线程的时间足够快,就造成了多线程的“同时”执行
  4. 如果线程数非常多,cpu会在n个线程之间切换,消耗大量的cpu资源
  5. 每个线程被调度的次数会降低,线程的执行效率降低

建议
合理设置线程数目既可以最大化利用CPU,又可以减少线程切换的开销。

  • 高并发,低耗时的情况,建议少线程。
  • 低并发,高耗时的情况:建议多线程。
  • 高并发高耗时,要分析任务类型、增加排队、加大线程数

6.总结

这篇文章我们讲了线程,进程,协程,也讲了并发,并行,串行。介绍了JUC,上下文切换,时间片等相关概念,都是很基础很简单的内容,这是后面学习并发编程的基础,要熟练



 

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

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

相关文章

如何对发电机组进行负载测试

发电机组负载测试是为了评估其在不同负载条件下的性能和稳定性,下面是对发电机组进行负载测试的步骤: 准备工作: - 确定测试负载的类型和大小,例如,纯阻性负载、电动机负载等。 - 确保测试负载设备符合安全要求&#x…

C#选择排序(Selection Sort)算法

选择排序(Selection Sort)原理介绍 选择排序(Selection Sort)是一种简单的排序算法,其实现原理如下: 遍历待排序数组,从第一个元素开始。 假设当前遍历的元素为最小值,将其索引保存…

正点原子嵌入式linux驱动开发——Linux按键输入

在前几篇笔记之中都是使用的GPIO输出功能,还没有用过GPIO输入功能,本章就来学习一下如果在Linux下编写GPIO输入驱动程序。正点原子STM32MP1开发板上有三个按键,就使用这些按键来完成GPIO输入驱动程序,同时利用原子操作来对按键值进…

【Vue】v-if和v-show的区别

v-if&#xff1a;按条件渲染&#xff0c;判定为true时渲染&#xff0c;否则不渲染 v-show&#xff1a;按条件展示&#xff0c;区别在于切换的是display属性的值 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&l…

掌握JavaScript的练习之道:十个手写函数让你信手拈来!

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

企业知识库系统:从0开始,部署企业知识库模型

当今竞争激烈的商业环境中&#xff0c;企业需要不断提高效率和降低成本&#xff0c;以保持竞争力。而建立一个高效的智能知识库&#xff0c;可以帮助企业实现这一目标。 部署企业知识库 但是知识库目前也需要相关专业的工具创建才能满足企业的业务需求&#xff0c;以HelpLook为…

将数组拆分成斐波那契序列

题目描述 示例 代码如下&#xff1a; public class SplitIntoFibonacci {LinkedList<Integer> res new LinkedList<>();public List<Integer> splitIntoFibonacci(String num) {if(num.length() < 3) return res;if(dfs(num, 0)) return res;return new…

【API篇】四、Flink物理分区算子API

文章目录 1、 分区算子&#xff1a;随机分区2、分区算子&#xff1a;轮询分区3、分区算子&#xff1a;重缩放分区4、分区算子&#xff1a;广播5、分区算子&#xff1a;全局分区6、自定义分区 重分区&#xff0c;即数据"洗牌"&#xff0c;将数据分配到下游算子的并行子…

优思学院|六西格玛品质管理概念,实现卓越品质的艺术

在竞争激烈的商业环境中&#xff0c;企业必须不断提高产品和服务的质量&#xff0c;以满足不断增长的客户需求。在这个背景下&#xff0c;六西格玛&#xff08;6σ&#xff09;管理理念应运而生。由摩托罗拉公司的比尔史密斯于1986年提出&#xff0c;六西格玛是一种管理策略&am…

Spring5学习笔记之整合MyBatis

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

这4个网站太厉害了, 每一个都能帮你打开新世界大门

又是一期满满的干货&#xff01;今天给大家推荐几个小众但超好用的网站&#xff0c;每一个都能帮你打开新世界的大门&#xff01; 一、音分轨——在线人声分离网站 在线从任何音、视频中提取人声、伴奏和各种乐器&#xff0c;针对某一视频可以单独从里面提取人声或背景音乐&am…

Dreambooth工作原理

什么是Dreambooth 中文名&#xff1a;梦想亭。 Dreambooth 由 Google 研究团队于 2022 年发布&#xff0c;是一种通过向模型注入自定义主题来微调扩散模型&#xff08;如稳定扩散&#xff09;的技术。 所谓自定义主体&#xff0c;就是一张照片&#xff0c;但是照片主体要鲜明…

高校教务系统登录页面JS分析——广东工业大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

分布式定时任务xxljob

xxl-job的xxl为作者名徐雪里拼音首字母。 xxl-job的作者是2015年开始开发这个项目&#xff0c;那时候springmvcbootstrapadminlte 大行其道&#xff0c;所以这个框架调度器一直沿用这个架构。 一、运行调度器 调度器可以集群或单点运行&#xff0c;以单点运行为例 下载代码…

Python学习笔记——文件操作、异常捕获、模块

食用说明&#xff1a;本笔记适用于有一定编程基础的伙伴们。希望有助于各位&#xff01; 文件读取 文件操作比较常见&#xff0c;通常我们需要对文件进行读取操作&#xff1a; f1 open(assets/Files/测试文件.txt, r, encodingUTF-8)# 辨别是否可读print(f1.readable())# 读取…

MYSQL常用函数详解

今天查缺陷发现同事写的一个MYSQL的SQL中用到函数JSON_CONTAINS&#xff0c;我当时第一反应是这个函数是Mysql8新加的么&#xff1f;原来小丑尽是我自己。 有必要巩固一下Mysql函数知识&#xff0c;并记录一下。&#xff08;如果对您也有用&#xff0c;麻烦您动动发财的手点个赞…

第六届“中国法研杯”司法人工智能挑战赛进行中!

第六届“中国法研杯”司法人工智能挑战赛 赛题上新&#xff01; 第六届“中国法研杯”司法人工智能挑战赛&#xff08;LAIC2023&#xff09;目前已发布司法大模型数据和服务集成调度 、证据推理、司法大数据征文比赛、案件要素识别四大任务。本届大赛中&#xff0c;“案件要素…

找不到msvcr120.dll怎么办?msvcr120.dll丢失如何修复?

MSVCR120.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2012 Redistributable Package的一部分。这个文件包含了许多用于运行C应用程序的函数和类。当我们的计算机上缺少这个文件时&#xff0c;就会导致一些程序无法正常运行&#xff0c;甚至会出现系统崩溃的情…

汽车屏类产品(四):仪表Cluster

###前言 仪表Cluster/仪表盘Dashboard,作为伴随汽车诞生就存在的一个主要零部件之一,从机械到电子到数字,可以说也是逐渐发展到现在的。 目前的主流框图如下,中间processor就是主控芯片,可能有buttons/switches,有display显示屏+backlight背光,有audio->speake…

黑客技术(网络安全)学习

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…