嵌入式开发高频面试题——第一章 进程与线程(上)
1.1 进程线程的基本概念
1.1.1 什么是进程,线程,彼此有什么区别?⭐⭐⭐⭐⭐
进程:是操作系统分配资源和调度任务的基本单位。它包含了程序代码、数据、堆栈、文件描述符、内存地址空间等资源。每个进程有一个独立的内存空间,它们之间的通信比较困难。进程的切换开销较大,因为切换进程时需要保存和恢复上下文信息(如寄存器状态、地址空间等)。
线程:是进程中的一个执行流,是 CPU 调度的基本单位。线程共享进程的资源(如内存、文件描述符等),但每个线程有独立的栈和寄存器。线程之间的切换开销相对较小,因为它们共享同一个进程的内存空间。
区别:
- 进程有独立的内存空间,线程共享进程的内存。
- 进程之间的通信较复杂(如通过 IPC 机制),而线程之间的通信较为简单。
- 进程切换开销大,线程切换开销小。
1.1.2 多进程、多线程的优缺点?⭐⭐⭐⭐
- 多进程:
- 优点:
- 稳定性高,进程间互不影响,某个进程崩溃不会影响其他进程。
- 安全性高,进程间的资源是隔离的。
- 缺点:
- 创建和销毁进程的开销较大。
- 进程间通信(IPC)复杂。
- 优点:
- 多线程:
- 优点:
- 线程间通信方便,线程共享进程资源,创建线程开销较小。
- CPU 利用率更高,适用于并发任务。
- 缺点:
- 线程间的资源共享增加了数据竞争、死锁等问题的复杂性。
- 线程间共享进程的资源,一旦某个线程崩溃,整个进程可能受影响。
- 优点:
1.1.3 什么时候用进程,什么时候用线程?⭐⭐⭐
使用进程:
- 当需要更高的稳定性和安全性时。
- 各任务间相互独立,且资源隔离很重要时。
- 任务的执行流程较为复杂,且并行性不高时。
使用线程:
- 当任务需要频繁通信且需要较高的响应速度时。
- 当需要并发执行,且任务之间存在资源共享时。
- 当程序需要并发处理大量轻量级任务时(如服务器处理多个请求)。
1.1.4 多进程、多线程同步(通讯)的方法?⭐⭐⭐⭐⭐
- 多进程同步与通信:
- 使用信号量、共享内存、管道(pipe)、消息队列、信号、套接字(sockets)等方式进行通信和同步。
- 多线程同步:
- 使用互斥锁(mutex)、信号量(semaphore)、条件变量(condition variable)、读写锁、屏障(barrier)等机制实现同步。
1.1.5 进程的空间模型?⭐⭐⭐⭐
- 进程的地址空间模型:分为用户空间和内核空间。
- 用户空间:进程运行时使用的地址空间,用于存储用户程序的数据和代码。主要包括代码段、数据段、堆、栈。
- 内核空间:由操作系统内核管理的内存区域,进程通过系统调用进入内核空间,执行特定的内核操作。
1.1.6 进程线程的状态转换图 什么时候阻塞,什么时候就绪?⭐⭐⭐
进程/线程的三种基本状态:
- 就绪状态:进程已准备好执行,但由于没有分配到 CPU 而无法运行。
- 运行状态:进程获得 CPU 正在运行。
- 阻塞状态:进程等待某个事件(如 I/O 完成、资源可用等)而无法运行。
状态转换:
- 就绪 -> 运行:当调度器分配 CPU 时。
- 运行 -> 阻塞:等待 I/O 或其他资源时。
- 阻塞 -> 就绪:等待的事件完成后。
1.1.7 父进程、子进程的关系以及区别?⭐⭐⭐⭐
父进程:创建子进程的进程。
子进程:由父进程创建的进程,子进程继承了父进程的大部分资源。
关系与区别:
- 子进程通过
fork()
系统调用创建,继承了父进程的环境。 - 子进程有自己独立的进程 ID 和内存空间,但它最初继承了父进程的数据和代码。
- 子进程通过
1.1.8 什么是进程上下文、中断上下文?⭐⭐
- 进程上下文:进程在执行过程中,CPU 寄存器、堆栈等所有需要保存的执行状态信息,供进程切换时保存与恢复。
- 中断上下文:当 CPU 响应中断时保存的处理器状态,包括寄存器、程序计数器等,供中断服务程序使用。
1.1.9 一个进程可以创建多少线程,和什么有关?⭐⭐
- 与什么有关:
- 受限于系统资源(内存、CPU、文件描述符等)和操作系统的限制。
- 操作系统对线程的最大数量通常取决于内核的线程模型和系统的硬件资源。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CFuYuan'sBlog!