网络编程
大小端
大端:高位存在低地址,低位存在高地址。
小端:高位存在高地址,低位存在低地址。
大小端和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
日志
syslog
rsyslogd
用户信息
getuid
,geteuid
,getgid
,getegid
,getpgid
,getsid
setuid
,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_create
epoll_ctl
epoll_wait
ref.
事件处理模式
- Reactor
- Proactor
并发模式
- 半同步/半异步 (变体)=> 半同步/半反应堆
- 领导者/追随者
池
- 内存池
- 进程池
- 线程池
- 连接池
信号
kill
SIG_IGN
SIG_DFL
SIGHUP
,SIGPIPE
,SIGGURG
定时器
Linux定时方法
- socket方法
SO_RCVTIMEO
SO_SNDTIMEO
SIGALRM
- I/O复用系统调用的超时参数
高性能定时器
- 时间轮
- 时间堆
I/O框架库 Libevent
Linux服务器必须处理的3件事
- I/O 时间
- 信号
- 定时器
基于Reactor的框架库
- 句柄
- 事件多路分发器
- 事件处理器和具体事件处理器
- Reactor
- handle_event
- register_handler
- remove_handler
多进程
fork
exec
系列- 僵尸进程
wait
waitpid
进程间通信
- 管道 (pipe)
- 信号量 (Semaphore): P, V.
semget
semop
semctl
IPC_PRIVATE
- 共享内存
shmget
shmat
shmdt
shmctl
- 消息队列
msgget
msgsnd
msgrcv
msgctl
多线程
- 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高性能服务器编程. 机械工业出版社
- 徐晓鑫. 后台开发:核心技术与应用实践. 机械工业出版社