《03-javaEE系列---多线程》

回顾:进程的概念

在多任务操作系统中,我们希望能够同时运行多个程序这种并发运行的能力,使得系统资源能够被更高效地利用,也让用户体验更加流畅。

进程(Process)就是为了解决并发编程问题而引入的一个重要概念。本质上,它是操作系统分配资源的基本单位,拥有独立的内存空间、文件描述符等系统资源。

在互联网发展的早期,服务器端的Web开发主要使用C语言编写,采用了CGI(Common Gateway Interface)技术。这种模式基于多进程:服务器在接收到一个用户请求时,会为每一个请求创建一个独立的进程,处理完成后再销毁该进程。

然而,这种模式带来了一些明显的问题:

  • 每次请求都需要创建和销毁进程,频繁的资源申请与释放,导致开销巨大。

  • 服务器的性能受限于进程的创建和销毁速度,当请求量大时,系统负载急剧上升。

造成开销巨大的根本原因,在于进程的资源隔离特性:每个进程都有自己独立的一套资源,这意味着创建一个新进程时,需要完整地分配一套新的资源。


线程的引入:轻量级进程

为了优化进程创建与销毁的开销,操作系统引入了线程(Thread)的概念。

线程又被称为轻量级进程。它在进程的基础上进行了改进,保留了独立调度和并发执行的能力,但通过共享进程的资源,大幅度降低了创建与销毁的开销。

线程相比进程有以下优势:

  • 高效创建与销毁创建一个线程仅需分配少量资源(如栈空间和线程控制块TCB),远比创建一个完整进程高效。

  • 资源共享同一进程下的多个线程可以共享内存空间、打开的文件描述符、环境变量等,大大减少资源重复分配。

  • 调度开销小线程切换所需保存和恢复的上下文信息更少,因此线程切换通常比进程切换更快。

操作系统在进行多任务调度时,本质上是调度PCB(Process Control Block,进程控制块)或TCB(Thread Control Block,线程控制块)。每个线程也有自己的状态、优先级、上下文信息,只是它们共享了进程的大部分资源。


进程与线程的关系

没有线程的早期设计中,进程同时承担两个职责:

  • 资源分配的基本单位

  • 调度执行的基本单位

引入线程之后,这两个角色被清晰地区分:

  • 进程专注于资源的拥有和管理

  • 线程专注于任务的执行和调度

每个进程在创建时,至少包含一个主线程(Main Thread)。在程序运行过程中,进程可以根据需要动态创建更多线程来执行不同的任务。

值得注意的是:

  • 进程独立,线程共享。不同进程之间是相互独立的,而同一进程内的线程之间可以共享数据,因此线程间通信更加高效(不需要IPC机制)。

  • 线程安全问题。由于线程共享内存资源,多个线程同时访问同一资源时容易引发竞争条件,必须通过加锁、同步等机制来保证线程安全。


线程数量的影响

虽然线程的创建和调度开销小于进程,但线程数量过多也会带来新的问题:

  • 资源竞争:CPU核心数量是有限的,当线程数量远远超过可用核心数时,线程之间会频繁抢占CPU时间片,导致频繁上下文切换,反而降低系统整体性能。

  • 调度开销增加:线程调度需要维护更多的上下文信息,调度器的负担加重。

  • 异常影响整个进程:如果某个线程出现了未捕获的异常并导致崩溃,整个进程也可能被终止。

因此,在设计多线程程序时,应合理控制线程的数量,避免盲目创建过多线程。


小结

  • 进程资源分配的基本单位。每个进程拥有独立的内存空间文件描述符等资源。

  • 线程是调度执行的基本单位。同一进程内的多个线程共享资源,因此线程创建和销毁的开销更小。

  • 线程间共享资源带来了线程安全问题,需要通过锁机制等方式保护共享数据。

  • 线程数量适度为宜。线程太少无法充分利用CPU资源线程太多又会导致频繁的资源竞争和性能下降。

  • 合理使用线程模型,可以在保持高效并发的同时,尽量减少系统开销和错误风险。


扩展阅读

如果想进一步深入理解进程与线程的相关概念,推荐阅读以下内容:

  • 线程安全与同步机制
    探索如何通过互斥锁(Mutex)、信号量(Semaphore)、读写锁(ReadWriteLock)等机制,保证多线程环境下数据的正确性。

  • 进程间通信(IPC)
    在多进程场景下,由于进程之间资源独立,需要借助管道(Pipe)、消息队列(Message Queue)、共享内存(Shared Memory)等方式实现通信。

  • 线程池的原理与应用
    线程池通过复用线程,避免了频繁创建销毁线程的开销,是高并发场景中非常重要的性能优化手段。可以了解Java中的ExecutorService框架,或者C++中的std::thread结合自定义线程池实现。

  • 协程(Coroutine)与线程的区别
    协程作为一种更轻量级的并发实现方式,相较于线程拥有更低的切换开销和更高的调度效率,适合I/O密集型应用。

  • 常见面试题整理
    比如:进程和线程的区别?线程和协程的区别?线程池的工作原理?为什么线程过多反而降低性能?等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值