阻塞、非阻塞、异步、同步

news2024/11/16 1:20:40

IO | bRPC

一般有三种操作IO的方式:

  • blocking IO: 发起IO操作后阻塞当前线程直到IO结束,标准的同步IO,如默认行为的posix read和write。
  • non-blocking IO: 发起IO操作后不阻塞,用户可阻塞等待多个IO操作同时结束。non-blocking也是一种同步IO:“批量的同步”。如linux下的poll,select, epoll,BSD下的kqueue。
  • asynchronous IO: 发起IO操作后不阻塞,用户得递一个回调待IO结束后被调用。如windows下的OVERLAPPED + IOCP。linux的native AIO只对文件有效。

linux一般使用non-blocking IO提高IO并发度。当IO并发度很低时,non-blocking IO不一定比blocking IO更高效,因为后者完全由内核负责,而read/write这类系统调用已高度优化,效率显然高于一般得多个线程协作的non-blocking IO。但当IO并发度愈发提高时,blocking IO阻塞一个线程的弊端便显露出来:内核得不停地在线程间切换才能完成有效的工作,一个cpu core上可能只做了一点点事情,就马上又换成了另一个线程,cpu cache没得到充分利用,另外大量的线程会使得依赖thread-local加速的代码性能明显下降,如tcmalloc,一旦malloc变慢,程序整体性能往往也会随之下降。而non-blocking IO一般由少量event dispatching线程和一些运行用户逻辑的worker线程组成,这些线程往往会被复用(换句话说调度工作转移到了用户态),event dispatching和worker可以同时在不同的核运行(流水线化),内核不用频繁的切换就能完成有效的工作。线程总量也不用很多,所以对thread-local的使用也比较充分。这时候non-blocking IO就往往比blocking IO快了。不过non-blocking IO也有自己的问题,它需要调用更多系统调用,比如epoll_ctl,由于epoll实现为一棵红黑树,epoll_ctl并不是一个很快的操作,特别在多核环境下,依赖epoll_ctl的实现往往会面临棘手的扩展性问题。non-blocking需要更大的缓冲,否则就会触发更多的事件而影响效率。non-blocking还得解决不少多线程问题,代码比blocking复杂很多。

阻塞:当我们调用read、send、write等等系统调用API时,会把内核的缓存区里的数据拷贝到用户态的缓存区里,如果这个时候内核缓存区里没有数据,则会等待内核把数据准备好,此时,应用进程处于一种挂起状态。

非阻塞:当我们的应用程序调用write、send、read(所有的IO接口都是的),如果仅仅是从内核缓存区里把数据copy走,或者没有数据copy,此时也会直接返回,明显我们的用户进程并没有任何的等待,或者说处于挂起的状态,这种就是非阻塞。

默认创建的socket是阻塞的,但是可以调用下面这个函数设置为非阻塞:

非阻塞意味着在调用IO接口时,都不会发送等待,会立即返回。

同步

int function(xxxxx)

{

    char buf[1024] = {0};

    int size = read(fd, buf, bsize);

}

int  read(xxxxx)

{

xxxxxjj

kk

。。。

   memcpy(buf, kener_buffer, size);

}

内核把数据准备好了之后,它也是通过read返回的,read一返回,其实也就意味着数据是否准备好。

int callback(char* buffer, size)

{

    printf(buffer);

}

int gun(oooo)

{

char buffer[1024] = {0};

s_read(fd, callback, buffer, size);

}

内核:

int s_read(fd, callback, buffer, size)

{

    update_fd_set(fd, callback)   更新了fd的结构,也就是设置了一个回调函数

send_signal(sig);

}

int process_signal(sig)

{

    copy_data_from_disk_2_kener_buffer()

copy_data_from_kener_buffer_2_user_buffer();

callback(user_buffer, size);

}

异步,我调用read时,只是告诉你一个回调函数,并且read已经返回,但是此时并不代表数据准备好了,只有当内核调用了我们的callback才意味着数据已经准备好了。

