UNP socket /select / udp

本文探讨了多进程并发服务器的设计原理,包括如何利用fork创建子进程处理客户端连接请求,主进程继续监听新连接。文章详细解释了阻塞与非阻塞IO的区别,以及select/poll等IO复用技术的应用,并对比了close与shutdown的功能差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 在多进程的并发服务器中,接受连接后fork子进程,让子进程处理连接请求,主进程继续等待连接,子进程关闭链接等待接口,主进程关闭已经连接的接口(socket)
  • 阻塞的发生
    • 等待处理:等待接受,等待处理结果,等待(某种信号或者信息)
  • 阻塞的函数或者操作被中断后必须考虑,系统是自动重启还是手动重启,手动重启的话可以将函数放入循环实现自动重启
  • fork之后必须捕获SIGCHLD信号,保证fork出的子进程完成后,被父进程回收资源
  • 父进程捕获SIGCHLD信号时,可能中断当前阻塞的系统调用,应该或者最好考虑系统调用被中断的情况。
  • SIGCHLD处理函数最好使用waitpid 针对固定pid回收等待,防止僵尸子进程存在
  • wait函数收到一个子进程结束信号即执行并结束,其他子进程就会变成僵尸进程
  • connect 函数对应TCP三次握手:即在connect函数之后完成TCP的三次握手
  • 阻塞的问题:一旦一端下线,另一端会一直阻塞在响应操作处,即使一端不掉线也可能使得另一端一直处于等待状态,浪费资源,更不要高并发场景了

select/poll

  • IO复用: 一个服务器程序处理超过一个接口(连接,服务,协议等),需要IO复用
    900750-20170121222402218-17708425.png
  • 非阻塞IO,不等待内核处理结果,在不能满足 请求时当前操作不睡眠等待结果,而是直接返回错误
    900750-20170121222802953-1487084162.png
  • IO复用
    900750-20170121223209187-695381695.png
    • select 监视不止一个描述符,当某个描述符可用时,即唤醒当前描述符的响应操作,即让一个select函数监视多个端口的等待情况
    • 多线程IO模型,每个线程调用一个阻塞IO函数监视一个描述符
  • 信号驱动IO
    900750-20170121223702875-1354692823.png
    • 不再依赖等待,而是靠信号通知原本需要等待的函数启动
  • 异步IO:相比于信号驱动,异步IO直接通知的操作结果,而信号驱动通知的是可操作
    900750-20170121224059671-2096708931.png
  • 一图胜千言
    900750-20170121224321484-729972909.png
  • close 与shutdown 的qubie
    • close 减少描述符计数,当减为0时,直接关闭描述符
    • shutdown 不减少描述符,但正常激发结束系列即发出FIN信号,单向终止

      udp

      900750-20170123231417191-1501166208.png
  • 无需连接,直接sendto/recvfrom 地址

转载于:https://www.cnblogs.com/zeroArn/p/6338121.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值