poll

HTTP手记

安稳与你 提交于 2019-12-20 20:50:32
---------------------tcp/ip模型和osi模型--------------------- tcp/ip协议模型 osi模型 应用层      应用层         表示层         会话层 传输层      传输层 网络层      网络层 链路层      数据链路层         物理层 ---------------------交换机--------------------- 1、网络交换机介绍: 网络交换机(又称“网络交换器”),是一个扩大网络的器材,能为子网络中提供更多的连接端口,以便连接更多的计算机 具有性能价格比高、高度灵活、相对简单、易于实现等特点 以太网技术已成为当今最重要的一种局域网组网技术,网络交换机也就成为了最普及的交换机 2、交换机的作用: 转发过滤:当一个数据帧的目的地址在MAC地址表中有映射时,它被转发到连接目的节点的端口而不是所有端口(如该数据帧为广播帧则转发至所有端口) 学习功能:以太网交换机了解每一端口相连设备的MAC地址,并将地址同相应的端口映射起来存放在交换机缓存中的MAC地址表中 ---------------------路由器--------------------- 1. 路由器简介 路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络

nginx架构分析

烈酒焚心 提交于 2019-12-18 01:39:06
Nginx模块化 #Nginx基于模块化设计,每个模块是一个功能实现,分布式开发,团队协作 #核心模块、标准HTTP模块、可选HTTP模块、邮件模块、第三方模块 #编译后的源码目录objs/ngx_modules.c # https://coding.net/u/aminglinux/p/nginx/git/blob/master/4z/module.md Nginx的web请求机制 #并行处理:多进程、多线程、异步 # https://coding.net/u/aminglinux/p/nginx/git/blob/master/4z/IO.md Nginx事件驱动模型 # https://coding.net/u/aminglinux/p/nginx/git/blob/master/4z/event.md 设计架构概览 #Nginx基于模块化设计、基于事件驱动模型处理请求、主进程和工作进程 # https://coding.net/u/aminglinux/p/nginx/git/blob/master/4z/jg.md Nginx模块化结构 Nginx涉及到的模块分为核心模块、标准HTTP模块、可选HTTP模块、邮件服务模块以及第三方模块等五大类。 核心模块 核心模块是指Nginx服务器正常运行时必不可少的模块,它们提供了Nginx最基本最核心的服务,如进程管理、权限控制

基于epoll的聊天室程序

风格不统一 提交于 2019-12-17 03:11:37
epoll相对于poll和select这两个多路复用的I/O模型更加的高效。epoll的函数很简单,麻烦的地方在于水平触发和边沿触发。 用张图来说明下 ET(边沿)只是在状态反转时触发,比如从不可读到可读。而LT(水平)就是如果可读,就会一直触发。所以在使用ET的时候要做一些额外的处理,比如可读的,一直把缓冲区读完,进入不可读状态,下次来数据才会触发。 下面贴出代码,只是一个简单的练习的例子 socketheads.h C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #ifndef SOCKETHEADS_H #define SOCKETHEADS_H #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <fcntl.h> #include <netinet/in.h> #include <arpa/inet.h> #endif //SOCKETHEADS_H zepoll.h C++ 1 2 3 4 5 6 7 8 9 10 11 12

一文看懂java io系统

帅比萌擦擦* 提交于 2019-12-17 00:20:19
学习java IO系统,重点是学会IO模型,了解了各种IO模型之后就可以更好的理解java IO Java IO 是一套Java用来读写数据(输入和输出)的API。大部分程序都要处理一些输入,并由输入产生一些输出。Java为此提供了java.io包 java中io系统可以分为Bio,Nio,Aio三种io模型 关于Bio,我们需要知道什么是同步阻塞IO模型,Bio操作的对象:流,以及如何使用Bio进行网络编程,使用Bio进行网络编程的问题 关于Nio,我们需要知道什么是同步非阻塞IO模型,什么是多路复用Io模型,以及Nio中的Buffer,Channel,Selector的概念,以及如何使用Nio进行网络编程 关于Aio,我们需要知道什么是异步非阻塞IO模型,Aio可以使用几种方式实现异步操作,以及如何使用Aio进行网络编程 BIO BIO是同步阻塞IO,JDK1.4之前只有这一个IO模型,BIO操作的对象是流,一个线程只能处理一个流的IO请求,如果想要同时处理多个流就需要使用多线程 流包括字符流和字节流,流从概念上来说是一个连续的数据流。当程序需要读数据的时候就需要使用输入流读取数据,当需要往外写数据的时候就需要输出流 阻塞IO模型 在Linux中,当应用进程调用 recvfrom 方法调用数据的时候,如果内核没有把数据准备好不会立刻返回,而是会经历等待数据准备就绪

802.11常见帧

落爺英雄遲暮 提交于 2019-12-16 00:04:49
1、802.11 帧类型 802.11协议有规定三种类型的帧,分别时管理帧,控制帧和数据帧。 (1)管理帧 有线通信和无线通信的最大区别是什么?那就是有没有用网线!有线客户端如果想连接某个网络,只要将网线接到对应的路由器上就好了,但是无线客户端想完成这个“接入”动作应该怎么办呢?这就需要管理帧的帮忙, 管理帧的主要工作就是管理无线客户端的接入和断开 。有线连接并不太需要管理帧的帮忙,插拔网线的动作也很简单,但是无线接入却复杂得多。 管理帧是不带上层payload信息的,但是它携带一些固定大小的Information felds和可变大小的Information elements (IE) 。 管理帧主要包括下面这些种类: Association request Association response Reassociation request Reassociation response Probe request Probe response Beacon Announcement traffic indication message (ATIM) Disassociation Authentication Deauthentication Action (2)控制帧 有线通信和无线通信另外一个区别是传输媒介的稳定性,无线因为传输媒介是电磁波,容易受到各种干而变得不稳定

