poll

非阻塞/异步(epoll) openssl

天大地大妈咪最大 提交于 2020-03-09 13:41:09
前段时间在自己的异步网络框架handy中添加openssl的支持,当时在网络上搜索了半天也没有找到很好的例子,后来自己慢慢的摸索,耗费不少时间,终于搞定。因此把相关的资料整理一下,并给出简单的例子,让后学者可以少费些力气。 同步的openssl调用网上已经有许多的例子,这里就不再详细介绍,大家也可以直接读源代码: 同步客户端:https://github.com/yedf/openssl-example/blob/master/sync-ssl-cli.cc 该例子连接www.openssl.com:443,发送一个Http请求,并打印结果中的前256个字符 同步服务器端:https://github.com/yedf/openssl-example/blob/master/sync-ssl-svr.cc 该例子监听本地的443端口,并返回一个简单http响应 下面详细介绍非阻塞调用 1. 初始化SSL库 SSL_load_error_strings (); SSL_library_init (); sslContext = SSL_CTX_new (SSLv23_method ()); //server端需要初始化证书与私钥 string cert = "server.pem", key = "server.pem"; r = SSL_CTX_use_certificate

Linux网络编程 - 子线程使用poll处理连接 I/O事件(高并发高性能进阶篇)

流过昼夜 提交于 2020-03-07 10:18:07
这一篇我们就将 acceptor 上的连接建立事件和已建立连接的 I/O 事件分离,形成所谓的 主 - 从 reactor 模式 。 主 - 从 reactor 模式 主 - 从这个模式的核心思想是,主反应堆线程只负责分发 Acceptor 连接建立,已连接套接字上的 I/O 事件交给 sub-reactor 负责分发。其中 sub-reactor 的数量,可以根据 CPU 的核数来灵活设置 。 多个反应堆线程同时在工作,这大大增强了 I/O 分发处理的效率,并且同一个套接字事件分发只会出现在一个反应堆线程中,这会大大减少并发处理的锁开销。 来解释一下这张图,我们的 主反应堆线程一直在感知连接建立的事件 ,如果有连接成功建立,主反应堆线程 通过 accept 方法获取已连接套接字 ,接下来会 按照一定的算法 选取一个从反应堆线程,并 把已连接套接字加入到选择好的从反应堆线程中 。 主反应堆线程唯一的工作,就是调用 accept 获取已连接套接字,以及将已连接套接字加入到从反应堆线程中。不过,这里还有一个小问题,主反应堆线程和从反应堆线程,是 两个不同的线程,如何把已连接套接字加入到另外一个线程中呢 ?这是高性能网络程序框架要解决的问题,在后面,将会给出这个问题的答案。 主 - 从 reactor+worker threads 模式 如果说主 - 从 reactor 模式解决了 I

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系统调用,是把数据从进程缓冲区复制到内核缓冲区。这个两个系统调用,都不负责数据在内核缓冲区和磁盘之间的交换。底层的读写交换

select、poll和epoll的区别和优缺点

陌路散爱 提交于 2020-03-03 18:03:03
原文地址: https://blog.csdn.net/BaiHuaXiu123/article/details/89948037 I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。select,poll,epoll都是IO多路复用的机制。但 select,poll,epoll本质上都是同步I/O ,因为他们都需要在读写事件就绪后自己负责进行读写, 也就是说这个读写过程是阻塞的 ,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。下来,分别谈谈。 select——> 原理概述: select 的核心功能是调用tcp文件系统的poll函数,不停的查询,如果没有想要的数据,主动执行一次调度(防止一直占用cpu),直到有一个连接有想要的消息为止。从这里可以看出select的执行方式基本就是不同的调用poll,直到有需要的消息为止。 缺点: 1、每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大; 2、同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大; 3、select支持的文件描述符数量太小了,默认是1024。 优点: 1、select的可移植性更好,在某些Unix系统上不支持poll()。 2

