D-bus相对于其他进程间通信技术有哪些优势

D-Bus(Desktop Bus) 是 freedesktop.org 主导开发的消息总线型进程间通信(IPC)中间件,专为 Linux 桌面与系统服务设计,是 Linux 生态中最主流的 IPC 方案。
D-Bus 是高级封装,自带总线 daemon,有额外开销与约束;而原始 IPC 是裸奔,更轻、更快、更可控。
在这里插入图片描述

FreeRTOS中的消息队列是什么?如何使用消息队列进行任务间通信?

FreeRTOS消息队列是FIFO缓冲区,用于任务间安全传递数据。

PS:
FIFO 是规则,队列是数据结构。
FIFO:意思是先进先出,是一种规则
队列(Queue):就是按照 FIFO 规则工作的容器

QueueHandle_t q = xQueueCreate(10, sizeof(int));
xQueueSend(q, &data, portMAX_DELAY);    // 发送
xQueueReceive(q, &data, portMAX_DELAY); // 接收

特点:数据是拷贝传递保证安全、支持超时等待、ISR中用 FromISR 后缀版本、队列满/空时任务自动阻塞/唤醒。

队列是FreeRTOS最基础的通信机制,信号量和互斥量内部也基于队列实现。

mutex、semaphore 与 condition variable 的区别是什么?

① Mutex —— 互斥锁
作用:保护共享资源,同一时间只让一个任务用
场景:两个任务同时改一个全局变量、同时操作串口、同时访问硬件。
特点:谁加锁,谁才能解锁(所有权)。

② Semaphore —— 信号量
分两种:
二值信号量(0/1):类似锁,但没有所有权,谁都能释放。
计数信号量(0~N):相当于可用资源个数,比如 3 个缓冲区、5 个串口。
作用:同步、限流、资源计数。

③ Condition Variable —— 条件变量
作用:让任务等某个条件成立,条件不满足就休眠,不占 CPU。
场景:
等队列非空
等某个标志置位
等 “可以开始干活了” 的信号
特点:必须配合互斥锁一起用


互斥锁:保护资源,防止抢。
信号量:发通知、数资源、做同步。
条件变量:等复杂条件(一般 RTOS 很少用)。
PS:
信号量:信号是 “资源”,拿走就没了。
条件变量:信号只是 “叫醒服务”,状态要自己看。

pthread_create 的使用方法以及线程同步机制有哪些?

参考答案
pthread_create(&tid, NULL, thread_func, arg) 创建线程。

线程同步机制:

互斥锁(pthread_mutex):保护共享数据互斥访问
条件变量(pthread_cond):让线程等待条件,配合mutex使用
读写锁(pthread_rwlock):读共享写排他
自旋锁(pthread_spin):临界区极短时使用

线程结束后用 pthread_join() 回收或 pthread_detach() 自动回收。

PS:
互斥锁:我用你别用(通用)
读写锁:读共享、写独占(读多写少)
自旋锁:不睡觉,死循环等(极短临界区)

什么是守护进程(daemon)?如何编程创建一个守护进程?需要哪些关键步骤?

守护进程 = 后台默默运行、不跟你交互、开机自启、一直运行的程序

普通进程:你开个终端跑 ./a.out,关掉终端进程就没了。
守护进程:关掉终端、退出登录,它依然在后台跑。

下面一套步骤,就是把一个普通进程 “改造” 成:
脱离终端、独立运行、不受用户登录影响、安全稳定的系统后台服务。
每一步都是为了去掉和 “用户环境” 的绑定。

fork 父退出:让终端不再等待,程序后台化
setsid:切断与终端的绑定,关终端不被杀
再 fork:防止重新获取终端,更安全
chdir(“/”):不占用目录,不影响设备卸载
umask(0):文件权限干净可控
关闭 0/1/2:不和终端交互,避免异常
运行业务逻辑:成为真正的后台服务

什么是线程同步和互斥

线程同步:多个线程按一定顺序协调执行,比如线程B要等线程A完成某操作后才能继续。典型工具:条件变量、信号量、屏障。

线程互斥:多个线程不能同时访问共享资源(临界区),同一时刻只有一个线程能进入。典型工具:互斥锁。

关系:互斥是同步的一种特殊情况。同步强调顺序,互斥强调排他。

例子:

生产者-消费者模型中,生产者和消费者之间是同步(有数据才能消费),对缓冲区的访问是互斥(同时只能一个操作)

什么是进程、线程,彼此有什么区别?

进程是操作系统资源分配的基本单位,拥有独立的地址空间和系统资源(文件描述符、信号处理等)。

线程是 CPU 调度的基本单位,同一进程内的线程共享地址空间和大部分资源,但各自有独立的栈和寄存器。

核心区别:

进程间隔离性强但通信开销大;线程间共享内存但需要同步
创建/切换线程的开销远小于进程
一个线程崩溃会导致整个进程崩溃
Linux 内核中线程本质是 clone() 创建的轻量级进程

信号量、互斥锁、消息队列分别适用于什么场景?它们的区别是什么?

  1. 互斥锁(mutex)
    作用
    保护共享变量,保证同一时间只有一个人在修改。
    特点
    只有 0 或 1 两种状态
    谁加锁,必须谁解锁
    默认只用于同一进程内的线程

  2. 信号量(semaphore)
    作用
    控制 最多 N 个线程 / 进程同时进入(限流)
    实现 先后顺序同步(A 执行完,B 再执行)
    可用于线程,也可用于进程,进程间共享内存同步(最经典用法)

  3. 消息队列
    作用
    进程之间传递结构化数据。
    几乎只用于进程间通信

孤儿进程、僵尸进程、守护进程分别是什么?

三种特殊进程:

孤儿进程:父进程先于子进程退出,子进程变成孤儿,被 init(PID=1)进程收养,由 init 负责回收。无害
僵尸进程:子进程退出后,父进程没有调用 wait()/waitpid() 回收其退出状态。子进程的 task_struct 还残留在内核中,状态为 Z(Zombie)。有害(占用 PID 和内核资源)
守护进程(Daemon):在后台运行的服务进程,与终端脱离关联。如 sshd、crond。通常通过两次 fork() + setsid() 创建

线程同步与阻塞是什么关系?同步一定阻塞吗,阻塞一定同步吗?

都不一定
线程同步:多线程按规则协调执行,互相等待
非同步:线程各跑各的,互不等待、不协调
阻塞:线程主动暂停休眠,不占 CPU
非阻塞:线程不休眠,要么忙等,要么直接继续

  1. 同步一定阻塞吗?
    不一定。
    同步可以用阻塞方式,也可以用非阻塞方式:
    阻塞同步:mutex、sem_wait、cond_wait(拿不到就休眠,不占 CPU)
    非阻塞同步:
    自旋锁(循环忙等,不休眠,占 CPU)
    trylock(拿不到直接返回)
    原子操作(无锁,一步完成)
    所以:
    同步 ≠ 必须阻塞
  2. 阻塞一定是同步吗?
    不一定。
    很多阻塞和 “线程协调” 毫无关系,比如:
    sleep(1)
    阻塞式 read、write、网络 IO
    等待键盘输入
    这些只是线程自己阻塞等待,没有和其他线程协调,不属于同步。

PS:
只要是阻塞:一定休眠、不占 CPU
只要是非阻塞:一定不休眠
但可能是忙等(占 CPU)
也可能是直接返回(不占)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