Other

串行通信与并行通信​ 串行通信(Serial Communication)​ 概念:数据 按位顺序一位一位地传输​ 传输线少(通常 1 条数据线 + 控制线)​ 常用接口:​ UART / USART / RS-232 / RS-485​ SPI(单线或多线模式,但本质是串行传输)​ 特点:​ 接线简单,成本低​ 传输距离可长(易抗干扰)​ 速度相对并行慢(但高速串口可达到 Mbps 级)​ 并行通信(Parallel Communication)​ 概念:数据 同时通过多条数据线传输多个位​ 典型接口:​ MCU GPIO 并行总线​ CPU 与外设(如打印机、LCD)并行接口​ 特点:​ 速度快(一次可传多个 bit)​ 接线复杂,成本高​ 传输距离短(长线干扰大) 总结 串行通信是数据按位顺序传输,接线少、传输距离远、速度相对较慢;​ 并行通信是数据多位同时传输,速度快但接线复杂、距离短、成本高。 传输模式(单工、半双工、全双工) 单工(Simplex)​ 概念:数据只在 一个方向传输​ 特点:​ 发送方 → 接收方,无法反向通信​ 典型应用:键盘到 CPU、显示器显示数据​ 优点:简单、成本低​ 缺点:无法双向交流​ 半双工(Half-Duplex)​ 概念:数据 双向传输,但同一时间只能单向​ 特点:​ 发送和接收可互换,但不能同时进行​ 典型应用:对讲机、RS-485 总线​ 优点:线路利用率比单工高​ 缺点:通信需要切换方向,延迟稍大​ 全双工(Full-Duplex)​ 概念:数据 双向同时传输​ 特点:​ 发送和接收可以同时进行​ 典型应用:电话、RS-232(双线)、以太网双绞线​ 优点:通信效率高​ 缺点:线路复杂,成本高​ 回答​ 传输模式分为单工、半双工和全双工。​ ...

2026-04-15 · 2 min · 375 words · Shearin

Basic

OSI七层模型 物理层 负责比特流的传输​ 定义电气特性、接口规范、信号电压、传输速率​ 不关心数据含义,只负责 0 和 1 数据链路层 负责将比特流封装成帧​ 实现相邻节点之间的可靠传输​ 提供差错检测(CRC) 典型内容:​ MAC 地址​ 以太网协议​ ARP 协议(地址解析) 网络层 负责逻辑地址和路由选择​ 实现不同网络之间的数据转发​ 决定数据包从源到目的的路径 IP 协议 IP 地址 路由协议 传输层 提供端到端通信​ 负责数据分段、重组​ 保证或不保证数据可靠性 会话层 负责建立、管理和终止会话​ 控制通信过程中的会话状态​ 支持会话同步和恢复 表示层 负责数据格式转换​ 处理数据编码、加密、解密、压缩​ 屏蔽不同系统的数据表示差异 字符编码(ASCII、UTF-8)​ 数据压缩​ SSL/TLS(概念上属于该层) 应用层 直接面向用户和应用程序​ 提供网络服务接口​ 定义具体应用协议 应用层、传输层、网络层分别解决什么问题? 应用层(Application Layer) 作用: 为用户和应用程序提供网络服务接口。 解决的问题: 定义应用数据格式(HTTP、FTP、MQTT) 提供应用间通信协议(文件传输、消息、远程控制) 数据语义处理(编码、压缩、序列化) **典型协议:**HTTP、HTTPS、FTP、SMTP、DNS、MQTT 一句话: 应用层关心“数据内容是什么”。 传输层(Transport Layer) 作用: 实现端到端通信,确保数据从源主机传到目标主机的应用进程。 解决的问题: 端口管理:区分不同应用进程 可靠传输(TCP):顺序、重传、校验、流控、拥塞控制 不可靠快速传输(UDP):低延迟、广播/组播 多路复用:一台主机可同时处理多个连接 **典型协议:**TCP、UDP 一句话: 传输层关心“数据如何可靠送到正确的进程”。 ...

2026-04-15 · 2 min · 375 words · Shearin

Basic

