网站开发棋牌,html爱心代码,手机百度免费下载,网站设计培训机构一、socket
socket是在应用层和传输层中间的抽象层#xff0c;它把传输层#xff08;TCP/UDP#xff09;的复杂操作抽象成一些简单的接口#xff0c;供应用层调用实现进程在网络中的通信。Socket起源于UNIX#xff0c;在Unix一切皆文件的思想下#xff0c;进程间通信就被…一、socket
socket是在应用层和传输层中间的抽象层它把传输层TCP/UDP的复杂操作抽象成一些简单的接口供应用层调用实现进程在网络中的通信。Socket起源于UNIX在Unix一切皆文件的思想下进程间通信就被冠名为文件描述符file desciptorSocket是一种“打开—读/写—关闭”模式的实现服务器和客户端各自维护一个“文件”在建立连接打开后可以向文件写入内容供对方读取或者读取对方内容通讯结束时关闭文件。 Socket就像一个电话插座负责连通两端的电话进行点对点通信让电话可以进行通信端口就像插座上的孔端口不能同时被其他进程占用。而我们建立连接就像把插头插在这个插座上创建一个Socket实例开始监听后这个电话插座就时刻监听着消息的传入谁拨通我这个“IP地址和端口”我就接通谁。
二、Socket通信过程 像图中的listen、send等接口都为阻塞接口。
三、网络IO模型
1.阻塞IOblocking I/O 概念用户发出read请求时如果数据并没有准备好那么系统一直处于等待状态当拿到结果后才会向下执行否则一直处于阻塞状态。在内核将数据准备好之前系统调用会一直等待所有的套接字默认的是阻塞方式。形象的例子A拿着一支鱼竿在河边钓鱼并且一直在鱼竿前等在等的时候不做其他的事情十分专心。只有鱼上钩的时才结束掉等的动作把鱼钓上来。
其实我们例子中所说的鱼竿就是这一个文件描述符。这个模型是我们最常见的程序调用和我们编写的基本程序是一致的。 几乎所有的接口都是阻塞接口这就造成了效率低下、CPU资源浪费等一系列问题。 优化方法①socket套接字一次可以accept多次②使用多进程或多线程 2.非阻塞IOnoblocking I/O 概念当用户发出read操作后如果内部数据并没有准备好会迅速返回一个ERROR与阻塞IO不同点之一用户可以马上收到一个回复同样也会一直等待数据准备好这期间会一直不断询问数据的准备情况与阻塞IO不同点之二。
例子B也在河边钓鱼但是B不想将自己的所有时间都花费在钓鱼上在等鱼上钩这个时间段中B也在做其他的事情一会看看书一会读读报纸一会又去看其他人的钓鱼等但B在做这些事情的时候每隔一个固定的时间检查鱼是否上钩。一旦检查到有鱼上钩就停下手中的事情把鱼钓上来。
其实B在检查鱼竿是否有鱼是一个轮询的过程。
每次客户询问内核是否有数据准备好即文件描述符缓冲区是否就绪。当有数据报准备好时就进行拷贝数据报的操作。当没有数据报准备好时也不阻塞程序内核直接返回未准备就绪的信号等待用户程序的下一个轮寻。但是轮寻对于CPU来说是较大的浪费一般只有在特定的场景下才使用。
3.信号驱动IOsignal blocking I/O 概念发出请求后如果没有收到结果不会继续阻塞能够做其他的工作。
例子C也在河边钓鱼但与A、B不同的是C比较聪明他给鱼竿上挂一个铃铛当有鱼上钩的时候这个铃铛就会被碰响C就会将鱼钓上来。
信号驱动IO模型应用进程告诉内核当数据报准备好的时候给我发送一个信号对signal信号进行捕捉并且调用我的信号处理函数来获取数据报。
4.IO多路转接I/O multiplexing 例子D同样也在河边钓鱼但是D生活水平比较好D拿了很多的鱼竿一次性有很多鱼竿在等D不断的查看每个鱼竿是否有鱼上钩。增加了效率减少了等待的时间。
IO多路转接是多了一个select函数select函数有一个参数是文件描述符集合对这些文件描述符进行循环监听当某个文件描述符就绪时就对这个文件描述符进行处理。
其中select只负责等recvfrom只负责拷贝。 IO多路转接是属于阻塞IO但可以对多个文件描述符进行阻塞监听所以效率较阻塞IO的高。
5.异步IOasynchronous I/O 例子E也想钓鱼但E有事情于是他雇来了F让F帮他等待鱼上钩一旦有鱼上钩F就打电话给EE就会将鱼钓上去。
当应用程序调用aio_read时内核一方面去取数据报内容返回另一方面将程序控制权还给应用进程应用进程继续处理其他事情是一种非阻塞的状态。
当内核中有数据报就绪时由内核将数据报拷贝到应用程序中返回aio_read中定义好的函数处理程序。
很少有Linux系统支持Windows的IOCP就是该模型。
6.阻塞程度
可以看出阻塞程度阻塞IO非阻塞IO多路复用IO信号驱动IO异步IO效率是由低到高的。 前四种都属于同步IO。