本文讨论的背景是Linux环境下的network IO,同步IO和异步IO,阻塞IO和非阻塞IO分别是什么 概念说明 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进程的阻塞 - 文件描述符 - 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接…
一.关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题. 1. 为什么redis能以单工作线程处理高达几万的并发请求? 2. 什么是I/O多路复用?为什么redis.nginx.nodeJS以及netty等以高性能著称的服务器其底层都利用了I/O多路复用技术? 3. 非阻塞I/O为什么会流行起来,在许多场景下取代了传统的阻塞I/O? 4. 非阻塞I/O真的是银弹吗?为什么即使在为海量用户提…
最近越来越认为,在讲解技术相关问题时,大白话固然很重要,通俗易懂,让人有想读下去的欲望.但几乎所有的事,都有两面性,在看到其带来好处时,不妨想想是否也引入了不好的地方. 例如在博客中,过于大白话的语言的确会让你阅读起来更加顺畅,也更容易理解.但这都是其他人理解,已经咀嚼过了的,人家是已经完全理解了,你从这些信息中大概可能会观察不到全貌.所以,适当的白话是很好的,但这个度得控制一下. 接下来切入正文. 相信大家经常看到这个问题: BIO.NIO 和 AIO 有什么区别? 看到这个问题,可能你脑海中…
基本概念 我们之前编写的套接字程序都是阻塞式的,其实这也是默认的形式.现在我们需要明确一些概念: 用户空间和内核空间 首先要明确,用户启动的应用程序在系统中以一个进程的形式存在,而无论对于网络数据还是磁盘数据通常来讲这个进程都无法直接访问,必须由内核把数据复制到用户空间也就是进程所在的内存空间里这个进程才可以访问.上图结合了网络请求和磁盘数据,用户发起一个HTTP请求,请求一个HTML页面,这个页面就在磁盘上,其实就是把这个HTML页面发送给用户,用户的浏览器解析HTML语言就显示了页面.用户请…
以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时候,会经历两个过程:磁盘到内核空间(这块消耗性能,下面简称内核数据准备),内核空间拷贝到用户空间(下面简称用户空间拷贝). 内核数据准备这部分是由DMA芯片实现的,而用户空间拷贝的实现则是由CPU实现的,后者非常快,能到1G以上,所以,所谓的阻塞基本是内核数据准备的过程,这块消耗时间.为啥呢?简单的…
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 小的不才,在查了一部分资料后,愿试着以通俗易懂的方式解释下这几个名词.如有不足之处,还望告知. 在弄清楚上面的几个问题之前,我们首先得明白什么是同步,异步,阻塞,非阻塞,只有这几个单个概念理解清楚了,然后在组合理解起来,就相对比较容易了. 1,…
引言 在进行I/O学习的时候,阻塞和非阻塞,同步和异步这几个概念常常被提及,但是很多人对这几个概念一直很模糊.要想学好Netty,这几个概念必须要掌握清楚. 同步和异步 同步与异步的区别在于,异步基于通知,当程序执行完毕后后,会有一个通知的机制来告知你程序执行完毕:而同步则没有,只能通过自己调用API去查询程序是否已经执行完毕. 阻塞与非阻塞 阻塞与非阻塞的却别在于,阻塞不能执行其他代码,必须等待结果返回.而非阻塞则表示在等待执行结果返回的过程中可以去做别的事情. 举例 同步阻塞:隔壁老王买了一…
四种 IO 模型:       首先需要明确,IO发生在 用户进程 与 操作系统 之间.可以是客户端IO也可以是服务器端IO. 阻塞IO(blocking IO):     在linux中,默认情况下所有socket都是blocking:kernel和用户都在阻塞等待数据.   非阻塞IO(non-blocking):        用户程序重复调用系统调用 recvfrom ,等待 return OK信号. polling轮询         为什么没有Block:用户进程发出read请求后…
“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了. 换句话说,就是由*调用者*主动等待这个*调用*的结果. 而异步则是相反,*调用*在发出之后,这…
IO 概念 一个基本的 IO,它会涉及到两个系统对象,一个是调用这个 IO 的进程对象,另一个就是系统内核 (kernel).当一个 read 操作发生时,它会经历两个阶段: 通过 read 系统调用想内核发起读请求. 内核向硬件发送读指令,并等待读就绪. 内核把将要读取的数据复制到描述符所指向的内核缓存区中. 将数据从内核缓存区拷贝到用户进程空间中. IO 模型对比 从等待数据和数据复制这两个时间段,指出了不同 I/O 模型的区别 类比餐厅吃饭 看了几篇文章,为了加深理解,我做了文字排版上的优…
举一个去书店买书的例子吧: (同步)阻塞: 你去书店买书,到柜台告诉店员,需要买一本APUE,然后一直在柜台等.(阻塞) 店员拿到书以后交给你. (同步)非阻塞: 你去书店买书,到柜台告诉店员A,需要买一本APUE.但是你不在柜台等了,而是出去遛弯.(非阻塞) 隔几分钟回去柜台问一次:“我的书来了没有?”“我的书来了没有?” 终于有一次书来了,你就拿着书走了 (同步)I/O多路复用(poll/select/epoll): 去书店买书,告诉店员自己要买APUE,然后拿到一个号.每个顾客都是这样.…
0 - 同步&异步 同步和异步关注的是消息通信机制. 0.1 - 同步 由“调用者”主动等待这个“调用”结果.即是,发出一个“调用”时,在没有得到结果之前,该“调用”不返回,一旦调用返回,则得到返回值. 0.2 - 异步 “调用者”不主动等待“调用”结果,而是“调用”结束之后主动通知“调用者”(通过状态.通知或者回调函数等各种形式). 0.3 - 同步&异步-举例 例如,我打电话去询问教务处老师有没有开设”高性能计算导论“这门课.如果是同步机制,则老师会说,”稍等一下,我查一下“,然后我就…
5种IO模型 1.阻塞式I/O模型 阻塞I/O(blocking I/O)模型,进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误才返回.进程从调用recvfrom开始到它返回的整段时间内是被阻塞的. 2.非阻塞式I/O模型 当一个应用进程像这样对一个非阻塞描述字循环调用recvfrom时,我们称之为轮询(polling).应用进程持续轮询内核,以查看某个操作是否就绪. 3.I/O多路复用(事件驱动)模型 4.信号驱动式I/O(SIGIO) 5.异步I/O…
1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事.   例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个…
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当一个异步过程调用发出后,调用者不能立刻得到结果.实际处理这个调…
一.今日内容 1.网络IO的两个阶段 waitdata copydata 2阻塞IO模型 之前写的都是阻塞 无论多线程 多进程 还是 进程池 线程池 3.非阻塞IO模型 在非阻塞IO中 需要不断循环询问操作是否有需要处理的数据 这一来 对应程序而言 效率确实高 但是操作系统而言 你的程序就像一个病毒 CPU江被你强行霸占 当你的TCP程序 没有锁 没有数据接收 没有数据发送时 就是在做无用循环 浪费系统资源 4.多路复用 5.异步IO模型 二.waitdata 和 copydata 1)等待数据…
这两篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/historyasamirror/article/details/5778378 http://blog.csdn.net/hguisu/article/details/7453390 很多人对阻塞 / 非阻塞, 同步 / 异步 的概念理解的不深入,搞不清楚非阻塞和异步IO的区别,笼统的认为非阻塞IO就是异步IO.其实区别很大,编程模型完全不同. 阻塞 / 非阻塞描述的是函数,指访问某个函数时是否会阻塞线程(b…
最近一直在看跟IO模型有关的内容,感觉差不多理解了,于是开始写这一篇总结博客.针对的操作系统为UNIX/LINUX,大致的体系结构如上图. 操作系统中的客体主要包括了:文件,Socket和进程,本文主要讨论与IO相关的文件和Socket. IO主要分为文件IO和网络IO,文件IO也就是对文件的读写,网络IO是利用socket进行数据传输,socket是对TCP/IP协议的封装而提供的编程接口. 首先区分一下同步.异步.阻塞式.非阻塞式这些概念,参考知乎上解答: 1.同步.异步是针对消息通信机制而…
网络IO模型及分类 网络IO模型是一个经常被提到的问题,不同的书或者博客说法可能都不一样,所以没必要死抠字眼,关键在于理解. Socket连接 不管是什么模型,所使用的socket连接都是一样的. 以下是一个典型的应用服务器上的连接情况.客户的各种设备通过Http协议与Tomcat进程交互,Tomcat需要访问Redis服务器,它与Redis服务器也建了好几个连接.虽然客户端与Tomcat建的是短连接,很快就会断开,Tomcat与Redis是长连接,但是它们本质上都是一样的. 建立一个Socke…
I/O( INPUT OUTPUT),包括文件I/O.网络I/O. 计算机世界里的速度鄙视: 内存读数据:纳秒级别. 千兆网卡读数据:微妙级别.1微秒=1000纳秒,网卡比内存慢了千倍. 磁盘读数据:毫秒级别.1毫秒=10万纳秒 ,硬盘比内存慢了10万倍. CPU一个时钟周期1纳秒上下,内存算是比较接近CPU的,其他都等不起. CPU 处理数据的速度远大于I/O准备数据的速度 . 任何编程语言都会遇到这种CPU处理速度和I/O速度不匹配的问题! 在网络编程中如何进行网络I/O优化:怎么高效地利用…
本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现.Http短连接主要用于从服务器读取各种持久化信息:比如用户信息.聊天历史记录.好友列表等等,长连接则是用于实时的聊天消息或指令的接收和发送. 作为IM系统中不可或缺的技术,Http短连的重要性无可替代,但Http作为传统互联网信…
原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ ThreadLocal解决什么问题 由于 ThreadLocal 支持范型,如 ThreadLocal< StringBuilder >,为表述方便,后文用 变量 代表 ThreadLocal 本身,而用 实例 代表具体类型(如 StringBuidler )的实例. 不恰当的理解 写这篇文章的一个原…
1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长连接为中心:身份鉴权.数据收发.文件传送等等).但当前主流的IM(尤其新一代的移动端IM)中,都是“长”(指TCP或UDP长连接).“短”(是指Http短连接)相结合的方式. 一个现代的移动端IM“长”.“短”连接配合内容大致如下: 1)短连接用途1:前置HTTP的SSO单点接口来实现身份认证: 2…
1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我们可以称为即时消息:即消息从一端发出后(消息发送者)立即就可以达到另一端(消息接收者),这种方式的具体实现就是平时最常见的IM聊天消息: 2)另一种称为延迟消息:即消息从某端发出后,首先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端. 在上述“消息传递方式2)”中所指的这个容器…
条目二十八<正确理解由reverse_iterator的base()成员函数所产生的iterator的用法> 迭代器的种类一共有四种,上面已经说过了.这里就不再次写出来. 这一个条目主要是reserce_iterator和iterator的转换.可以使用base()函数来把前者转换为后者. 比如在拥有reserve_iterator,但需要用到插入,删除成员函数,那么这两个是不接受reserve_iterator作为参数的,所以需要转换为iterator再进行下一步的插入和删除元素. 以上代码…
在web开发中,不可避免遇到要计算元素大小以及位置的问题,解决这类问题的方法是利用DOM提供的一些API结合兼容性处理来,所有内容大概分3篇左右的文章的来说明.本文作为第一篇,介绍DOM提供的与尺寸大小相关的DOM属性,提供一些兼容性处理的方法,并结合常见的场景说明如何正确运用这些属性. 1. 正确理解offsetWidth.clientWidth.scrollWidth及相应的height属性 假设某一个元素的横纵向滚动条都拖动到最末端,则offsetWidth.clientWidth.scr…
我们编写程序时,无论怎样小心谨慎,犯错总是在所难免的.这些错误通常会迷惑PHP编译器.如果开发人员无法了解编译器报错信息的含义,那么这些错误信息不仅毫无用处,还会常常让人感到沮丧. 编译PHP脚本时,PHP编译器会尽其所能报告它遇到的第一个问题.这样就产生一个问题:只有当错误出现时,PHP才能将它识别出来(本文后面对此 问题进行了详细描述).正是由于这个缘故,编译器指出出错的那行,从表面上看来可能语法正确无误,或者可能是根本就不存在的一行! 更好地理解错误信息可以大大节省确定并改正错误内容所花费…
ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求.…
ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求. 原子性整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节.事务在执行过程中发生错误,会被回滚(R…
前言:好久不见,博客园. 最近在学习研究regex,其中有个特迷惑自己的知识点是分隔符 ( word boundary) [\b] (注:为了方便,后文都以[]来包含字符,并不是reg规则里面的[] ),后面查询咨询了解,明白了,记录下来,希望帮到恰好迷惑的你. [\b] 官方解释是:Match a word boundary,匹配一个单词边界,也就是单词和空格之间的位置,它本身不匹配任何字符.一般它有三种情况,如下: 在一个 \w 字符之前,eg:  \bend 在一个 \w 字符之后,eg:…