下面我把你这一大段 操作系统内容(用户态/内核态、通信方式、补码、内存碎片) 整理成一份 结构清晰、适合八股文/面试的高质量总结版。 我不会重复你已有的内容,而是帮你 提炼重点 + 梳理逻辑 + 给出面试可背诵版本。 用户态与内核态、切换方式(面试高频) 4.1.1 用户态 vs 内核态 用户态(User Mode) 权限低 不能直接访问硬件、不能执行特权指令 需要通过 系统调用 请求内核服务 内核态(Kernel Mode) 权限最高 可以访问所有硬件、管理内存、调度进程 操作系统核心代码运行在内核态 一句话: 用户态受限制,内核态无所不能。 4.1.2 用户态与内核态的切换方式 1)系统调用(最常见) 用户程序 → syscall → 内核态执行 → 返回用户态 流程: 用户程序发起系统调用 执行 syscall / int 0x80 CPU 切换到内核态,保存上下文 内核执行系统调用逻辑 恢复上下文,返回用户态 2)中断(硬件触发) 如定时器中断、网卡中断 → CPU 自动进入内核态执行 ISR → ISR 完成后恢复用户态 3)异常(程序错误) 如除零、非法访问 → CPU 进入内核态执行异常处理程序 → 可能终止进程 4.1.3 切换开销(面试必问) 上下文切换成本高(保存/恢复寄存器、栈) 切换到内核态时,操作系统需要保存当前程序的上下文(包括CPU寄存器、堆栈等),然后加载内核态相关的上下文。这个过程需要时间并会增加系统开销。 CPU 缓存失效 当执行系统调用时,CPU的缓存可能会失效,导致系统访问内存的速度降低。 模式切换本身有成本 从用户态切换到内核态和从内核态切换回用户态时,CPU需要改变运行模式,这会产生额外的时间开销。 一句话: 用户态 ↔ 内核态切换很贵,能少则少。 ...

2026-04-15 · 3 min · 633 words · Shearin

Basic

C 和 C++ 的区别(总结版) 2.1.1 设计目标的不同 C —— “高效运行” 目标:贴近硬件、提供最小抽象、保证可移植性 主要用于系统级开发(OS、驱动、嵌入式) C++ —— “高效 + 可维护” 目标:在不损失性能的前提下提供更强的抽象能力 支持面向对象、泛型、RAII、模板元编程等 一句话: C 关注“能不能跑”,C++ 关注“能不能长期维护”。 2.1.2 编程范式差异(核心区别) C:面向过程(Procedure-Oriented) 数据与函数分离 通过函数操作结构体 struct Point { int x, y; }; void move(struct Point* p); C++:面向对象(Object-Oriented) 数据 + 行为封装在类中 支持继承、多态、封装 class Point { public: void move(); }; C++ 同时支持: 面向对象 泛型编程(模板) 函数式编程(lambda) 元编程(模板元编程) 2.1.3 抽象能力对比 C 结构体 + 函数 手动管理复杂度 C++ 类、继承、多态 模板(泛型) STL(容器 + 算法) RAII 自动管理资源 抽象能力远强于 C。 2.1.4 内存与资源管理 C:手动管理内存 malloc(); free(); 容易出现: 内存泄漏 野指针 重复释放 C++:RAII + 智能指针 auto p = std::make_unique<int>(10); 自动释放 异常安全 所有权语义明确 2.1.5 类型安全 C 类型检查弱 隐式转换多 容易写出未定义行为 C++ 强类型系统 重载、模板、const、引用 编译期检查更严格 2.1.6 标准库能力 C 标准库(libc) 字符串处理 数学函数 IO 较小 C++ 标准库(STL + 现代库) 容器(vector、map、list…) 算法(sort、find…) 智能指针 正则表达式 多线程库 chrono 时间库 C++ 标准库远比 C 强大。 ...

2026-04-15 · 8 min · 1586 words · Shearin

Basic

局变量和局部变量的区别​ 定义位置不同​ 1.全局变量​ ◦ 定义在 函数外部,通常在文件顶部​ ◦ 整个程序中都可以访问(受 extern / static 影响)​ 2.局部变量​ ◦ 定义在 函数内部或代码块内部​ ◦ 只能在定义它的作用域内使用​ 作用域不同​ 1.全局变量​ ◦ 作用域:从定义处到文件结束​ ◦ 可被多个函数访问​ 2. 局部变量​ ◦ 作用域:所在的函数或 {} 代码块​ ◦ 离开作用域即不可访问​ 生命周期不同​ 1.全局变量​ ◦ 生命周期:整个程序运行期间​ ◦ 程序开始时分配,程序结束时释放​ 2.局部变量​ ◦ 生命周期:函数执行期间​ ◦ 函数调用时创建,函数返回时销毁​ 存储位置不同​ 1.全局变量​ ◦ 存储在 全局/静态存储区(.data / .bss)​ 2.局部变量​ ◦ 一般存储在 栈区​ ◦ static 局部变量存储在静态区​ 初始化规则不同​ 1.全局变量​ ◦默认初始化为 0(未显式初始化)​ 2.局部变量​ ◦ 不会自动初始化,值为随机值​ 使用注意点​ 1.全局变量​ ◦ 优点:使用方便、共享数据简单​ ◦ 缺点:​ ▪ 破坏模块封装​ ▪ 容易引发命名冲突​ ▪ 不利于多线程安全​ 2.局部变量​ ◦ 优点:​ ▪ 作用范围小,安全性高​ ▪ 有利于代码维护和复用​ ...

