嵌软八股大全13 - Linux OS 相关问题汇总
1、进程 VS 线程 VS 协程?
1.1、概念?
什么是进程?线程?协程?
- 进程(Process)
- 操作系统资源分配和调度的基本单位,进程间是独立的,一个进程崩溃不会影响另外一个进程
- 线程(Thread)
- 进程的子任务,所有线程共享同一个进程的上下文和资源,一个线程崩溃可能会导致该进程崩溃
- 协程(Coroutine)
- 比线程更轻量级的并发单元,它允许在单个线程中执行多个任务
注意:Linux 内核并不区别对待进程和线程,线程对于内核来说仅仅是一个共享特定资源的进程而已
1.2、特点?
进程、线程和协程各自特点?
定义 | 操作系统中运行的独立程序实例 | 进程内的轻量级子任务 | 轻量级线程,用户级调度 |
独立性 | 独立 | 共享进程地址空间 | 共享进程地址空间 |
通信方式 | 进程间通信(IPC)机制 | 共享内存和同步机制 | 直接调用和共享内存 |
上下文切换 | 开销大 | 开销较小 | 开销最小 |
调度 | 操作系统内核调度 | 操作系统内核调度 | 用户程序调度 |
资源占用 | 高 | 较低 | 最低,轻量级 |
异常处理 | 独立进程崩溃不影响其他进程 | 线程崩溃可能导致进程崩溃 | 仅影响协程本身,不影响其他协程 |
1.3、IPC?
进程之间的通信方法(IPC)有哪几种?
IPC 主要用于在不同的进程之间传递数据和信号,主要有如下几种
- 管道(Pipe)
- 单向通信机制,使用 pipe() 函数创建
- 共享内存(Shared Memory)
- 它允许多个进程直接访问同一块内存区域,使用 shmxxx() 系列函数操作共享内存段
- 信号量(Semaphore)
- 用于控制进程对共享资源访问的同步机制,使用 semxxx() 系列函数操作信号量
- 消息队列(Message Queue)
- 允许进程以消息为单位发送/接收数据,FIFO,使用 msgxxx() 系列函数操作消息队列
- 套接字(Socket)
- 网络通信机制,TCP/UDP
- 信号
- 单向,signal() 或 sigaction() 函数捕获信号,使用 kill() 函数发送信号
多线程之间要传输大量的数据,如何实现?
- 共享内存
- 优点:避免了数据的复制和传输开销
- 缺点:需要仔细处理同步问题,容易出现死锁、竞态条件等问题
- 消息队列
1.4、进程调度?
操作系统进程调度方法有哪些?
- 先来先服务(first come first serve,FCFS)
- 短作业优先(short job first,SJF)
- 最短剩余时间优先(Shortest Remaining Time First, SRTF)
- 高响应比优先调度算法(Highest Reponse Ratio First,HRRF)
- 时间片轮转(Round Robin, RR)
- 完全公平调度(Completely Fair Scheduler,CFS)
各自特点?
先来先服务 | 实现简单,公平性较好,不会存在作业饥饿问题 |
短作业优先 | 最大程度减少平均等待时间,可能会造成长作业的饥饿现象 |
最短剩余时间优先 | - |
高响应比优先调度算法 | 等待时间较长的作业能够优先得到执行,提高系统的响应速度 |
时间片轮转 | 能够公平分配 CPU 时间 |
完全公平调度 |
讲一下 先来先服务 调度算法流程?
- 当一个作业到达时,将其放入就绪队列的末尾
- 当前执行的作业执行完毕后,从就绪队列中选择队首的作业进行运行
- 重复步骤 2,直到所有作业都执行完毕
讲一下 短作业优先 调度算法流程?
- 首先,按照 作业的执行时间 对待执行的作业队列进行排序,即将估计执行时间较短的作业排在前面
- 然后,选择执行时间最短的作业来运行,直到该作业执行完毕或者被阻塞
- 当作业执行完毕或者被阻塞时,从待执行作业队列中选择下一个执行时间最短的作业来运行
- 重复步骤 2 和步骤 3,直到所有作业都执行完毕
讲一下 最短剩余时间优先 调度算法流程?
讲一下 高响应比优先 调度算法流程?
什么是响应比:(等待时间+作业长度) / 作业长度
- 当一个作业到达时,计算其响应比
- 将计算得到的 响应比 最高的作业放入就绪队列
- 前执行的作业执行完毕后,从就绪队列中选择响应比最高的作业进行运行
- 重复步骤 2 和步骤 3,直到所有作业都执行完毕
讲一下 时间片轮转 调度算法流程?
- 将所有就绪进程按照 到达时间的顺序 放入就绪队列
- 设定一个固定的时间片大小,通常为几十毫秒
- 从就绪队列中选择一个进程,分配给它一个时间片的 CPU 时间
- 若该进程在时间片结束前完成任务,则该进程被移出就绪队列,否则将其放到队列的末尾等待下一次调度
- 重复步骤 3 和步骤 4,直到所有进程执行完毕
讲一下 完全公平 调度算法流程?
Linux 内核中的调度策略有哪些?
- 非实时进程调度策略
- SCHED_NORMAL (SCHED_OTHER),大多数普通用户进程使用的默认调度策略,CFS
- SCHED_BATCH,适用于批处理任务
- SCHED_IDLE,用于在系统空闲时运行的低优先级任务
- 实时进程调度策略
- SCHED_RR,时间片轮转
- SCHED_FIFO,先进先出
1.5、MAX?
Linux 理论上最多可以创建多少个进程 / 线程?
受 pid_max 和 threads-max 限制,可以通过以下命令查看进程/线程的限制数量
# 最大进程数量
cat /proc/sys/kernel/pid_max
# 最大线程数量
cat /proc/sys/kernel/threads-max
# 一般 pid_max 范围为 32768 到 4194304
1.6、特殊进程?
什么是孤儿进程?
父进程终止,子进程仍然运行,最终会被 init 进程(PID=1)收留
什么是僵尸进程?
子进程已经终止,但 PID 仍在系统进程表中,因为父进程未读取其退出状态(
wait
/waitpid
)
子进程结束的流程?
- 当子进程终止时会向父进程发送
SIGCHLD
信号- 父进程需要调用
wait/waitpid
函数来读取子进程的退出状态,然后子进程的进程描述符才能从系统进程表中移除- 如果未执行步骤 2 ,则子进程会处于僵尸状态
1.7、进程崩溃?
一个进程在什么时候会崩溃?
- 非法内存访问
- 非法操作,尝试执行没有权限的操作
- 非法指令,无效的机器指令或非法的操作码
- 除零操作
- 栈溢出
1.8、进程创建?
如何创建/销毁一个进程/线程?
使用 fork() 开一个新的子进程,使用 exit(0); 退出进程 使用 pthread_create() 开一个新线程,使用 pthread_exit(0); 退出线程
如何判断一个进程是不是子进程?
看 fork() 函数返回值,fork() 函数返回非负数表示父进程,返回 0 表示子进程
1.9、进程状态?
三态模型
- 执行
- 就绪
- 阻塞
五态模型
- 新建状态(New)
- 就绪状态(Ready)
- 运行状态(Running)
- 阻塞状态(Blocked)
- 终止状态(Terminated)
七态模型
- 新建状态
- 就绪挂起状态
- 就绪状态
- 运行状态
- 等待状态
- 挂起等待状态
- 终止状态
2、Linux 系统?
Linux 系统由哪几个子系统构成 ?
- 进程调度
- 内存管理
- 虚拟文件系统
- 网络接口
- 进程间通信
Linux 的设备有哪些?
- 字符设备
- 块设备
- 网络设备
Linux 驱动的匹配机制?
- OF,设备树
- ACPI
- id_table
- name
Linux 根目录文件下有哪些文件目录?作用?
- bin:基本的用户命令和二进制可执行文件
- dev:存放设备文件,提供设备接口
- etc:包含所有系统的配置文件和启动脚本
- home:用户的主目录,每个用户都有一个子目录
- lib:存放系统的共享库文件和内核模块
- mnt:临时挂载点
- proc:虚拟文件系统,存储系统的内核和进程信息
- sys:虚拟文件系统,提供与内核和硬件设备之间的接口
- usr:包含用户二进制文件、库文件、文档和其他资源
何时发生任务调度?
- 运行进程时间片用完
- 进程运行出错
- 运行进程阻塞
讲一下 Linux 中断分为上半部和下半部的原因?
一般来说,对于中断函数我们希望其执行的越快越好,但是实际上总有一些事件需要长时间去处理,因此提出了上 / 下半部这个概念,上半部也就是中断处理函数,负责处理比较紧急但不怎么费时间的事件(不能被其他中断打断),然后通过某些机制(软中断、tasklet 或工作队列等)抛出,让费时间的事件延后到下半部处理函数中得到执行,下半部则允许被其他中断打断
哪些程序应该放在上半部,哪些放在下半部?
- 上半部
- 任务对时间十分敏感
- 任务和硬件有关
- 任务要保证不被其他中断打断
- 其他的放在下半部
常见的实现下半部的方法有哪些?
- 软中断(softirq)
- 任务队列(tasklets)
- 工作队列(workqueues)
- 内核线程(Kthreads)
- 延时函数(Delayed Work)
tasklet、软中断和工作队列的原理?
软中断 是由操作系统提前固定好的,每一个软中断类型都有一个处理函数,工作在软中断上下文,适用于需要频繁调用的任务
tasklet 实际上是基于软中断实现的轻量级机制,工作在软中断上下文,适用于短小的任务,且不允许阻塞
工作队列 在内核线程上下文中执行延迟任务的机制,与上述两者不同,工作队列允许任务在执行时被阻塞,适合需要较长时间处理的任务
Linux 信号常用哪些?
- 中断信号(Ctrl+C),
SIGINT(2)
- 终止进程(kill pid),
SIGKILL(9)
怎么知道当前主机上挂载了有哪些 I2C 设备,用什么工具,什么原理?
ls /sys/bus/i2c/devices
(I2C 设备在初始化时创建了字符设备文件接口)- 使用其他工具
i2cdetect
Linux 中能进行浮点数运算吗?
可以,首先大多数现代 CPU 都内置集成了 FPU,其次如果硬件不支持 FPU,那 Linux 也可以通过软件库来模拟浮点数运算,但是效率可能会比较低
Linux 下 VSS、RSS、PSS 的区别?
VSS:进程所占用的虚拟地址空间的总大小
RSS:进程实际占用的物理内存的大小
PSS:对 RSS 的改进,表示进程使用的物理内存,但共享内存部分会按比例分摊到各个使用它的进程中
3、Linux 命令?
Linux 中遇到文件无法删除怎么解决?
- 权限问题
ls -l
,查看文件权限chmod 777 文件
,更改文件权限chown user:user 文件
,更改文件所有者sudo rm -rf 文件
- 文件被进程占用
lsof 文件
,查找正在使用该文件的进程kill pid
,杀死占用文件的进程sudo rm -rf 文件
软链接?
# 创建软链接,软链接有自己的 inode 号,实质为
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。