poll

201712-2 游戏 Java

点点圈 提交于 2020-02-27 11:38:01
思路: 第一感觉有点像约瑟夫环。想到用队列解决比较好理解 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); Queue<Integer> children = new LinkedList<Integer>(); for(int i=1;i<=n;i++) { children.offer(i); } for(int j=1;children.size()!=1;j++) { int temp = children.poll();//每个数都出队 if(!(j%k==0 || j%10==k)) {//如果不出局就再入队 children.offer(temp); } } sc.close(); System.out.println(children.poll()); } } 普通队列: LinkedList支持队列的行为,并且实现了Queue接口,上转型为Queue。

并发程序设计3:多路IO复用技术(2)

你说的曾经没有我的故事 提交于 2020-02-26 13:09:08
  上一节( https://www.cnblogs.com/yuanwebpage/p/12362876.html )记录了多路IO复用的第一种方式select函数,以及其相应的缺点。本节记录多路IO复用的第二种方式epoll(在windows系统下叫IOCP)。 1. epoll相关函数   epoll函数克服了select函数的相关缺点,其优点如下: (1) 只需向OS注册一次文件描述符集合,不用每次循环传递; (2) epoll函数会将发生变化的文件描述符单独集中起来,这样每次遍历时只需要遍历发生变化的文件描述符。 (3) 相对于select同时监听的数量有限制,epoll监听数量一般远大于select,这对于多连接的服务器至关重要。 epoll用来集中通知变化的文件描述符结构体如下: struct epoll_event { __uint32_t events; //用来注册是什么事件需要关注,如输入/输出 epoll_data_t data; } typedef union epoll_data { void* ptr; int fd; //发生变化的文件描述符 __uint32_t u32; __uint64_t u64; } epoll_data_t; //可以看到,常用的为events, fd两个 epoll相关的函数总共有3个: #include <sys

Android系统启动-Init篇

扶醉桌前 提交于 2020-02-26 09:38:40
copy from : http://gityuan.com/2016/02/05/android-init/ 基于Android 6.0的源码剖析, 分析Android启动过程进程号为1的init进程的工作内容 system/core/init/ - init.cpp - init_parser.cpp - signal_handler.cpp 一、概述 init进程是Linux系统中用户空间的第一个进程,进程号固定为1。Kernel启动后,在用户空间启动init进程,并调用init中的main()方法执行init进程的职责。对于init进程的功能分为4部分: 解析并运行所有的init.rc相关文件 根据rc文件,生成相应的设备驱动节点 处理子进程的终止(signal方式) 提供属性服务的功能 接下来从main()方法说起。 1.1 main [-> init.cpp] static int epoll_fd = -1; int main(int argc, char** argv) { ... //设置文件属性0777 umask(0); //初始化内核log,位于节点/dev/kmsg【见小节1.2】 klog_init(); //设置输出的log级别 klog_set_level(KLOG_NOTICE_LEVEL); //创建一块共享的内存空间,用于属性服务【见小节5.1

kafka消费者参数配置

爱⌒轻易说出口 提交于 2020-02-26 07:23:05
参数默认设置 auto.commit.interval.ms = 5000 check.crcs = true client.id = connections.max.idle.ms = 540000 enable.auto.commit = false exclude.internal.topics = true fetch.max.wait.ms = 500 fetch.min.bytes = 1 group.id = bigdata heartbeat.interval.ms = 3000 interceptor.classes = [ ] internal.leave.group.on.close = true isolation.level = read_uncommitted key.deserializer = class org.apache.kafka.common.serialization.StringDeserializer # 一次fetch请求,从一个broker中取得的records最大大小 fetch.max.bytes = 52428800 # 一次fetch请求,从一个partition中取得的records最大大小 # 如果在从topic中第一个非空的partition取消息时,如果取到的第一个record的大小就超过这个配置时

Linux企业级开发技术(3)——epoll企业级开发之epoll模型

自作多情 提交于 2020-02-25 19:58:50
EPOLL事件有两种模型: Edge Triggered (ET) 边缘触发 只有数据到来,才触发,不管缓存区中是否还有数据。 Level Triggered (LT) 水平触发 只要有数据都会触发。 假如有这样一个例子: 1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符 2. 这个时候从管道的另一端被写入了2KB的数据 3. 调用epoll_wait(2),并且它会返回RFD,说明它已经准备好读取操作 4. 然后我们读取了1KB的数据 5. 调用epoll_wait(2)...... Edge Triggered 工作模式: 如果我们在第1步将RFD添加到epoll描述符的时候使用了EPOLLET标志,那么在第5步调用epoll_wait(2)之后将有可能会挂起,因为剩余的数据还存在于文件的输入缓冲区内,而且数据发出端还在等待一个针对已经发出数据的反馈信息。只有在监视的文件句柄上发生了某个事件的时候 ET 工作模式才会汇报事件。因此在第5步的时候,调用者可能会放弃等待仍在存在于文件输入缓冲区内的剩余数据。在上面的例子中,会有一个事件产生在RFD句柄上,因为在第2步执行了一个写操作,然后,事件将会在第3步被销毁。因为第4步的读取操作没有读空文件输入缓冲区内的数据,因此我们在第5步调用 epoll_wait(2)完成后,是否挂起是不确定的

Linux企业级开发技术(2)——epoll企业级开发之epoll接口

牧云@^-^@ 提交于 2020-02-25 19:57:22
epoll的接口非常简单,总共只有三个函数: 1、int epoll_create(intsize); 生成一个 Epoll 专用的文件描述符,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。 其实是申请一个内核空间,用来存放你想关注的 socket fd 上是否发生以及发生了什么事件。 size 就是你在这个 Epoll fd 上能关注的最大 socket fd 数,大小自定,只要内存足够。 2、int epoll_ctl(intepfd, int op, int fd, struct epoll_event *event); epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。它用来控制某个epoll 文件描述符上的事件:注册、修改、删除。其中参数 epfd 是 epoll_create() 创建 Epoll 专用的文件描述符。相当于 select 模型中的 FD_SET 和 FD_CLR 宏。 第一个参数是epoll

[C++] epoll server实例

时光毁灭记忆、已成空白 提交于 2020-02-25 19:56:43
// IO多路复用,事件驱动+非阻塞,实现一个线程完成对多个fd的监控和响应,提升CPU利用率 // epoll优点: // 1.select需要每次调用select时拷贝fd,epoll_ctl拷贝一次,epoll_wait就不需要重复拷贝 // 2.不需要像select遍历fd做检查,就绪的会被加入就绪list,遍历list完成处理 // 3.没有最大连接限制,与最大文件数目相关:cat /proc/sys/fs/file-max,与内存相关 // epoll实现相关: // 1.epoll_ctl,将fd的event使用RB tree保存,读写O(logN); // 2.一旦有event,内核负责添加到rdlist链表 // 3.epoll_wait检查链表看是否有事件,并进行处理 // Ref // https://www.cnblogs.com/lojunren/p/3856290.html // http://blog.chinaunix.net/uid-28541347-id-4273856.html // Question: // 是否需要每个event一个实例? #include <cstdlib> /* exit() */ #include <cstdio> /* perror(): 打印信息+发生错误的原因,可用于定位。 */ #include

IO复用解述

寵の児 提交于 2020-02-25 19:54:30
I/O多路复用 select select 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或指定时间后返回它。 select函数原型 #include <sys/select.h> #include <sys/time.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 返回值: 监听到有事件发生的文件描述符的个数,超时为0,错误为 -1. 1.当监视的相应的文件描述符集中满足条件时,比如说读文件描述符集中有数据到来时,内核(I/O)根据状态修改文件描述符集,并返回一个大于0的数。 2.当没有满足条件的文件描述符,且设置的timeval监控时间超时时,select函数会返回一个为0的值。 3.当select返回负值时,发生错误。 参数: maxfd: 是需要监视的最大的文件描述符值+1; rdset、wrset、exset: 是传入传出参数,fd_set类型,分别对应于需要检测的可读文件描述符的集合、可写文件描述符的集合、异常文件描述符的集合。若对其中任何参数条件不感兴趣,则可将其设为NULL。 timeout: 设置超时时间,指定select在返回前没有接收事件时应该等待的时间。 timeval 结构体 struct

I/O多路复用select/poll/epoll

Deadly 提交于 2020-02-25 19:52:32
前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个。因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll。现代操作系统中,线程数已经得到了极大的提升,如NPTL线程软件包可支持数十万的线程。 I/O多路复用 select select 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或指定时间后返回它。 select函数原型 #include <sys/select.h> #include <sys/time.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 返回值: 监听到有事件发生的文件描述符的个数,超时为0,错误为 -1. 1.当监视的相应的文件描述符集中满足条件时,比如说读文件描述符集中有数据到来时,内核(I/O)根据状态修改文件描述符集,并返回一个大于0的数。 2.当没有满足条件的文件描述符,且设置的timeval监控时间超时时,select函数会返回一个为0的值。 3.当select返回负值时,发生错误。 参数: maxfd: 是需要监视的最大的文件描述符值+1; rdset、wrset、exset: 是传入传出参数,fd_set类型

python中的select模块

本秂侑毒 提交于 2020-02-22 15:26:25
介绍: Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统) select方法: 进程指定内核监听哪些文件描述符(最多监听1024个fd)的哪些事件,当没有文件描述符事件发生时,进程被阻塞;当一个或者多个文件描述符事件发生时,进程被唤醒。 当我们调用select()时:   1 上下文切换转换为内核态   2 将fd从用户空间复制到内核空间   3 内核遍历所有fd,查看其对应事件是否发生   4 如果没发生,将进程阻塞,当设备驱动产生中断或者timeout时间后,将进程唤醒,再次进行遍历   5 返回遍历后的fd   6 将fd从内核空间复制到用户空间 fd:file descriptor 文件描述符 fd_r_list, fd_w_list, fd_e_list = select.select(rlist, wlist, xlist, [timeout]) 参数: 可接受四个参数(前三个必须)rlist: wait until ready for readingwlist: wait until ready for writingxlist: wait for an “exceptional condition