Python学习第九天

拟墨画扇 提交于 2020-03-03 08:29:20
生产者-消费者模型: 看下面的例子哦: 1 import threading,queue 2 import time 3 def consumer(n): 4 while True: 5 print("\033[32;1mconsumer [%s]\033[0m get task: %s"%(n,q.get())) 6 time.sleep(1) 7 q.task_done() 8 def producer(n): 9 count=1 10 while True: 11 print('producer [%s] produced a new task: %s'%(n,count)) 12 q.put(count) 13 count += 1 14 q.join()#queue is emtpy 15 print('all tasks has been cosumed by consumers...') 16 q=queue.Queue() 17 c1=threading.Thread(target=consumer,args=[1,]) 18 c2=threading.Thread(target=consumer,args=[2,]) 19 c3=threading.Thread(target=consumer,args=[3,]) 20 21 p=threading.Thread

KafkaConsumer 长时间地在poll(long )方法中阻塞

大憨熊 提交于 2020-03-03 02:16:36
一,问题描述 搭建的用来测试的单节点Kafka集群(Zookeeper和Kafka Broker都在 同一台Ubuntu 上),在命令行下使用: ./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic topicForTest 创建了一个3个分区的Topic如下:(Topic名称为 topicForTest) 使用 Console producer/consumer都能够正常地向topicForTest发送和接收消息: bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topicForTest bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topicForTest --from-beginning 但是在自己的windows 机器的开发环境下,使用kafka client JAVA API (0.10版本)中的KafkaConsumer 却无法接收消息,表现为:在poll()方法中阻塞了。 更具体一点地,是在:org.apache.kafka

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 中配置

Java面试题之 Queue 中 poll()和 remove()有什么区别?

前提是你 提交于 2020-02-28 13:46:22
队列是一个典型的先进先出(FIFO)的容器。即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序是相同的。 队列的两种实现方式: 1、offer()和add()的区别 add()和offer()都是向队列中添加一个元素。但是如果想在一个满的队列中加入一个新元素,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false。可以据此在程序中进行有效的判断! 2、peek()和element()的区别 peek()和element()都将在不移除的情况下返回队头,但是peek()方法在队列为空时返回null,调用element()方法会抛出NoSuchElementException异常。 3、poll()和remove()的区别 poll()和remove()都将移除并且返回对头,但是在poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。 笔者在此总结,希望对大家有所帮助! ———————————————— 版权声明:本文为CSDN博主「马小_菜」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_41026809/article/details/90647569

JUC并发编程(十)-阻塞队列BlockingQueue

老子叫甜甜 提交于 2020-02-28 10:39:13
10、阻塞队列:BlockingQueue 10.1. 阻塞队列概念 队列:排队 特性:先进先出 FIFO 阻塞:必须要阻塞、不得不阻塞,原理如下: 10.2. 接口架构图 jdk官方文档如下: 阻塞队列:与List、Set类似,都是继承Collection. 10.3.ArrayBlockingQueue API 的使用 1、ArrayBlockingQueue 是一个有限的 blocking queue ,由数组支持。 2、这个队列排列元素FIFO(先进先出)。 3、队列的 头部 是队列中最长时间的元素。队列的 尾部 是队列中最短时间的元素。 4、新元素插入队列的尾部,队列检索操作获取队列头部的元素。 5、这是一个经典的“有界缓冲区”,其中固定大小的数组保存由生产者插入的元素并由消费者提取。 6、队列的固定大小创建后,容量无法更改。 ​ ArrayBlockingQueue 以插入方法、移除方法、检查队首三个方法为单元,形成了四组API,分别是抛出异常组、返回特殊值组、超时退出组、一直阻塞组,如下: ​ 方法 抛出异常 返回特殊值 超时退出 一直阻塞 插入(存) add offer offer(e, timeout, unit) put () 移除(取) remove poll poll(timeout, unit) take() 检查队首 element peek - - ​