文件描述符

Java NIO学习系列五:I/O模型

社会主义新天地 提交于 2019-12-14 00:23:37
前面总结了很多IO、NIO相关的基础知识点,还总结了IO和NIO之间的区别及各自适用场景,本文会从另一个视角来学习一下IO,即IO模型。什么是IO模型?对于不同人、在不同场景下给出的答案是不同的,所以先限定一下本文的上下文:Linux环境下的network IO。   本文会从如下几个方面展开:    一些基础概念    I/O模型    总结 1. 一些基础概念   IO模型这个概念属于比较基础的底层概念,在此之前容我再先简单介绍一些涉及到的更底层的概念,帮助对I/O模型的理解: 1.1 用户空间与内核空间   现在操作系统都是采用虚拟存储器,对于32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。 1.2 文件描述符   对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数

Epoll模型详解

旧时模样 提交于 2019-12-13 10:37:50
1. 内核中提高I/O性能的新方法epoll epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。要使用epoll只需要这三个系统调 用:epoll_create(2), epoll_ctl(2), epoll_wait(2)。当然,这不是2.6内核才有的,它是在 2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44) Linux2.6 内核epoll介绍: 先介绍2本书《The Linux Networking Architecture--Design and Implementation of Network Protocols in the Linux Kernel》,以2.4内核讲解Linux TCP/IP实现,相当不错.作为一个现实世界中的实现,很多时候你必须作很多权衡,这时候参考一个久经考验的系统更有实际意义。举个例子linux内 核中sk_buff结构为了追求速度和安全,牺牲了部分内存,所以在发送TCP包的时候,无论应用层数据多大,sk_buff最小也有272的字节.其实对于socket应用层程序来说,另外一本书《UNIX Network Programming Volume 1》意义更大一点.2003年的时候,这本书出了最新的第3版本

Linux Shell 文件描述符stdin,stdout,stderr,重定向

∥☆過路亽.° 提交于 2019-12-12 23:59:54
Linux Shell 文件描述符stdin,stdout,stderr,重定向 系统保留的三个文件描述符分类 0 标准输入 stdin /dev/stdin 1 标准输出 stdout /dev/stdout 2 标准错误 stderr /dev/stderr 对文件描述符进行重定位(重定位运算符) > 替换原有内容 >> 内容追加到末尾 重定位运算符 ">" ">>" 的默认参数为标准输出 stdout ,即 1 ; 也就是说 > 和 >> 默认只接收 stdout 。 所以 ">" 等价于 "1>" ; ">>" 等价于 "1>>" ,也就是说 ls > out.log 就是 ls 1 > out.log 注意 1和 > 之间不能有空格,使用数字来重定向都不能有空格。 解释: (0)、何为标准输入和标砖输出 标准输入: /dev/stdin 文件里面的数据 标准输出: /dev/stdout 文件里面的数据 (1)、当我们输入“输出指令”,例如 ls, echo 等返回的信息归为stdout; 比如: ls > out.log cat out.log 有内容 比如: ls + > out2.log ls: 无法访问+: 没有那个文件或目录 cat out2.log 空的,为什么呢?那显然返回的内容不是stdout,而是stderr,我们可以使用 $?

linux epoll使用详解

时间秒杀一切 提交于 2019-12-12 13:48:38
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Linux2.6内核中epoll用法详解 引言 epoll是linux2.6内核中才有的机制,其他版本内核中是没有的,是Linux2.6内核引入的多路复用IO的一种方式,用于提高网络IO 性能的方法。在linux网络编程中,很长一段时间都是采用select来实现多事件触发处理的。Select存在如下几个方面的问题:一是每次调用时要 重复地从用户态读入参数,二是每次调用时要重复地扫描文件描述符,三是每次在调用开始时,要把当前进程放入各个文件描述符的等待队列。在调用结束后,又把 进程从各个等待队列中删除。Select采用轮询的方式来处理事件触发,当随着监听socket的文件描述符fd的数量增加时,轮询的时间也就越长,造成 效率低下。而且linux/posix_types.h中有#define __FD_SETSIZE 1024(也有说2048的)的定义,也就是说linux select能监听的最大fd数目是1024个,虽然能通过内核修改此参数,但这是治标不治本。 epoll的出现可以有效的解决select效率低下的问题,epoll把参数拷贝到内核态,在每次轮询时不会重复拷贝。epoll有ET和LT两种工 作模式,ET是高速模式只能以非阻塞方式进行,LT相当于快速的select,可以才有阻塞和非阻塞两种方式

man-翻译和epoll相关的内容,部分

蹲街弑〆低调 提交于 2019-12-12 13:48:23
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. int epoll_create(int size); epoll_create 新建了一个epoll的实例,请求内核分配一块存储事件结构的空间,size不是后台存储的最大尺寸,只是初始化时告诉内核应该分配多大的内部空间。 epoll_create 返回了一个对新的epoll实例引用的文件描述符。这个文件描述符在所有随后的epoll接口的调用中都会被用到。当不需要的时候,由epoll_create返回的文件描述符,需要用close()函数关闭。当所有对本文件应用的文件描述符都被关闭时,内核将把这个epoll实例破坏掉,并释放所分配的资源以实现再利用。 2 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) 这个系统调用控制了一个被文件描述符epfd所引用的epoll实例。它在目标文件描述符fd上请求相关的操作op。 有效的op参数如下: EPOLL_CTL_ADD 在文件描述符epfd所引用的epoll实例里注册目标文件描述符fd并把event和fd指向的文件联系起来。 EPOLL_CTL_MOD 修改和目标文件描述符fd联系起来的event。 EPOLL_CTL_DEL

