UNP socket /select / udp
- 在多进程的并发服务器中,接受连接后fork子进程,让子进程处理连接请求,主进程继续等待连接,子进程关闭链接等待接口,主进程关闭已经连接的接口(socket)
- 阻塞的发生
- 等待处理:等待接受,等待处理结果,等待(某种信号或者信息)
- 阻塞的函数或者操作被中断后必须考虑,系统是自动重启还是手动重启,手动重启的话可以将函数放入循环实现自动重启
- fork之后必须捕获SIGCHLD信号,保证fork出的子进程完成后,被父进程回收资源
- 父进程捕获SIGCHLD信号时,可能中断当前阻塞的系统调用,应该或者最好考虑系统调用被中断的情况。
- SIGCHLD处理函数最好使用waitpid 针对固定pid回收等待,防止僵尸子进程存在
- wait函数收到一个子进程结束信号即执行并结束,其他子进程就会变成僵尸进程
- connect 函数对应TCP三次握手:即在connect函数之后完成TCP的三次握手
- 阻塞的问题:一旦一端下线,另一端会一直阻塞在响应操作处,即使一端不掉线也可能使得另一端一直处于等待状态,浪费资源,更不要高并发场景了
select/poll
- IO复用: 一个服务器程序处理超过一个接口(连接,服务,协议等),需要IO复用
- 非阻塞IO,不等待内核处理结果,在不能满足 请求时当前操作不睡眠等待结果,而是直接返回错误
- IO复用
- select 监视不止一个描述符,当某个描述符可用时,即唤醒当前描述符的响应操作,即让一个select函数监视多个端口的等待情况
- 多线程IO模型,每个线程调用一个阻塞IO函数监视一个描述符
- 信号驱动IO
- 不再依赖等待,而是靠信号通知原本需要等待的函数启动
- 异步IO:相比于信号驱动,异步IO直接通知的操作结果,而信号驱动通知的是可操作
- 一图胜千言
- close 与shutdown 的qubie
- close 减少描述符计数,当减为0时,直接关闭描述符
- shutdown 不减少描述符,但正常激发结束系列即发出FIN信号,单向终止
udp
- 无需连接,直接sendto/recvfrom 地址