热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于网络模型的一些概念

五中IO模型:1)阻塞IO,比如socket,一直阻塞到对方数据填充recv缓冲区,一直等到IO操作彻底返回才

五中IO模型:

1)阻塞IO,比如socket,一直阻塞到对方数据填充recv缓冲区,一直等到IO操作彻底返回才回到用户空间,

         最简单的改进是使用多进程或者多线程,让一个连接的阻塞不影响其他

        int accept(int fd,struct sockaddr *addr,socklen_t *addrlen); //accept接口原型


2)非阻塞IO:但是这种是一直轮询内核数据,并不阻塞,会造成CPU资源的浪费,一般不使用,被调用后立即

            返回给用户一个状态值不必等到IO操作彻底完成

        fcntl(fd,F_SETFL,O_NONBLOCK);    //将句柄设置为非阻塞状态


连接池和线程池的概念:就是维持一定的连接数,意在降低创建和销毁进程的频率,让空闲的进程或线程

    重新承担新的执行任务,但也只是在一定程度上缓解了频繁调用io接口带来的资源占用


3)IO复用:用select来管理多个文件描述符,一旦有一个有数据写入,select就返回,也就是阻塞在select,

不阻塞在recv,select可以看成管理者,用它来管理多个IO,一旦其中的一个或多个IO检测到我们感兴趣的事件,select就返回,返回值为检测到的事件的个数以及是哪些IO发生的事件,这样我们就可以遍历这些事件,进而

去处理它,若直到超时都未检测到事件,则返回0,它的优势不在于能够处理的更快,而在于能够处理更多的连接


在IO复用模型中,对于每一个socket,其实是非阻塞的,但是整个用户进程是阻塞的,只是它被阻塞在select,

而不是socket IO

select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,

         fd_set *restrict errorfds, struct timeval *restrict timeout);

参数说明:1 读写异常集合中的文件描述符的最大值+1

         2 读集合

         3 写集合

         4 异常集合

         5 超时描述的结构体


select在检测到可读事件之后,即时响应recv()操作,并根据接收到的数据准备好待发送数据,并将

对应的句柄值假如到writefds,准备下次的可写事件的select检测,同样,如果select发现某个句柄

发现可写事件,会立即做send操作,并准备好下一次的可读事件操作


事件驱动模型:每一个执行周期都会检测或者探测一次或者一组事件,一个特定的事件会触发某个特定

的响应


但是,注意select模型接口并不是实现事件驱动的最好的选择,因为当需要探测的句柄值较大的时候,

select接口本身需要消耗大量的实际去轮询各个句柄,很多操作系统提供了更为高效的接口,

比如Linux提供了epoll,而BSD提供了kqueue,Solaris提供了/dev/poll等但由于各系统的epoll

接口实现差异较大,所以用epool实现的服务器实现跨平台比较难,libevent和libev库是属于事件

驱动库 ,实际上Linux2.6之后也引入了支持异步的io操作如aio_read , aio_write


4)信号驱动IO:安装一个信号处理程序sigaction,有数据写入信号到来,再用信号通知应用进程有数

据到来,执行recv接收,把数据从内核拉取到用户空间,也不常用


5)异步IO:效率最高,用aio_read来实现的,没有数据时阻塞,有数据到来,直接copy到用户空间buf,

应用进程直接处理数据即可,不用再调用recv函数拉取,是一种主动推送的机制



poll函数的返回值errno:

1)EBADF:一个或者多个结构体中定义的文件描述符无效

2)EFAULTfds:指针指向的地址超出进程的地址空间

3)EINTR:请求的事件之前产生的一个信号,调用可以重新发起

4)EINVALnfds:参数超出PLIMIT_NOFILE的值

5)ENOMEM:可用内存不足,无法完成请求




epoll是在Linux2.6内核提出的,是select和poll的增强版,更加灵活,没有文件描述符的限制

int epoll_create(int size)  size是要监听的数目

int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event) epoll的事件注册函数

int epoll_wait(int epfd,staruct epoll_event *events,int maxevents,int timeout);

一点解释:

1)size应为最大监听数fd+1,创建好epoll句柄后它就会占用一个fd的值,在Linux下,看

/proc/fd/是可以看到这个fd的值的,所以在使用完epoll后必须close关闭,否则可能造成fd被耗尽

2)ctl的参数说明:

   a)create的返回值  

   b)表示动作,用epoll_ctl_add  epoll_ctl_mod epoll_ctl_del三个宏来描述 

   c)要监听的fd

   d)要监听的事件epollin可读  epollout可写  epollpri有紧急数据可读

epollerr 对应fd发生错误

   e)fd被挂断

   f)将epoll设为边沿处罚

   g)epolloneshot只监听一次事件,若需要再次监听,需重新加入到epoll队列 


select  poll和epoll的区别:

三者都是多路IO复用机制,可以监视多个描述符,一旦某个描述符九尾,可以通知程序进行相应的读写操作,但本质上都是同步IO,他们都需要在读写事件就绪后自己负责读写,而异步IO会把主动数据copy到用户空间

1)一般认为poll比select高效的原因:

   a.poll不要求开发组在计算最大文件描述符(fd)时进行+1的操作

   b.在应付大数目的fd时速度更快,因为select内核需要大量检测fd对应的fd_set中每一个bit位,会比较耗时

   c.select可监控的fd是固定的,也相对较少。poll可创建特定大小的数组来保存fd,不受fd大小的影响,而且可以监控的fd的数目远大于select

   d.对select来说,所监控的fd_set在select返回之后会发生变化,在下次进入select之前需要重新初始化需要监控的fd_set,poll将输入和输出分块,允许备件款的文件数组被复用而无需重新初始化

   f.select的超时参数在返回时也是未定义的,为考虑移植性,每次超时在下次进入select之前需重新设置超时参数


2)select的优点:

   a.可移植性更好,在某些unix系统不支持poll

   b.对超时提供了更好的精度,而poll精度较差


3)epoll的优点:

   a.支持一个进程打开最大数目的socket描述符FD,可以使用cat /proc/sys/fd/file-max查看

   b. IO效率不随FD数目的增加线性下降

   c.使用mmap家属内核与用户控件的消息传递







推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
mobiledu2502855247
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有