嵌入式 操作系统(三)
更多专栏:
超详细的嵌入式面经专栏(适用于小白学习和大佬复习):https://www.nowcoder.com/creation/manager/columnDetail/mGYoDz
校招公司汇总专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybKdp
目录:
1.请你说说进程、线程、协程分别是什么?它们分别有什么区别?
2.请你描述一下进程的空间模型?
3.请你说说多进程多线程多协程的优缺点?
4.请你说说多进程、多线程同步通信方式是什么?
5.请你讲讲进程线程的状态转换?
6.请你说说进程上下文是什么?
7.请你说说中断上下文是什么?
8.你了解父进程、子进程吗?请你说说它们关系以及区别?
内容:
1.请你说说进程、线程、协程分别是什么?它们分别有什么区别?
进程
进程是程序在计算机中执行的实例,是操作系统进行资源分配和调度的基本单位。每个进程都有自己的虚拟地址空间、代码段、数据段以及系统资源(如文件描述符、IO资源等)。
线程
线程是进程中的一个执行单元,线程在进程内共享资源(如内存、文件描述符等),但每个线程有独立的执行栈和程序计数器。线程是 CPU 调度的最小单位,多个线程可以并发地执行。
协程
协程是一种用户级的线程,它是轻量级的、由程序员控制调度的并发单元。协程通常由程序员主动切换,而不像线程那样由操作系统进行调度。
区别:
特性 |
进程 |
线程 |
协程 |
调度单位 |
操作系统调度 |
操作系统调度 |
用户调度(程序员控制) |
内存隔离 |
每个进程有独立的内存空间 |
线程共享进程的内存空间 |
协程共享进程的内存空间 |
资源消耗 |
开销大(包括创建和上下文切换) |
较小(比进程小,但比协程大) |
开销最小(无操作系统介入) |
创建销毁开销 |
较大 |
较小 |
非常小(仅为函数调用) |
并发性能 |
并发能力受限于操作系统调度 |
多线程能提高并发能力 |
高并发,适合I/O密集型任务 |
通信方式 |
进程间通信(IPC) |
线程间通信(共享内存、锁等) |
协程间直接通过共享内存、变量等 |
使用场景 |
适用于需要高度隔离的任务 |
适用于需要高并发的CPU密集型任务 |
适用于大量I/O密集型操作 |
注意:
- 一个进程可以包含多个线程,一个线程从属于一个进程。一个线程可以有多个协程。
- 一个进程的消失不会影响其他进程,但是一个线程的消失会使相对应的进程消失。
- 协程不需要多线程的锁机机制,因为多个协程从属于一个线程,不存在同时写变量冲突。并且效率上比线程高。
2.请你描述一下进程的空间模型?
通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间具体如图,内核空间是受保护的,用户不能对该空间进行读写操作。
栈的空间有限,堆是很大的自由存储区,程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也是在栈上进行。
程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。
初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。
未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据。
栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。
堆 (Heap):存储[动态内存分配,需要程序员手工分配,手工释放.注意它与数据结构中的堆是两回事,分配方式类似于链表。
注意:
- 栈空间有向下的箭头,代表数据地址增加的空间是往下的,新的数据的地址的值反而更小,
- 堆空间则是往上。
3.请你说说多进程多线程多协程的优缺点?
特性 |
多进程 |
多线程 |
多协程 |
内存开销 |
高,每个进程有独立内存空间 |
较小,线程共享进程的内存 |
非常小,多个协程共享线程内存 |
创建/销毁开销 |
高,进程创建和销毁较慢 |
较低,线程创建和销毁较快 |
极低,协程创建和销毁非常快 |
上下文切换效率 |
低,进程切换涉及更多资源 |
较高,线程切换相对较轻 |
非常高,由用户级调度控制 |
并行性 |
高,支持多核并行处理 |
高,支持多核并行处理 |
仅限于单线程,不支持多核并行 |
稳定性 |
高,进程独立,一个崩溃不会影响其他进程 |
较低,线程共享内存,一个线程崩溃可能影响进程 |
较低,协程在同一线程中,崩溃会影响整个进程 |
线程/进程间通信 |
复杂,需要使用IPC(如管道、消息队列等) |
简单,线程共享内存,易于通信 |
极其简单,通过共享变量或异步IO等 |
适用场景 |
适用于CPU密集型任务,需要高独立性和并行性 |
适用于I/O密集型任务,尤其需要多任务并发时 |
适用于I/O密集型任务,极高并发且资源使用少 |
开发难度 |
较高,进程间通信和同步复杂 |
中等,需要处理线程同步和死锁等问题 |
低,协程的开发较简单,但调度和控制需要注意 |
调试难度 |
中等,进程间隔离相对容易调试 |
较高,线程安全问题导致调试较困难 |
高,调试协程中的并发和状态控制较复杂 |
4.请你说说多进程、多线程同步通信方式是什么?
多进程
管道
- 匿名管道:用于父子进程之间的通信,通常为单向通信。
- 命名管道:允许不同的进程通过文件系统中的命名管道进行通信,支持双向通信。
- 优点:简单、轻量。
- 缺点:只能用于父子进程或具有相关关系的进程。
消息队列
- 允许进程通过消息队列发送和接收消息,消息按顺序排队。
- 优点:提供了进程间异步通信,支持多个生产者和消费者。
- 缺点:性能受限,特别是消息队列长度较长时。
共享内存
- 允许多个进程访问同一块内存区域,速度较快,但需要显式的同步机制(如信号量或互斥锁)。
- 优点:速度快,适合大数据量的共享。
- 缺点:需要额外的同步机制来保证数据一致性。
信号量
- 信号量用于控制对共享资源的访问,通过计数来实现资源的限制,防止多个进程同时访问共享资源。
- 优点:可以有效地防止竞争条件,控制并发。
- 缺点:实现复杂,容易产生死锁。
互斥锁
- 互斥锁是一种同步原语,确保同一时间只有一个进程能够访问某个资源。
- 优点:确保数据的一致性,防止竞争条件。
- 缺点:可能会产生死锁,需要小心设计。
多线程
互斥锁/锁
- 互斥锁是最常用的同步工具,确保只有一个线程能访问共享资源,其他线程必须等待锁被释放。
- 优点:简单直接,保证了线程安全。
- 缺点:容易产生死锁,锁粒度过大
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新