信号,通知:

延时,IO的操作,同步和异步:

ssize_t read(int fd, void *buf, size_t count);

int aio_read(struct aiocb *aiocbp);

struct aiocb {

               /* The order of these fields is implementation-dependent */

               int             aio_fildes;     /* File descriptor */

               off_t           aio_offset;     /* File offset */

               volatile void  *aio_buf;        /* Location of buffer */

               size_t          aio_nbytes;     /* Length of transfer */

               int             aio_reqprio;    /* Request priority */

               struct sigevent aio_sigevent;   /* Notification method */

               int             aio_lio_opcode; /* Operation to be performed;

                                                  lio_listio() only */

               /* Various implementation-internal fields not shown */

           };

struct sigevent {

           int          sigev_notify;        /* Notification method */

           int          sigev_signo;        /* Notification signal */

           union sigval sigev_value;  /* Data passed with notification */

           void       (*sigev_notify_function) (union sigval); /* Function used for thread

                                                                                     notification (SIGEV_THREAD) */

           void        *sigev_notify_attributes;  /* Attributes for notification thread   

                                                                    (SIGEV_THREAD) */

           pid_t        sigev_notify_thread_id;  /* ID of thread to signal (SIGEV_THREAD_ID) */

       };

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java 进阶篇】HTML列表标签详解与示例

HTML(Hypertext Markup Language)是网页开发中的标准标记语言,用于构建网页内容。在网页中,常常需要展示信息的列表,例如商品列表、文章目录、任务清单等。HTML提供了多种列表标签,用于创建不同类型的列表。…

Python3操作文件系列(二):文件数据读写|二进制数据读写

