fd

Java多线程:Linux多路复用,Java NIO与Netty简述

蓝咒 提交于 2020-03-15 10:11:48
JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: Winsock的select模型(感谢评论指正,仅Java NIO.2使用了Windows IOCP,由于Netty没有采用NIO.2此处不展开) Free BSD, OS X: kqueue 下面仅讲解Linux的多路复用。 Linux中的IO Linux的IO将所有外部设备都看作文件来操作,与外部设备的操作都可以看做文件操作,其读写都使用内核提供的系统调用,内核会返回一个文件描述符(fd, file descriptor),例如socket读写使用socketfd。描述符是一个索引,指向内核中一个结构体,应用程序对文件的读写通过描述符完成。 一个基本的IO,涉及两个系统对象:调用这个IO进程的对象,系统内核,read操作发生时流程如下: 通过read系统调用向内核发起读请求。 内核向硬件发送读指令,并等待读就绪。 内核把将要读取的数据复制到描述符所指向的内核缓存区中。 将数据从内核缓存区拷贝到用户进程空间中。 Linux I/O模型简介 阻塞I/O模型:最常用,所有文件操作都是阻塞的。 非阻塞I/O模型:缓冲区无数据则返回,一般采用轮询的方式做状态检查。 I/O复用模型:详细见下 信号驱动I/O:使用信号回调应用,内核通知用户何时开启一个I/O操作

Redis源码阅读(一)事件机制

Deadly 提交于 2020-03-15 04:24:54
Redis 源码阅读(一)事件机制   Redis 作为一款 NoSQL 非关系内存数据库,具有很高的读写性能,且原生支持的数据类型丰富,被广泛的作为缓存、分布式数据库、消息队列等应用。此外 Redis 还有许多高可用特性,包括数据持久化,主从模式备份等等,可以满足对数据完整性有一定要求的场景。   Redis 的源码结构简单清晰,有大量材料可以参阅;通过阅读 Redis 源码,掌握一些常用技术在 Redis 中的实现,相信会对个人编程水平有很大帮助。这里记录下我阅读 Redis 源码的心得。从我自己比较关心的几个技术点出发,每个技术点都是来自个人使用 Redis 过程中产生的问题。这里也参考了黄建宏老师的《 Redis 设计与实现》部分内容,不得不说参考这本书再结合源码注释,看起来绝对事半功倍。   当初选用 Redis 的时候,很大程度上是由于 Redis 的并发性能很高,可以支持大量并发请求。那 Redis 是如何支持高并发请求的呢?这里就引入了第一个技术点,事件处理机制。在 Redis 中使用了单线程的 Reactor 模式,属于 I/O 多路复用的一种常见实现模式。这里简单介绍下 Reactor 模式。 1. Reactor 模式 从网上切一个类图,简单描述一下Reactor模式的主体结构 基本概念: Handle : I/O 操作的基本文件句柄,在 linux 下就是

第5课.异步通知

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-14 19:03:35
1.按键的4种控制方式对比 1.查询 :耗资源 | 2.中断 :没有超时机制 | APP---->驱动 3.poll :加入了超时机制 | 4.异步通知 :按键发生后去通知app 驱动--->APP 异步通知的注意事项 1.不是所有的设备都支持异步通知。应用程序通常假设只有套接字和终端才有异步通知能力。 2.当进程收到SIGIO信号时,它并不知道是哪个输入文件有了新的输入。如果有多于一个文件可以异步通知输入的进程,则应用程序仍然必须借助于poll或select来确定输入的来源。 2.异步通知开发流程 1.应用程序注册信号处理函数 signal(SIGIO, my_signal_fun); 2.驱动程序发信号 void kill_fasync(struct fasync_struct **fp, int sig, int band) 3.信号被发给应用程序,应用程序需要告诉驱动pid fcntl(fd, F_SETOWN, getpid()); // 告诉内核pid,让内核知道应该通知那个进程 解析:当fcntl系统调用执行F_SETOWN命令时,属主进程的进程ID号就被保存在filp->f_owner中 Oflags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, Oflags | FASYNC); // 改变fasync标记

CAN FD实战之示波器捕捉波形及对照CAN FD帧定义解析CAN FD帧