2026-04-15 · 7 min · 1327 words · Shearin

STL

STL 容器总览 1. STL 容器是什么(核心一句话) STL 容器 = 模板类 + 数据结构封装 提供统一接口来存储、管理数据,并与迭代器、算法共同构成 STL 三大组件。 2. 容器分类与特点 2.1 顺序容器(Sequence Containers) 序列容器(Sequence Containers)是 STL 中的一类容器,特点是 元素按照严格的线性顺序存储,支持顺序访问和插入删除操作。主要包括:vector、deque、list、forward_list、array。 按插入顺序存储,强调顺序与遍历效率。 容器 底层结构 随机访问 插入/删除 典型场景 vector 动态数组 ✔ O(1) 尾部快,其他位置慢 大量随机访问 deque 分段连续空间 ✔ O(1) 头尾都快 双端操作频繁 list 双向链表 ✘ 任意位置 O(1) 频繁插入删除 forward_list 单向链表 ✘ O(1) 更轻量的链表 面试要点: vector 扩容:指数扩容(通常 ×2),导致迭代器失效 list/forward_list:不支持随机访问,迭代器稳定 deque:不是连续内存,但支持随机访问 2.2 关联容器(Associative Containers) 基于 红黑树(RB-tree),自动排序,log 级别查找。 容器 是否允许重复 存储内容 是否排序 set 否 key ✔ multiset 是 key ✔ map 否 key-value ✔ multimap 是 key-value ✔ 面试要点: ...

2026-04-14 · 4 min · 644 words · Shearin

C++ 面试速背稿

一篇面向面试直接背诵的 C++ 高频问题速记稿。

2026-04-14 · 2 min · 325 words · Shearin

计算机网络基础与 TCP

计算机网络面试整理,包括 OSI 七层模型与 TCP 基础知识。

2026-04-06 · 11 min · 2295 words · Shearin

App

🧵 pthread_create() 创建线程的核心流程 1. 准备线程控制块(TCB) 内核分配线程控制块(Thread Control Block),保存线程的基本信息: 线程 ID 状态(就绪、运行、阻塞等) 寄存器上下文(PC、SP 等) 如果传入了 pthread_attr_t,则根据属性设置栈大小、调度策略等。 2. 分配线程栈空间 每个线程有独立的栈,用于函数调用和局部变量。 默认大小由系统决定,可通过 attr 修改。 3. 初始化线程上下文 设置程序计数器(PC)指向入口函数 start_routine。 初始化栈指针(SP)和寄存器。 将参数 arg 传递给入口函数。 4. 加入调度器 内核把新线程放入 可运行队列。 根据调度策略(如 SCHED_OTHER、SCHED_FIFO、SCHED_RR)等待 CPU 调度。 5. 返回线程 ID pthread_create() 返回 0 表示成功。 用户态获得线程 ID,可用于 pthread_join() 或 pthread_detach()。 6. 线程开始执行 CPU 调度器选择该线程运行。 执行入口函数 start_routine(arg)。 执行结束后调用 pthread_exit() 或隐式退出。 注意事项 共享地址空间:所有线程共享进程的堆、全局变量。 独立栈:每个线程有自己的栈和寄存器上下文。 资源释放:如果不调用 pthread_join() 或 pthread_detach(),线程退出后资源不会自动释放,可能导致内存泄漏。 总结口诀 TCB → 栈 → 上下文 → 调度器 → 返回 ID → 执行入口函数 ...

2026-04-05 · 4 min · 707 words · Shearin

进程通信与并发问题

操作系统面试高频:IPC、死锁、活锁和中断上下文中的同步问题。

2026-04-04 · 1 min · 9 words · Shearin