epoll

select函数参数及其使用

人走茶凉 提交于 2020-08-09 01:42:49
Select在Socket编程中还是比较重要的,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。   Select的函数格式(Unix系统下的伯克利socket编程,和windows下的略有区别,体现两个方面:一是select函数的第一个参数,在windows下可以忽略,但在linux下必须设为最大文件描述符加1;二是结构fd_set在两个系统里定义不一样): int select( int maxfdp,fd_set * readfds,fd_set * writefds,fd_set * errorfds, struct timeval * timeout); /* 参数列表 int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。    fd_set *readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。  

关于/proc/进程idpid/fd ,根据fd来查找连接

拥有回忆 提交于 2020-08-08 17:51:22
当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查 看/proc/进程id/fd/, 是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。 epoll创建的fd是: lrwx------ 1 root root 64 Aug 20 11:04 3 -> anon_inode:[eventpoll] 这种类型的inode,是epoll创建的。 lrwx------ 1 root root 64 Aug 20 11:04 4 -> socket:[1126425] 一篇文章: 众所周知,在相应进程的/proc/$pid/fd 目录下存放了此进程所有打开的fd。当然有些可能不是本进程自己打开的,如通过fork()从父进程继承而来的。本文着着重讲述socket有关的内容。当我们在fd目录下使用 ls -l 命令查看时,会看到诸如下面的内容: lrwx------ 1 root root 64 Nov 21 09:44 133 -> /dev/sda1 lrwx------ 1 root root 64 Nov 21 09:44 134 -> /dev/sdb1 lrwx------ 1 root root 64 Nov 21 09:44 136 -> /dev/sdb1 lrwx------ 1 root root 64

.NET 异步详解

安稳与你 提交于 2020-08-08 11:35:16
前言 博客园中有很多关于 .NET async / await 的介绍,但是很遗憾,很少有正确的,甚至说大多都是“从现象编原理”都不过分。 最典型的比如通过前后线程 ID 来推断其工作方式、在 async 方法中用 Thread.Sleep 来解释 Task 机制而导出多线程模型的结论、在 Task.Run 中包含 IO bound 任务来推出这是开了一个多线程在执行任务的结论等等。 看上去似乎可以解释的通,可是很遗憾,无论是从原理还是结论上看都是错误的。 要了解 .NET 中的 async / await 机制,首先需要有操作系统原理的基础,否则的话是很难理解清楚的,如果没有这些基础而试图向他人解释,大多也只是基于现象得到的错误猜想。 初看异步 说到异步大家应该都很熟悉了,2012 年 C# 5 引入了新的异步机制: Task ,并且还有两个新的关键字 await 和 async ,这已经不是什么新鲜事了,而且如今这个异步机制已经被各大语言借鉴,如 JavaScript、TypeScript、Rust、C++ 等等。 下面给出一个简单的对照: 语言 调度单位 关键字/方法 C# Task<> 、 ValueTask<> async 、 await C++ std::future<> co_await Rust std::future::Future<> .await

从linux内核理解Java怎样实现Socket通信

自古美人都是妖i 提交于 2020-08-08 08:28:50
前言 前段时间买本书研究了 TCP/IP 通信,弄清楚了计算机之间是怎么通信的。网络通信的的基础就是 TCP/IP 协议簇 ,也被称为 TCP/IP 协议栈 ,也被简称为 TCP/IP 协议 。 TCP/IP 协议 并不是只有 TCP 和 IP 协议,只是这俩用的比较多,就用这两个起的名字。 我们目前使用的 HTTP , FTP , SMTP , DNS , HTTPS , SSH , MQTT , RPC 等都是以 TCP/IP协议 为基础。下图针对的是 传输层为 TCP 。 <img src="http://oss.mflyyou.cn/blog/20200718221518.svg?author=zhangpanqin" alt="TCP_IP 同一以太网 (1)" style="zoom:50%;" /> Linux 内核 为我们屏蔽了 TCP/IP 通信模型的复杂性,并且 Linux 中一切皆文件,因此为我们抽象了 Socket 文件,实际我们编码的时候,主要是通过一些系统调用和 Socket 打交道。 在 Java 中,网络通信这块 netty 提供了很大的便利,但是你了解了这些原理之后, netty 你也了解的差不多了。 内核参数说明 /proc/sys/net/* 说明 TCP/IP 内核参数说明 文件系统部分 /proc/sys/fs/* 说明 https:/

如何提高服务器的并发处理能力?硬核!

冷暖自知 提交于 2020-08-08 00:57:45
作者:潇洒一剑 www.cnblogs.com/zengjin93/p/5569556.html 以下内容为入门级介绍,意在对老技术作较全的总结而不是较深的研究。主要参考《构建高性能Web站点》一书。 什么是服务器并发处理能力 一台服务器在单位时间里能处理的请求越多,服务器的能力越高,也就是服务器并发处理能力越强 有什么方法衡量服务器并发处理能力 1. 吞吐率 吞吐率,单位时间里服务器处理的最大请求数,单位req/s 从服务器角度,实际并发用户数的可以理解为服务器当前维护的代表不同用户的文件描述符总数,也就是并发连接数。 服务器一般会限制同时服务的最多用户数,比如apache的MaxClents参数。 这里再深入一下,对于服务器来说,服务器希望支持高吞吐率,对于用户来说,用户只希望等待最少的时间,显然,双方不能满足,所以双方利益的平衡点,就是我们希望的最大并发用户数。 2. 压力测试 有一个原理一定要先搞清楚,假如100个用户同时向服务器分别进行10个请求,与1个用户向服务器连续进行1000次请求,对服务器的压力是一样吗? 实际上是不一样的,因对每一个用户,连续发送请求实际上是指发送一个请求并接收到响应数据后再发送下一个请求。 这样对于1个用户向服务器连续进行1000次请求, 任何时刻服务器的网卡接收缓冲区中只有1个请求,而对于100个用户同时向服务器分别进行10个请求

Event notification from kernel space to user space

谁都会走 提交于 2020-08-07 20:10:57
问题 How to notify the user space application whenever an event occurs in the kernel space? A hardware generates an interrupt when the data arrives at some GPIO. This data is copied to the kernel buffer. At this point, I want the driver to notify the application that it can call read function to copy the data form kernel buffer to user space buffer. I thought of using epoll method, but epoll indicates whether the device is ready to be read from. What I want is that, epoll to indicate whenever

Nginx安全优化与性能调优

百般思念 提交于 2020-08-07 11:28:53
目录 Nginx基本安全优化 隐藏Nginx软件版本号信息 更改源码隐藏Nginx软件名及版本号 修改Nginx服务的默认用户 修改参数优化Nginx服务性能 优化Nginx服务的worker进程数 1.优化NGINX进程对应的配置 2.优化Nginx进程个数的策略 3.查看Web服务器CPU硬件资源信息 4.修改服务器Nginx配置 绑定不同的Nginx进程到不同的CPU上 Nginx事件处理模型优化 调整Nginx单进程允许的客户端最大连接数 配置Nginx worker进程最大打开文件数 开启高效文件传输模式 1.设置参数: sendfile on; 2.设置参数:tcp_nopush on; 限制文件上传大小 配置gzip压缩实现性能优化 Nginx gzip压缩功能介绍 Nginx gzip压缩的优点 需要和不需要压缩的对象 参数介绍及配置使用 增加http accept-ranges头来提高性能 Nginx日志相关优化与安全 Nginx access日志切割 Nginx图片及目录防盗链解决方案 Nginx防爬虫优化 robots.txt机器人协议介绍 Nginx防爬虫优化配置 Nginx基本安全优化 隐藏Nginx软件版本号信息 一般来说,软件的漏洞都和版本有关,这个很像汽车的缺陷,同一批次的要有问题就都有问题,别的批次可能就都是好的。因此

硬核干货合集!500+篇Java干货技术文章整理|资源|书单|工具|面试指南|强烈建议打开!

蹲街弑〆低调 提交于 2020-08-07 07:57:53
   今天给大家推荐一位在阿里做Java的朋友给大家,他是公众号【程序员书单】的作者黄小斜。   他的公众号【程序员书单】这两年来累积了200多篇优质原创文章,独家原创的系列文章有《五分钟学编程》系列,以及最近在大量创作的《程序员书单》系列文章,黄小斜在公众号里也写了很多使用的技术干货,他将其中的精华内容都整理到了这篇文章里。   该公众号专注于IT技术,致力于为程序员推荐好书。作者黄小斜是非科班出身的程序员,在自学编程的路上读过很多书,踩过很多坑,现在在阿里做研发,一直认为读书是程序员必不可少的好习惯之一。    该公众号专注于分享Java、Python、大数据、人工智能等多个领域的优质学习资源,每天为你pick精品书单,优质学习资源和软件工具。关注前沿技术与行业资讯,更关注你的自我提升。    关注公众号【程序员书单】回复“book”领取30+本Java工程师精品电子书   程序员不止需要阅读技术书籍,更需要阅读更多其他领域的书籍,比如如何思考,如何阅读,如何管理时间和提供工作效率的书籍,在程序员不断精进的路上,需要更多书籍的陪伴。不管你是刚入门,在求职面试或者已经在工作,相信本公众号推荐的一些书籍都会帮助到你!    公众号里会不定期分享电子书、技术资料、源码等干货,同时也会经常进行送书活动,回馈一直支持本号的粉丝!   同时,他也在运营一个个人网站

Redis基础数据结构

 ̄綄美尐妖づ 提交于 2020-08-07 04:48:50
Redis数据结构:String、Hash、List、Set、ZSet(每种数据结构均包含两种以上的内部编码) Redis单线程架构: 1. 纯内存访问 2. 非阻塞I/O (采用多路复用技术epoll) 3. 减少了线程切换和竞态产生的消耗 字符串:实际值可以使字符串、数字、二进制 内部编码(object encoding + 键查看内部编码): int : 8个字节的长整型 embstr : 小于等于39个字节的字符串 raw : 大于39个字节的字符串 使用场景:资源缓存、计数、共享Session(用户Session放在Redis集群上集中处理)、限速(设置缓存失效时间,控制访问速度) 哈希: 内部编码: ziplist(压缩列表):当哈希类型元素个数长度小于512且列表中所有值的length小于64字节 hashtable(哈希表) 区别于关系型数据库: 哈希类型每个键可以有不同的field,而关系型数据库的field固定,每行均要设置值 关系型数据库可以进行复杂查询,非关系型不可以 列表: 内部编码: ziplist(压缩列表):当列表元素个数长度小于512且列表中所有值的length小于64字节 linkedlist(链表) 使用场景:消息队列、文章列表 集合: 内部编码: intset(整数集合):当集合中的元素个数小于512个且所有值均是整数 hashtable

2020年腾讯实习生C++面试题&持续更新中(1)

核能气质少年 提交于 2020-08-06 13:00:02
腾讯2020年实习生C++面试整理(1) 最近大三的学生找实习生的同学非常多,给大家分享一篇腾讯实习生的面试题,关于面试题,会持续更新~~~ 也算是今天开通博客的第一次为社区的贡献. 一面: 多态怎么实现的 虚表虚机制是怎么回事 构造函数可以是虚函数吗?为什么? 析构函数可以是虚函数吗?为什么? const是函数签名吗?是。有什么作用?区分只读操作和赋值操作 C++11了解过吗? variatic template讲一讲 右值引用讲一讲 lambda讲一讲 智能指针干嘛的,大概怎么实现的? override final关键字有什么用 decltype有什么使用场景吗 delete 和 delete[] 有什么区别 delete 删除数组为什么会造成内存泄露?只调用一次析构函数 delete[]怎么知道要调用多少次析构函数?讲了object的内存格式 二面: static、const(各种场景的用法) new、malloc区别、使用 STL vector/list的实现、数组链表区别、map/unordered_map的实现、哈希表的相关问题(哈希冲突) 红黑树、AVL,主要问了特性和区别 纯虚函数、虚函数、多态(虚指针、虚函数表)、this 指针 构造函数(为什么不能是虚函数)、析构函数(可以是虚函数吗?什么时候必须是虚函数?)、类默认成员函数 堆和栈(内存布局,内核空间、用户空间