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 地址
posted @ 2017-01-21 23:30  zeroArn  阅读(385)  评论(0编辑  收藏  举报