5.1阻塞和非阻塞、同步和异步 5.2Unix、Linux上的五种IO模型

5.1阻塞和非阻塞、同步和异步

典型的一次IO的两个阶段是什么?数据就绪和数据读写
数据就绪:根据IO操作的就绪状态

  • 阻塞
  • 非阻塞

数据读写:根据应用程序和内核的交互方式

  • 同步
  • 异步

在这里插入图片描述

陈硕:在处理IO的时候,阻塞和非阻塞都是同步IO,只有使用了特殊的API才是异步IO。
在这里插入图片描述
一个典型的网络接口调用,分为两个阶段,分别是“数据就绪”和“数据读写”,数据就绪阶段分成阻塞和非阻塞,表现得结果就是,阻塞当前线程或是直接返回。

同步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),数据的读写都是由请求方A自己来完成的(不管是阻塞还是非阻塞);异步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),向B传入请求的事件以及事件发生时通知的方式,A就可以处理其他逻辑了,当B监听到事件处理完成后,会用事先约定好的通知方式,通知A处理结果。

  • 同步阻塞
  • 同步非阻塞
  • 异步阻塞
  • 异步非阻塞

5.2Unix、Linux上的五种IO模型

阻塞、非阻塞是与文件描述符fd有关的。

阻塞blocking

调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等这个函数返回才能进行下一步动作。

在这里插入图片描述

非阻塞non-blocking(NIO)

非阻塞等待,每隔一段时间就去检测IO事件是否就绪,没有就绪就可以做其他事。非阻塞IO执行系统调用总是立即返回,不管事件是否已经发生,若事件没有发生,则返回-1,此时可以根据errno区分着两种情况,对于accept,recv和send,事件未发生时,errno通常被设置成EAGAIN。

在这里插入图片描述

IO复用(IO multicomplexing)

Linux用select/poll/epoll函数实现IO复用模型,这些函数也会使进程阻塞,但是和阻塞IO所不同的是这些函数可以同时阻塞多个IO操作。而且可以同时对多个读操作、写操作的IO函数进行检测。直到有数据可读或可写时,才真正调用IO操作函数。

在这里插入图片描述

信号驱动(signal-driven)

Linux用套接口进行信号驱动IO,安装一个信号处理函数,进程继续运行并不阻塞,当IO事件就绪,进程收到SIGIO信号,然后处理IO事件。
在这里插入图片描述
内核在第一个阶段是异步,在第二个阶段是同步;与非阻塞IO的区别在于它提供了消息通知机制,不需要用户进程不断地轮询检查,减少了系统API的调用次数,提高了效率。

异步(asynchronous)

Linux中,可以调用aio_read函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序。
在这里插入图片描述

//异步 IO控制块
struct aiocb{
	int aio_filders;
	int aio_lio_opcode;
	int aio_reqprio;
	volatile void *aio_buf;
	size_t aio_nbytes;
	struct sigevent aio_sigevent;
	
