嵌软八股大全13 - Linux OS 相关问题汇总

1、进程 VS 线程 VS 协程?

1.1、概念?

什么是进程?线程?协程?

  1. 进程(Process)
    1. 操作系统资源分配和调度的基本单位,进程间是独立的,一个进程崩溃不会影响另外一个进程
  2. 线程(Thread)
    1. 进程的子任务,所有线程共享同一个进程的上下文和资源,一个线程崩溃可能会导致该进程崩溃
  3. 协程(Coroutine)
    1. 比线程更轻量级的并发单元,它允许在单个线程中执行多个任务

注意:Linux 内核并不区别对待进程和线程,线程对于内核来说仅仅是一个共享特定资源的进程而已

1.2、特点?

进程、线程和协程各自特点?

进程 线程 协程
定义 操作系统中运行的独立程序实例 进程内的轻量级子任务 轻量级线程,用户级调度
独立性 独立 共享进程地址空间 共享进程地址空间
通信方式 进程间通信(IPC)机制 共享内存和同步机制 直接调用和共享内存
上下文切换 开销大 开销较小 开销最小
调度 操作系统内核调度 操作系统内核调度 用户程序调度
资源占用 较低 最低,轻量级
异常处理 独立进程崩溃不影响其他进程 线程崩溃可能导致进程崩溃 仅影响协程本身,不影响其他协程

1.3、IPC?

进程之间的通信方法(IPC)有哪几种?

IPC 主要用于在不同的进程之间传递数据和信号,主要有如下几种

  1. 管道(Pipe)
    1. 单向通信机制,使用 pipe() 函数创建
  2. 共享内存(Shared Memory)
    1. 它允许多个进程直接访问同一块内存区域,使用 shmxxx() 系列函数操作共享内存段
  3. 信号量(Semaphore)
    1. 用于控制进程对共享资源访问的同步机制,使用 semxxx() 系列函数操作信号量
  4. 消息队列(Message Queue)
    1. 允许进程以消息为单位发送/接收数据,FIFO,使用 msgxxx() 系列函数操作消息队列
  5. 套接字(Socket)
    1. 网络通信机制,TCP/UDP
  6. 信号
    1. 单向,signal() 或 sigaction() 函数捕获信号,使用 kill() 函数发送信号

多线程之间要传输大量的数据,如何实现?

  1. 共享内存
    1. 优点:避免了数据的复制和传输开销
    2. 缺点:需要仔细处理同步问题,容易出现死锁、竞态条件等问题
  2. 消息队列

1.4、进程调度?

操作系统进程调度方法有哪些?

  1. 先来先服务(first come first serve,FCFS)
  2. 短作业优先(short job first,SJF)
  3. 最短剩余时间优先(Shortest Remaining Time First, SRTF)
  4. 高响应比优先调度算法(Highest Reponse Ratio First,HRRF)
  5. 时间片轮转(Round Robin, RR)
  6. 完全公平调度(Completely Fair Scheduler,CFS)

各自特点?

方法 特点
先来先服务 实现简单,公平性较好,不会存在作业饥饿问题
短作业优先 最大程度减少平均等待时间,可能会造成长作业的饥饿现象
最短剩余时间优先 -
高响应比优先调度算法 等待时间较长的作业能够优先得到执行,提高系统的响应速度
时间片轮转 能够公平分配 CPU 时间
完全公平调度

讲一下 先来先服务 调度算法流程?

  1. 当一个作业到达时,将其放入就绪队列的末尾
  2. 当前执行的作业执行完毕后,从就绪队列中选择队首的作业进行运行
  3. 重复步骤 2,直到所有作业都执行完毕

讲一下 短作业优先 调度算法流程?

  1. 首先,按照 作业的执行时间 对待执行的作业队列进行排序,即将估计执行时间较短的作业排在前面
  2. 然后,选择执行时间最短的作业来运行,直到该作业执行完毕或者被阻塞
  3. 当作业执行完毕或者被阻塞时,从待执行作业队列中选择下一个执行时间最短的作业来运行
  4. 重复步骤 2 和步骤 3,直到所有作业都执行完毕

讲一下 最短剩余时间优先 调度算法流程?

讲一下 高响应比优先 调度算法流程?

什么是响应比:(等待时间+作业长度) / 作业长度

  1. 当一个作业到达时,计算其响应比
  2. 将计算得到的 响应比 最高的作业放入就绪队列
  3. 前执行的作业执行完毕后,从就绪队列中选择响应比最高的作业进行运行
  4. 重复步骤 2 和步骤 3,直到所有作业都执行完毕

讲一下 时间片轮转 调度算法流程?

  1. 将所有就绪进程按照 到达时间的顺序 放入就绪队列
  2. 设定一个固定的时间片大小,通常为几十毫秒
  3. 从就绪队列中选择一个进程,分配给它一个时间片的 CPU 时间
  4. 若该进程在时间片结束前完成任务,则该进程被移出就绪队列,否则将其放到队列的末尾等待下一次调度
  5. 重复步骤 3 和步骤 4,直到所有进程执行完毕

讲一下 完全公平 调度算法流程?

Linux 内核中的调度策略有哪些?

  1. 非实时进程调度策略
    1. SCHED_NORMAL (SCHED_OTHER),大多数普通用户进程使用的默认调度策略,CFS
    2. SCHED_BATCH,适用于批处理任务
    3. SCHED_IDLE,用于在系统空闲时运行的低优先级任务
  2. 实时进程调度策略
    1. SCHED_RR,时间片轮转
    2. 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

