多路复用

Java NIO:浅析I/O模型

烈酒焚心 提交于 2020-03-19 02:32:43
转载: Java NIO:浅析I/O模型 一.什么是同步?什么是异步?   同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多。以下是我个人的理解:   同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;   异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待。   这就是同步和异步。举个简单的例子,假如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直至A执行完毕,B才能执行;而对于异步就是A和B可以并发地执行,B不必等待A执行完毕之后再执行,这样就不会由于A的执行导致整个任务的暂时等待。   如果还不理解,可以先看下面这2段代码: void fun1() { } void fun2() { } void function(){ fun1(); fun2() ..... ..... }   这段代码就是典型的同步,在方法function中,fun1在执行的过程中会导致后续的fun2无法执行,fun2必须等待fun1执行完毕才可以执行。   接着看下面这段代码: void fun1() { } void fun2() { } void function(){ new Thread()

Java NIO:浅析I/O模型

試著忘記壹切 提交于 2020-03-19 02:31:59
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群:618528494 我们一起学Java!   也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,最后介绍了两种和高性能IO设计相关的设计模式(Reactor和Proactor)。   以下是本文的目录大纲:   一.什么是同步?什么是异步?   二.什么是阻塞?什么是非阻塞?   三.什么是阻塞IO?什么是非阻塞IO?   四.什么是同步IO?什么是异步IO?   五.五种IO模型   六.两种高性能IO设计模式   若有不正之处,请多多谅解并欢迎批评指正。 一.什么是同步?什么是异步?   同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多。以下是我个人的理解:   同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;   异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行

Redis 单线程模型介绍

末鹿安然 提交于 2020-03-18 16:18:07
1. 理解单线程模型 redis 会将每个客户端都关联一个指令队列。客户端的指令通过队列来按顺序处理,先到先服务。 在一个客户端的指令队列中的指令是顺序执行的,但是多个指令队列中的指令是无法保证顺序的,例如执行完 client-0 的队列中的 command-0 后,接下去是执行哪个队列中的第一个指令是无法确定的,但是肯定不会同时执行两个指令。 redis 同样也会为每个客户端关联一个响应队列,通过响应队列来顺序地将指令的返回结果回复给客户端。 同样,一个响应队列中的消息可以顺序的回复给客户端,多个响应队列之间是无法保证顺序的。 所有的客户端的队列中的指令或者响应,redis 每次都只能处理一个,同一时间绝对不会处理超过一个指令或者响应。 2. 为什么redis使用单线程模型还能保证高性能? (1) 纯内存访问 redis 将所有数据放在内存中,内存的响应时长大约为 100 纳秒,这是 redis 的 QPS 过万的重要基础。 (2) 非阻塞式IO 什么是阻塞式 IO 当我们调用 Scoket 的读写方法,默认它们是阻塞的。 read() 方法要传递进去一个参数 n,表示读取这么多字节后再返回,如果没有读够 n 字节线程就会阻塞,直到新的数据到来或者连接关闭了, read 方法才可以返回,线程才能继续处理。 write() 方法会首先把数据写到系统内核为 Scoket

三分钟看Netty (2) 何为IO多路复用

大兔子大兔子 提交于 2020-03-16 12:01:03
某厂面试归来,发现自己落伍了!>>> 粗暴的解释 从JDK 1.0开始,用户就可以通过Socket进行网络编程。在JDK 1.4后,又提供了一种全新的编程方式。 在翻阅文档的时候,相信不少人对“多路复用”这个词感到陌生和费解。 对于程序员来说,代码是更容易理解。 BIO示例: ExecutorService executor = Excutors.newFixedThreadPollExecutor(100);//建立线程池 ServerSocket serverSocket = new ServerSocket();//新建Socket serverSocket.bind(8088);//监听8088端口 while(!Thread.currentThread.isInturrupted()){ Socket socket = serverSocket.accept();//循环等待新连接进入 executor.submit(new ConnectIOnHandler(socket));//放入线程池中处理读写任务 } class ConnectIOnHandler extends Thread{ private Socket socket; public ConnectIOnHandler(Socket socket){ this.socket = socket; }

《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高?

房东的猫 提交于 2020-03-15 20:52:16
原文: 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高? 能坚持别人不能坚持的,才能拥有别人未曾拥有的。 关注 编程大道 公众号,让我们一同坚持心中所想,一起成长!! 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高? 在这个系列里,我会整理一些面试题与大家分享,帮助年后和我一样想要在金三银四准备跳槽的同学。 我们一起巩固、突击面试官常问的一些面试题,加油!! 1、面试题 Redis和Memcached有什么区别? Redis的线程模型是什么? 为什么Redis是单线程的但是还可以支撑高并发? 2、面试官心理分析 问这个的时候就是问你Redis的原理了,看你是不是思考过,研究过。Redis最基本的一个内部原理和特点,就是Redis实际上是个单线程工作模型。你要是连这个都不知道,那后面在使用Redis的时候,如果出了问题岂不是什么都不知道,无从下手? 还有可能面试官会问问你Redis和Memcached的区别。不过说实话,近几年,面试官都不太喜欢这么问了。因为memcached是早些年各大互联网公司常用的缓存方案,但是现在近几年基本都是Redis,没什么公司用memcached了。 3、温馨提醒 如果你要是现在还不知道redis和memcached是啥

Java多线程:Linux多路复用,Java NIO与Netty简述

蓝咒 提交于 2020-03-15 10:11:48
JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: Winsock的select模型(感谢评论指正,仅Java NIO.2使用了Windows IOCP,由于Netty没有采用NIO.2此处不展开) Free BSD, OS X: kqueue 下面仅讲解Linux的多路复用。 Linux中的IO Linux的IO将所有外部设备都看作文件来操作,与外部设备的操作都可以看做文件操作,其读写都使用内核提供的系统调用,内核会返回一个文件描述符(fd, file descriptor),例如socket读写使用socketfd。描述符是一个索引,指向内核中一个结构体,应用程序对文件的读写通过描述符完成。 一个基本的IO,涉及两个系统对象:调用这个IO进程的对象,系统内核,read操作发生时流程如下: 通过read系统调用向内核发起读请求。 内核向硬件发送读指令,并等待读就绪。 内核把将要读取的数据复制到描述符所指向的内核缓存区中。 将数据从内核缓存区拷贝到用户进程空间中。 Linux I/O模型简介 阻塞I/O模型:最常用,所有文件操作都是阻塞的。 非阻塞I/O模型:缓冲区无数据则返回,一般采用轮询的方式做状态检查。 I/O复用模型:详细见下 信号驱动I/O:使用信号回调应用,内核通知用户何时开启一个I/O操作

[内功修神]Java NIO

微笑、不失礼 提交于 2020-03-07 23:46:48
个人博客文章地址 文章目录 1. 浅析I/O模型 1.1. 什么是同步?什么是异步? 1.2. 什么是阻塞?什么是非阻塞? 1.3. 什么是阻塞IO?什么是非阻塞IO? 1.4. 什么是同步IO?什么是异步IO? 1.5. 五种IO模型 1.5.1. 阻塞IO模型(BIO) 1.5.2. 非阻塞IO模型 1.5.3. 多路复用IO模型(NIO) 1.5.4. 信号驱动IO模型 1.5.5. 异步IO模型 (Asynchronous IO --- AIO) 1.6. 两种高性能IO设计模式 1.6.1. 传统的网络服务设计模式中,有两种比较经典的模式 1.6.2. Reactor模式 1.6.3. Proactor模式 2. Java NIO之Buffer(缓冲区) 3. Java NIO之通道(Channel) 4. 选择器(Selector) 1. 浅析I/O模型 1.1. 什么是同步?什么是异步? 同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行 会导致整个流程的暂时等待 ,这些事件没有办法并发地执行; 异步:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行 不会导致整个流程的暂时等待 。 1.2. 什么是阻塞?什么是非阻塞? 阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作

Java NIO 底层原理

旧城冷巷雨未停 提交于 2020-03-05 10:06:43
目录 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking IO) 1.4. 同步非阻塞NIO(None Blocking IO) 1.5. IO多路复用模型(I/O multiplexing) 1.6. 异步IO模型(asynchronous IO) 小结一下: 本文的知识,在《 Netty Zookeeper Redis 高并发实战 》 1.1. Java IO读写原理 无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。在原理上和处理流程上,都是一致的。区别在于参数的不同。 用户程序进行IO的读写,基本上会用到read&write两大系统调用。可能不同操作系统,名称不完全一样,但是功能是一样的。 先强调一个基础知识:read系统调用,并不是把数据直接从物理设备,读数据到内存。write系统调用,也不是直接把数据,写入到物理设备。 read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。这个两个系统调用,都不负责数据在内核缓冲区和磁盘之间的交换。底层的读写交换

