`
laughingchs
  • 浏览: 69752 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

IO模式

阅读更多

I/O模式概述
 阻塞I/O 非阻塞I/O I/O多路复用 信号驱动I/O 异步I/O
 五程I/O模式区别图:


1.阻塞I/O --- 最普遍使用的I/O模式。缺省的,一个套接字建立后所处于的模式即是阻塞I/O模式。
 图例如下:


 上图中,一个进程调用recvfrom 若没有数据报到达本地系统,刚阻塞。直接有数据报到达,才返回。
 
2.非阻塞I/O --- 设置套接字为非阻塞模式,相当于告诉系统:当请求的I/O操作不能马上完成,不进行休眠等待,马上返回一个错误.
 图例如下:


 上图中,三次recvfrom调用,仅一次正常返回,其余返回一个EWOULDBLOCK的错误。
 当一个应用程序使用了非阻塞模式的套接字,它需要使用一个循环不停的测试是否一个文件描述符有数

 据可读(称做polling).
 应用程序不停的polling来检查是否I/O操作已经就绪。这将浪费CPU资源,所有此模式不常用。

 

3.I/O多路复用
 调用select()函数和poll()函数,调用时阻塞,而不是来调用recv的时候阻塞。
 当调用select函数阻塞时,select函数等待数据报套接字进入读就绪状态。当select函数返回时,即套接字可以读取数据的时候,就可以调用recvfrom函数来接收数据(将数据拷贝到程序缓冲区)。
 多路复用优点:同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()就可以返回。
 图例如下:


 应用:假设运行一个网络客户端程序,要同时处理套接字传来的网络数据,又要处理本地标准输入输出。当程序处于阻塞状态等待标准输入的数据时,假如服务器端的程序被kill,那么服务器端的TCP协议会给客户端的TCP协议发送一个FIN数据代表终止连接。但我们这端的程序阻塞等待标准输入的数据上,在它读取套接字数据之前,它不会看见结束标志。
 IO多路技术一般在下面情况中应用:
 当一个客户端需要同时处理多个文件描述符的输入输出操作时。
 当程序需要同时进行多个套接字的操作时
 TCP服务程序同时处理正在侦听网络连接和已经连接好的套接字时。
 一个服务器程序同时使用TCP和UDP协议。
 一个服务器同时用多种服务并且服务协议不同如:inetd

 

4.信号驱动I/O模式
 使用信号,让内核在文件描述符就绪的时候使用SIGIO信号来通知我们的模式。
 首先需要允许套接字使用信号驱动I/O,安装SIGIO的函数.
 此程模式,系统调用立即返回,然后程序做其它事情,当数据准备就绪时,系统向进程发送SIGIO信号。在信号处理函数中进行I/O操作。

 图例如下:

 


 信号I/O可以使内核在某个文件描述符发生改变的时候发信号通知我们的程序。异步I/O可以提高我们程序进行I/O读写效率。通过使用它,当我们的程序进行I/O操作的时候,内核可以在初始化I/O操作后立即返回,在进行I/O操作的同时,我们的程序可以做其它事情,真到I/O结束,内核给我们的程序发送消息通知。
 应用实例:如果一个正在进行读写操作的TCP套接字处于信号驱动I/O状态下,那么每当新数据到达本地的时候,将会产生一个SIGIO信号,每当本地套接字发出的数据被远程确认后,也会产生一个SIGIO信号。对于我们的程序来讲,是无法区分这二个SIGIO有什么区别。在此种情况下使用SIGIO,TCP套接字应当被设置为无阻塞模式来阻止一个阻塞的read/write/recv/send操作。所以我们考虑一个只进行监听网络连接操作的套按字上使用异步I/O。

5.异步I/O模式
 当我们运行在异步I/O模式下,如果想进行I/O操作,只需要告诉内核我们要进行I/O操作,然后内核马上返回。具体的I/O和数据拷贝全部由内核来完成,我们程序继续执行。当内核完成所有的I/O操作,内核将通知我们程序。
 异步I/O和信号驱动I/O区别:
 信号驱动I/O模式下,内核在操作可以被操作的时候通知我们的应用程序发送SIGIO信号
 异步I/O模式下,内核在所有I/O操作的已经被内核操作结束后才会通知我们的应用程序。
 图例如下:


 上例中:当我们进行一个IO操作时,传递给内核的文件描述符,我们的缓存区指针和缓存区的大小,一

 个偏移量offset,以及在内核结束所有操作后和我们联系的方法。这种调用也是立即返回的,我们的程序

 不需要阻塞来等待数据的就绪。我们可以要求系统内核所有的操作结束后(包括从网络上读取信息,然后

 拷贝到我们提供给内核的缓存区中)给我们发一个消息。

 

套接字选项select()函数 <sys/time.h><sys/types.h><unistd.h>
int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,

 struct timeval * timeout); 用来等待文件描述词状态的改变。
 参数n代表readfds,writefds,exceptfds中fd集合中文件描述符中最大的文件描述符数字加1
 参数readfds 中的fd集合将由select来监视是否可以读取
 writefds 中的...是否可以写入
 exceptfds 中的...是否有例外发生
 如果你想知道是否可以从标准输入和一些套接字sockfd中读取数据,你就可以把文件描述符和sockfd加入readfds中。n的值设成readfds中文件描述符中最大的那个数字加一,也就是sockfd+1(因为标准输入的文件描述符值为0,所以其它任何的文件描述符都会比0值大)
 当select()函数返回时,readfds将会被修改用来告诉你哪一个文件描述符你可以用来读取数据。
 使用FD_ISSET()宏,你可以选出select()函数执行的结果。
 FD_CLR(inr fd, fd_set* set);用来清除描述词组set中相关fd 的位
 FD_ISSET(int fd, fd_set *set);用来测试描述词组set中相关fd的位是否为真
 FD_SET(int fd, fd_set*set);用来设置描述词组set中相关fd的位
 FD_ZERO(fd_set *set); 用来清除描述词组set的全部位
 参数timeout为结构timeval,用来设置select()的等待时间,其结构定义如下
 struct timeval{
 time_t tv_sec;
 time_t tv_usec;
 };
 在调用select()函数中,如果时间超过timeval参数所设置的时间长度,而还没有文件描述满足你的要

 求,那么select()函数将返回,允许继续程序下面的操作。
 当select()函数返回时,timeval中的时间将会被设置为执行为select()后还剩下的时间。
 注:如果timeval 设置为0, select立即返回,同时返回在你集合中的文件描述符状态。
 如果timeout参数为NULL,select函数进入阻塞状态,除了文件描述符的状态变化,否则select()

 不会返回。
 如果你的套接字描述符正在通过listen()函数侦听一个外来的网络连接,则你可以使用select函数来测

 试是否存在一个未经处理的新连接。
 返回值如果参数timeout设为NULL则表示select()没有timeout。
 错误代码执行成功则返回文件描述词状态已改变的个数,如果返回0代表在描述词状态改变前已超过

 timeout时间,当有错误发生时则返回-1,错误原因存于errno,此时参数readfds,writefds,exceptfds

 和timeout的值变成不可预测。
 EBADF 文件描述词为无效的或该文件已关闭
 EINTR 此调用被信号所中断
 EINVAL 参数n 为负值。
 ENOMEM 核心内存不足
 范例常见的程序片段:
 fs_set readset;
 FD_ZERO(&readset);
 FD_SET(fd,&readset);
 select(fd+1,&readset,NULL,NULL,NULL);
 if(FD_ISSET(fd,readset){……}
 代码演示select
 #include<stdio.h><sys/time.h><sys/types.h><unistd.h>
 #define STDIN 0
 int main()
 {
 struct timeval tv;
 fd_set readfds;
 tv.tv_sec = 2;
 tv.tv_usec = 500000;
 FD_ZERO(&readfds);
 FD_SET(STDIN, &readfds);
 select(STDIN+1, &readfds, NULL, NULL, &tv);
 if(FD_ISSET(STDIN, &readfds)){
 printf("A key was pressed!\n");
 }
 else{
 printf("Timed out.\n");
 }
 }

 

 

 

分享到:
评论

相关推荐

    雅马哈机械手视觉补偿系统的Socket通信与坐标转换实现详解

    内容概要:本文详细介绍了雅马哈机械手在锁螺丝过程中与视觉系统的协同工作流程,重点讲解了Socket通信的实现方法、坐标转换的具体步骤以及动态路径规划的技术细节。首先,文章展示了如何通过TCP/IP协议建立机械手与相机之间的稳定通信,确保数据传输的可靠性和实时性。接着,深入探讨了从像素坐标到机械臂笛卡尔坐标的转换过程,强调了标定矩阵的重要性和正确处理字节序的问题。此外,还讨论了托盘动态路径规划的实现,如螺旋式搜索算法的应用及其带来的效率提升。最后,文章分享了一些实际应用中的经验和教训,如处理粘包问题、网络延迟、异常处理机制等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对机械手与视觉系统集成感兴趣的读者。 使用场景及目标:适用于需要深入了解机械手与视觉系统协作机制的场合,帮助工程师更好地理解和优化工业生产线上的自动化设备。目标是提高生产效率和产品质量,减少因技术问题导致的生产停滞。 其他说明:文中提供了多个代码示例,涵盖Python、C++和C#等多种编程语言,便于不同背景的读者参考和实践。同时,作者结合自身经验,给出了许多实用的调试技巧和注意事项,有助于读者规避常见错误并快速解决问题。

    LabVIEW与西门子S7-200 PLC基于PPI协议的通讯实现及调试技巧

    内容概要:本文详细介绍了如何利用LabVIEW与西门子S7-200 PLC通过PPI协议进行通讯的方法和技术要点。主要内容涵盖硬件准备、通讯参数配置、PPI协议命令格式、命令发送与接收、数据解析以及常见问题的调试方法。文中强调了硬件选择、波特率设置、命令帧结构、CRC校验、超时处理等方面的具体操作步骤,并提供了多个实用技巧,如地址扫描、批量读取优化、字节序处理等。 适合人群:从事工业自动化系统集成、LabVIEW编程、PLC通讯开发的技术人员。 使用场景及目标:适用于需要将LabVIEW与西门子S7-200 PLC进行通讯的工程项目,帮助技术人员快速掌握PPI协议的应用,提高通讯稳定性和效率。 其他说明:文章不仅提供了详细的理论指导,还分享了许多实践经验,有助于解决实际应用中的各类问题。

    计算机二级考试资源合集

    计算机二级考试资源合集:高效备考,轻松通关! 本合集涵盖计算机二级考试核心内容,包括软件/硬件知识、编程、数据库、网络技术等,提供理论资料与实战资源(如PHP示例、网页文件、配置数据等),助你系统复习、强化实操。适合考生快速提升技能,顺利通过考试!

    【嵌入式系统】基于STM32的宠物饮水机C++源代码:实现循环过滤与水质清洁功能

    内容概要:本文档提供了基于STM32的宠物饮水机的C++源代码,实现了循环过滤和保持水质清洁的功能。代码包括硬件初始化、水位检测、温度监测、紫外线杀菌以及OLED显示等功能模块。通过水位传感器检测水位并控制水泵启停,使用DS18B20温度传感器监测水温并在OLED屏幕上显示,每小时自动启动紫外线灯进行杀菌5分钟。此外,详细解释了水位传感器的工作原理及其在代码中的实现,重点介绍了浮球式传感器的结构和工作过程。 适合人群:对嵌入式系统开发有一定了解,特别是熟悉STM32平台和C++编程的工程师或爱好者。 使用场景及目标:①学习STM32平台下的硬件初始化和外设驱动编程;②掌握水位传感器、温度传感器及紫外线杀菌功能的设计与实现;③理解浮球式水位传感器的工作原理及其在实际项目中的应用。 阅读建议:此资源不仅提供了完整的源代码,还详细解释了每个功能模块的实现细节,适合在实际项目中参考和学习。建议读者结合STM32开发板进行实践操作,深入理解各个功能模块的工作机制,并根据具体需求进行功能扩展和优化。

    Gerber-语音模块

    语音模块的打印文件,直接使用。

    ### NA200H 可编程控制器硬件手册概述

    内容概要:本文档是傲拓科技股份有限公司发布的NA200H可编程控制器(PLC)硬件手册,旨在详细介绍NA200H系列PLC的硬件特性、安装、拆卸与接线原则。NA200H系列PLC是一款小型一体化PLC,具有集成以太网接口,适用于恶劣运行环境,具备良好的扩展性能和低廉的价格。手册涵盖了NA200H PLC的硬件组成(包括CPU模块和各种扩展模块)、工作方式、编程软件介绍、快速应用指南以及详细的安装、拆卸与接线原则。此外,手册还提供了CPU模块和各类I/O扩展模块的技术参数、端子定义与接线说明,并介绍了多种通讯模块的功能和特性。最后,附录部分列出了订货参数和扩展模块的功率消耗清单。 适合人群:具备一定电气知识的操作人员和技术人员,特别是从事自动化控制系统设计、安装和维护的工程师。 使用场景及目标:①帮助用户了解NA200H PLC的硬件结构和工作原理;②指导用户正确安装、配置和维护NA200H PLC;③协助用户选择合适的扩展模块以满足特定的应用需求;④提供详细的接线和通讯配置指导,确保系统稳定运行。 阅读建议:本手册内容详尽,建议读者在使用产品前仔细阅读并理解相关内容,尤其是安装、拆卸和接线部分,以确保系统的安全和稳定运行。同时,建议结合实际应用场景,灵活运用手册中的信息,进行合理的系统设计和配置。

    社交电商卡盟租号商城陪玩建站代刷电脑手机端官网源码

    电脑手机端全新UI界面优化更新 支持PC+wap端自动识别跳转 代码工整易于阅读,方便二次修改 全站幻灯片后台自定义更换 大部分可见数据后台可自行修改配置 栏目结构层次清晰,非常利于搜索引擎优化 服务器环境:PHP>=5.3,支持最新的PHP7 系统默认采用Sqlite数据库,放入PHP(5.3+)环境即可直接使用, 系统独家支持七牛云对接,无论你是否启用七牛云,请把轮播图,栏目大图,定制标签内的部分图片重新上传可直接保存图 片,重新上传一下,否则不会图片可能会不显示(因为那些图片在我们的七牛云内) 授权码生成:https://www.pbootcms.com/freesn/ 默认采用sqlite数据库,不需要做导入和配置操作 为了网站各个页面正常运行,请不要修改URL规则 统计代码、商桥代码、各种客服代码,均可放置在后台统计位置,全站生效。 浏览器标签logo在根目录favicon.ico,ico格式百度一下,可以生成 后台地址:您的域名/admin.php 账号:admin密码:123456789

    甲壳虫adb助手安全下载.apk

    甲壳虫adb助手安全下载.apk

    蓝桥杯省赛考点整合,模块总结

    内容概要:本文档《1_蓝桥杯省赛考点整合.pdf》详细介绍了蓝桥杯省赛中常见的硬件模块及其编程实现方法。主要包括Led模块、Key模块、Seg模块、ds1302、ds18b20、PCF8591、EEPROM、超声波模块、串口通信、NE555定时器以及蜂鸣器继电器的底层代码和具体应用实例。每个模块都涵盖了代码示例、功能解释及具体的省赛题目应用场景。例如Led模块展示了如何根据模式显示Led、Led闪烁和PWM亮度调整;Key模块讲解了模式切换、参数设置和按键长按短按等功能;Seg模块则侧重于正常数据显示和闪烁效果。

    Matlab图像拼接GUI:基于Harris角点、SIFT匹配、RANSAC优化的五模块实现

    内容概要:本文详细介绍了基于Matlab的图像拼接GUI系统的实现过程,涵盖了五个主要模块:系统管理、角点提取(Harris角点)、特征匹配(SIFT匹配)、匹配优化(RANSAC)和图像拼接(单映变换)。系统管理模块负责初始化环境和参数设置;角点提取模块使用Harris角点算法识别图像的关键点;特征匹配模块通过SIFT算法寻找匹配点对;匹配优化模块采用RANSAC算法去除误匹配点;最终图像拼接模块利用单映变换完成图像融合。文中还提供了大量代码示例和参数调优技巧,如高斯滤波的sigma值选择、SIFT匹配阈值设定、RANSAC迭代次数和像素容差调整等。 适合人群:对图像处理感兴趣的初学者和有一定编程基础的研究人员。 使用场景及目标:适用于学习和研究图像拼接技术,尤其是希望通过Matlab实现图像处理算法的人群。目标是掌握图像拼接的基本原理和技术实现,能够独立构建类似的图像处理系统。 其他说明:文中提供的代码仅供学习参考,实际应用中建议进一步优化和改进。同时,文中提及了一些实用技巧,如内存管理和性能优化,有助于提高系统的稳定性和效率。

    西门子S7-200 Smart PLC在30吨双级反渗透水处理系统的应用与优化

    内容概要:本文详细介绍了基于西门子S7-200 Smart PLC的30吨双级反渗透水处理系统的设计与实现。主要内容涵盖了一键制水、加药控制、触摸屏组态、程序结构优化等方面的技术细节。文中不仅展示了具体的PLC梯形图代码片段,还分享了许多现场调试的经验和技巧,如定时器防抖、中断优先处理、PID闭环控制的应用等。此外,文章还提到了一些实用的功能设计,如无人值守模式的安全机制、长按按钮触发高级设置等。 适合人群:从事水处理自动化系统设计、维护的工程师和技术人员,尤其是熟悉西门子PLC编程的从业者。 使用场景及目标:适用于需要稳定产水的工业应用场景,帮助工程师理解和掌握双级反渗透系统的控制逻辑,提高系统的可靠性和效率。同时,也为新手提供了宝贵的调试经验和注意事项。 其他说明:文章强调了程序结构的模块化设计,便于后期维护和参数调整。建议读者结合提供的工程文件进行仿真练习,以便更好地理解系统的工作原理。

    LabVIEW多路温度采集系统的Modbus通讯与高级特性应用

    内容概要:本文详细介绍了基于LabVIEW 2018版开发的多路温度采集系统,涵盖了系统架构设计、Modbus通讯实现、FGV(功能性全局变量)应用、队列管理和引用控制等多个高级知识点。系统采用了一主两从的串口连接方式,其中一个从机负责温度采集,另一个从机负责开关控制。文中提供了具体的代码示例,如串口配置、Modbus主站配置、数据读取、FGV创建与使用、队列操作等,展示了如何通过这些技术实现高效的数据传输和处理。 适用人群:适用于有一定LabVIEW基础的研发人员和技术爱好者,尤其是希望深入理解LabVIEW高级特性和Modbus通讯机制的人群。 使用场景及目标:①掌握LabVIEW中Modbus通讯的具体实现方法;②学会使用FGV实现跨VI的数据共享;③理解队列在多线程数据处理中的应用;④熟悉引用控制在动态界面更新中的作用。通过这些技术的应用,可以提高项目的开发效率和系统的稳定性。 其他说明:本文不仅提供了详细的代码示例,还分享了许多实践经验,如如何避免内存泄漏、如何处理异常情况等。此外,作者还强调了系统架构的设计思路,如分层设计、生产者-消费者模式等,这些都是实际项目开发中非常重要的考虑因素。

    RAG-N算法,滤波器加法器优化代码

    RAG-N算法,滤波器加法器优化代码

    软考软件设计师高频考点精析

    《软考软件设计师高频考点精析》精准提炼考试核心内容,涵盖编程语言、数据结构、操作系统、数据库、软件工程等必考领域。结合历年真题与实战技巧,助你快速掌握重点,高效备考。一册在手,轻松攻克软考难关!

    LabVIEW与CAN通讯上位机集成:基于周立功库文件的实现方法及应用

    内容概要:本文详细介绍了如何利用LabVIEW和周立功库文件构建一个能够进行基本CAN通讯的上位机系统。主要内容涵盖前期准备工作,包括安装LabVIEW软件和下载相关库文件;创建LabVIEW项目,调用库文件实现CAN设备初始化、数据发送与接收等功能的具体步骤;以及一些常见的注意事项和避坑指南。此外,还提供了进阶玩法,如封装成子VI、优化接收处理逻辑等。 适合人群:适用于初次接触LabVIEW和CAN通讯的技术爱好者,尤其是希望快速掌握CAN通讯上位机开发的初学者。 使用场景及目标:本教程旨在帮助用户建立一个简易的CAN通讯平台,以便于后续深入研究或实际项目开发。通过动手实践,读者将学会如何配置CAN设备、编写数据传输代码,并理解CAN通讯的基本原理。 其他说明:文中附带了详细的代码示例和实用技巧,有助于提高学习效率。同时强调了正确配置结构体成员顺序、管理设备句柄、匹配波特率等关键点,以确保系统的稳定性。

    永磁同步电机矢量控制C代码实现及其S-function仿真与实际应用

    内容概要:本文详细介绍了永磁同步电机(PMSM)矢量控制的C代码实现,涵盖从理论到实践的全过程。首先解释了矢量控制的基本原理,即通过坐标变换将三相电流解耦为励磁电流和转矩电流,以便独立控制电机的转矩和磁通。接着介绍了S-function模式仿真的优势,强调它可以灵活嵌入自定义代码并与其他Simulink模块协同工作。文中提供了关键的C代码示例,包括电机参数和状态变量的初始化、Clark变换和Park变换的具体实现、PI控制器的设计以及SVPWM生成算法。此外,还讨论了代码移植到实际工程项目中的注意事项,如硬件资源对接、参数调整和优化技巧。 适合人群:从事电机控制系统开发的技术人员,尤其是有一定C语言编程基础并对永磁同步电机矢量控制感兴趣的工程师。 使用场景及目标:适用于希望深入了解永磁同步电机矢量控制原理并在实际项目中应用相关技术的研发人员。主要目标是帮助读者掌握从仿真到实际应用的完整流程,提高电机控制系统的开发效率和稳定性。 其他说明:文中不仅提供了详细的代码示例,还分享了许多来自实际项目的宝贵经验和技术细节,如定点运算优化、锁相环(PLL)实现中的常见问题及解决方案、PI控制器的抗积分饱和处理等。这些内容对于理解和解决实际开发中的难题非常有帮助。

    流变学在材料科学中的应用:聚合物流变学仿真.zip

    流变学在材料科学中的应用:聚合物流变学仿真.zip

    LabVIEW与三菱FX PLC编程口协议通讯详解及应用

    内容概要:本文详细介绍了如何使用LabVIEW与三菱FX系列PLC进行编程口协议通讯。首先解释了协议的基本结构,包括起始符、结束符、ASCII字符指令以及校验码的计算方式。接着展示了具体的LabVIEW代码实现,涵盖了串口配置、命令帧构造、数据解析等关键步骤。文中还分享了许多实用技巧和常见错误的解决方案,如正确设置串口参数、处理特殊字符、优化读取速度等。此外,作者提供了完整的工程源码,并强调了在实际应用中需要注意的问题,如通信间隔控制和浮点数处理。 适合人群:从事工业自动化领域的工程师和技术人员,特别是熟悉LabVIEW和三菱PLC的用户。 使用场景及目标:适用于需要通过编程口与三菱FX系列PLC进行通讯的应用场景,如读取寄存器数据、监控设备状态等。目标是帮助读者掌握LabVIEW与三菱PLC通讯的具体实现方法,提高工作效率。 其他说明:文中提到的所有代码和技巧均经过实际验证,确保可行性和可靠性。建议读者在实践中结合自己的具体需求进行调整和优化。

    蓝桥杯Python之自动生成数据库表字典的markdown文本3.zip

    蓝桥杯python 蓝桥杯Python之自动生成数据库表字典的markdown文本3.zip

Global site tag (gtag.js) - Google Analytics