宏哥分享的大作,不分享出来,就埋没了
本次分享主要针对TCP协议,不涉及UDP等其他网络协议。
网络编程的核心接口------》建立连接,数据收发
客户端使用connect发起连接,服务器端使用listen监听和accept建立连接。图里面少了一个重要的函数,socket——创建套接字,两边都要使用。
连接过程:backlog,在连接建立完成之前的连接请求的个数,超过这个数值,则连接请求被拒绝
数据收发过程:每个已连接的socket都有一个对应的发送缓冲区和接收缓冲区,当发送缓冲区满时,发送请求会被阻塞,当接收缓冲区空时,接收请求会被阻塞。阻塞会引起线程/进程的切换,影响系统的整体的性能。可以使用select、pool、epool来统一控制I/O,从而模拟一种非阻塞的模型,
只有发送缓冲区有空余和接收缓冲区有数据时,才进行数据的收发,使得业务线程不会因为网络I/O而发生阻塞。
阻塞并不一定总比非阻塞低效,因为阻塞实际上是释放了处理器资源。因此如果并发的线程/进程比较多,临界区比较大的话,非阻塞机制会使得非工作的进程也争抢CPU时间片。
信号是Unix系统提供的机制,可以理解为软中断。可以用于进程间发送通知。
服务端和客户端的高效的编程模式。
服务端:使用非阻塞I/O,实现业务逻辑和I/O的解耦,提升服务的效率。
I/O模式:Reactor和Proactor,Proactor的模式会更高效一些。
要慎重选择等待队列的大小,以免请求被无理的拒绝或者造成无谓的服务延迟。
RPC的核心是数据的跨平台的解析-》序列化与反序列话,一个统一的中间语言IDL至关重要。
为什么要Thrift与Protobuf?
RPC不可避免的需要序列化与反序列化工作,这种工作简单但是繁琐,不仅每个字段都要进行,而且要注意处理网络序和主机序。
原文地址:http://blog.csdn.net/moon_yang_bj/article/details/38112485