操作系统(6)---线程
一、线程
为什么引入线程?
单进程——>串行,多进程——>并发。问题:数据无法共享。进程之间不共享内存,就用多线程来解决。
多线程解决思路:
在进程内部增加一类实体(线程),线程之间可以并发执行,可以共享相同的地址空间。
线程的概念:线程是进程的一部分,描述指令流执行状态,它是进程中的指令执行流的最小单元,是CPU调度的基本单位。
因为总有不能共享的资源,所有线程也有线程控制块TCB(保持地址独立)。
二、线程与进程
进程是资源分配单位,线程是CPU调度单位。
进程拥有一个完整资源平台,线程只独享指令流执行的必要资源,如堆栈、寄存器。
线程具有就绪、等待和运行三种基本状态和状态间的转换关系。
线程能减少并发执行的时间和空间开销
- 线程的创建时间比进程短
- 线程的终止时间比进程短
- 同一进程内的线程切换时间比进程短
由于同一进程的各线程间共享内存和文件资源,可不通过内核进行直接通信。
线程=进程-共享资源
- 线程的优点:一个进程可以有多个线程,各线程可以并发执行,可以共享地址空间和文件等资源。
- 线程的缺点:一个线程崩溃,所属进程的其他进程都会崩溃。
主线程和函数线程
上面的例子可以看出:
- 主线程和函数线程并发执行
- 函数线程若提前于主线程结束,不影响主线程运行
- 主线程提前于函数线程结束,整个进程都会结束,其他进程均结束
- 哪个线程先执行取决于调度算法和当时机器环境决定
三、用户线程与内核线程
用户线程:由用户级线程函数完成线程的管理(线程的创建、终止、同步和调度等),内核不知道用户线程的存在。
用户线程是多对一结构,一个内核进程为多个用户线程服务。
优点:1.同一进程内的用户线程切换速度快,不依赖操作系统内核(可用于不支持线程的多进程操作系统),无需用户态/核心态的切换,线程切换代价比内核线程少。
2.允许每个进程拥有自己的线程调度算法。
缺点:1.一个用户线程发起系统调用占用内核资源而阻塞时,整个进程进入等待,不会进行线程切换,因为内核不知道多线程的存在。
2.不支持基于线程的处理机抢占。除非当前运行的线程主动放弃,否则其所在进程的其他线程无法抢占CPU。
3.只能按进程分配CPU时间。多线程的进程中,每个线程的时间片段少。
内核线程:由内核通过系统调用实现线程机制,完成线程的管理(线程的创建、终止、同步和调度等)。
内核线程是一对一结构(单核心处理器),一个内核线程服务一个用户线程;多核心处理器是多对多结构,对于多线程一个核心有多个选择,但一次仍然只服务一个用户线程。
优点(多核处理器下):
1.内核可以并行同一进程的多个线程。
2.一个线程执行系统调用而被阻塞不影响其他线程的执行,能够切换同一进程的其他线程继续执行(单核心处理器中,只有一个核心可用,可能会发生阻塞导致内核线程被延迟执行)。
3.以线程为单位进行CPU时间分配,多线程的进程可以获得更多CPU时间。
缺点:在单核处理器中,操作系统需要在不同线程之前切换来模拟并发执行,而线程的创建、终止、切换开销大,需要通过系统调用/内核函数在内核实现,涉及用户态/核心态的转换,速度和效率不如用户级线程。
相比之下,多核处理器可以使多线程在不同的核心上执行,做到真正的并行,运行性能和效率得到了提升。多核处理器的效率受到算法的特点、线程调度机制、缓存等因素的综合影响,在某些情况下,当线程数超过了核心数量可能会导致线程间的资源竞争和调度,使CPU运行效率降低;但当线程的算力不足以充分利用CPU时,线程数的增加可以增加处理器的工作效率,比如超线程技术的使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)