异步io

高性能Server---Reactor模型

烈酒焚心 提交于 2020-02-24 13:49:04
无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮件用的Outlook,Foxmail等 你看视频用的优酷,土豆等 你写文档用的Office365,googleDoc,Evernote等 你浏览网页用的IE,Chrome等(B/S是特殊的C/S) ...... C/S架构的软件带来的一个明显的好处就是:只要有网络,你可以在任何地方干同一件事。 例如:你在家里使用Office365编写了文档。到了公司,只要打开编辑地址就可以看到在家里编写的文档,进行展示或者继续编辑。甚至在手机上进行阅读与编辑。不再需要U盘拷来拷去了。 C/S架构可以抽象为如下模型: C就是Client(客户端),上面的B是Browser(浏览器) S就是Server(服务器): 服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务 C/S架构之所以能够流行的一个主要原因就是网速的提高以及费用的降低,特别是无线网络速度的提高。试想在2G时代,大家最多就是看看文字网页,小说什么的。看图片,那简直就是奢侈!更别说看视频了! 网速的提高,使得越来越多的人使用网络,例如:优酷,微信都是上亿用户量,更别说天猫双11的瞬间访问量了!这就对服务器有很高的要求!能够快速处理海量的用户请求!那服务器如何能快速的处理用户的请求呢? 高性能服务器

JAVA BIO与NIO、AIO的区别

别说谁变了你拦得住时间么 提交于 2020-02-21 08:33:27
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。 二、NIO NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。 NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了

linux网络编程IO模型

为君一笑 提交于 2020-02-18 22:25:37
同步与异步 : 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成。 异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了,异步一般使用状态、通知和回调。 阻塞与非阻塞 阻塞是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。 非阻塞是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 五种IO模型 对于一次IO访问,数据会先被拷贝到内核的缓冲区中,然后才会从内核的缓冲区拷贝到应用程序的地址空间。需要经历两个阶段: 1. 准备数据 2. 将数据从内核缓冲区拷贝到进程地址空间 由于存在这两个阶段,Linux产生了下面五种IO模型。 阻塞IO 当用户进程调用了recvfrom调用时,内核进入IO的第一个阶段:准备数据(内核需要等待足够的数据再拷贝),这个过程需要等待,用户进程会被阻塞,等内核将数据准备好,然后拷贝到用户地址空间,内核返回结果,用户进程才从阻塞态进入就绪态。 Linux中,默认情况下所有的socket都是阻塞的。 非阻塞IO 当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。用户进程判断结果是一个error时,它就知道数据还没有准备好

NodeJS开发指南:读书笔记随谈之一

為{幸葍}努か 提交于 2020-02-18 21:28:52
这本书是市面上讲nodejs的一本不可多得的入门书,当初想学 nodejs的时候,找了半天,终于找到了这本好书,随后一发不可收拾,花了一两天的功夫就看玩了,感觉作者系统功力深厚,以下只是偶的一些摘要,权当心得体会。 书里说nodejs的核心特性是异步IO,事件驱动,任何IO操作都是由事件来驱动的。 说到异步IO又不得不来看看操作系统的 线程与阻塞 。 什么是阻塞呢, 线程在执行中遇到磁盘读写或者数据库通讯,网络通讯这种耗时比较多的时候,操作系统将会剥夺此线程的CPU资源,并暂停此线程,转而去执行别的线程,此线程调度方式称为阻塞 。当 I/O操作完成之后,操作系统又恢复此线程,让其继续执行,这种I/O模式通常称为同步I/O或者阻塞式I/O。 异步式IO或者非阻塞式I/O则针对所有操作采取不阻塞的方式,当线程遇到IO操作的时候,不会以阻塞的方式等待IO操作完成或者数据的返回,而是将IO操作发送给操作系统,然后接着执行下一个操作,当操作系统执行完IO操作之后,将是事件的方式通知执行IO的线程,线程会在特定的时候执行这个事件。这一切的前提条件就是,系统需要一个事件循环,以不断的去查询有没有未处理的事件,然后给预处理。 阻塞方式下,一个线程只能处理一个任务,要想提高系统的吞吐量,必须使用多线程 ;而非阻塞情况下,一个线程永远在执行计算,CPU使用率几乎100%,IO以事件的方式通知

BIO、NIO、AIO

可紊 提交于 2020-02-18 20:11:06
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。 二、NIO NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。 NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了

同步和异步,阻塞和非阻塞

不羁岁月 提交于 2020-02-17 01:39:13
A进程里面调用B函数 对B而言有没有通知、回调等就是同步、没有的话是异步 同步:调用时等到结果出来才返回,没有得到结果不会返回 异步:调用者不会立刻得到结果,而是在*调用*发出后,被调用者通过状态、通知、回调来通知调用者 对A而言,一直等是阻塞、不等是非阻塞 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态 阻塞:没有资源一直等待,线程处于阻塞状态 非阻塞:没有资源不会等待,线程处于非阻塞状态,会一直去检测有没有资源,有资源就去获取 如果一个或多个I/O条件满足(例如:输入已准备好被读,或者描述字可以承接更多输出的时候) 我们就能够被通知到,这样的能力被称为I/O复用 来个例子(出自网络): 老张爱喝茶,废话不说,煮开水。 出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。 1 老张把水壶放到火上,立等水开。(同步阻塞) 老张觉得自己有点傻 2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞) 老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。 3 老张把响水壶放到火上,立等水开。(异步阻塞) 老张觉得这样傻等意义不大 4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞) 老张觉得自己聪明了。 所谓同步异步,只是对于水壶而言。

