资讯专栏INFORMATION COLUMN

文件描述符(File Descriptor)简介

CoffeX / 1853人阅读

摘要:当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。世界需要秩序,于是就有了文件描述符限制的规定。

维基百科:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。

一、文件描述符概念

  Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。

二、文件描述符、文件、进程间的关系

1.描述:

每个文件描述符会与一个打开的文件相对应

不同的文件描述符也可能指向同一个文件

相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开

2.系统为维护文件描述符,建立了三个表

进程级的文件描述符表

系统级的文件描述符表

文件系统的i-node表 (转到:阮一峰——理解inode)

3.通过这三个表,认识文件描述符

在进程A中,文件描述符1和30都指向了同一个打开的文件句柄(#23),这可能是该进程多次对执行打开操作

进程A中的文件描述符2和进程B的文件描述符2都指向了同一个打开的文件句柄(#73),这种情况有几种可能,1.进程A和进程B可能是父子进程关系;2.进程A和进程B打开了同一个文件,且文件描述符相同(低概率事件=_=);3.A、B中某个进程通过UNIX域套接字将一个打开的文件描述符传递给另一个进程。

进程A的描述符0和进程B的描述符3分别指向不同的打开文件句柄,但这些句柄均指向i-node表的相同条目(#1936),换言之,指向同一个文件。发生这种情况是因为每个进程各自对同一个文件发起了打开请求。同一个进程两次打开同一个文件,也会发生类似情况。

前人的思考,我们的阶梯,这部分参考自网络:链接

三、文件描述符限制

  有资源的地方就有战争,“文件描述符”也是一种资源,系统中的每个进程都需要有“文件描述符”才能进行改变世界的宏图霸业。世界需要秩序,于是就有了“文件描述符限制”的规定。

如下表:

永久修改用户级限制时有三种设置类型:

soft 指的是当前系统生效的设置值

hard 指的是系统中所能设定的最大值

- 指的是同时设置了 soft 和 hard 的值

命令讲解:

ulimit

sysctl

四、检查某个进程的文件描述符相关内容

步骤(以nginx为例,*注意权限问题,此示例是在本地环境):

找到需要检查的进程id

如图,找到的进程id为 1367

查看该进程的限制

如图,在 Max open files 那一行,可以看到当前设置中最大文件描述符的数量为1024

查看该进程占用了多少个文件描述符

如图所示,使用了17个文件描述符

总结

  实际应用过程中,如果出现“Too many open files” , 可以通过增大进程可用的文件描述符数量来解决,但往往故事不会这样结束,很多时候,并不是因为进程可用的文件描述符过少,而是因为程序bug,打开了大量的文件连接(web连接也会占用文件描述符)而没有释放。程序申请的资源在用完后及时释放,才是解决“Too many open files”的根本之道。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10065.html

相关文章

  • 进程和线程

    摘要:概念在学习操作系统的过程中,进程线程概念其实很模糊。该段落拓展阅读虚拟地址空间布局文件描述符简介多线程信号总结对进程和线程的实现内核只有一个结构体来描述进程线程,该文件位于。 概念 在学习操作系统的过程中,进程、线程概念其实很模糊。不同的上下文中,该名称指代的概念很可能是不同的,概念的不清晰为学习和沟通带来障碍,所以,在最开始我们先对齐概念。 很多书籍、文章里会这样来定义进程和线程: ...

    lordharrd 评论0 收藏0
  • Linux文件描述

    摘要:在通用模型中,操作系列函数系统调用都是围绕一个叫做文件描述符的整数展开。场景解析上图中,详细描述了两个进程诸多文件描述符,以及相互关系。当然了,进程通过套接字将一个文件描述符传递给也会出现类似的情形,但一般文件描述符数值是不一样的。 在Linux通用I/O模型中,I/O操作系列函数(系统调用)都是围绕一个叫做文件描述符的整数展开。这不禁让人产生疑问:这个整数代表什么?一个数值代表一个文...

    张宪坤 评论0 收藏0
  • linux-文件描述

    摘要:简介内核利用文件描述符来访问文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。参考地址文件描述符与进程文件描述符 简介 内核(kernel)利用文件描述符(file descriptor)来访问文件。1.系统为每一个进程维护了一个文件描述符表,该表的值都是从0开始的,所以在不同的进程中你会看到相同的文件描述符,这种情况下相同文件描述符有可能指向同一个文件,也有可能指向...

    MartinHan 评论0 收藏0
  • 手把手写C++服务器(31):服务器性能提升关键——IO复用技术【两万字长文】

    摘要:前面几讲手撕了网关服务器回显服务器服务的代码,但是这几个一次只能监听一个文件描述符,因此性能非常原始低下。复用能使服务器同时监听多个文件描述符,是服务器性能提升的关键。表示要操作的文件描述符,指定操作类型,指定事件。  本系列文章导航: 手把手写C++服务器(0):专栏文章-汇总导航【更...

    big_cat 评论0 收藏0
  • 【Redis学习笔记】2018-05-30 Redis源码学习之Ziplist、Server

    摘要:函数原型本身会占用一个文件描述符,不用时应将其关闭。对而言,操作系统需要遍历所有文件,从而找出发生事件的文件描述符。操作系统为每个维护了一个双向链表,当某个文件可读或者可写时,通过回调事先设定的回调函数,将文件描述符写入这个双向链表。 作者:施洪宝 顺风车运营研发团队一. 压缩列表压缩列表是Redis的关键数据结构之一。目前已经有大量的相关资料,下面几个链接都已经对Ziplist进行...

    starsfun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<