poll

Netty-6、Netty 线程模型

不羁的心 提交于 2019-12-09 11:03:05
1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发、高吞吐量的环境中进行I/O处理。 I/O多路复用机制都依赖于一个事件分发器,事件分离器把接收到的客户事件分发到不同的事件处理器中,如下图: 1.1 select,poll,epoll 在操作系统级别select,poll,epoll是3个常用的I/O多路复用机制,简单了解一下将有助于我们理解Proactor和Reactor。 1.1.1 select select的原理如下: 用户程序发起读操作后,将阻塞查询读数据是否可用,直到内核准备好数据后,用户程序才会真正的读取数据。 poll与select的原理相似,用户程序都要阻塞查询事件是否就绪,但poll没有最大文件描述符的限制。 1.1.2 epoll epoll是select和poll的改进,原理图如下: epoll使用“事件”的方式通知用户程序数据就绪,并且使用内存拷贝的方式使用户程序直接读取内核准备好的数据,不用再读取数据 1.2 Proactor Proactor是一个异步I/O的多路复用模型,原理图如下: 用户发起IO操作到事件分离器 事件分离器通知操作系统进行IO操作 操作系统将数据存放到数据缓存区 操作系统通知分发器IO完成 分离器将事件分发至相应的事件处理器

Netty学习三:线程模型

本秂侑毒 提交于 2019-12-09 11:02:45
1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发、高吞吐量的环境中进行I/O处理。 I/O多路复用机制都依赖于一个事件分发器,事件分离器把接收到的客户事件分发到不同的事件处理器中,如下图: 1.1 select,poll,epoll 在操作系统级别select,poll,epoll是3个常用的I/O多路复用机制,简单了解一下将有助于我们理解Proactor和Reactor。 1.1.1 select select的原理如下: 用户程序发起读操作后,将阻塞查询读数据是否可用,直到内核准备好数据后,用户程序才会真正的读取数据。 poll与select的原理相似,用户程序都要阻塞查询事件是否就绪,但poll没有最大文件描述符的限制。 1.1.2 epoll epoll是select和poll的改进,原理图如下: epoll使用“事件”的方式通知用户程序数据就绪,并且使用内存拷贝的方式使用户程序直接读取内核准备好的数据,不用再读取数据 1.2 Proactor Proactor是一个异步I/O的多路复用模型,原理图如下: 用户发起IO操作到事件分离器 事件分离器通知操作系统进行IO操作 操作系统将数据存放到数据缓存区 操作系统通知分发器IO完成 分离器将事件分发至相应的事件处理器

几个例子,看懂poll和epoll

筅森魡賤 提交于 2019-12-07 15:39:59
1. poll的例子 #include <stdio.h> #include <sys/eventfd.h> #include <poll.h> int main() { uint64_t value = 2; int event_fd = eventfd(0, EFD_NONBLOCK); struct pollfd pfd; int status = 0; uint64_t check_value = 0; printf("event_fd=%d\n", event_fd); write(event_fd, &value, sizeof(value)); write(event_fd, &value, sizeof(value)); write(event_fd, &value, sizeof(value)); read(event_fd, &check_value, sizeof(check_value)); printf("read, value=%ld\n", check_value); int ret = fork(); if (ret < 0) { printf("fork error\n"); } if (ret == 0) { pfd.fd = event_fd; pfd.events = POLLIN; printf("__FILE: %s, __LINE:

Kafka消费者——API开发

。_饼干妹妹 提交于 2019-12-07 15:28:35
目录 消费者客户端 订阅主题 订阅分区 取消订阅 订阅总结 消息消费 poll ConsumerRecord 位移提交 自动提交 手动提交 控制和关闭消费 指定位移消费 再均衡 消费者拦截器 消费者客户端 消费步骤: 1、配置消费者客户端参数并创建相应的消费者实例。 2、订阅主题。 3、拉取消息并消费 4、提交消费位移 5、关闭消费者实例 Properties prop = new Properties(); prop.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.25.10:9092"); prop.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); prop.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class.getName()); prop.put(ConsumerConfig.GROUP_ID_CONFIG,"test1"); KafkaConsumer consumer = new KafkaConsumer(prop); try{ consumer.subscribe(Arrays

随便看的面试题

▼魔方 西西 提交于 2019-12-07 09:53:59
关于epoll和select的区别: 1、epoll和select都是I/O多路复用的技术,都可以实时监听多个I/O事件的状态 2、epoll比select效率更高,主要是基于其操作系统支持的 I/O,事件通知机制,而 select 是基于轮询机制 3、select 能并行支持 I/O 比较小,且无法修改 从innodb索引结构分析,为什么索引key的长度不能过长? key 太长会导致一个页当中能够存放的 key 的数目变少,间接导致 索引树的页数目变多,索引层次增加,从而影响整体查询变更的效 率。 来源: https://www.cnblogs.com/notchangeworld/p/12000713.html

集合类源码(五)Collection之BlockingQueue(LinkedTransferQueue, PriorityBlockingQueue, SynchronousQueue)