Python中使用多进程来实现并行处理的方法小结

依然范特西╮ 提交于 2020-02-14 00:02:35
Python中使用多进程来实现并行处理的方法小结 进程和线程是计算机软件领域里很重要的概念,进程和线程有区别,也有着密切的联系,先来辨析一下这两个概念: 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 2.关系 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 3.区别 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。 简而言之,一个程序至少有一个进程

IO模型区别:

我与影子孤独终老i 提交于 2020-02-12 22:44:51
4.1.20 1)原生NIO的问题 (1)NIO的类库和API复杂,使用麻烦,需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等; (2)需要具备其它的额外技能: 熟悉java多线程编程,因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程非常熟悉, 才能编写出高质量的NIO程序; (3)开发工作量和难度都非常大,例如:客户端面临断线重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等; (4)JDK NIO bug: Epoll的bug导致Selector空轮询,导致cpu 100%,直到jdk 1.7该版本的问题依然存在,没有被根本解决; 2)Netty优点: (1)设计优雅,适用于各种传输类型的统一API阻塞和非阻塞Socket,基于灵活可扩展的事件模型,可以清晰的分离关注点,高度可定制 的线程模型,单线程,一个或多个线程池; (2)使用方便,详细记录的javadoc,用户指南和实例,没有其他依赖, jdk5-->netty 3.x jdk6-->netty 4.x就足够了; (3)高性能、吞吐量更高,延迟更低,加上那号资源消耗,最小化不必要的内存复制; (4)安全、完整的SSL/TLS和StartTLS支持; (5)社区活跃,不断更新,版本迭代周期短,发现的bug可以被及时修复,同时

面试中那些操作系统常考问题

限于喜欢 提交于 2020-02-12 19:43:47
1. 进程和线程以及其区别? 1、进程是系统进行资源调度和分配的的基本单位,是程序的一次动态执行过程,可实现操作系统的并发;线程是系统资源调度的在最小单位,可实现进程内部的并发; 2、一个程序至少包含一个进程,一个进程至少包含一个线程,线程是进程的子任务; 3、进程有自己独立的内存单元,线程没有,多个线程共享一个进程的内存; 2. 进程间通信的方式? 1、 管道 :内存中固定大小的缓冲区;一个管道只能实现半双工通信,要实现全双工通信需要两个管道;数据没读空不能写,没写满不能读; 优缺点:简单,能保证数据确实已经被取出了(因为没读空是不能写的),但效率低。如a进程给b进程传输数据,只能等到b取出数据后才能返回。因此,其不适合频繁通信的进程。 能否将进程的数据放在某个内存之后不用等待其他进程来取就返回呢? 2、 消息队列 :a进程给b进程传输数据,把消息放在对应的消息队列即可,无需等待。 优缺点:如果a进程发送的数据占用内存较大,且两进程通信特别频繁,消息队列就不合适了。因为此时大量时间花费在内存的拷贝上。 如何解决上述拷贝耗时问题呢? 3、 共享内存 :a和b进程各自拿出一块虚拟内存地址空间,然后映射到同一个物理内存中,实现内存共享机制。 但是上述共享内存机制存在多进程竞争内存的问题,如何解决呢? 4、 信号量 :本质是计数器,用来实现进程之间的互斥和同步。比如信号量初值为1

IO多路复用

天大地大妈咪最大 提交于 2020-02-12 12:03:13
一.IO多路复用 前面用协程实现IO阻塞自动切换,‘如何去实现事件驱动的情况下IO的自动阻塞的的切换,这个学名叫IO多路复用。 比如socketsew64hmay'y'yver,多个客户端连接,单线程下实现并发效果,这就叫多路复用. 同步io和异步IO,阻塞IO和非阻塞IO的区别? 二.IO模型的前戏准备   1.用户空间与内核空间     操作系统的核心是内核,独立于普通应用程序,可以访问受保护的内存空间也有访问底层硬件的权限     为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。     各个进程的使用,称为用户空间。   2.进程切换     为了控制进程的执行,内核必须有能力挂起正在CPU运行的程序,并恢复以前挂起的某个进程。进程切换由操作系统完成,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关.     把进程的pbc移入相应的队列,选择另一个进程执行,并更新pbc。   3.进程的阻塞     正在执行的进程,由于期待的某些事件未发生,入请求系统资源失败,等待某种操作的完成,新数据尚未到达或无新工作等。则由系统自动执行阻塞,使自己由运行状态变为阻塞状态。进程阻塞是进程自身的一种主动行为,因此只有处于运行状态的进程(获得cpu),才可能将其转换为阻塞状态。当进程进入阻塞状态