进程
进程内存结构
虚拟内存管理
父子进程创建与通信
父子进程COW机制
逻辑层面
物理层面
进程创建速度
进程优先级(nice值)
传统UNIX实现中只有特权进程才能赋予自己一个高优先级,而非特权进程只能降低自己的优先级(这样做对其他进程就友好了,nice值也由此而来)
进程、进程组、会话关系
作业控制
孤儿进程组
系统日志
线程
线程数据结构
多线程内存结构
多线程修改共享变量
无同步处理
通过互斥量控制同步资源访问
Reactor模型
Reactor单线程模型
所有IO操作都在一个Reactor线程中执行
Reactor多线程模型
单独的Acceptor线程处理客户端连接,其余网络IO有IO线程组处理
主从Reactor多线程模型
不再是单独的Acceptor线程处理客户端连接,而是一组独立的线程池来处理,处理完连接后后续的网络IO交给IO线程组完成
IPC
进程和线程通信方法
IPC工具标识符和句柄
管道通信
ls | wc -l
FIFO实现C/S通信
System V IPC
System V IPC对象数据结构
System V 消息队列实现C/S通信
System V 消息队列实现文件服务器
System V 信号量同步进程
多进程同时初始化信号量同步控制
System V 共享内存
使用共享内存和信号量完成进程通信
共享内存位置
通过文件创建内存映射
多个进程通过文件映射内存
非线性文件内存映射(虚拟内存顺序和文件页顺序不对应)
POSIX IPC
SOCKET
流SOCKET
未决的socket连接
流socket通信
数据报socket
零拷贝
sendfile()实现零拷贝,不用经过用户空间
TCP/IP
网络包结构简单示意
TCP
报文格式
TCP报文确认机制
TCP状态机
TCP三次握手
TCP四次挥手
网络字节序
大端字节顺序和小端字节顺序
粘包/拆包
粘包拆包有很多原因,最主要是因为TCP是数据流,TCP会根据自己的缓冲区、MTU等进行业务报文的粘拆
IP
IPV4转IPV6,前80位全0,接着16位全1,后面32位放IPV4地址
DNS
IO
阻塞IO
整个生命周期都阻塞,从调用系统调用到系统调用返回数据期间一直阻塞
非阻塞IO
设置IO的NON_BLOCKING标识,当无数据返回时返回特定错误。轮询检测是否有数据到来
IO多路复用
进程监听多个fd,对于select/poll每次调用都要传递监听的fd,某个fd存在文件就绪,就可调用,实际上也是轮询的一种。对于epoll,内核会记住监听的fd列表,不用每次都传, 某个fd存在文件就绪,会通过回调函数通知进程
IO多路复用方案对比
水平触发,可以在任意时刻检查文件描述符的就绪状态
边缘触发,只有在文件描述符就绪时才会通知,且在下一个文件描述符就绪前不会有任何其他通知
select()和poll()对比
不同事件对应不同的标识
epoll\select\poll性能对比
信号驱动IO
通过信号处理器监听信号,当fd就绪时会发送对于信号,信号处理器收到对应信号通知应用程序完成数据读写
异步IO
同信号驱动IO类似,区别是信号驱动IO由内核发送信号通知应用程序可进行IO操作,而异步IO由内核告诉应用程序IO操作已完成可以就行对应的数据处理