	struct aiocb *_next_prio;
	int __abs_prio;
	int __policy;
	int __error_code;
	__ssize_t __return_value;
	
#ifndef __USE_FILE_OFFSET64
	__off_t aio_offset; /* File offset. */
	char __pad[sizeof (__off64_t) - sizeof (__off_t)];
#else
	__off64_t aio_offset; /* File offset. */
#endif
	char __glibc_reserved[32];
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/33918.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

短信压力测试系统,支持自定义接口

短信压力测试系统,支持自定义接口 支持卡密充值,短信压力测试系统,解决一切骚扰电话,教程在压缩包里面 可多个服务器挂脚本分担压力,套了cdn导致无法正常执行脚本可以尝试添加白名单 这边建议使用MySQL方式 同服务器下直接配置…

计算机网络——物理层

物理层 物理层是计算机网络体系结构中的底层层级,负责处理计算机与物理传输媒介之间的接口和通信细节。它主要关注如何在物理媒介上传输原始比特流,并确保数据能够可靠地从发送方传输到接收方。 物理层的主要任务包括: 传输介质&#xff1a…

计算机启动

按下主机上的 power 键后,第一个运行的软件是 BIOS,BIOS 全称叫 Base Input & Output System,即基本输入输出系统。 (8086的1MB内存) 地址 0~0x9FFFF 处是 DRAM,顶部的 0xF0000~0xFFFFF&am…

【一起啃书】《机器学习》第十章 降维与度量学习

文章目录 第十章 降维与度量学习10.1 k k k近邻学习10.2 低维嵌入10.3 主成分分析10.3.1 定义与步骤10.3.2 最近重构性与最大可分性 10.4 核化线性降维10.5 流形学习10.6 度量学习 第十章 降维与度量学习 10.1 k k k近邻学习 k k k近邻学习是一种常用的监督学习方法&#xf…

基于 unity 配置 adb

1.打开环境变量配置path的环境 2 找到自己的unity安装目录,找到对应路径 配置到 path 属性中 C:\~\Editor\2021.3.0f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\platform-tools 3 应用保存即可

FPGA中ROM初始化方法

一 读取txt数据文件进行初始化 parameter INIT_FILE "文件路径/Data.txt" (**注意文件路径中斜杠方向**) reg [DATA_WITDH - 1:0] ROM [DATA_DEPTH - 1:0];initial begin$readmemh(INIT_FILE, ROM, 0, DATA_DEPTH - 1); end Dat…

Java面试题大全(23年整理版)最新全面技巧讲解

程序员面试背八股,可以说是现在互联网开发岗招聘不可逆的形式了,其中最卷的当属 Java!(网上动不动就是成千上百道的面试题总结)你要是都能啃下来,平时技术不是太差的话,面试基本上问题就不会太大…

Loadrunner怎么实现MD5加密

目录 前言: 1、写一个md5.h文件,将其放入脚本路径下 2、在globals.h中加入#include “md5.h” 3、在Action中写脚本,脚本示例如下: 前言: 在 LoadRunner 中实现 MD5 加密可以通过使用 LoadRunner 提供的函数来完成…

使用Python+Flask+HTML写一个测试小工具

背景: 由于公司安全规范限制,我司的测试、预发布、灰度、生产环境,接口间的数据通信通常是加密处理的,给我们日常定位缺陷带来了一定的阻碍,因此我决定使用Python写一个工具,将加密数据转换为正常数据&…

界面开发框架Qt新手入门教程:如何使用Calendar组件创建日历(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文中的CalendarWi…

Python3 实例(三) | 菜鸟教程(二十一)

目录 一、Python 二分查找 二、Python 线性查找 三、Python 插入排序 四、Python 快速排序 五、Python 选择排序 六、Python 冒泡排序 七、Python 归并排序 一、Python 二分查找 (一)二分搜索是一种在有序数组中查找某一特定元素的搜索算法。 &a…

Java8 Stream详解

Stream类继承关系 前置知识 Spliterator接口使用 Spliterator是在java 8引入的一个接口,它通常和stream一起使用,用来遍历和分割序列。 只要用到stream的地方都需要Spliterator,比如List,Collection,IO channel等等…

数据库监控与调优【十七】—— 表结构设计优化

表结构设计优化 第一范式(1NF) 字段具有原子性,即数据库的每一个字段都是不可分割的原子数据项,不能是集合、数组、记录等非原子数据项 当实体中的某个属性有多个值时,必须拆分为不同的属性 例子: 如图…

《黑马头条》SpringBoot+SpringCloud+ Nacos等企业级微服务架构项目

环境搭建、SpringCloud微服务(注册发现、服务调用、网关) 1)课程对比 2)项目概述 2.1)能让你收获什么 2.2)项目课程大纲 2.3)项目概述 随着智能手机的普及,人们更加习惯于通过手机来看新闻。由于生活节奏的加快,很多人只能利用碎片时间来获取信息&#x…

iview切换Select时选项丢失,重置Seletc时选项丢失

分析原因 在旧版本的iview中如果和filterable一起使用时,当值清空选项或者使用重置按钮清空时选项会丢失。 解决方式一 把去掉filterable 解决方式二 使用ref,调用clearSingleSelect()方法清空 ref"perfSelect" this.$refs.perfSelect.c…

【数据库原理与实践】知识点归纳(下)

第6章 规范化理论 一、关系模式设计中存在的问题 关系、关系模式、关系数据库、关系数据库的模式 关系模式看作三元组&#xff1a;R < U,F >&#xff0c;当且仅当U上的一个关系r满足F时&#xff0c;r称为关系模式R < U,F >的一个关系 第一范式&#xff08;1NF&…

Mybatis-Plus:实现自定义SQL

目录 1.简介 2.自定义SQL具体实现 2.1.注解SQL 2.2.Wrapper传参注解SQL 2.3.Wrapper传参xml文件SQL 2.4.正常传参XML文件SQL 3.总结 1.简介 Mybatis-Plus&#xff08;以下简称MBP&#xff09;的初衷是为了简化开发&#xff0c;而不建议开发者自己写SQL语句的&#xff1b…

Java又双叒叕“凉”了?

前几天&#xff0c;TIOBE的一份6月编程语言榜单公布&#xff1a;Java退出前三&#xff0c;位居第四。一波Java凉了的言论甚嚣尘上。其实不止Java&#xff0c;python、C、C&#xff0c;哪一个没被提过“凉”... 而现实是&#xff0c;Java的招聘需求依然很大&#xff1a; 不可否…

Java面试Day17

1.什么是 Java 内部类&#xff1f; 内部类的分类有哪些 &#xff1f;内部类有哪些优点和应用场景&#xff1f; 顾名思义&#xff0c;内部类是指定义在某一个类中的类&#xff0c;主要分为成员内部类&#xff0c;静态内部类&#xff0c;局部内部类和匿名内部类四种。 创建与获取…

ffmpeg+nginx-rtmp转发视频流

本篇博客最早发布于实验室公共博客&#xff0c;但已无人维护&#xff0c;现迁移至个人博客 nginx与nginx-rtmp-module安装 画了好几天图&#xff0c;实在有些乏力&#xff0c;找点有意思的事情做做 觉得视频流传输挺有意思&#xff0c;B站找了些视频&#xff0c;但感觉有些大…