谈I/O模型

一个IO操作涉及两个系统对象:

  • 调用这个IO的用户Process/Thread
  • 系统内核 - System Kernel

一个具体的Read操作包括两个阶段:

  • 内核等待数据准备就绪:Waiting for the data to be ready
  • 从内核向用户进程/线程拷贝数据:Copying the data from the Kernel to the Process/Thread

只有在同步的情况下才会有“阻塞”和“非阻塞”之说,异步情况,必须是非阻塞的!

同步 vs 异步

同步与异步是针对应用程序与内核的交互而言的,进程/线程触发IO操作后:

  • 同步过程:进程/线程等待IO操作完成(阻塞)或轮询查看IO操作是否完成(非阻塞);
  • 异步过程:直接返回,进程/线程做自己的事情,IO操作交给内核处理、完成后内核通知进程/线程;

同步 Synchronous

A Synchronous-I/O operation causes the requesting process to be blocked until that I/O operation completes.

 串行,无条件等待。

异步 Asynchronous

An Asynchronous-I/O operation does not cause the requesting process to be blocked.

 并发,

阻塞 vs 非阻塞

关于阻塞/非阻塞,在网络编程中通常应用在是不是需要等待数据就绪。

阻塞 Blocking

 挂起等待,

非阻塞 Non-Blocking

 轮询检查等待,

参考:怎样理解阻塞非阻塞与同步异步的区别? - 知乎

I/O模型

阻塞I/O(Blocking I/O)

非阻塞I/O(Non-Blocking I/O)

I/O多路复用(I/O Multiplexing)

信号驱动I/O(Signal Driven I/O)

异步I/O(Asynchronous I/O)

推荐书籍:

  • 《UNIX网络编程 - 卷1》:第六章

参考:

时间: 2024-10-14 00:33:23

谈I/O模型的相关文章

浅谈CSS盒子模型

[摘要]盒子模型是CSS中的一个重要概念,虽然CSS中没有盒子这个单独的属性对象,但它却是CSS中无处不在的一个重要组成部分.掌握盒子模型的原理和使用方法可以极大地丰富HTML元素的表现效果,同时对于整个HTML文档的布局也会产生很大的帮助和促进.本文尝试在介绍CSS盒子模型基本概念和组成元素属性的基础上,结合个人学习经验对其在网页制作中的实际应用谈一谈自己浅显的观点和看法.[关键词]盒子模型:表现效果:网页布局: CSS是Cascading Style Sheets的缩写,中文意思是层叠样式表

浅谈Java内存模型

Java内存模型虽说是一个老生常谈的问题 ,也是大厂面试中绕不过的,甚至初级面试也会问到.但是真正要理解起来,还是相当困难,主要这个东西看不见,摸不着.网上已经有大量的博客,但是人家的终究是人家的,自己也要好好的去理解,去消化.今天我也来班门弄斧,说下Java内存模型. 说到Java内存模型,不得不说到 计算机硬件方面的知识. 计算机硬件体系 我们都知道CPU 和 内存是计算机中比较核心的两个东西,它们之间会频繁的交互,随着CPU发展越来越快,内存的读写的速度远远不如CPU的处理速度,所以CPU

浅谈css盒模型

在我们网页上的每一个元素,一个按钮,一段文本,一张图片等等,浏览器都将它们当做一个“盒子”看待,并把这样的盒子称为盒模型(box model).使用Chrome的右键>审查元素对某个网页上的元素,就可得到类似这样一张图,这就是盒模型的缩影了. 组成盒模型主要是这几个要素:外边的外边距margin.中间的边框border.里边的内边距padding,再往里就是包围元素实体的宽.高.在padding这个块里面,包括实体元素的宽高,就是背景background横行的地方,一般我们所添加的背景图片.背景

Java NIO1:浅谈I/O模型

一.什么是同步?什么是异步? 同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多.以下是我个人的理解: 同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行: 异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待. 这就是同步和异步.举个简单的例子,假如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直

由volatile关键字谈Java内存模型

volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景 1. 内存模型的相关概念 当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再

浅谈生产者消费者模型与读写者模型的区别

多线程编程在操作系统中是十分重要的. 而在线程中处理同步与互斥问题又是至关重要的.生产者-消费者模型,(也称有限缓冲问题)是一个多线程同步问题的经典例子.下来我们对其进行简单分析. 生产者-->生成一定量的数据放到缓冲区中,然后重复此过程: 消费者-->在缓冲区消耗这些数据. 而生产者-消费者之间存在三种关系,即 生产者与生产者之间是互斥关系: 消费者与消费者之间是互斥关系: 生产者与消费者之间是同步与互斥关系. 下面的程序演示了一个生产者-消费者的例子,生产者生产一个结构体串在链表的表头上,

[JS学习笔记]浅谈Javascript事件模型

DOM0级事件模型 element.on[type] = function(){} 兼容性:全部支持 lay1 lay2 lay3 e.target:直接触发事件的元素[IE8及以下不支持taget属性,使用e.srcElement代替] e.srcElement:直接触发事件的元素[FF不支持srcElement属性,使用e.target代替] e.currentTarget:被间接触发的元素[IE8及以下不支持currentTarget属性,使用this代替] this:同e.current

浅谈并发性模型的测试策略

目前市面上的不少软件都会用到多方登录或者编辑的并发性问题,针对并发性问题有若干种方法,主要有以下几种: 保守方式:这种并发性模型在数据上加了锁.如果一个用户已经打开了一条记录,那么在允许编辑的环境中,系统就会拒绝来自其他用户的读取数据请求.适用于出现一个以上用户同时编辑相同数据的情况.(缺点:当一个用户已经打开某个数据时,其他用户就不能访问它了,这样导致了系统在使用上有些不方便.由于系统需要管理这些记录锁,所以模型在实现上也会有一定的复杂度.) 开放方式:总是允许用户读取数据,甚至还可能允许更新

浅谈双亲委派模型

类加载器:根据指定全限定名称将class文件加载到JVM内存,转为Class对象. 站在JVM的角度来看,只存在两种类加载器: 1.启动类加载器(Bootstrap ClassLoader):由C++语言实现(针对HotSpot),负责将存放在<JAVA_HOME>\lib目录或-Xbootclasspath参数指定的路径中的类库加载到内存中. 2.其他类加载器:由Java语言实现,继承自抽象类ClassLoader.如: 一.扩展类加载器(Extension ClassLoader):负责加