嵌入式 操作系统(三)

更多专栏:

超详细的嵌入式面经专栏(适用于小白学习和大佬复习):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/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新

全部评论
更了更了新鲜的诶 博主加油更
点赞 回复 分享
发布于 01-20 11:51 陕西

相关推荐

评论
12
21
分享

创作者周榜

更多
牛客网
牛客企业服务