面经链接:https://www.nowcoder.com/discuss/653930322421108736?sourceSSR=search
1.线程、进程、协程都是什么 有什么区别
特性 |
线程 |
进程 |
协程 |
定义 |
进程中的轻量级子任务,共享进程的内存空间和资源。 |
操作系统中资源分配的基本单位,具有独立的内存空间。 |
用户态的轻量级任务切换,控制由用户代码管理。 |
内存空间 |
共享同一进程的内存空间,彼此之间无隔离。 |
拥有独立的内存空间,进程之间互相隔离。 |
共享同一线程的内存空间,不同协程之间可以共享数据。 |
创建开销 |
开销较小,创建和切换速度快。 |
创建和上下文切换开销较大,需要操作系统内核介入。 |
开销极小,切换非常快,因为在用户态中完成。 |
切换机制 |
由操作系统调度器在内核态进行切换。 |
由操作系统调度器在内核态进行切换。 |
由用户代码显式调度,在用户态进行切换。 |
并发性 |
支持并发执行,多线程可利用多核 CPU 资源。 |
支持并行和并发执行,不同进程可在多核上并行运行。 |
支持并发执行,但依赖于线程的执行,无法真正并行。 |
通信方式 |
通过共享内存直接通信,也可以使用互斥锁、条件变量等。 |
通过进程间通信(IPC)机制,如管道、消息队列、共享内存等。 |
直接共享数据结构,或通过消息传递。 |
安全性 |
由于共享内存,不当的操作可能导致数据竞争和安全问题。 |
进程间隔离较好,安全性较高,但通信较复杂。 |
用户态管理,容易发生不当使用导致的死锁或资源泄露。 |
使用场景 |
多任务处理、高并发场景,如服务器处理多用户请求。 |
独立应用程序、任务隔离、稳定性要求高的场景。 |
高效 IO 操作、协作式任务切换,如异步编程、事件驱动。 |
2.线程之间的通信
通信方式 |
描述 |
优点 |
缺点 |
适用场景 |
共享内存 |
多个线程共享同一块内存,线程可以通过访问这块内存来交换数据。 |
快速,无需内核参与 |
需要手动管理同步,容易出现竞态条件 |
大量数据传输,高性能场景 |
信号量 |
使用计数器来控制对共享资源的访问,确保多个线程之间互斥访问资源。 |
简单有效的同步机制 |
容易产生死锁,复杂度增加 |
资源有限,需严格控制访问的场景 |
互斥锁 |
互斥锁确保一次只有一个线程能够访问共享资源,其他线程需要等待锁释放。 |
提供线程安全的资源访问 |
可能导致死锁,特别是在锁的管理不当时 |
需要同步访问共享资源的场景 |
条件变量 |
线程可以等待某个条件成立,然后继续执行。条件变量通常与互斥锁配合使用。 |
支持线程等待特定事件发生 |
使用较复杂,需要与其他同步原语结合 |
需要线程等待特定条件的场景 |
消息队列 |
线程之间可以通过消息队列发送和接收消息,消息可以是任意数据类型。 |
线程之间解耦,安全的消息传递方式 |