嵌入式 操作系统(四)

更多专栏:

超详细的嵌入式面经专栏(适用于小白学习和大佬复习):https://www.nowcoder.com/creation/manager/columnDetail/mGYoDz

校招公司汇总专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybKdp

目录:

1.线程池设计思路

2.请你说说什么是孤儿进程、僵尸进程、守护进程?

3.什么是并发,同步,异步,互斥,阻塞,非阻塞?

4.你了解死锁吗?请你说说产生的条件?如何解决?

5.什么是互斥锁机制?互斥锁和读写锁有什么区别?

6.什么是自旋锁,和互斥锁有什么区别?

内容:

1.线程池设计思路

设计线程池的原因

  • 减少线程创建和销毁的开销
  • 控制线程数量,避免资源浪费
  • 线程池中的线程是预先创建好的,任务一到达,线程池就能立刻分配线程来执行任务,极大地提高了任务响应的速度。
  • 线程池可以设置任务的优先级,优先执行高优先级的任务,适用于任务有不同重要性的场景。
  • 线程池的管理机制有助于避免线程泄漏。没有线程池时,线程的创建和销毁通常是由程序员手动管理的,容易出现线程未关闭或无法结束的情况,导致线程泄漏,占用系统资源。

如何设计一个线程池

  • 创建一个线程安全的任务队列,充当生产者消费者队列,作为临界资源。
  • 初始化n个线程,并让它们进入等待状态,准备处理任务。
  • 当任务队列为空时,所有线程阻塞,等待新任务的到来。
  • 当生产者队列来一个任务之后,先对队列进行加锁,然后把任务挂到队列上。使用条件变量通知一个阻塞中的线程来处理任务。

线程池中线程数量

注意:线程池中线程数量与CPU核数、IO、并行、并发有关。

  • CPU密集型任务:对于 CPU 密集型任务,建议将线程池大小设置为CPU核心数量+1,因为 CPU 密集型任务不会并行执行得更快,反而会受到线程切换和上下文切换的影响。这样可以保持CPU的高利用率。
  • I/O密集型任务:对于 I/O 密集型任务,线程池的大小可以设置得更大,因为这些任务通常会在等待 I/O 操作时阻塞,因此可以通过增加线程数来更好地利用系统资源。,建议将线程池大小设置为2*CPU核心数量+1。
  • 并行度和响应性需求:线程池的大小还受到任务的并行度和对响应性的需求影响。最佳线程数目 = (线程等待时间/线程CPU时间 + 1)* CPU数目。

2.请你说说什么是孤儿进程、僵尸进程、守护进程?

孤儿进程

孤儿进程是指一个子进程的父进程在子进程还未结束时已经终止了。这意味着子进程的父进程消失了,而该子进程仍然在运行。

为什么会出现孤儿进程

  • 当一个进程创建了子进程(即父进程是子进程的父进程),如果父进程提前终止(无论是正常退出还是崩溃),子进程就会成为孤儿进程。
  • 操作系统为了避免孤儿进程影响系统稳定性,通常会将这些孤儿进程的父进程设置为 init进程(在 UNIX/Linux 系统中是进程号为1的进程)。init进程将会收养这些孤儿进程,成为它们的父进程,并负责清理资源。

例子:

假设进程 A 创建了进程 B。如果进程 A 退出,而进程 B 还在运行,那么进程 B 就变成了孤儿进程。此时,init进程会成为进程 B 的父进程。

僵尸进程

僵尸进程是指已经完成执行的进程,但其父进程还没有调用 wait()waitpid() 来回收该进程的资源,因此它仍然保留在进程表中。

为什么会出现僵尸进程

  • 当一个进程完成执行后,操作系统会保留该进程的部分信息(如进程ID、退出状态等)以供父进程获取。如果父进程没有及时调用 wait() 来获取子进程的退出状态,子进程的资源就无法被释放。
  • 虽然僵尸进程的执行已完成,但它依然占据操作系统的进程表项。

检查和清理僵尸进程

使用 pstop 查找僵尸进程

  • 使用命令 ps aux | grep 'Z' 来查找系统中所有的僵尸进程。Z 表示该进程是僵尸进程。
ps aux | grep 'Z'

  • 使用 top 命令检查僵尸进程。在 top 中,僵尸进程通常显示为 Z 状态。

杀死父进程

如果父进程没有回收子进程的资源,可以通过终止父进程来让 init 进程收养子进程,然后由 init 进程回收资源。

  • 查找父进程的PID:使用 ps -ef 查找僵尸进程的父进程 ID(PID)。
  • 杀死父进程:使用 kill 命令终止父进程。
