并发:简介
并发:简介
什么是并发?
顺序执行:一个程序独占 CPU 资源,直到程序结束才释放 CPU,让出使用权给另一个程序。
并发执行:在较长时间片多个程序共享 CPU 资源,短时间片仍然是单程序占据 CPU,OS 进行调控切换。
为什么需要并发?
背景:硬件发展,计算能力发展,旧有批处理机制浪费资源。
效率!效率!还是效率!
- 最初的并发目的就是提高资源利用率和系统吞吐量。
- 后来的分时系统对及时响应的要求也需要并发支持。
如何实现并发?
OS 需要能够调控切换程序的运行,单纯的代码段并不能完成这个要求。所以出现了进程,线程。
进程
进程定义:进程是对程序一次执行过程的抽象,包括其程序段、相关数据段和 PCB(Process Control Block, 进程控制块)组成。其中 PCB 记录进程的各种信息。
进程特征:动态性,独立性,并发性,异步性。
- 动态性:进程实质是程序的一次执行过程,所以是其最基本特征;
- 独立性:传统 OS 中,进程是独立获取资源,独立执行,独立接受调度的基本单位;
- 并发性:多个进程同时存在与内存中,一段时间内同时运行;
- 异步性:进程互相独立,已不可预知的速度运行。
线程
目的:减少进程上下文切换造成的资源浪费。
实现方法:将资源获取和调度执行分开
- 使进程成为拥有资源的基本单位,不再是调度的基本单位,不再被频繁切换
- 进程内部开辟线程来执行程序,线程间共享资源,线程作为调度的基本单位
- 多个线程的状态存储在共享资源内,切换时的消耗小于进程切换,减少了系统消耗
而且线程更适合多处理机进行调度,单进程多线程,不同线程在不同处理器上执行无疑会加快任务完成,而单进程单线程情况下无论有多少个处理机,进程只在一个处理机上执行。
如此,进程成为资源的分配单位,线程是 OS 调度的基本单位。
所以下文中主要以线程为主要研究对象
遇到的问题
- 核心问题:调度不可控
- 内存共享导致的问题
这两个问题会导致进程间互相影响,程序运行基本不可再现。
对现代操作系统下的并发编程还存在以下问题
- 原子性丧失:“程序 (甚至是一条指令) 独占处理器执行” 的基本假设在现代多处理器系统上不再成立。”
- 顺序丧失:编译器翻译时的优化会打乱源码语句顺序
- 可见性丧失:
- 现代处理器可以理解为动态编译器,甚至会将一条指令“编译”为更小的微操作,乱序执行。
- 多处理器造成的处理器之间的即时可见性丧失。
问题的解决:互斥与同步
互斥
对于要操作同一个资源的多个线程,通过互斥保证某一时间仅能有一个线程有操作权限
例如:宿舍 6 人,某一时刻仅 1 人能上厕所。
同步
同步:两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。
线程同步:在某个时间点共同达到互相已知的状态,进行进程间的协作。
例如:NPY洗完头就一起去吃饭/打完这局游戏就一起去吃饭
参考资料:
[1] OSTEP
[2] OSTEP Chinese
[2] NJU OS PPT
[3] NJU OS 课程
本文来自博客园,作者:全无青年,转载请注明原文链接:https://www.cnblogs.com/qwqn/p/concurrency-intro.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律