线程间之event

怎甘沉沦 提交于 2019-12-14 17:33:08
eventfd()创建了一个“eventfd对象”, 通过它能够实现用户态程序间。 此对象包含了一个被内核所维护的计数(uint64_t), 初始值由initval来决定。 eventfd在内核里的核心是一个计数器counter,它是一个uint64_t的整形变量counter,初始值为initval。 1.read(eventfd_read) 消费者需要对信号量进行down操作时,调用read从eventfd读即可。read返回值: 如果当前counter > 0,那么read返回counter值,并重置counter为0; 如果当前counter等于0,那么read 1)阻塞直到counter大于0;2)如果设置了NONBLOCK,那么返回-1,并设置errno为EAGAIN。 可以看到,eventfd实现的资源是一次性消耗品,只允许一次read。 2.write(eventfd_write) 生产者需要执行up操作时,调用write写一个64bit的整数value到eventfd即可。write返回值: counter最大能存储的值是 0xffff ffff ffff fffe(以max表示此值),那么write尝试将value加到counter上,如果结果超过max,那么write一直阻塞直到有read操作发生,或者返回-1并设置errno为EAGAIN。

epoll详解

无人久伴 提交于 2019-12-14 12:03:41
什么是 epoll ? epoll是 Linux 下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集 合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符 集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的电平触发 (Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。 Linux 2.6内核中对/dev/epoll设备的访问的封装(system epoll)。 这个使我们开发网络应用程序更加简单,并且更加高效。 为什么要使用epoll? 同样,我们在linux系统下,影响效率的依然是I/O操作,linux提供给我们select/poll/epoll等多路复用I/O方式 (kqueue暂时没研究过) ,为什么我们对epoll情有独钟呢?原因如下: 1.文件描述符数量的对比。 epoll并没有fd(文件描述符)的上限,它只跟系统内存有关

select、poll、epoll优缺点

别等时光非礼了梦想. 提交于 2019-12-10 21:14:48
select、poll、epoll都是IO多路复用。 I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 select的缺点 每次调用select,都需要将进程加入到所有fd的等待队列,每次唤醒都需要从每个队列中移除; 每次都需要将fd集合从用户态传递给内核;进程被唤醒后,程序并不知道哪些fd就绪,还需要再比遍历一次; 因为遍历开销较大,默认只能监视1024个fd poll poll 和 select相似,只是fd集合的方式不同,但是解决了select文件描述符的最大上限 epoll(eventpoll) 功能分离, 将等待队列和阻塞进程分开。 create-创建结构体(eventpoll),ctl-增删fd, wait-唤醒 新增就绪队列 内核维护一个就绪列表,引用就绪的fd,就能避免一次遍历 epoll工作方式:创建eventpoll, 通过ctl增删fd,若fd就绪后,调用回到函数将就绪fd放入就绪列表中,并唤醒在wait中进入睡眠的进程(select 和poll

LinkedBlockingQueue与ArrayBlockingQueue

北城余情 提交于 2019-12-10 18:38:49
阻塞队列与普通的队列(LinkedList/ArrayList)相比,支持在向队列中添加元素时,队列的长度已满阻塞当前添加线程,直到队列未满或者等待超时;从队列中获取元素时,队列中元素为空 ,会将获取元素的线程阻塞,直到队列中存在元素 或者等待超时。 在JUC包中常用的阻塞队列包含ArrayBlockingQueue/LinkedBlockingQueue/LinkedBlockingDeque等,从结构来看都继承了AbstractQueue实现了BlockingQueue接口(LinkedBlockingDeque是双向阻塞队列,实现的是BlockingDeque接口),在BlockingQueue接口中定义了几个供子类实现的接口,可以分为3部分,puts操作、takes操作、其他操作。 puts操作 add(E e) : 添加成功返回true,失败抛IllegalStateException异常 offer(E e) : 成功返回 true,如果此队列已满,则返回 false(如果添加了时间参数,且队列已满也会阻塞) put(E e) :将元素插入此队列的尾部,如果该队列已满,则一直阻塞 takes操作 remove(Object o) :移除指定元素,成功返回true,失败返回false poll() : 获取并移除此队列的头元素,若队列为空,则返回 null

BlockingQueue

故事扮演 提交于 2019-12-10 18:33:45
1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列提供了四种处理方法: 方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e) put(e) offer(e,time,unit) 移除方法 remove() poll() take() poll(time,unit) 检查方法 element() peek() 不可用 不可用 异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException("Queue full")异常。当队列为空时,从队列里获取元素时会抛出NoSuchElementException异常 。 返回特殊值:插入方法会返回是否成功,成功则返回true。移除方法,则是从队列里拿出一个元素,如果没有则返回null 一直阻塞:当阻塞队列满时,如果生产者线程往队列里put元素,队列会一直阻塞生产者线程,直到拿到数据,或者响应中断退出。当队列空时,消费者线程试图从队列里take元素