Thanks to visit codestin.com
Credit goes to b34nk0.github.io

B34nK0

技术永不过期

0%

概要

在讲到IO时,我们会讲到阻塞/非阻塞,即BIO/NIO。那么AIO又是什么呢?

AIO即是Asynchronous IO,异步IO。这里的异步是关于用户读取数据来说是同步还是异步,回到BIO及NIO的场景:
BIO是创建一个IO句柄后,阻塞等待数据返回
NIO在创建完一个IO句柄后,不阻塞等待,而是去做其他事情,当有数据时,用户再进行数据读取,这个时候的读取动作是同步的,即如果缓冲区的数据没读取完,那么会一直读取。

比如select以及poll模型,这两种模型都是非阻塞IO,即当socket套接字创建完成之后,用户可以去做其他事情,当套接字有事件发生时,用户主动将内核数据同步拷贝到用户态。

AIO要优化的的即是,当内核数据有数据时,将内核态数据拷贝到用户态,并不需要用户做主动拷贝。

总结:

AIO将IO就绪事件监听和IO数据读取全部交由操作系统完成,也就不需要多路复用器去监听IO就绪事件、也不需要分配线程读取。
用户完全不需要关注IO过程,只需要关注拿到数据后的处理。

阅读全文 »

IOCP是由Window内核提供的网络通讯方式,其模式为Proactor

Epoll在ET(Edge Triggered)边缘触发模式下,Socket必须是非阻塞,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。
et模式,是当发生事件时进行一次通知,epool_wait获取该次事件后,如果用户不处理完缓冲区数据,使用epoll_wait是不会再获取到事件

LT(level Triggered)水平触发模式,支持非阻塞Socket及阻塞Socket,当一个文件句柄准备就绪时,内核会通知用户进行io操作,如果不进行任何操作时,内核还是会继续通知用户关于该句柄的事件。
通过epoll_wait获取到事件后,如果不处理完缓冲区数据,继续使用epoll_wait

epol会将用户空间与内核空间采用mmap技术映射为同一内存,减少内存拷贝

epoll相比于select/poll,在于epoll通过epoll_create创建时,内核开始准备存储句柄的空间,通过epoll_add添加句柄后,在epoll_wait开始等待事件通知,而select/poll每次都需要将句柄列表拷贝给内核。

当进程调用eopll_create()时,内核会创建一个eventpoll结构体,该结构体里采用红黑树来存储epoll_ctl添加进来的句柄,采用双向链表来记录就绪句柄。
当调用epoll_ctl的add操作添加一个句柄时,会把这个句柄存储到红黑树,同时注册一个回调函数给内核。回调函数的操作:当该句柄有中断时,内核调用回调将句柄放到链表

epoll_wait调用时,查看就绪列表有没数据即可,如果有则返回,如果没有则等待timeout后返回

概要

前文讲过MySQL的缓冲池buffer-pool,我们知道缓冲池是用于加速数据访问速度的。那么当发生写操作时,也需要更新缓冲池中缓存的数据,这也是在任何缓存架构体系下需要实现的机制。

阅读全文 »

概要

在应用系统分层结构中,我们经常会使用缓存(cache)来加速数据的访问。
同理的,MySQL作为一个存储系统,同样采用了缓存方式,而在MySQL中叫做缓冲池(buffer pool)机制,用来避免每次查询数据时进行磁盘IO。

阅读全文 »

打包前端项目部署时,运动前端无法加载样式的问题。原因是浏览器没有识别返回的css等文件。

阅读全文 »

@TOC

概要

本章将进行太坊虚拟机EVM的介绍、Solidity的三种数据存储位置的 区别以及不同情况下跨区域数据赋值的gas成本分析与利用等内容。

在前文讲变量、函数时,我们讲过EVM提供了四种数据结构来存储数据:Storage、Calldata、Stack、Memory。

阅读全文 »