当前位置:2019年全年资料歇后语 > 取文件长度 >

需要了解Linux编程中的select

  select系统调用的的用途是:在一段指定的时间内,监听用户感兴趣的文件描述符上可读、可写和异常等事件。

  这是用来接收数据的,在默认的阻塞模式下的套接字里,recv会阻塞在那里,直到套接字连接上有数据可读,把数据读到buffer里后recv函数才会返回,不然就会一直阻塞在那里。在单线程的程序里出现这种情况会导致主线程(单线程程序里只有一个默认的主线程)被阻塞,这样整个程序被锁死在这里,如果永 远没数据发送过来,那么程序就会被永远锁死。这个问题可以用多线程解决,但是在有多个套接字连接的情况下,这不是一个好的选择,扩展性很差。

  这一次recv的调用不管套接字连接上有没有数据可以接收都会马上返回。原因就在于我们用ioctlsocket把套接字设置为非阻塞模式了。不过你跟踪一下就会发现,在没有数据的情况下,recv确实是马上返回了,但是也返回了一个错误:WSAEWOULDBLOCK,意思就是请求的操作没有成功完成。

  看到这里很多人可能会说,那么就重复调用recv并检查返回值,直到成功为止,但是这样做效率很成问题,开销太大。

  select模型的关键是使用一种有序的方式,对多个套接字进行统一管理与调度 。

  如上所示,用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。

  从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。

  maxfdp:被监听的文件描述符的总数,它比所有文件描述符集合中的文件描述符的最大值大1,因为文件描述符是从0开始计数的;

  readfds、writefds、exceptset:分别指向可读、可写和异常等事件对应的描述符集合。

  TImeout:用于设置select函数的超时时间,即告诉内核select等待多长时间之后就放弃等待。TImeout == NULL 表示等待无限长的时间

  返回值:超时返回0;失败返回-1;成功返回大于0的整数,这个整数表示就绪描述符的数目。

  当声明了一个文件描述符集后,必须用FD_ZERO将所有位置零。之后将我们所感兴趣的描述符所对应的位置位,操作如下:

  然后调用select函数,拥塞等待文件描述符事件的到来;如果超过设定的时间,则不再等待,继续往下执行。

  理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。则1字节长的fd_set最大可以对应8个fd。

  (5)若fd=1,fd=2上都发生可读事件,则select返回,此时set变为0000,0011。注意:没有事件发生的fd=5被清空。

  (1)可监控的文件描述符个数取决与sizeof(fd_set)的值。我这边服务器上sizeof(fd_set)=512,每bit表示一个文件描述符,则我服务器上支持的最大文件描述符是512*8=4096。据说可调,另有说虽然可调,但调整上限受于编译内核时的变量值。

  (2)将fd加入select监控集的同时,还要再使用一个数据结构array保存放到select监控集中的fd,一是用于再select返回后,array作为源数据和fd_set进行FD_ISSET判断。二是select返回后会把以前加入的但并无事件发生的fd清空,则每次开始select前都要重新从array取得fd逐一加入(FD_ZERO最先),扫描array的同时取得fd最大值maxfd,用于select的第一个参数。

  网络程序中,select能处理的异常情况只有一种:socket上接收到带外数据。

  这种通知在已经排队等待发送的任何“普通”(有时称为“带内”)数据之前发送。

  我们写的select程序经常都是用于接收普通数据的,当我们的服务器需要同时接收普通数据和带外数据,我们如何使用select进行处理二者呢?

  上面提到过,,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。在网络编程中,当涉及到多客户访问服务器的情况,我们首先想到的办法就是fork出多个进程来处理每个客户连接。现在,我们同样可以使用select来处理多客户问题,而不用fork。

  客户端:启动->

  连接服务器->

  发送A->

  等待服务器回复->

  收到B->

  再发B给服务器->

  收到C->

  结束

  select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:

  1、单个进程可监视的fd数量被限制,即能监听端口的大小有限。一般来说这个数目和系统内存关系很大,具体数目可以cat/proc/sys/fs/file-max察看。32位机默认是1024个。64位机默认是2048.

  2、 对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低:当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll与kqueue做的。

  3、需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。

  课程从0开始,讲到云计算结束,按阶段授课,从入门到跑路,适合初学者,也适合定制,需要哪个模块学哪个模块2,包含初级运维工

  对于PMEM设备来说,它的访问延迟已经和内存接近了,为什么还需要内存中的page cache呢?

  IEC 1131-3的编程语言是IEC工作组对世界规模的PLC厂家的编程语言合理地吸收、学习的基础上...

  Rocke是专门从事门罗币(Monero)挖掘业务的顶级黑客组织。去年年底,自新黑客组织Pacha崛...

  随着电子产品的飞速发展,MCU的集成度越来越高,体积越来越少,封装形式越来越多。编程是产品上市前至关...

  3月5日,高盛集团向全体3.6万名员工发布内部信,表示放宽员工着装要求。从此,这一老牌华尔街公司员工...

  张钹院士指出,清华大学建立人工智能研究院的重要目标就是在人工智能的基础理论和基本方法上进行源头性和颠...

  继电器梯形图(LD-Ladder Diagram)语言是PLC首要选用的编程语言,也是PLC最普遍选...

  本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在My...

  我们可以把“进化计算”看做是一类人工智能和机器学习的分支。最早提出于20世纪50年代,进化计算旨在让...

  根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器,存储器及输入/输出设备的执行...

  最近,网上流传一组《人工智能实验教材》的图片,照片火起来的原因是教材是为幼儿园的小朋友们设计的!

  Vundle在github上面有上将近20K的star,已经作为最流行的Vim插件管理器,强烈推荐所...

  目前国内流行用昆仑通泰或者威纶通触摸屏做项目,一方面价格便宜,另一方面编程简单。但西门子屏也经常会被...

  其实在Linux操作系统中,磁盘管理机制和windows上的差不多,绝大多数都是使用MBR(Mast...

  嵌入式linux中文站给大家介绍三种Linux中的常用多线程同步方式:互斥量,条件变量,信号量。

  为了协助外科手术或在人体内运送药物,未来的机器人将需要放弃有毒性的钕,转而使用铁等危险性较低的金属。...

  初代kirigani的实验也证明了不同的鳞片形状会对机器人的爬行效率产生影响。研究人员对圆形、三角形...

  一个服务器是以虚拟机的形式提供的,通过df -h看服务器磁盘空间只有30多个G,但通过fdisk -...

  PLC(可编程控制器)是软硬结合的一门技术,因为我们编写的程序需要外部接线才能实现,而只有接线没有程...

  World Zones的作用是在机器人位于用户专门定义的区域内时,停止该机器人或设置一个输出信号。

  天雷滚滚。天雷滚滚。天雷滚滚。作为一个Linux程序员,你能碰到的最伤心的事情,莫过于:编译了一整天...

  docker是linux容器的一种封装,提供简单易用的容器使用接口。它是最流行的Linux容器解决方...

  今天Reddit机器学习板块最火的话题,莫过于一个“亡于AI”的帖子,作者分享了发生在自己公司的一个...

  有时候在你安装后摇升级 RAM 的时候需要增加一点交换分区的空间,比如你要将你的系统的 RAM 从 ...

  目前,Linux作为嵌入式系统的主力军,广泛应用于消费类电子、工业控制、军工电子、电信/网络/通讯、...

  该团队首先制作了一个由16个镍钛诺电极组成的电极束,每个电极的直径只有23微米。(最小的人类神经元的...

  如果你想要进入运维管理领域这一行,首先你应该了解linux运维工程师是干什么的。他主要是对Linux...

  预测源代码,听着就是一件非常炫酷的事情。最近,谷歌大脑的研究人员就对此高难度任务发起了挑战,在构建源...

  玩儿电脑最怕的就是卡慢,那么电脑卡慢应该怎么解决呢?对于windows系统来说,你可能有各种免费的杀...

  当转为使用 Linux 时,你可能会注意到你所使用的版本会带有一个默认的备份工具。然而,可能该工具并...

  在这个路径运动过程中,工具的方向会从起始点到结束点连续变化,这种方式通过腕部轴的变化把执行运动拆分成...

  也许没有那么多铁杆的游戏玩家使用 Linux,但肯定有很多 Linux 用户喜欢玩游戏。如果你是其中...

  正如我之前说过,安全好比是在公路上开车――比你开得慢的人都是白痴,比你开得快的人都是疯子。本文介绍的...

  当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机...

  上古卷轴 5 已经不是款新游戏了,但它的 mod 社区依旧活跃。如果你的 Linux 系统有足够资源...

  众所周知,如果没有 cd 命令,我们无法 Linux 中切换目录。这个没错,但我们有一个名为 sho...

  作为中央核心处理单元的CPU,除了生产工艺的不断革新进步外,在处理数据和响应速度方面也需要有权衡。稍...

  IO响应过程中最主要问题是中断的balance,由于默认linux中并没有对NVMe的中断进行有效的...

  这是一个美妙而且疯狂的时代,瞬息万变,一切皆有可能。 曾经一度,微软把Linux看作危险的异类

  Linux系统让我们懂得了共享、开放、自由可以让人类生活的更加美好,开源精神是一种让每个从事Linu...

  OpenCV是一个跨平台的计算机视觉库,可以运行在Windows、Linux、MacOS等操作系统上...

  本月C语言和C++都强势增长,C语言大有超越Java的趋势,C++则回到第三位置。

  如果说如何快速学习、了解 Linux 的话,我的答案是学命令、背命令!为何呢?对于一名新手来说,去学...

  自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:...

  最近,据报道,日本文部科学省3月26日公布了全国小学从2020年度起使用的教科书的审定结果,共164...

  Windows 7将要到达其生命线的终点,市场数据表明,Win7操作系统(OS)的用户数量开始减少。...

  由于 Linux 所具备的开源、稳定、高效、易裁剪、硬件支持广泛等优点,使得它在嵌入式系统领域最近十...

  按 照电气工程师协会的一个定义:嵌入式系统是用来控制或监视机器、装置或工厂等的大规模系统的设备。具体...

  树莓派运行的是Linux系统,因此需要对Linux的命令和操作进行熟悉,我个人的体会Linux的命令...

  处理机(CPU)是整个计算机系统的核心资源,在多进程的操作系统中,进程数往往多于处理机数,这将导致各...

  众所周知,现在的分时操作系统能够在一个CPU上运行多个程序,让这些程序表面上看起来是在同时运行的。l...

  TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等...

http://mimaximafm.com/quwenjianchangdu/182.html
点击次数:??更新时间2019-06-03??【打印此页】??【关闭
  • Copyright © 2002-2017 DEDECMS. 织梦科技 版权所有  
  • 点击这里给我发消息
在线交流 
客服咨询
【我们的专业】
【效果的保证】
【百度百科】
【因为有我】
【所以精彩】