前置知识

用户态与内核态

如果不了解,参考我之前的博文:用户态与内核态

上下文切换

如果不了解,参考我之前的博文:上下文切换

文件描述符

Linux中,一切皆是文件,也就是意味着任何一个进程以及线程也都有一个唯一标识,这个标识称之为为文件描述符(file descriptor),举一些例子,例如建立Socket连接,会产生一个文件,文件的描述符标记为fd1,socket监听也会产生一个文件,也会产生文件描述符fd2,文件描述符在形式上是一个非负整数,是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。

具体来说,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。