子进程结束的流程?

  1. 当子进程终止时会向父进程发送 SIGCHLD 信号
  2. 父进程需要调用 wait/waitpid 函数来读取子进程的退出状态,然后子进程的进程描述符才能从系统进程表中移除
  3. 如果未执行步骤 2 ,则子进程会处于僵尸状态

1.7、进程崩溃?

一个进程在什么时候会崩溃?

  1. 非法内存访问
  2. 非法操作,尝试执行没有权限的操作
  3. 非法指令,无效的机器指令或非法的操作码
  4. 除零操作
  5. 栈溢出

1.8、进程创建?

如何创建/销毁一个进程/线程?

使用 fork() 开一个新的子进程,使用 exit(0); 退出进程 使用 pthread_create() 开一个新线程,使用 pthread_exit(0); 退出线程

如何判断一个进程是不是子进程?

看 fork() 函数返回值,fork() 函数返回非负数表示父进程,返回 0 表示子进程

1.9、进程状态?

三态模型

  1. 执行
  2. 就绪
  3. 阻塞

alt

五态模型

  1. 新建状态(New)
  2. 就绪状态(Ready)
  3. 运行状态(Running)
  4. 阻塞状态(Blocked)
  5. 终止状态(Terminated)

alt

七态模型

  1. 新建状态
  2. 就绪挂起状态
  3. 就绪状态
  4. 运行状态
  5. 等待状态
  6. 挂起等待状态
  7. 终止状态

alt

2、Linux 系统?

Linux 系统由哪几个子系统构成 ?

  1. 进程调度
  2. 内存管理
  3. 虚拟文件系统
  4. 网络接口
  5. 进程间通信

Linux 的设备有哪些?

  1. 字符设备
  2. 块设备
  3. 网络设备

Linux 驱动的匹配机制?

  1. OF,设备树
  2. ACPI
  3. id_table
  4. name

Linux 根目录文件下有哪些文件目录?作用?

  1. bin:基本的用户命令和二进制可执行文件
  2. dev:存放设备文件,提供设备接口
  3. etc:包含所有系统的配置文件和启动脚本
  4. home:用户的主目录,每个用户都有一个子目录
  5. lib:存放系统的共享库文件和内核模块
  6. mnt:临时挂载点
  7. proc:虚拟文件系统,存储系统的内核和进程信息
  8. sys:虚拟文件系统,提供与内核和硬件设备之间的接口
  9. usr:包含用户二进制文件、库文件、文档和其他资源

何时发生任务调度?

  1. 运行进程时间片用完
  2. 进程运行出错
  3. 运行进程阻塞

讲一下 Linux 中断分为上半部和下半部的原因?

一般来说,对于中断函数我们希望其执行的越快越好,但是实际上总有一些事件需要长时间去处理,因此提出了上 / 下半部这个概念,上半部也就是中断处理函数,负责处理比较紧急但不怎么费时间的事件(不能被其他中断打断),然后通过某些机制(软中断、tasklet 或工作队列等)抛出,让费时间的事件延后到下半部处理函数中得到执行,下半部则允许被其他中断打断

哪些程序应该放在上半部,哪些放在下半部?

  1. 上半部
    1. 任务对时间十分敏感
    2. 任务和硬件有关
    3. 任务要保证不被其他中断打断
  2. 其他的放在下半部

常见的实现下半部的方法有哪些?

  1. 软中断(softirq)
  2. 任务队列(tasklets)
  3. 工作队列(workqueues)
  4. 内核线程(Kthreads)
  5. 延时函数(Delayed Work)

tasklet、软中断和工作队列的原理?

软中断 是由操作系统提前固定好的,每一个软中断类型都有一个处理函数,工作在软中断上下文,适用于需要频繁调用的任务

tasklet 实际上是基于软中断实现的轻量级机制,工作在软中断上下文,适用于短小的任务,且不允许阻塞

工作队列 在内核线程上下文中执行延迟任务的机制,与上述两者不同,工作队列允许任务在执行时被阻塞,适合需要较长时间处理的任务

Linux 信号常用哪些?

  1. 中断信号(Ctrl+C),SIGINT(2)
  2. 终止进程(kill pid),SIGKILL(9)

怎么知道当前主机上挂载了有哪些 I2C 设备,用什么工具,什么原理?

  1. ls /sys/bus/i2c/devices(I2C 设备在初始化时创建了字符设备文件接口)
  2. 使用其他工具 i2cdetect

Linux 中能进行浮点数运算吗?

可以,首先大多数现代 CPU 都内置集成了 FPU,其次如果硬件不支持 FPU,那 Linux 也可以通过软件库来模拟浮点数运算,但是效率可能会比较低

Linux 下 VSS、RSS、PSS 的区别?

VSS:进程所占用的虚拟地址空间的总大小
RSS:进程实际占用的物理内存的大小
PSS:对 RSS 的改进,表示进程使用的物理内存,但共享内存部分会按比例分摊到各个使用它的进程中

3、Linux 命令?

Linux 中遇到文件无法删除怎么解决?

  1. 权限问题
    1. ls -l ,查看文件权限
    2. chmod 777 文件 ,更改文件权限
    3. chown user:user 文件,更改文件所有者
    4. sudo rm -rf 文件
  2. 文件被进程占用
    1. lsof 文件 ,查找正在使用该文件的进程
    2. kill pid,杀死占用文件的进程
    3. sudo rm -rf 文件

软链接?

# 创建软链接,软链接有自己的 inode 号,实质为

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。

全部评论

相关推荐

评论
2
14
分享

创作者周榜

更多
牛客网
牛客企业服务