- 博客(1208)
- 收藏
- 关注

原创 Linux系统软件工程师/嵌入式Linux应用开发工程师 知识体系构建 500篇(持续更新)
今年受疫情影响,企业经营必不可免地受到冲击,企业在选人用人方面比以往都更加谨慎,招聘也更加苛刻。hr都试图用最低的成本去招最优秀的人才。本人从事嵌入式软件开发多年,结合自己的经验,推出了《嵌入式软件工程师技术面专题》,预计会有40篇,分成硬件协议、多进程多线程编程、网络编程、linux基础、C/C++等几大模块,每一篇在末尾都总结了相关提问,其中有些知识,即使是工作了两三年的同学也未必都懂,所以社招的同学也可以看,对于找工作绝对有帮助。**不打无准备之战,提前做好准备,方可立于不败之地**。欢迎大家订阅,只
2020-09-13 11:12:01
51095
73

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(3) 守护进程
守护进程(daemon),是一种运行在后台 的特殊进程,它独立于控制终端 ,并周期性地执行某项任务或等待处理某些发生的事件。守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能突破这种限制
2020-08-17 09:21:18
3845
4

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(4) 进程同步和通信的方式有哪些?
🥇 作者简介: 热衷于知识探索和分享的技术博主。💂 csdn主页::【✍️ 微信公众号:【🎉精彩专栏:🎓 【 🧡 【 📚【 🌎【✍️ 【 …💂关于作者: 曾就职于国内知名安防上市公司,现就职于国内知名AMR机器人公司,担任高级系统软件工程师。2020年至今保持CSDN博客专家,CSDN C/C++领域优质创作者头衔。全网5万+粉丝。十载寒冰,难凉热血;多年过去,历经变迁,物是人非。然而,对于技术的探索和追求从未停歇。💪坚持创作,热衷分享,初心未改,继往开来!
2020-08-16 16:27:48
11359
2

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(15) 内核空间、用户空间、内核态、用户态
为了保证用户进程不能直接操作内核,保证内核安全,操作系统将虚拟空间划分为两部分,一部分是内核空间,一部分是用户空间。针对Linux操作系统,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为内核空间,而较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。对于校招而言,该问题提问几率较大,因为是基础性问题,考察对内核空间和用户空间的理解,进程的内核态和用户态等概念。),进程切换时,用户空间切换,内核空间不变。
2020-08-16 16:18:39
15330
2

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(13) 请你描述下进程虚拟内存空间布局
对于这个问题,面试官可能拿出一张白纸,让你尝试画出linux下进程的虚拟内存空间布局,然后=再让你简述下每个分区的作用,可能会挑几个重点分区,例如堆区、栈区来进行深入展开,考察你对堆栈的理解等等。文章目录1 内核空间2 栈(stack)3 内存映射段(mmap)4 堆(heap)5 BSS段6 数据段(Data)7 代码段(text)8 保留区问题提问在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4
2020-08-16 16:00:34
2318
2

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(1) 进程和线程的基本概念与区别
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。线程(thread)是操作系统能够进行调度的最小单位。它被包含在进程之中,一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
2020-08-15 12:59:17
3556
2

