网络IO小白的进阶之路1

网络编程影响的都是收消息方式:

1.简单的一问一答式
client的一个线程收,一个线程发;
server的一个线程收,一个线程发。

消息是阻塞同步的,一直阻塞在那里,只有内核态收完了,才会拷贝到用户态。
这种机制会让程序一直挂在内核态,不占用cpu资源。只有数据拷贝到用户态之后,才会唤醒。

2.多个client+server
1.)多进程/线程的阻塞同步,即10个client,启10个线程,每个线程都用阻塞的方式处理。
2.)单线程/进程+非阻塞同步方式。所有的fd都放在一个队列里,一直在轮训,处理完了立刻返回,不等待结果。但这种轮训方式会一直在内核态和用户态装换,非常占cpu。所以会出现cpu100%的情况,为了解决这个问题,会每次用sleep 几毫秒的方式延迟。但会延迟消息收。
3.)当client过多,例如1000个,那么不可能启1000个线程/进程处理。可以用1)+2)的方式,即10个线程,每个线程轮训100个fd。
4.)优化2)步骤的轮训方式,用:
i)select非阻塞方式:把所有fd弄成一个集合,拷贝到内核态,死循环读取这些fd状态,如果内核态处理完了,就处理。—通用方式,linux+windows都可以用
ii)poll非阻塞方式:每次只拷贝有变化的fd到内核态—linux特有的
iii)epoll非阻塞方式:消息注册,边界触发+水平出发。
边界触发:内核收到一个消息,立即回调处理,但有弊端,例如正在传输大文件,无论有多少其他的消息都是阻塞的,必须处理完这个连接才可以。
水平出发:只要缓冲区有数据,有中断处理??

所有以上的处理,影响的都只是网络收数据,收数据实际是非常快的。整个网络架构还涉及发数据和处理数据。
例如。如果后端程序处理不过来,前端接受的程序就会丢数据,或者不再收请求,阻塞在那里

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值