李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
01.并发编程之进程与线程概述
Leefs
2022-10-02 PM
1303℃
0条
[TOC] ### 一、进程和线程 #### 1.1 进程 + 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。 进程就是用来加载指令、管理内存、管理 IO 的。 + 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 + **进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。** windows系统中,经常会看见`.exe`后缀的文件,双击这个`.exe`文件的时候,这个文件中的指令就会被系统加载,就能得到一个关于这个`.exe`程序的进程。进程是“活”的,或者说是正在被执行的。 *也可以将进程更直观的理解为一个正在运行的应用程序(例如:微信、Google浏览器等)* ##### 进程具有的特点 - **动态性**:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的 - **并发性**:任何进程都可以同其他进程一起并发执行 - **独立性**:进程是系统进行资源分配和调度的一个独立单位 - **结构性**:进程由程序,数据和进程控制块三部分组成 #### 1.2 线程 + 一个进程之内可以分为一到多个线程; *在同⼀个进程内可以执⾏多个任务,⽽这每⼀个任务就可以看做是⼀个线程* + 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行; + 线程是轻量级的进程,是程序执行的最小单元,使用多线程而不是多进程去进行并发程序的设计,是因为线程间的切换和调度的成本远远小于进程。 #### 1.3 进程和线程对比 - 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集; - 进程拥有共享的资源,如内存空间等,供其内部的线程共享; - 进程间通信较为复杂 + 同一台计算机的进程通信成为IPC; + 不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如HTTP; - 线程间的通信比较简单,因为他们共享进程的内存,一个例子是多个线程可以访问一个共享变量; - 线程更轻量,线程上下文切换成本一般比进程上下文切换低。 #### 总结 进程就是,打开一个应用,操作系统会给它分配各种资源,比如CPU、内存、磁盘IO等等,一旦这个应用进入内存后,资源就是要给到进程,**所以说,进程是资源分配的基本单位**。 程序开始执行后,会有不同的执行路径,而执行的基本单位就是线程,**也可以说线程是CPU调度的基本单位,而线程本身就是一系列的指令合集**。 因此,进程本身是不执行任务的,真正执行任务的是线程,**所以一个进程至少拥有一个线程。进程可以被看作程序的实体,也是线程的容器。** ### 二、并行和并发 #### 2.1 并发 早期计算机的 CPU 都是单核的,一个 CPU 在同一时间只能执行一个进程/线程,当系统中有多个进程/线程等待执行时,CPU 只能执行完一个再执行下一个。 计算机在运行过程中,有很多指令会涉及 I/O 操作,而 I/O 操作又是相当耗时的,速度远远低于 CPU,这导致 CPU 经常处于空闲状态,只能等待 I/O 操作完成后才能继续执行后面的指令。 为了提高 CPU 利用率,减少等待时间,人们提出了一种 CPU 并发工作的理论。 所谓并发,就是通过一种算法将 CPU 资源合理地分配给多个任务,当一个任务执行 I/O 操作时,CPU 可以转而执行其它的任务,等到 I/O 操作完成以后,或者新的任务遇到 I/O 操作时,CPU 再回到原来的任务继续执行。 *下图展示了两个任务并发执行的过程:* ![01.并发编程之进程与线程概述01.gif](https://lilinchao.com/usr/uploads/2022/10/3347033470.gif) 虽然 CPU 在同一时刻只能执行一个任务,但是通过将 CPU 的使用权在恰当的时机分配给不同的任务,使得多个任务在视觉上看起来是一起执行的。CPU 的执行速度极快,多任务切换的时间也极短,用户根本感受不到,所以并发执行看起来才跟真的一样。 操作系统负责将有限的 CPU 资源分配给不同的任务,但是不同操作系统的分配方式不太一样,常见的有: + 当检测到正在执行的任务进行 I/O 操作时,就将 CPU 资源分配给其它任务。 + 将 CPU 时间平均分配给各个任务,每个任务都可以获得 CPU 的使用权。在给定的时间内,即使任务没有执行完成,也要将 CPU 资源分配给其它任务,该任务需要等待下次分配 CPU 使用权后再继续执行。 + 将 CPU 资源合理地分配给多个任务共同使用,有效避免了 CPU 被某个任务长期霸占的问题,极大地提升了 CPU 资源利用率。 #### 2.2 并行 并发是针对单核 CPU 提出的,而并行则是针对多核 CPU 提出的。和单核 CPU 不同,多核 CPU 真正实现了“同时执行多个任务”。 多核 CPU 内部集成了多个计算核心(Core),每个核心相当于一个简单的 CPU,如果不计较细节,你可以认为给计算机安装了多个独立的 CPU。 多核 CPU 的每个核心都可以独立地执行一个任务,而且多个核心之间不会相互干扰。在不同核心上执行的多个任务,是真正地同时运行,这种状态就叫做并行。 例如,同样是执行两个任务,双核 CPU 的工作状态如下图所示: ![01.并发编程之进程与线程概述02.gif](https://lilinchao.com/usr/uploads/2022/10/4109177659.gif) 双核 CPU 执行两个任务时,每个核心各自执行一个任务,和单核 CPU 在两个任务之间不断切换相比,它的执行效率更高。 #### 2.3 并发加并行 在上图中,执行任务的数量恰好等于 CPU 核心的数量,是一种理想状态。但是在实际场景中,处于运行状态的任务是非常多的,尤其是电脑和手机,开机就几十个任务,而 CPU 往往只有 4 核、8 核或者 16 核,远低于任务的数量,这个时候就会同时存在并发和并行两种情况:所有核心都要并行工作,并且每个核心还要并发工作。 例如一个双核 CPU 要执行四个任务,它的工作状态如下图所示: ![01.并发编程之进程与线程概述03.gif](https://lilinchao.com/usr/uploads/2022/10/3841762948.gif) 每个核心并发执行两个任务,两个核心并行的话就能执行四个任务。当然也可以一个核心执行一个任务,另一个核心并发执行三个任务,这跟操作系统的分配方式,以及每个任务的工作状态有关系。 #### 总结 并发针对单核 CPU 而言,它指的是 CPU 交替执行不同任务的能力;并行针对多核 CPU 而言,它指的是多个核心同时执行多个任务的能力。 单核 CPU 只能并发,无法并行;换句话说,并行只可能发生在多核 CPU 中。 在多核 CPU 中,并发和并行一般都会同时存在,它们都是提高 CPU 处理任务能力的重要手段。 ### 三、并发编程的意义以及注意事项 #### 3.1 意义 + **充分利用CPU资源**:随着CPU上的核心数量越来越多,以及超线程技术的广泛运用,其自身就具备了执行多线程的能力。线程是CPU调度的基本单位,一个线程在某一个时刻只能在一个CPU的核心上执行。 如果是单线程编程无法充分的利用CPU资源; + **减少程序的响应时间**: 如果某个操作很耗时,或者陷入长时间的等待,此时程序将不会响应鼠标和键盘等操作。使用多线程技术可以把这个耗时的操作分配到一个单独的线程中去执行,从而使程序可以更快的作出响应; + 与进程相比,线程创建和切换开销更小,同时多线程在数据共享方面效率非常高; #### 3.2 注意事项 多线程编程的目的是为了提高程序的执行效率,但是也可能会遇到很多问题导致性能下降,最终可能比单线程效率还要低,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题。 - **线程安全**:因为同一进程中的多个线程是资源共享的,也就是可以访问同一内存地址的一个变量,如果多个线程同时进行写操作,就要考虑线程同步的问题。 + **死锁**:为了保证线程安全引入锁机制,但是也容易导致死锁,有些线程等待的可能是永远不会释放的死锁。 + **线程太多会导致资源耗尽,死机、宕机**:线程本身也是一种资源,创建大量的线程会导致内存资源耗尽,线程频繁切换也十分耗费`CPU`,一次线程切换大概要消耗`20000`个`CPU`周期。如果线程数较多的话,最好是用线程池。 *附参考文章链接地址* *https://blog.csdn.net/YSecret_Y/article/details/125626663* *https://blog.csdn.net/xingyu19911016/article/details/115394073*
标签:
并发编程
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2428.html
上一篇
09.数仓建设之数仓规范建设指南
下一篇
02.并发编程之线程的创建
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Ubuntu
容器深入研究
递归
GET和POST
LeetCode刷题
MyBatis
锁
Netty
FastDFS
正则表达式
机器学习
Eclipse
Hadoop
SpringBoot
随笔
栈
Flink
Java工具类
高并发
JVM
设计模式
Linux
Spark Core
Golang
Kibana
Quartz
Sentinel
数据结构
字符串
链表
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