Nginx 为什么这么快?

依然范特西╮ 提交于 2020-03-02 04:26:45
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 Nginx 为什么这么快! Nginx视频讲解,百度云盘自行下载: 链接:https : / / pan . baidu . com / s / 1 R9or4_QR27cteNmxakSjyQ 提取码: 613 g Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 Nginx 为什么这么快! Nginx 的进程模型 Nginx 服务器,正常运行过程中: 多进程:一个 Master 进程、多个 Worker 进程。 Master 进程:管理 Worker 进程。对外接口:接收外部的操作(信号);对内转发:根据外部的操作的不同,通过信号管理 Worker;监控:监控 Worker 进程的运行状态,Worker 进程异常终止后,自动重启 Worker 进程。 Worker 进程:所有 Worker 进程都是平等的。实际处理:网络请求,由 Worker 进程处理。Worker 进程数量:在 nginx.conf 中配置

socket网络编程实现并发服务器——IO多路复用

你。 提交于 2020-02-28 22:44:27
一 五种网络I/O模型 在Linux下进行网络编程时,服务器端编程经常需要构造高性能的IO模型,常见的IO模型有五种: (1)同步阻塞IO (2)同步非阻塞IO(Non-blocking IO) (3)IO多路复用(IO Multiplexing) :IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,使用select函数 可以避免同步非阻塞IO模型中轮询等待的问题,此外poll、epoll都是这种模型。 (4) 信号驱动IO(signal driven IO) (5)异步IO(Asynchronous IO) 各服务器源代码:https://gitee.com/constructorvirgil/lingyun_apue/tree/master/yangjianing 二 多路复用–select select()函数允许进程指示内核等待多个事件(文件描述符)中的任何一个发生,并只在有一个或多个事件发生或经历一段指定时 间后才唤醒它,然后接下来判断究竟是哪个文件描述符发生了事件并进行相应的处理。 # include <sys/select.h> # include <sys/time.h> struct timeval { long tv_sec ; //seconds long tv_usec ; //microseconds } ; FD_ZERO ( fd