Python 标准库 18.3

孤人 提交于 2019-12-12 13:48:12
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> select 模块一般有两个主要对象 —— select 函数和 Polling 对象。 select 一般各平台都会有,而 Polling 是区分平台实现的,比如在 Linux 上他就是 epoll ,在 Solaris 上叫做 devpoll 。 select 和 epoll 实际都是访问系统调用,功能是等待 I/O 完成。 select select(rlist, wlist, xlist[, timeout]) 函数接受三个文件描述符的列表作为参数,并将其中就绪的文件描述符返回。如果当前没有就阻塞调用。以 socket 为例,假设有两对 socket 对象 s1 和 s2 , 都没有未读取的数据,那么: lang:python >>> import select >>> x = select.select([s1, s2], [], []) ... 就会阻塞。直到彼端的 socket 发送数据: # 这里是另一端的 s1 和 s2 >>> s1.send(b'hello') 此端的 select 调用就会返回: >>> x ([s1], [], []) >>> x[0][0].recv(100) b'hello' epoll Polling Object 是对各平台上此类对象的一个统称,下面皆用

Linux_UNIX编程手册-读书笔记-第四章(文件I/O:通用的I/O模型)

北战南征 提交于 2019-12-11 19:27:45
4.1 概述 所有执行I/O操作的系统调用都以文件描述符,一个非负数(通常是最小整数),来指代打开的文件。 针对每个进程,文件描述符都自成一套 应该就是每个进程相互之间文件描述符不冲突 在程序开始运行之前,shell代表程序打开这三个文件描述符:stdin,stdout,stderr. 这三个文件描述符默认指向shell运行所在终端。 四个主要的I/O系统调用: fd = open ( pathname , flags , mode ) ; numread = read ( fd , buffer , count ) ; numwritten = write ( fd , buffer , count ) ; status = close ( fd ) ; 4.2 通用I/O 看不懂 4.3 open flag:用于指定文件的访问模式 分为三类:文件访问模式标志,文件创建标志,已打开的文件标志(如下表) 其中,第一类不能同时使用。 mode:指定了文件的访问权限 如果open()调用成功,必须保证其返回值为进程未用文件描述符中数值最小者。 如果在close(STDIN_FILENO)后调用OPEN,则得到的fd为0. 4.4 read() 4.5 write() 4.6 close() 显式关闭不再需要的文件描述符往往是良好的编程习惯 4.7 lseek() 文件打开时

Linux 输入、输出、错误重定向(Aix系统同样适用)

断了今生、忘了曾经 提交于 2019-12-10 04:36:38
文章目录 背景 文件文件描述符 输入重定向 输出重定向 错误重定向 规律 🌰 标准输出 标准输出和错误输出分别放两个文件 错误和正确的放一个文件 或者简单写为 ps:好吧我承认因为这篇是东拼西凑的,转载的话,不知道填写哪位大神的,所以暂且无耻的定为原创,不过文末加了转载连接 背景 执行完linux命令之后,希望将标准输出和错误输出分别重定向到不同的文件,否则在同一个文件的话,后期代码中不好处理,所以需要了解下知识背景。 文件文件描述符 系统中实际上有12个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、输出和错误。可以任意使用文件描述符3到9。 标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。 标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。 标准错误是文件描述符2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。 输入重定向 主要用于改变命令的输入源,让输入不要来自键盘,而来自指定文件。基本用法: 命令 < 文件名 $ ls < ls.out 输出重定向 主要用于改变命令的输出,让标准输出不要显示在屏幕上,而是写入到指定文件中。基本用法: 命令 > 文件名 $ ls > ls.out 以上是对标准输出来讲的,至于标准错误输出的重定向,只需要换一种符号,将 > 改为 2> ,将 >> 改为 2>>

Python os模块方法

[亡魂溺海] 提交于 2019-12-10 04:29:58
os 模块提供了大量有用的方法来处理文件和目录。本章节中的代码实例是在 Ubuntu Linux系统上运行来演示。 大多数有用的方法都列在这里 - 编号 方法 描述/说明 1 os.access(path, mode) 使用真正的 uid/gid 来测试访问指定的路径。 2 os.chdir(path) 将当前工作目录更改为指定路径。 3 os.chflags(path, flags) 将指定的路径的标志设置为数字标志。 4 os.chmod(path, mode) 将路径模式更改为数字模式。 5 os.chown(path, uid, gid) 将指定的路径的所有者和组ID更改为数字uid和gid。 6 os.chroot(path) 将当前进程的根目录更改为指定的路径。 7 os.close(fd) 关闭文件描述符 fd 。 8 os.closerange(fd_low, fd_high) 将所有从 fd_low (包括)到 fd_high (不包括)的文件描述符关闭,并忽略错误。 9 os.dup(fd) 返回文件描述符 fd 的副本。 10 os.dup2(fd, fd2) 重复从 fd 到 fd2 的文件描述符,如果需要,首先关闭 fd2 。 11 os.fchdir(fd) 将当前工作目录更改为由文件描述符 fd 表示的目录。 12 os.fchmod(fd, mode