网络 I/O 通常包含两个阶段:等待事件就绪,以及在用户空间与内核之间复制数据。高并发服务器的核心不是让一次复制凭空消失,而是更高效地管理大量连接上的等待、就绪和状态推进。
本文介绍五种经典 I/O 模型,重点分析 select、poll 和 epoll,并给出一个正确处理非阻塞读写、边缘触发和输出缓冲区的 epoll 回显服务器。
...
传输层把数据交给目标进程,网络层负责把数据送到目标网络,数据链路层负责当前链路上的帧交付。
本文沿着一个 IP 数据报的路径,讲解 IPv4 首部、CIDR、路由、以太网、MTU、ARP、DNS、ICMP 与 NAT,并说明这些协议怎样协作完成跨网络通信。
一、网络层的职责网络层主要解决:
逻辑寻址:使用 IP 地址标识网络接口和路由目标;
路由选择: ...
应用层决定“数据表达什么”,传输层解决“怎样把字节交给另一端的应用”。HTTP 与 TCP 正好对应这两层的典型问题:HTTP 规定请求和响应的语义,TCP 提供可靠、有序、双向的字节流。
本文先分析 HTTP/1.1 报文,再深入 TCP 首部、三次握手、四次挥手、确认重传、滑动窗口、流量控制与拥塞控制。
一、应用层协议的作用应用层协议需要规 ...
Socket 是应用程序使用网络协议栈的主要接口。Linux 把套接字抽象为文件描述符,因此可以使用 read、write、close,也可以使用更适合网络语义的 recv、send、recvfrom 和 sendto。
本文从 IP、端口和网络字节序出发,分别梳理 UDP 与 TCP 的编程流程,并给出经过边界和错误处理完善的示例。
一、网络通信需要哪 ...
计算机网络的核心问题是:不同厂商、不同操作系统、不同硬件和不同程序,如何按照统一规则交换数据。
解决方案不是设计一个包揽全部工作的巨大协议,而是将复杂通信过程划分为多个层次,每一层只解决一组相对稳定的问题,并向上层提供服务。
一、计算机网络的发展1.1 独立模式早期计算机彼此独立,数据通常依赖磁盘、磁带等介质人工搬运。优点是结构简单,缺点是共享与协作效率 ...
线程是进程内部的执行流。多个线程共享同一进程的大部分资源,因此创建和切换成本通常低于进程,但共享也会带来数据竞争、死锁、丢失唤醒和生命周期管理等问题。
本文以 POSIX Threads 为主线,讲解线程创建、退出、等待、分离,以及互斥锁、条件变量、信号量、读写锁、生产者消费者模型和线程池设计。
一、进程与线程1.1 线程是什么线程可以理解为进程内部的一 ...
Linux 信号是一种异步事件通知机制。内核、终端或其他进程可以向目标进程发送信号,目标进程再按照默认动作、忽略规则或自定义处理器作出响应。
信号适合表达“发生了某件事”,不适合直接传输大量业务数据。真正掌握信号,需要理解信号的产生、未决、阻塞、递达、捕获,以及处理器中的异步安全约束。
一、信号是什么信号可以理解为发送给进程或线程的一个编号。它的特点是: ...
进程具有独立的虚拟地址空间,一个进程通常不能直接访问另一个进程的变量。为了让多个进程交换数据、同步状态或传递事件,操作系统提供了进程间通信机制,即 IPC(Inter-Process Communication)。
本文从匿名管道开始,依次介绍命名管道、System V 共享内存、消息队列和信号量,并给出可以直接编译运行的示例。
一、为什么需要进程间通信 ...
Linux进程控制可以概括为一条主线:父进程用fork创建子进程,子进程用exec装入新程序,进程用exit或_exit终止,父进程再用wait/waitpid回收退出状态。Shell启动外部命令、服务器派生工作进程和测试框架运行子任务,都建立在这条主线上。
本文系统解释fork的两次返回与写时拷贝、进程退出和标准I/O缓冲、僵尸进程、等待状态宏、 ...
Linux开发工具链不是若干彼此无关的命令:包管理器负责安装工具,Vim完成编辑,GCC把源代码变成程序,GDB观察运行状态,Make根据依赖关系组织构建,Git记录并协作代码变更。
本文以C/C++开发为主线,系统整理apt/dnf/yum、Vim、GCC/G++、GDB、Makefile和Git,并提供一个包含头文件、多个源文件、自动 ...
