异步io

BIO/NIO/AIO的区分

故事扮演 提交于 2019-11-29 01:43:26
BIO:同步阻塞IO(平常说的IO指的是BIO) NIO:同步非阻塞IO AIO:异步非阻塞IO io操作分为两部分,发起io请求,和io数据读写。 阻塞、非阻塞主要是针对线程发起io请求后,是否立即返回来定义的,立即返回称为非阻塞io,否则称为阻塞io。 同步、异步主要针对io数据读写来定义的,读写数据过程中不阻塞线程称为异步io,否则,称为同步io。 一、BIO 线程发起io请求后,一直阻塞(阻塞io),直到数据就绪后,用户线程将数据写入socket空间,或从socket空间读取数据(同步)。 JDK5之前, JDK的IO模式只有BIO(同步阻塞)。 问题:因为阻塞的存在, 需对每个请求开启一个线程. 过多的线程切换影响操作系统性能。 解决:使用线程池, 处理不过来的放入队列, 再处理不过来的会触发其他机制。 问题::超过线程池数量的请求需要等待。 1. 客户端 public class Client { final static String ADDRESS = "127.0.0.1"; final static int PORT = 8765; public static void main(String[] args) throws IOException { Socket socket = null; BufferedReader in = null;

java io

倾然丶 夕夏残阳落幕 提交于 2019-11-29 00:24:11
设计模式 装饰者模式 类别 同步阻塞IO(BIO) BIO是一个连接一个线程。 传统的同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作。连接成功后,双方通过输入和输出流进行同步阻塞式通信。 该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈1:1的正比关系,Java中的线程也是比较宝贵的系统资源,线程数量快速膨胀后,系统的性能将急剧下降,随着访问量的继续增大,系统最终就 死-掉-了 。 同步非阻塞IO(NIO) NIO提供了与传统BIO模型中的Socket和ServerSocket相对应的SocketChannel和ServerSocketChannel两种不同的套接字 通道 实现。两种通道都支持阻塞和非阻塞两种模式。 对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用NIO的非阻塞模式来开发。 缓冲区 java.nio.Buffer 是一个抽象类。 在NIO库中,所有数据都是用缓冲区处理的,缓冲区包含一些要写入或者读出的数据。 缓冲区实际上是一个数组,并提供了对数据结构化访问以及维护读写位置等信息。如:ByteBuffer、CharBuffer、 ShortBuffer、IntBuffer

二十一、进程管理之一基本概念

强颜欢笑 提交于 2019-11-29 00:05:54
硬件 调用、调用接口、库调用 线性内存地址空间、物理内存地址空间、线性地址、物理地址 交换内存:缺页异常 进程内存结构 常驻内存集、虚拟内存集 进程、进程元数据、结构体、任务结构体、链表 进程类型、状态(read,runing,sleep,stopped,zombie) 可中断睡眠、不可中断睡眠 创建子进程的过程 进程优先级、进程调度、进程队列 过期队列:抢占式多任务、系统调用IO IO模型、系统调用IO等待过程 进程间通信:IPC 硬件 编程接口 : syscall(系统调用) libcall(库调用) 硬件 库调用 : 用户空间发生(独立的模块或系统调用的二次封装) 系统调用 :内核空间发生,特权指令 **如果非内核将要运行特权指令,会发起软中断,CPU会通知内核,除非内核有漏洞,特权指令一定是由内核执行。 调用 :载入事先编写好的功能模块 模块 :由别人提供,调用此模块完成功能 调用接口 :得到模块的途径     例如:想要卖一双鞋(功能),到鞋店去买(提供功能的位置),鞋店的大门(调用接口)。 内核的功能   驱动硬件、用户及权限管理、网络管理、程序包管理、文件系统管理、进程管理、安全管理 网络管理 : ip,ifcfg,nmcli配置ip,route,dns。配置文件配置ip,dns,route,图形工具配置 文件系统管理 : 块组、bitmap,GDT,Supper

06文件操作

为君一笑 提交于 2019-11-28 23:08:44
文件操作 文件操作函数在内容中使用的 ZwXXXX 系列,下面是函数一览表 函数名 功能 ZwCreateFile 打开文件 ZwReadFile 读取文件内容 ZwWriteFile 将数据写入文件 ZwQueryInformationFile 查询文件信息 ZwDeleteFile 删除文件 ZwClose 关闭文件 打开/创建文件 在内核中打开文件比较繁琐, 该函数使用了比较多的API: 要打开的文件路径必须设置在 OBJECT_ATTRIBUTES 对象中, 此外, OBJECT_ATTRIBUTES 结构体的对象属性一般可以设置为 OBJ_CASE_INSENSITIVE (不区分大小写) , OBJ_KERNEL_HANDLE( 内核句柄) NTSTATUS createFile(wchar_t * filepath,/*文件路径*/ ULONG access, /*访问权限,: GENERIC_READ, GENERIC_XXX*/ ULONG share,/*文件共享方式: FILE_SHARE_XXX*/ ULONG openModel,/* 打开方式: FILE_OPEN_IF,FILE_CREATE ...*/ BOOLEAN isDir,/*是否为目录*/ HANDLE * hFile /*成功打开的文件句柄*/){​ NTSTATUS status =

day37_步入百万年薪的第三十七天——阻塞、非阻塞、同步、异步

不问归期 提交于 2019-11-28 22:57:15
day37 阻塞、非阻塞、同步、异步 进程运行的三个状态:运行、就绪、阻塞 执行的角度 阻塞:程序运行时,遇到了IO,程序挂起,CPU被切走 非阻塞:程序没有遇到IO,程序遇到IO但是我通过某种手段,让CPU强行运行我的程序 提交任务的角度 同步:提交一个任务,自任务开始运行直到此任务结束(可能有IO),返回一个返回值之后,我再提交下一个任务 异步:一次提交多个任务,然后直接执行下一行代码,等待任务结果 返回结果如何回收? 案例:给三个老师发布任务: 同步:先告知第一个老师完成写书的任务,我从原地等待,等他两天之后完成了,告诉完事了,我再发布下一个任务。。。。 异步:直接将三个任务告知三个老师,我就忙我的,直到三个老师完成之后, 告知我 同步调用、异步调用 同步调用 from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor import time import random import os def task(i): print(f"{os.getpid()} 开始了") time.sleep(random.randint(1, 3)) print(f"{os.getpid()} 结束了") return i if __name__ == '__main__': pool =

磁盘测试工具FIO

与世无争的帅哥 提交于 2019-11-28 22:30:16
目前主流的第三方IO测试工具有fio、iometer和Orion,这三种工具各有千秋。 fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。 如下是在Linux系统上采用fio工具来对SAN存储进行的IO测试。 1、安装fio 在fio官网下载fio-2.1.10.tar文件,解压后./configure、make、make install之后就可以使用fio了。 2、fio参数解释 FIO工具使用方法: 参数说明: filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。 direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。 rw=randwrite 测试随机写的I/O rw=randrw 测试随机写和读的I/O bs=16k 单次io的块文件大小为16k bsrange=512-2048 同上,提定数据块的大小范围 size=5g 本次的测试文件大小为5g,以每次4k的io进行测试。 numjobs=30 本次的测试线程为30. runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。 ioengine=psync io引擎使用pync方式

EOS区块链究竟有几个线程

核能气质少年 提交于 2019-11-28 21:55:00
一 nodeos工作线程 nodeso节点的工作线程包括:一个主线程,一个信号处理线程和两个线程池。 主线程:main函数启动线程,该线程执行完程序初始化工作后,会调用app().io_service.run(), 启动boost::asio::io_service的异步io服务,通过异步io方式完成节点块生产,交易处理等主要业务工作。 信号处理线程:子线程,通过异步io服务,接收系统信号并处理。 线程池,线程池启动的工作线程数可通过启动参数配置。 controller线程池: 异步执行块block_state创建,块中交易验证时的交易解签名计算。 生产者插件线程池:负责异步执行交易解签名计算。 ​ 采用默认配置(每个线程池2个工作线程),nodeos节点总线程数是6个,通过pstree命令可查看: ​ nodeos有一个主线程pid=32385,该主线程有5个子线程,32386~32390。 二 主线程 ​ main函数执行线程:main函数最后调用app().exec(),启动io_service服务。 app()是application实例,application中定义了io_service对象io_serv: ```c++ class application {... std::shared_ptr<boost::asio::io_service> io_serv; }

网络IO

霸气de小男生 提交于 2019-11-28 21:36:27
大并发服务器框架 大并发服务器设计目标 高性能(High Performance). 要求编写出来的服务器能够最大限度发挥机器性能, 使得机器在满负荷的情况下能够处理尽可能多的并发请求, 对于大量并发请求能够及时快速做出响应 高可用(High Availability). 要求服务器7*24小时服务, 故障转移 伸缩性(Scalability). 服务器具有良好框架, 分层设计, 业务分离, 并且能够进行灵活部署 分布式: 负载均衡 分布式存储 分布式计算 C/S结构: 任何网络系统都可以抽象为C/S结构(客户端, 服务端) 网络I/O+服务器高性能编程技术+数据库 超出数据库连接数: 数据库并发连接数10个, 应用服务器这边有1000个并发请求, 将会有990个请求失败. 解决办法: 增加一个中间层DAL(数据库访问控制层), 一个队列进行排队 超出时限: 数据库并发连接数10个, 数据库1秒钟之内最能处理1000个请求, 应用服务器这边有10000个并发请求, 会出现0-10秒的等待. 如果系统规定响应时间5秒, 则该系统不能处理10000个并发请求, 这时数据库并发能力5000, 数据出现瓶颈. 数据库瓶颈缓解 提高数据库的并发能力 队列+连接池(DAL) 主要逻辑挪到应用服务器处理, 数据库只做辅助的业务处理. 在数据库上进行计算能力或处理处理逻辑不如操作系统效率高. --

NIO

百般思念 提交于 2019-11-28 20:17:41
1.BIO,NIO,AIO的区别 BIO(Blocking IO):阻塞式IO。字节流和字符流,输入输出流。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低, 容易成为应用性能瓶颈。 InputStream/OutputStream Reader/Writer RandomAccessFile NIO(NonBlocking IO):非阻塞式IO。Buffer,FileChannel,SocketChannel,selector可以构建多路复用的、同步非阻塞 IO 程序, 同时提供了更接近操作系统底层高性能的数据操作方式。 AIO:(Asynchronous IO)是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,异步 IO 是基于事件和回调机制实现的,也就是应用操 作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。 2.Buffer:缓冲区,position,limit,capacity.三个变量的含义。 Buffer不能实例化,可以使用allocate()或者directAllocate()分配空间 filp()切换为写模式position为0,limit为数据大小, clear()清空数据,position切换为0,limit为capacity compact()压缩数据,把未读的数据放到前面 3

线程和进程(二)

放肆的年华 提交于 2019-11-28 19:33:17
线程和进程的优缺点: 首先,要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker。 如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker。 如果用多线程实现Master-Worker,主线程就是Master,其他线程就是Worker。 多进程模式最大的优点就是稳定性高,因为一个子进程崩溃了,不会影响主进程和其他子进程。(当然主进程挂了所有进程就全挂了,但是Master进程只负责分配任务,挂掉的概率低)著名的Apache最早就是采用多进程模式。 多进程模式的缺点是创建进程的代价大,在Unix/Linux系统下,用 fork 调用还行,在Windows下创建进程开销巨大。另外,操作系统能同时运行的进程数也是有限的,在内存和CPU的限制下,如果有几千个进程同时运行,操作系统连调度都会成问题。 多线程模式通常比多进程快一点,但是也快不到哪去,而且,多线程模式致命的缺点就是任何一个线程挂掉都可能直接造成整个进程崩溃,因为所有线程共享进程的内存。在Windows上,如果一个线程执行的代码出了问题,你经常可以看到这样的提示:“该程序执行了非法操作,即将关闭”,其实往往是某个线程出了问题,但是操作系统会强制结束整个进程。 在Windows下