旧城冷巷雨未停 提交于 2020-03-12 12:23:20
文章目录 一、一个CAN FD报文的波形 二、CAN FD的帧定义 1、CAN FD Standard Frame 2、CAN FD Extended Frame 3、仲裁场和控制场的位定义 4、CAN FD的DLC和CRC定义 一、一个CAN FD报文的波形 低波特率选500KBit/s、高波特率选2MBit/s、标准帧、ID=001、数据长度64、数据是55 00(62个) 55。 二、CAN FD的帧定义 1、CAN FD Standard Frame 2、CAN FD Extended Frame 3、仲裁场和控制场的位定义 与传统CAN相比,CAN FD取消了对远程帧的支持,用RRS位替换了RTR位,为常显性。IDE位仍为标准帧和扩展帧标志位,若标准帧与扩展帧具有相同的前 11 位 ID,那么标准帧将会由于IDE 位为 0,优先获得总线。 RRS(remote request substitution)远程请求替换位:即传统CAN中的RTR位; SRR (substitute remote request)代替远程帧请求位:SRR位为保留位,无影响; IDE(Identifier Extension) 扩展帧标志:显性(0)=11位ID,隐性(1)=29位 ID。 CAN FD在控制段中新添加了三个位FDF位、BRS位、ESI位。 FDF位(Flexible Data

Node.js 文件系统

时光怂恿深爱的人放手 提交于 2020-03-11 20:09:35
Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API。 Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。 异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。 建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。 创建 test.txt 文件 这是在test.txt中的内容 创建 main.js 文件 var fs=require("fs"); //异步 fs.readFile("test.txt",function(err,data){ if(err){ return console.error(err); } console.log("异步:"+data.toString()); }) //同步 var data=fs.readFileSync("test.txt"); console.log("同步:"+data.toString()); 异步模式下打开文件 fs.open(path, flags[, mode], callback) path - 文件的路径。 flags - 文件打开的行为。具体值详见下文。 mode - 设置文件模式(权限),文件创建默认权限为

Linux下socket编程的简单实例

筅森魡賤 提交于 2020-03-11 14:51:59
1 服务器端的socket编程 服务器端主要的功能,就是创建socket监听,等待客户端的连接。 基础的步骤很简单,如下: (1) 创建socket; (2) 绑定地址和端口; (3) 启动监听; (4) 接受客户端请求; (5) 读/写数据; 1.1 创建socket: 函数原型: mysocket = socket ( int socket_family , int socket_type , int protocol ) ; 1 第一个参数为socket的协议族,由一组宏定义表示,一般使用AF_INET,表示使用IPV4协议。 第二个参数为socket的类型,主要分为SOCK_STREAM和SOCK_DGRAM,分别对应TCP协议和UDP协议。 第三个参数为socket使用的特定协议,一般对应一个协议族就只有一个协议,可以使用0表示使用默认的协议。 函数返回值为创建的socket文件描述符。-1表示创建失败。 函数定义及相关宏定义在头文件<sys/socket.h>。 1.2 绑定地址和端口: 函数原型: int bind ( int sockfd , const struct sockaddr * addr , socklen_t addrlen ) ; 1 第一个参数为刚刚创建的socket; 第二个参数是一个结构体sockaddr的指针。但实际使用的时候,根据协议的不同

PWN学习笔记

时光总嘲笑我的痴心妄想 提交于 2020-03-10 23:46:26
久违的更一篇博客总结一点比较基础的PWN题的套路(用户态linux pwn),过一段时间 可能 会更windows pwn和kernel pwn,这次先总结套路,过一段时间可能会加上具体的例子解析。 ptmalloc利用:分两部分来总结,第一步利用堆漏洞利用,第二部分getshell 对漏洞利用:   fastbins attack,fast bins特性:是一个单项链表,只有fd指针,最后一个chunk的fd指向null。并且在free掉之后,并不会修改下一块相邻的chunk的pre_size位,即不会发生free时合并。但当申请一块small bins大小或large bins大小,在unsorted bins查找之前,会遍历fast bins进行合并,并将合并后的chunk放入unsortedbins   unlink :smallbins 过检查fd->bk=victim bk->fd=victim large bins增加对fd_nextsize和bk_nextsize的检查。unsorted bins 则不存在检查 绕过方式有两种:一 如果存在一个全局变量,是题目进行存储malloc指针的数组,这时如果将fd改为 address-0x18 bk改为 address-0x10即可绕过检查。下一步触发unlink,将全局变量改为address -0x18

linux----文件I/O

半世苍凉 提交于 2020-03-10 13:40:13
1. 文件描述符   一个非负整数,当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。   每个文件打开时会在内核中建立一个文件表项,这个文件表项包括文件的状态信息、存储文件内容的缓冲区、当前文件的读写位置等,这些文件表项保存在内核的一个数组(文件表)里。   每个进程在内核中有一个整形数组,里面的元素就是文件表的下标,通过这个下标可引用打开的文件表项,这个下标就是文件描述符   文件描述符0或符号常量STDIN_FILENO与进程的标准输入关联,1或符号常量STDOUT_FILENO与标准输出关联,2或STDERR_FILENO与标准错误关联(unistd.h) 2. 文件I/O操作   open打开、close关闭、lseek定位、read读、write写 2.1 文件打开 (1)open   成功,返回一个可用的最小文件描述符数值;出错返回-1 flags参数: 这3个选项互斥,只能选一个且必须有一个 可通过 | 连接使用多个选项 mode_t mode参数:   当要打开的文件不存在,且需要在创建时才有用,参数代表文件的权限 并受 umask 文件权限掩码的影响 (2)openat      dirfd参数:     ①若path指定了绝对路径,则dirfd参数无用,openat等同于open     ②path为相对路径

proc - 进程信息伪文件系统

邮差的信 提交于 2020-03-10 03:23:30
描述 /proc 是一个伪文件系统, 被用作内核数据结构的接口, 而不仅仅是解释说明 /dev/kmem. /proc里的大多数文件都是只读的, 但也可以通过写一些文件来改变内核变量. 下面对整个 /proc 目录作一个大略的介绍. [number] 在 /proc 目录里, 每个正在运行的进程都有一个以该进程 ID 命名的子目录, 其下包括如下的目录和伪文件. cmdline 该文件保存了进程的完整命令行. 如果该进程已经被交换出内存, 或者该进程已经僵死, 那么就没有任何东西在该文件里, 这时候对该文件的读操作将返回零个字符. 该文件以空字符 null 而不是换行符作为结束标志. cwd 一个符号连接, 指向进程当前的工作目录. 例如, 要找出进程 20 的 cwd, 你可以: cd /proc/20/cwd; /bin/pwd 请注意 pwd 命令通常是 shell 内置的, 在这样的情况下可能工作得不是很好. environ 该文件保存进程的环境变量, 各项之间以空字符分隔, 结尾也可能是一个空字符. 因此, 如果要输出进程 1 的环境变量, 你应该: (cat /proc/1/environ; echo) | tr ";\000"; ";\n"; (至于为什么想要这么做, 请参阅 lilo (8).) exe 也是一个符号连接, 指向被执行的二进制代码. 在 Linux

守护进程的编写

柔情痞子 提交于 2020-03-08 14:14:05
目录 守护进程的编写 一,普通进程 二,守护进程 守护进程的编写 ps: 参考资料: linux C++通讯架构实战 卷1 一,普通进程 查看进程 ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -E 'bash|PID|nginx' 这种进程都有各自对应的终端,终端退出,该进程也就退出,它的父进程是一个bash 终端被占用,你输入命令没有作用 如果放到后台(bg), 输入命令有用了,但是终端关闭进程仍然会退出 二,守护进程 定义:一种长期在后台运行的进程,不与任何终端关联 Linux本身是有很多守护进程默默运行着。查看 ps -efj 。 ppid = 0 内核进程,跟随系统,生命周期贯穿这个系统。 cmd 带 [ ] 的是内核守护进程 老祖init,也是系统守护进程,它负责启动各运行层次特定的系统服务;所以很多进程的PPID是init。而且这个init也负责收养孤儿进程; cmd列中名字不带[]的普通守护进程(用户级守护进程) 共同特点 大多数守护进程都是以超级 用户特权运行的; 守护进程没有控制终端,TT这列显示? 内核守护进程以无控制终端方式启动 普通守护进程可能是守护进程调用了setsid的结果(无控制端); 编写规则 调用umask(0); umask是个函数,用来限制(屏蔽)一些文件权限的。 fork()一个子进程