Linux 端口复用和I/O多路复用 2020-03-23(未经

2020-03-23  本文已影响0人  9_SooHyun

端口复用

默认情况下,一个port只允许绑定一个socket,其他socket不允许绑定该port
例如,当出现time_wait时,服务端未释放TCP连接的socket占用着端口,其他客户端的请求想连接服务端时则无法连接

端口复用允许多个socket在同一ip:port上绑定和监听
例如,父进程监听P端口,多个client端过来连接,父进程fork多个子进程一一处理,父子进程们共用P端口。这样一来,即使出现大量time_wait,那些想要连接server的客户端依然可以正常连接,不会影响正常的业务

阻塞式IO和非阻塞式IO

阻塞式IO指进程/线程进行IO时,处于阻塞态,直到IO完成才继续往下运行
非阻塞式IO指进程/线程进行IO时,IO函数会立刻返回一个结果而不管IO是否完成,使得进程/进程继续往下运行

以老王买票为例——买到票为IO完成
阻塞式IO:到火车站发现没票,不吃饭不睡觉一直等了7天7夜等到别人退票
非阻塞式IO:到火车站发现没票,第二天再来问,没有,第三天再来,直到有票

I/O多路复用

先上定义:一个线程并发交替地顺序完成多个socket的I/O操作,就叫I/O多路复用。必须明确的是,“复用”指复用同一个线程

int iresult = recv(s, buffer, 1024)

这个语句会等待对端的数据发送过来,要是对端没有发送数据,这个语句就会阻塞在这里,直到有数据可读。因此,阻塞式IO可能导致大量的线程都等待数据而阻塞,白白消耗资源
当然,我们也可以使用非阻塞IO,即读不到数据时返回一个错误标记,然后过段时间再来查有没有数据读。读不到-下次读这段时间内,线程也没事干,同样处于阻塞态


暂时记录,如日后发现有理解不当之处再行修正

上一篇 下一篇

猜你喜欢

热点阅读