一句话总结就是:引入线程前 , 进程是资源分配和独立调度的基本单位 。引入线程后 , 进程是资源分配的基本单位 , 线程是独立调度的基本单位 , 线程也是进程中的?个执?单元 。一、摘要在很多场景下 , 我们经常听到采用多线程编程 , 能显著的提升程序的执行效率 。例如执行大批量数据的插入操作 , 采用单线程编程进行插入可能需要 30 分钟 , 采用多线程编程进行插入可能只需要 5 分钟就够了 。
既然多线程编程技术如此厉害 , 那什么是多线程呢?
在介绍多线程之前 , 我们还得先讲讲进程和线程的概念 。
二、进程和线程2.1、什么是进程?从计算机角度来讲 , 进程是操作系统中的基本执行单元 , 也是操作系统进行资源分配和调度的基本单位 , 并且进程之间相互独立 , 互不干扰 。
例如 , 我们windows电脑中的 Chrome 浏览器是一个进程、WeChat 也是一个进程 , 正在操作系统中运行的.exe都可以理解为一个进程 。
![关于线程的知识,你知道多少?](http://img.jiangsulong.com/230828/162JKN1-0.jpg)
文章插图
图片
2.2、什么是线程?关于线程 , 比较官方的定义是 , 线程是进程中的?个执?单元 , 也是操作系统能够进行运算调度的最小单位 , 负责当前进程中程序的执? 。同时?个进程中?少有?个线程 , ?个进程中也可以有多个线程 , 它们共享这个进程的资源 , 拥有多个线程的程序 , 我们也称为多线程编程 。
举个例子 , Chrome 浏览器和 WeChat 是两个进程 , Chrome 浏览器进程里面有很多线程 , 例如 HTTP 请求线程、事件响应线程、渲染线程等等 , 线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时 , 浏览器还可以响应用户的其它事件 。
2.3、进程和线程的关系关于进程和线程 , 可能上面的解释过于抽象 , 还是很难理解 , 下面是一段出自阮一峰老师博客文章的介绍 , 可能描述不是非常严谨 , 但是足够形象 , 有助于我们对它们关系的理解 。
1.我们都知道 , 计算机的核心是 CPU , 它承担了所有的计算任务 。它就像一座工厂 , 时刻在运行;(CPU 类似于工厂)
2.假定工厂的电力有限 , 一次只能供给一个车间使用 。也就是说 , 一个车间开工的时候 , 其他车间都必须停工 。背后的含义就是 , 单个 CPU 一次只能运行一个任务;
3.进程就好比工厂的车间 , 它代表 CPU 所能处理的单个任务 。任一时刻 , CPU 总是运行一个进程 , 其他进程处于非运行状态;(进程类似于车间)
4.一个车间里 , 可以有很多工人 。他们协同完成一个任务;
5.线程就好比车间里的工人 。一个进程可以包括多个线程;(线程类似于工人)
6.车间的空间是工人们共享的 , 比如许多房间是每个工人都可以进出的 。这象征一个进程的内存空间是共享的 , 每个线程都可以使用这些共享内存;(每个线程共享进程下的内存资源)
7.一个防止他人进入的简单方法 , 就是门口加一把锁 。先到的人锁上门 , 后到的人看到上锁 , 就在门口排队 , 等锁打开再进去 。这就叫"互斥锁"(Mutual exclusion , 缩写 Mutex) , 防止多个线程同时读写某一块内存区域;(多个线程下可以通过互斥锁 , 实现资源独占)
8.还有些房间 , 可以同时容纳 n 个人 , 比如厨房 。也就是说 , 如果人数大于 n , 多出来的人只能在外面等着 。这好比某些内存区域 , 只能供给固定数目的线程使用;
9.这时的解决方法 , 就是在门口挂 n 把钥匙 。进去的人就取一把钥匙 , 出来时再把钥匙挂回原处 。后到的人发现钥匙架空了 , 就知道必须在门口排队等着了 。这种做法叫做 "信号量"(Semaphore) , 用来保证多个线程不会互相冲突 。(多个线程下可以通过信号量 , 实现互不冲突)
不难看出 , 互斥锁 Mutex 是信号量 semaphore 的一种特殊情况(n = 1时) 。也就是说 , 完全可以用后者替代前者 。但是 , 因为 Mutex 较为简单 , 且效率高 , 所以在必须保证资源独占的情况下 , 还是采用这种方式 。
推荐阅读
- 四层负载均衡的 NAT 模型与 DR 模型推导
- 详解API接口如何安全的传输数据
- Sonic: Go语言的超级JSON库,解析与编码速度狂飙
- EasyNetQ库:让你的分布式系统消息开发快人一步!
- C# 中的 ref 已经被放开,或许你已经不认识了
- Oracle数据库分区技术:优化大型数据集的存储效率!
- Docker容器中的Postgresql备份脚本异常解决办法
- 目前有哪些比较成功的人工智能应用?
- 为什么色准越高的显示设备就越贵
- AI要被卡脖子了?训练大模型的数据或在2026年耗尽