
简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
目标主机不在当前局域网里,数据包应该往哪里走?这就是网络层的核心任务:在复杂网络环境中确定合适路径。在网络层里,最重要的协议就是 IP。平时说的 IP 地址、子网掩码、网关、路由表、NAT,大多都和这一层有关。概念含义主机配有 IP 地址,但不进行路由控制的设备路由器配有 IP 地址,并且能进行路由控制的设备节点主机和路由器的统称网络层的核心任务是路径选择。IP 报头记录源地址、目的地址、TTL、
理解vector可以抓住一条主线:它是连续存储的动态数组。连续存储带来了O(1)随机访问和良好的局部性,也意味着扩容时需要搬运全部元素,中间插入和删除时需要移动后续元素。日常使用中,分清size与capacity,知道reserve不会创建元素,并在修改容器后谨慎处理迭代器,已经能避开大部分问题。再往下看,三个位置的存储模型、逐对象构造和资源转移规则,则解释了扩容、迭代器失效以及不能滥用memcp
阻塞 IO:等待和拷贝都让调用者停住;非阻塞 IO:数据没准备好就立即返回,需要应用程序重试;信号驱动 IO:数据就绪时通知应用程序,读取动作仍由应用程序发起;IO 多路转接:用一个入口等待多个描述符就绪;异步 IO:等待和拷贝都由内核完成,完成后再通知应用程序。真正写网络程序时,没有哪一种模型永远最好。简单程序用阻塞 IO 足够清晰;需要同时管理多个连接时,多路转接更合适;想让等待过程更可控,就
select把多个 fd 放进集合里,让内核帮我们等待它们的状态变化,返回后再由应用程序逐个处理就绪 fd。掌握selectnfds是最大 fd 加 1;fd_set本质是位图,用FD_ZEROFD_SETFD_CLRFD_ISSET操作;select会修改传入的 fd 集合,所以每轮调用前要重新准备;监听 socket 可读表示可以accept新连接;普通连接 socket 可读表示可以read
epoll先注册关注的 fd,事件真正就绪时再通过就绪队列返回给应用程序。创建 epoll 句柄;epoll_ctl负责添加、修改、删除 fd 事件;epoll_wait返回已经就绪的事件数组;内核通过红黑树管理已注册事件,通过就绪链表保存待返回事件;LT 模式会反复提示未处理完的就绪事件;ET 模式只在状态变化时提示,需要配合非阻塞读写把数据处理干净;epoll 适合大量连接、少量活跃的场景。理
namespace解决命名冲突;iostream提供类型更友好的输入输出方式;缺省参数让函数调用更灵活;函数重载让同一操作可以适配不同参数;引用让传参和返回更自然,但要关注生命周期;const引用解决权限控制和临时对象绑定问题;inline用更安全的方式替代宏函数的部分场景;nullptr比NULL更适合表达空指针。这些内容看起来分散,本质上都在增强 C++ 的表达能力和工程组织能力。把这些基础打
很多同学刚学网络时会直接接触socketbindlistenaccept这些接口,但如果不知道数据在网络中到底经历了什么,就很容易把 API 背成“咒语”。两台甚至更多台主机,隔着不同设备、不同线路、不同操作系统,如何把数据准确交给对方的某个进程。为了回答这个问题,我们需要先理解几个核心概念:协议、分层、封装、解包、IP、MAC、端口号和 socket。
库就是已经写好的、成熟的、可以复用的代码。现实中的程序不可能每个人都从零开始写。比如字符串处理、文件 IO、网络通信、数学计算、界面绘制,这些通用能力通常都会被封装成库。从本质上说:库是一种二进制形式的可执行代码,可以被操作系统加载到内存中执行。类型LinuxWindows静态库.a.lib动态库.so.dll不同发行版路径可能不一样,但核心思想一致。现在绝大多数程序默认使用动态链接。原因很现实。
Ext 系列文件系统这一章,看似从磁盘硬件讲到软硬链接跨度很大,但主线其实非常清楚。磁盘物理上由盘片、磁头、磁道、柱面、扇区构成;早期使用 CHS 寻址,后来通过 LBA 把磁盘抽象成线性数组。操作系统不会按单个扇区低效读写,而是以 block 为单位访问磁盘。分区只是磁盘空间的切分,格式化才是在分区中写入文件系统管理结构。







