【面试】多线程、多进程的常考点

本文详细介绍了进程和线程的概念,强调了它们在资源管理和并发执行上的区别。进程作为资源分配的基本单位,而线程是运算调度的最小单位,具有更低的开销和更高的并发性。此外,还探讨了进程间和线程间通信的各种方式,如管道、消息队列、共享内存、信号量等,并对比了它们的特点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、进程的概念及优点

进程Process)是系统资源调度和分配的基本单位,实现了操作系统的并发,进程是线程的容器,程序是指令、数据及其组织形式的描述,进程是程序的实体,程序一旦跑起来就是进程,不跑起来就只是程序,程序是没有生命周期的,线程和进程是有生命周期的,每个进程的内存是相互独立的。

进程的优点:

  1. 利于资源的管理和保护
  2. 可靠且安全,但效率不高

线程Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务,但是共享同一地址空间,也就是同样的动态内存(堆),映射文件,目标代码等等,打开的文件队列和其它内核的资源。

线程的优点:

  1. 易于调度
  2. 能够并发性。进程可以创建多个线程来并发执行程序的不同部分。
  3. 开销少。创建线程要比创建进程快很多,所需开销很小。
  4. 利于发挥多处理机的性能。多个线程能分别单独在不同的处理器上运行,实现并发性。

在这里插入图片描述

2、进程的基本状态及状态之间的关系

  • 状态有运行态阻塞态就绪态

  • 状态之间的转换: 准备就绪的进程,被CPU调度执行,变成运行态;

  • 运行中的进程,进行I/O请求或者不能得到请求的资源,变成阻塞态;

  • 运行中的进程,进程执行完毕(或者是时间片已到),变成就绪态;

3、进程和线程的区别

  1. 一个线程只能属于一个进程,但是一个进程可以有多个线程,但至少有一个线程。线程依赖于进程而存在。
  2. 进程是操作系统分配资源的基本单位,但是同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但每个线程拥有自己的栈段,栈段又叫运行时段,用来存储所有的局部变量和临时变量。
  3. 处理机分给线程,及真正运行在处理机上的是线程,而不是进程。
  4. 线程在执行过程中需要协作同步。不同进程的线程间需要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体。
  5. 系统开销:由于创建或撤销进程时,操作系统需要为之分配或回收资源。所以操作系统创建进程的开销将远大于创建线程的开销。进程切换的开销也远大于线程切换的开销。
  6. 进程间不会相互影响,但是线程间,如果有一个线程挂掉,那么整个进程就都会挂掉。
  7. 进程适应于多核,多机分布;线程适合于多核。

4、进程间通信的方式

进程间通信主要包括:管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。

  1. 管道:
    管道包括有名管道和无名管道,管道可用于具有亲缘关系的进程间进行通信,有名管道则可以对没有亲缘关系间的进程进行通信。
    无名管道是半双工的,具有固定的读端和写端。
    它只能用于具有亲缘关系间的进程之间进行通信(也是父子进程或者兄弟进程之间)
  2. 系统IPC:
    消息队列:
    是消息的链接表,存放在内核中。一个消息队列由一个标识符来标记,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点,具有写权限的进程可以按照一定的规则向消息队列中添加新信息,对消息队列有读权限的进程则可以从消息队列中读取信息。
    信号量:
    信号量与已经介绍过的IPC结构不同,它是一个计数器,可以用来控制多个进程对共享资源的访问。信号量用于实现进程间的互斥与同步,而不是用于存储进程间的通信数据。
    信号:
    信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
    共享内存:
    它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
    特点:
    共享内存是最快的一种IPC,因为进程是直接对内存进行存取
    因为多个进程可以同时操作,所以需要进行同步。
    信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。
    套接字SOCKET:
    socket也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机之间的进程通信。

5、线程间通信的方式

临界区:通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问

互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。

信号量:为控制具有有限数量的用户资源而设计,它允许多个线程在同一时刻去访问同一资源,但一般需要限制同一时刻访问资源的最大线程数。

事件(信号):通过通知方式来保证多线程同步,还可以方便的实现多线程优先级的比较操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思识己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值