kill -9 <parent_pid>

一旦父进程被终止,init 进程会收养子进程并回收它们,僵尸进程就会被清除。

例子:

假设进程 A 创建了进程 B。进程 B 执行完成,但父进程 A 没有调用 wait()。此时,进程 B 就变成了僵尸进程。直到进程 A 调用 wait() 或退出后,init 进程回收 B,僵尸进程才会消失。

守护进程

守护进程是在后台运行不受终端控制的进程(如输入、输出等)。网络服务大部分就是守护进程。

为什么需要守护进程

  • 守护进程通常在系统启动时启动,且一直运行,直到系统关闭。它们提供了服务,通常是系统的核心功能服务,如网络服务、日志管理、系统监控等。
  • 守护进程通常不需要用户交互,而是自动化地执行某些任务。

守护进程的创建过程:

  • 创建子进程:一个进程调用 fork() 来创建子进程。
  • 子进程脱离终端:子进程通过调用 setsid() 来创建一个新的会话,并使自己成为会话的领导者,脱离终端。
  • 关闭文件描述符:守护进程会关闭从父进程继承的文件描述符,避免它们与终端、标准输入/输出产生关联。
  • 在后台运行:守护进程开始执行其后台任务,并将自己的输出定向到日志文件等地方。

例子:

  • sshd:在 Linux 系统中,sshd(SSH 守护进程)负责处理远程登录连接。它会在系统启动时启动,并保持在后台运行,等待用户通过 SSH 协议连接。
  • croncron 守护进程定期执行系统任务(如定时备份、清理日志等)。

3.什么是并发,同步,异步,互斥,阻塞,非阻塞?

并发

并发指的是在同一时间段内处理多个任务的能力。并发并不意味着这些任务一定是在同一时刻同时执行,而是指在一个时间段内可以对多个任务进行调

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

嵌入式/C++八股 文章被收录于专栏

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

全部评论
加更加更
点赞 回复 分享
发布于 01-21 13:01 陕西
可以
点赞 回复 分享
发布于 01-21 13:41 陕西
已老实这么多要背嘛
点赞 回复 分享
发布于 01-21 17:27 陕西
佬速更
点赞 回复 分享
发布于 02-02 11:18 重庆

相关推荐

半导体行业作为现代科技的核心,正迎来前所未有的发展机遇。掌握芯片技术,突破关键领域,轻松搞定offer,开启半导体领域的高薪职业生涯。一、半导体行业的热门技能半导体行业对技术能力要求极高,掌握核心技能是关键。芯片设计是基础,熟悉Verilog或VHDL等硬件描述语言,能够设计复杂的集成电路。芯片制造则涉及光刻、蚀刻、掺杂等工艺,掌握这些工艺能够帮助你理解芯片生产的全流程。此外,半导体测试和封装也是必备技能,通过掌握ATE(自动测试设备)和封装技术,能够确保芯片的质量和性能。这些技能不仅能够提升你的专业能力,还能在求职中增加你的竞争力,帮助你轻松搞定offer。二、如何提升半导体技能提升半导体技能需要理论学习与实践相结合。参加专业课程和培训,如半导体设计工程师认证课程,系统学习理论知识。参与实际项目是提升技能的关键。可以通过实习或参与半导体项目,积累实际经验。例如,参与一个芯片设计项目,从需求分析到电路设计,再到仿真验证,全程参与,不仅能提升你的技术能力,还能为简历增添亮点,增加搞定offer的机会。关注行业动态,参加半导体研讨会和学术会议,了解最新技术和应用场景,也是提升技能的重要途径。三、半导体行业求职技巧在求职过程中,展示你的技术能力和项目经验是关键。优化简历,突出你在半导体项目中的角色和成果,如成功设计的芯片模块、优化的制造工艺等。准备面试时,熟悉常见问题和案例分析,展示你的逻辑思维和问题解决能力。此外,建立个人品牌也很重要。通过维护LinkedIn等社交媒体上的专业形象,分享你的技术见解和项目经验,能够提升你的行业知名度,吸引更多潜在雇主的关注,从而轻松搞定offer。参加行业活动,结识行业内专业人士,也能为你提供更多的求职机会和职业发展建议。#牛客AI配图神器#
点赞 评论 收藏
分享
评论
12
17
分享

创作者周榜

更多
牛客网
牛客企业服务