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


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

    目录

    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,上下文切换,时间片等相关概念,都是很基础很简单的内容,这是后面学习并发编程的基础,要熟练



     

  • 相关阅读:
    瀚高数据库DML自动转发功能介绍(数据库层面)
    【Java】之Java8新特性
    sleuth链路追踪
    力扣(LeetCode)2512. 奖励最顶尖的K名学生(C++)
    设计模式浅析(八) ·外观模式
    nestjs 新手入门第一章从入门到弃坑 解决运行中的启动错误
    [CSS]文字旁边的竖线以及布局知识
    janus videoroom之媒体录制
    Flask博客实战 - 实现个人中心及权限管理
    Vbox虚拟机安装Androidx86
  • 原文地址:https://blog.csdn.net/m0_52096593/article/details/133888586