原创 Linux C/C++ or 嵌入式面试之《网络编程系列》(4) tcp四次断开若干问题
首先A向B发送一个FIN报文段,报文段首部FIN=1,序列号seq=u(u为最后传送的数据的序列号加1,因为tcp规定,fin包消耗一个序列号,虽然没有发送数据),然后A进入FIN-WAIT-1(终止等待1)状态。(2)B收到释放连接的报文段后即发出确认报文段,报文首部ACK=1,ack=u+1,seq=v(v等于B前面传送过的数据的序列号加1),然后B进入CLOSE-WAIT(关闭等待)状态。(3)当A收到B的确认报文后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
2020-08-15 12:52:33
14993
2
原创 浅谈如何解决多组件系统相互依赖、调用导致接口复杂问题
通过统一的领域模型规范数据结构,并设计简洁的标准化接口,减少接口复杂度。具体做法梳理业务核心概念,定义统一的领域模型(如“用户”“订单”的属性和行为),确保各组件对数据的理解一致。基于领域模型设计接口,避免冗余字段(如接口仅返回必要的“订单ID”“状态”,而非全量信息)。接口版本控制:当业务变化时,通过版本号(如)管理接口迭代,避免频繁修改导致的混乱。优势:组件间基于共识的模型交互,减少沟通成本和接口适配工作量。通信上,通过协调层、事件驱动减少直接依赖;
2025-07-27 12:33:00
668
原创 面向对象分析与设计40讲(7)设计原则之合成复用原则
合成复用原则的核心是 “少用继承,多用组合继承是 “白箱复用”(子类可见父类内部),组合是 “黑箱复用”(仅通过接口使用)。在设计时,应优先考虑通过组合将不同功能模块化,让系统更灵活、更易维护。简单说:当你想 “这个类应该有某个功能” 时,先考虑 “能不能把这个功能做成对象,让类持有它”,而不是 “让类继承一个有这个功能的父类”。
2025-07-23 22:38:35
166
原创 面向对象分析与设计40讲(6)设计原则之开闭原则
这个实现的问题很明显:当需要新增一种图形(如三角形)时,必须修改ShapeCalculator类的calculateArea方法,添加新的判断分支,这就违反了 “对修改关闭” 的原则。具体来说,一个软件实体(如类、模块、函数等)应当允许在不修改其源代码的前提下,通过扩展的方式来新增功能。,通过定义抽象的接口或基类,让具体实现类去继承和扩展,而高层模块只依赖于抽象,不依赖具体实现。开闭原则是一种结果,一种指导思想,并非手段,想实现开闭原则,还得借助抽象来实现。实现开闭原则的关键是。
2025-07-22 23:10:18
70
原创 软件天生的复杂性
软件复杂性的本质是**“目标(需求)的不确定性”“实现(技术)的局限性”“协作(团队)的低效性”三者的叠加**。它不是某一个环节的问题,而是从需求定义到系统退役的全生命周期中,各种因素累积的结果。理解这些原因的价值在于:解决复杂性需“对症下药”——需求层面需明确边界,技术层面需控制债务,团队层面需降低沟通成本,最终实现“复杂性可控”而非“完全消除”。
2025-07-20 16:50:51
281
原创 库软件(Library Software)的核心特性与开发原则
库软件的本质是**“基础设施级的复用资产”**:其需求由依赖关系决定,其可靠性由契约和稳定性保障,其价值由易用性体现。这种定位要求库开发必须跳出“单一应用视角”,以“全局复用”为目标,通过专业化团队、严格的设计规范和长期维护,成为支撑整个技术生态的“基石”。正如Linux内核的发展逻辑——“一次做好,持续兼容”,库的价值不在于短期交付,而在于长期降低整个系统的开发与维护成本。
2025-07-17 13:30:23
704
原创 可复用软件的构建本质是组织能力的重构
可复用软件的构建本质是组织能力的重构:它需要打破部门壁垒、建立专业化分工、设计合理的激励机制,并借助技术工具实现效率跃迁。尽管初期投入较高,但复用组件的长期价值远超短期成本。正如C++标准库的优秀的复用设计不仅是技术问题,更是战略选择。企业需从“项目制思维”转向“资产化运营”,将复用能力纳入核心竞争力建设,方能在数字化浪潮中实现可持续发展。
2025-07-17 11:32:42
553
原创 std::vector<bool>有什么特殊的吗
但也带来了与标准容器不一致的行为。在实际开发中,需谨慎评估其适用性,必要时选择替代方案以避免潜在问题。理解其特性是编写健壮C++代码的关键。是标准库中的一个特殊容器,它虽然看似是存储布尔值的动态数组,但实际上是一个。每个布尔值(通常8个布尔值压缩为1字节),以节省内存空间。这些差异可能导致一些反直觉的行为,需特别注意。某些需要直接访问内存地址的算法(如。的迭代器返回的是代理对象,而非。由于位压缩存储,无法提供真正的。
2025-07-06 23:09:47
268
原创 linux/ubuntu日志管理--/dev/log 的本质与作用
是Linux系统中实现进程间通信(IPC)的一种特殊文件。它为应用程序提供了向系统日志服务(如rsyslogd、systemd-journald)发送日志的标准接口。系统之所以定义了这个,是想规范应用程序输出日志的接口,日志服务会持续迭代演变,但只要接口未变,应用程序的日志调用接口就不用修改,日志输出还会被记录。通常是一个指向实际套接字文件的符号链接。传递给当前系统的日志服务。编译后运行,日志会通过。
2025-07-06 12:30:14
523
原创 单用户模式、紧急模式、救援模式有什么区别
通过合理使用这三种模式,可有效解决Linux系统的各类启动和配置故障,确保系统恢复正常运行。通过修改GRUB启动参数。
2025-07-05 23:55:51
1004
原创 getaddrinfo工作原理分析
函数时,是否会发起网络通信取决于具体情况。(内存或文件),查看是否有最近解析过的域名记录。如果命中缓存,直接返回结果,文件,看是否存在域名到IP的静态映射。会调用系统的DNS解析器(通常是。如果缓存未命中,系统会检查本地的。如果找到匹配项,直接返回结果,获取DNS服务器地址(如。到配置的DNS服务器(如。如果前两步都未找到结果,
2025-07-04 18:04:29
333
原创 linux/ubuntu启动引导过程详细分析
Ubuntu的启动流程通过模块化设计和systemd的并行机制,在保证稳定性的同时,大幅提升了启动效率。理解各阶段的功能和依赖关系,有助于系统管理员进行性能优化和故障定位。作为init系统(PID=1),替代传统的SysV init,负责系统服务启动和管理。作为引导加载程序,负责加载内核和初始化参数。Ubuntu自15.04版本起使用。Ubuntu默认使用。
2025-07-04 16:34:18
713
原创 计算机科学导论(1)哈佛架构
哈佛架构(Harvard Architecture)是一种将程序指令存储和数据存储分开的计算机体系结构。其名称源于1944年哈佛大学开发的“马克一号”(Harvard Mark I)计算机,该架构与传统的冯·诺依曼架构形成鲜明对比,核心设计目标是提升数据处理效率和系统性能。哈佛架构通过“存储与总线分离”的设计,从硬件层面解决了冯·诺依曼架构的“总线瓶颈”问题,成为高性能计算、嵌入式系统和专用处理器的核心架构之一。其核心思想——将指令与数据的处理路径分离以实现并行性——至今仍是计算机体系结构优化的重要方向。
2025-07-04 15:11:35
1023
原创 udev 规则文件命名规范
数字前缀建议使用90-99,避免与系统规则冲突。描述性名称需清晰表达规则用途,例如:udev 规则文件名以数字开头的设计,本质是为了精确控制规则执行顺序和提升管理效率。通过数字前缀的优先级机制,系统可按设备初始化逻辑加载规则,确保硬件识别和配置的稳定性;而描述性名称则帮助管理员快速定位规则功能,降低维护成本。这一规范是 Linux 设备管理体系中“约定优于配置”的典型体现。
2025-07-04 11:45:32
690
原创 udev介绍与规则书写--Linux 系统中动态设备管理的核心组件
udev通过“动态映射+规则配置”的模式,解决了传统Linux设备管理的两大痛点:静态命名的随机性与权限管理的复杂性。从嵌入式设备到数据中心服务器,udev已成为Linux系统中硬件抽象的核心组件。理解其工作原理与规则编写方法,不仅能解决设备识别难题,更能为自动化部署、多设备管理等场景提供高效解决方案。
2025-07-04 11:25:12
681
原创 计算机科学导论(10)什么是BIOS
BIOS是计算机启动的“基石”,在硬件与系统间扮演着桥梁角色,但受限于技术架构,逐渐被更先进的UEFI替代。理解BIOS的原理,有助于排查计算机启动故障、优化硬件配置,以及理解现代固件技术的演进逻辑。
2025-07-03 23:24:19
902
原创 locate 命令更新机制详解
Linux 系统通常通过 crontab 定时任务 自动执行 命令,确保数据库与文件系统同步。该任务的配置文件一般位于:其中: 表示每天凌晨4点执行; 参数为静默模式,减少日志输出。二、定时任务的配置逻辑执行频率:权限控制:除定时任务外,系统还可能通过以下方式触发 :软件包管理器联动:手动触发场景:文件系统事件监控: 在扫描时会通过以下方式减少系统负担:排除指定目录:增量扫描策略:IO 优先级控制:数据库更新延迟导致查询失效:定时任务未执行排查:自定义更新频率:总
2025-07-03 23:10:38
776
原创 locate命令的原理是啥
将实时搜索转化为快速查询,适用于需要频繁查找已知文件名的场景。但需注意其时效性依赖数据库更新,且功能局限于路径匹配。若需复杂条件检索或实时结果,仍需使用。命令是Linux系统中用于快速查找文件或目录的工具,其原理主要围绕。命令的高效性源于它不直接遍历文件系统,而是查询。命令的核心优势在于通过。
2025-07-03 23:10:01
305
原创 ubuntu网络管理五花八门netplan 、NetworkManager、systemd、networking是什么关系
A: Netplan 只是生成配置,实际管理由底层工具(NetworkManager 或 systemd-networkd)执行。如果需要更详细的配置示例,可以参考 Netplan 官方文档或 Ubuntu 网络管理指南。,它们各自有不同的作用,但也可以协同工作。A: 可能是 YAML 缩进错误,或底层服务未重启。Ubuntu 的网络管理确实涉及多个组件,包括。修改,可能会覆盖 Netplan 的配置。
2025-06-19 23:16:47
1001
原创 NetworkManager介绍与用法
NetworkManager 是 Linux 上最强大的网络管理工具之一,适用于桌面和服务器环境,支持动态网络切换、VPN、DNS 管理等。通过nmclinmtui或 GUI 工具,用户可以灵活配置网络,而高级用户可通过配置文件进一步定制行为。
2025-06-19 23:15:40
761
原创 编译链接实战(32)再探动态库的本质和原理
其核心依赖位置无关代码(PIC)和动态符号解析机制。相比静态库,动态库在资源利用和灵活性上优势明显,但需要处理依赖管理和ABI兼容性问题。理解其原理有助于优化程序部署和维护。,其核心原理是通过操作系统的动态链接机制实现代码的共享和灵活更新。多个进程可共享同一动态库的代码段(只读),数据段每进程独立(Copy-on-Write)。存储导出的函数/变量符号(供其他程序调用)和依赖的外部符号(如。动态库(Dynamic Library,也称共享库)的本质是。记录运行时需要修正的地址(如外部函数调用)。
2025-06-15 18:04:51
107
原创 编译链接实战(30)strip移除了哪些内容
合理使用可减小发布体积,但需确保不破坏关键功能(如动态链接)。调试时可通过外部符号文件(如。)中的调试信息和符号表,以减少文件体积并提高安全性。命令主要用于移除二进制文件(如可执行文件、动态库。部分情况下会被移除,影响 C++ 异常回溯。,但对运行必需的动态符号(
2025-06-15 16:03:08
132
原创 编译链接实战(29)了解什么是ABI(应用程序二进制接口)
ABI(Application Binary Interface,应用程序二进制接口)是软件系统中不同模块之间的底层接口规范,定义了二进制层面的交互规则。它与API(Application Programming Interface)不同,API关注源代码级别的交互,而ABI关注的是编译后的二进制代码如何协同工作。ABI是软件生态的“隐形契约”,确保二进制组件无缝协作。理解ABI有助于解决链接错误、性能优化(如避免不必要的参数传递开销)以及跨平台/语言开发问题。
2025-06-15 15:47:28
68
原创 编译链接实战(27)动态库实现变了,可执行程序需要重新编译吗
是结构体的第一个成员,但动态库已交换顺序,导致内存解析错误。:动态库内部实现改变但接口不变时,可执行程序无需重新编译。:必须修改代码或恢复动态库的符号。下面通过具体的代码示例来验证。符号,导致运行时链接失败。:必须重新编译可执行程序。
2025-06-15 15:37:22
83
原创 coredump文件的原理是啥
Core Dump(核心转储)是操作系统在程序崩溃(如段错误、非法指令等)时自动生成的一个文件,它包含了程序崩溃瞬间的。通过 core dump,开发者可以像“时间回溯”一样检查程序崩溃瞬间的状态,是调试复杂问题的利器!终止时,Linux 内核会生成 core 文件。不会生成 core dump,因为它们是“优雅终止”信号。这样 core 文件会直接压缩存储,节省磁盘空间。的文件(类似可执行文件),可以用。Core 文件本质上是一个。
2025-06-08 09:55:49
93
原创 软件功能模块归属论证方法
在讨论软件功能点应该归属哪些模块时,并没有放之四海而皆准的固定方法,但可以通过系统化的论证和设计原则来做出合理决策。以下是常见的论证方法和关键考虑因素:单一职责原则 (SRP)高内聚低耦合复用性领域驱动设计 (DDD)功能相关性分析变更影响评估性能与数据局部性团队协作边界分层架构约束没有绝对正确的答案,但可通过以下步骤决策:最终目标是实现可维护性、可扩展性和团队协作效率的平衡。
2025-06-06 22:46:15
435
原创 低内聚高耦合的衡量指标
程度需要通过具体的指标和观察点来判断。内聚性指模块内部元素(函数、类、组件)之间的功能相关性。低内聚表现为模块职责分散、功能混杂。耦合度指模块间依赖关系的强度。高耦合表现为模块间直接依赖过多,难以独立修改或替换。通过量化指标和设计原则,可以客观评估系统的内聚和耦合问题,并针对性优化。
2025-06-06 22:45:06
551
原创 Linux平台排查CPU占用高的进程和线程指南
定位高CPU进程:使用top/htop/ps找出问题进程分析进程线程:top -H/ps -T查看线程情况检查调用栈:使用gdb/perf分析执行路径监控系统调用:strace跟踪具体行为检查依赖资源:查看是否因等待IO/锁等导致分析日志:检查系统日志和应用日志。
2025-06-03 21:32:54
498
有初学C++ C linux 嵌入式的吗,这里集合,有大量系统学习的博客教程
2021-04-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人