网络编程
大小端
大端:高位存在低地址,低位存在高地址。
小端:高位存在高地址,低位存在低地址。
大小端和CPU有关。
现代PC大多采用小段,所以小端字节序又被成为主机字节序。而大端字节序又被成为网络字节序。
基础API
TCP: recv, send
UDP: recvfrom, sendto(也可以面向连接)
通用: recvmsg, sendmsg
网络I/O
- 管道:
ini pipi(int fd[2]); - 双向管道:
ini socketpair(int domain, int type, int protocol, int fd[2]); - 分散读:
readv、集中写:writev - 两个文件描述符之间传递数据:
sendfile - 进程间通信共享内存:申请
mmap, 释放munmap - 两个文件描述符之间移动数据:
splice - 两个管道文件描述符间复制数据:
tee - 文件描述符的各种控制:
fcntl
日志
syslogrsyslogd
用户信息
getuid,geteuid,getgid,getegid,getpgid,getsidsetuid,seteuid,setgid,setegid,setpgid,setsid
服务器框架
TCP客户端与服务器工作流程

I/O模型
- 同步
- 阻塞I/O
- I/O复用
- 信号驱动I/O
- 异步
I/O复用
select,监听文件描述符。O(n)的无差别轮询,最大连接数1024。
poll,轮询文件描述符。也是O(n)的无差别轮询,但是它没有最大连接数的限制,原因是它是基于链表来存储的。
epoll。可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。复杂度降低到了O(1)。
- LT模式,ET模式
epoll_createepoll_ctlepoll_wait
ref.
事件处理模式
- Reactor
- Proactor
并发模式
- 半同步/半异步 (变体)=> 半同步/半反应堆
- 领导者/追随者
池
- 内存池
- 进程池
- 线程池
- 连接池
信号
killSIG_IGNSIG_DFLSIGHUP,SIGPIPE,SIGGURG
定时器
Linux定时方法
- socket方法
SO_RCVTIMEOSO_SNDTIMEO
SIGALRM- I/O复用系统调用的超时参数
高性能定时器
- 时间轮
- 时间堆
I/O框架库 Libevent
Linux服务器必须处理的3件事
- I/O 时间
- 信号
- 定时器
基于Reactor的框架库
- 句柄
- 事件多路分发器
- 事件处理器和具体事件处理器
- Reactor
- handle_event
- register_handler
- remove_handler
多进程
forkexec系列- 僵尸进程
waitwaitpid
进程间通信
- 管道 (pipe)
- 信号量 (Semaphore): P, V.
semgetsemopsemctlIPC_PRIVATE
- 共享内存
shmgetshmatshmdtshmctl
- 消息队列
msggetmsgsndmsgrcvmsgctl
多线程
- LinuxThreads
- NPTL
创建
- pthread_creatr
- pthread_exit
- pthread_join
- pthread_cancel
线程间同步
- POSIX信号量:
sem_xxx - 互斥量:
pthread_mutex_xxx - 条件变量:
pthread_cond_xxx - 线程同步机制类:
locker.h - 进程和线程:
pthread_atfork - 线程和信号:
pthread_sigmask
进程池和线程池
- 随机算法、Round Robin、工作队列
- 半同步/半异步进程池实现
Reference
- 游双. Linux高性能服务器编程. 机械工业出版社
- 徐晓鑫. 后台开发:核心技术与应用实践. 机械工业出版社