╄→尐↘猪︶ㄣ 提交于 2019-12-06 18:47:29
LinkedTransferQueue 功能 全名 public class LinkedTransferQueue<E> extends AbstractQueue<E> implements TransferQueue<E>, Serializable 简述 基于链表的的无界队列。队列的头是某个生产者在队列中停留时间最长的元素。队列的尾部是某个生产者在队列中时间最短的元素。 注意,与大多数集合不同,size方法不是一个常量时间操作。由于这些队列的异步性,确定当前元素的数量需要遍历元素,因此如果在遍历期间修改此集合,可能会报告不准确的结果。 此外,批量操作addAll、removeAll、retainAll、containsAll、equals和toArray不能保证自动执行。例如,与addAll操作并发操作的迭代器可能只查看一些添加的元素。 从JDK1.7被引入,它既有SynchronousQueue的“交换”特性(还比SynchronousQueue多了用于存储的空间),也具有阻塞队列的“阻塞”特性(由于不加锁,性能比LinkedBlockingQueue要好得多) 方法 // 返回该队列中元素的Spliterator。返回的spliterator是弱一致的。 public Spliterator<E> spliterator() // 将指定的元素插入到此队列的末尾

我对网络IO的理解

回眸只為那壹抹淺笑 提交于 2019-12-06 13:47:17
Unix/Linux系统下IO主要分为磁盘IO,网络IO,我今天主要说一下对网络IO的理解,网络IO主要是socket套接字的读(read)、写(write),socket在Linux系统被抽象为流(stream)。 网络IO模型 在Unix/Linux系统下,IO分为两个不同阶段: 等待数据准备好 从内核向进程复制数据 阻塞式I/O 阻塞式I/O(blocking I/O)是最简单的一种,默认情况下,socket 套接字的系统调用都是阻塞的,我以recv/recvfrom 理解一下网络IO的模型。当应用层的系统调用recv/recvfrom时,开启Linux的系统调用,开始准备数据,然后将数据从内核态复制到用户态,然后通知应用程序获取数据,整个过程都是阻塞的。两个阶段都会被阻塞。 阻塞I/O模型 图片来源于《Unix网络编程卷1》 阻塞I/O下开发的后台服务,一般都是通过多进程或者线程取出来请求,但是开辟进程或者线程是非常消耗系统资源的,当大量请求时,因为需要开辟更多的进程或者线程有可能将系统资源耗尽,因此这种模式不适合高并发的系统。 非阻塞式I/O 非阻塞IO(non-blocking I/O)在调用后,内核马上返回给进程,如果数据没有准备好,就返回一个error ,进程可以先去干其他事情,一会再次调用,直到数据准备好为止,循环往返的系统调用的过程称为轮询(pool)

神秘的40毫秒延迟与 TCP_NODELAY

牧云@^-^@ 提交于 2019-12-06 09:03:24
最近的业余时间几乎全部献给 breeze 这个多年前挖 下的大坑—— 一个异步 HTTP Server。努力没有白费,项目已经逐渐成型了, 基本的框架已经有了,一个静态 文件模块也已经实现了。 写 HTTP Server,不可免俗地一定要用 ab 跑一下性能,结果一跑不打紧,出现了一个困扰了我好几天的问题:神秘的 40ms 延迟。 Table of Contents 1 现象 2 背后的原因 3 为什么只有 Write-Write-Read 时才会出问题 4 解决方案 4.1 优化协议 4.2 开启TCP_NODELAY 1 现象 现象是这样的,首先看我用 ab 不加 -k 选项的结果: [~/dev/personal/breeze]$ /usr/sbin/ab -c 1 -n 10 http://127.0.0.1:8000/styles/shThemeRDark.css This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking

详解IO多路复用中的select, poll, epoll

荒凉一梦 提交于 2019-12-06 08:33:30
select, poll, epoll 都是I/O多路复用的具体的实现,这三个是不同时期先后顺序出来的,也是为了改进性能。 I/O多路复用这个概念被提出来以后, select是第一个实现 (1983 左右在BSD里面实现的)。 1.select 被实现以后,暴露出了很多问题。 select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。 select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是哪个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍,这就消耗了很多无谓开销。 select 只能监视1024个链接, linux 定义在头文件中的,参见FD_SETSIZE。 select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,这个sock不用,要收回。这时候这个select 不支持的,如果你强制关掉这个sock,结果不可预测的。 2.poll的诞生:于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如: poll 去掉了1024个链接的限制,于是要多少链接呢, 自己随意设置。 poll 从设计上来说,可以不再修改传入数组,当然这个要看你的平台了。

一步一步创建聊天程序2-利用epoll来创建简单的聊天室

放肆的年华 提交于 2019-12-06 06:27:01
如图,这个是看视频时,最后的作业,除了客户端未使用select实现外,其它的要求都有简单实现。 服务端代码如下: #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <errno.h> #include <sys/epoll.h> #include <netinet/in.h> #include <unistd.h> #include<netinet/tcp.h> #define MAX_LISTEN 10 #define EPOLL_SIZE 100 struct message { int target_id; char buf[100]; }; struct user_password { char username[100]; char password[100]; }; //设置保活参数 keepalive_time保活时间,keepalive_intvl保活间隔,keepalive_probes保活探测数。 int set_keepalive(int sockfd,int keepalive_time, int keepalive_intvl, int keepalive_probes) { int optval; socklen_t