Python3操作文件系列(一):判断文件|目录是否存在三种方式 Python3操作文件系列(二):文件数据读写|二进制数据读写 Python3数据文件读取与写入 一: 文件数据|二进制数据读写 import os"""Python3的open(file,mode"文件的操作模式")利用该函数可以对…

TensorFlow入门(九、张量及操作函数介绍)

在TensorFlow程序中,所有的数据都由tensor数据结构来代表。即使在计算图中,操作间传递的数据也是Tensor tensor在TensorFlow中并不是直接采用数组的形式,它只是对TensorFlow中计算结果的引用。也就是说在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程 一个…

【轻松玩转MacOS】常用软件篇

引言 在本篇文章中,我将介绍如何安装和使用一些常用的软件,如Safari浏览器、邮件、日历、地图等。让我们一起来看看吧! 一、Safari浏览器 Safari是MacOS自带的浏览器,具有简洁、快速、安全的特点。 以下是一些Safari浏览器的使…

蛋仔派对如何获得蛋币,蛋仔派对怎么切换账号

在蛋仔派对游戏中,蛋币是一种虚拟货币,用以购买游戏道具或提升游戏体验。以下是五种可能的获得蛋币的方式: 关注【娱乐天梯】,获取内部福利号 1. 完成挑战和任务:玩家可以通过完成不同类型的任务和挑战来获取蛋币。任务…

根据前序与中序遍历结果构造二叉树

文章前言:如果不知道什么是前序与中序的小白同学,作者推荐:二叉树的初步认识_加瓦不加班的博客-CSDN博客 思路: 先通过前序遍历结果定位根节点 再结合中序遍历结果切分左右子树 public class E09Leetcode105 {//1. pre-order 前…

练[BJDCTF2020]The mystery of ip

[BJDCTF2020]The mystery of ip 文章目录 [BJDCTF2020]The mystery of ip掌握知识解题思路关键paylaodsmarty可利用paylaod 掌握知识 ​ ssti里的php语言smarty模板注入 解题思路 访问题目链接,发现导航条的flag和hint两个吸引人的题目,先查看flag发现…

方法内改变形参引用影响实参问题详解

方法内修改形参引用问题详解 一、问题描述二、解答三、结论 一、问题描述 方法内型参指向新建的对象是否会影响实参的引用呢? 我们看下面的例子 由图中我们可以看到,在main函数创建了一个新的ArrayList对象,并调用了print函数实现了对该对象…

Maven 下载安装配置

Maven 下载安装配置 下载 maven maven 官网:https://maven.apache.org/ maven 下载页面:https://maven.apache.org/download.cgi 安装 maven 将下载的apache-maven.zip文件解压到安装目录 将加压后的apache-maven目录改名为maven maven 配置环…

基于粒子群优化算法、鲸鱼算法、改进的淘沙骆驼模型算法(PSO/SSA/tGSSA)的微电网优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

JavaScript系列从入门到精通系列第十九篇:JavaScript中的this关键字

文章目录 前言 一:什么是this 二:this的灵活妙用 前言 function fun(a,b){console.log(a b); }fun(1,2); 我们通过形参的形式往参数中添加了参数。浏览器也会默默的给我们传递一个参数过去,这个参数被称为this。传递的节点就是在调用函…

1984-2020年世界各国和地区ICRG政治经济金融风险指标数据

1984-2020年世界各国和地区ICRG政治经济金融风险指标数据 1、时间:1984-2020年、 2、指标: 主要包括政治风险、经济风险、金融风险,以及各个分指标数据, 具体指标: id、Country、year、Bureaucracy Quality (L)、…

Goby 漏洞发布|深信服下一代防火墙 loadfile.php 文件读取漏洞

漏洞名称:深信服下一代防火墙 loadfile.php 文件读取漏洞 English Name: Sangfor Next Generation Firewall loadfile.php file reading vulnerability CVSS core:7.5 影响资产数:281045 漏洞描述: 深信服下一代防火墙是一款…

由于找不到msvcp120.dll 无法继续执行怎么解决(最新方法分享)

在使用电脑的过程中,我们可能会遇到一些问题,比如丢失 msvcp120.dll 文件。这种情况会导致电脑运行出现问题,甚至无法正常启动。本文将详细介绍 msvcp120.dll 文件丢失对电脑的影响以及 msvcp120.dll 丢失的原因,并提供四种解决方…

jwt的基本介绍

说出我的悲惨故事给大家乐呵乐呵:公司刚来了一个实习生,老板让他写几个接口给我,我页面还没画完呢。他就把接口给我了,我敲开心,第一次见这么高效率的后端。但我很快就笑不出来了。他似乎不知道HTTP通信是无状态的。他…

Glide源码分析

一,Glide一次完整的加载流程 下面的流程图是一次完整的使用Glide加载图片流程,时序图 二,Glide重要的类图 三,Glide加载图片 流程图

C语言数据结构 1.1 初学数据结构

数据结构的基本概念 数据结构在学什么? 如何用程序代码把现实世界的问题信息化 如何用计算机高效处理信息从而创造价值 数据: 数据元素、数据项: 数据元素——描述一个个体 数据对象——数据元素之间具有同样的性质 同一个数据对象里的数…

3. 无重复字符的最长子串(枚举+滑动窗口)

目录 一、题目 二、代码 一、题目 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 二、代码 class Solution { public:int lengthOfLongestSubstring(string s) {int _MaxLength 0;int left 0, right 0;vector<int>hash(128, 0);//ASCII…

【iOS】——仿写计算器

文章目录 一、实现思路二、实现方法三、判错处理 一、实现思路 先搭建好MVC框架&#xff0c;接着在各个模块中实现各自的任务。首先要创建好UI界面&#xff0c;接着根据UI界面的元素来与数据进行互动&#xff0c;其中创建UI界面需要用到Masonry布局。 二、实现方法 在calcu…

糖基转移酶特异性 -bg

糖基转移酶特异性 大多数糖基转移酶对其供体和受体底物都具有高度的特异性&#xff0c;这导致Saul Roseman及其同事提出了“一种酶 - 一种连接”假说。人B血型α1-3半乳糖基转移酶就是这一概念的例证。该酶催化糖基化反应&#xff0c;其中半乳糖以α键添加到受体底物上半乳糖残…