Linux内核详解(四)

来源:互联网 发布:百度关键词优化方案 编辑:程序博客网 时间:2024/06/14 07:39
Linux内核时间和定时器管理

硬件为内核提供了一个系统定时器用来计算时间,系统定时器以某种频率自动触发时钟中断,该频率可通过编程预定,称作节拍率。当时钟中断发生时,内核就通过一种特殊的中断处理程序对其进行处理。因为预编的节拍率对内核来说是可知的,所以内核知道连续两次时钟中断的间隔时间(节拍),它等于节拍率分之一秒。内核就是通过这种已知的时钟间隔来计算墙上(实际)时间和系统运行时间的。另外内核也为用户空间提供了一组系统调用以获取实际日期和实际时间。


系统定时器频率(节拍率)是通过静态预处理定义的,也就是赫兹(HZ),在系统启动时按照HZ值对硬件进行设置。比如x86体系结构中系统定时器频率默认值为100,因此x86上时钟中断的频率也就为100HZ,即每秒时钟中断100次。


提高节拍率意味着时钟中断产生得更加频繁,导致中断处理程序也会更加频繁地执行,这样带来的好处是提高了中断解析度(执行粒度更高)以及时间驱动事件的准确度(平均误差是中断周期的一半),这样那些依赖定时执行的系统调用(比如epoll和select)就能够以更高的精度运行,更高的准确度也使进程抢占更准确(因为需要等到下一个时钟中断到来才能进行抢占),同时还会加快调度响应时间。但是带来的坏处是系统负担更重了,因为节拍率越高,中断处理程序占用的cpu时间越多并增加耗电(在基于节拍的标准系统中,即使系统空闲期间,内核也需要为时钟中断提供服务)。


Linux内核使用类型为无符号长整数的全局变量 jiffies来记录系统启动以来的节拍总数,每次时钟中断处理程序都会增加该变量的值,那么系统运行时间即等于 jiffies/HZ。


Linux内核内存管理

内核把物理页作为内存管理的基本单位,尽管cpu最小可寻址单位是字,但是内存管理单元(MMU)通常以页(page)大小为单位来管理系统中的页表,从虚拟内存的角度来讲页就是最小单位。通常32位体系架构支持4KB的页,64位支持8KB的页。


Linux内核使用struct page结构来表示系统中的每个物理页;其中flags域用来表示页是不是脏的,是不是被锁定在内存中等等,_cout域存放页的引用计数,virtual域是页的虚拟地址;注意内核仅仅使用这个数据结构来描述当前在相关物理页本身,而不是其中的数据。

虚拟文件系统

虚拟文件系统(VFS)作为内核子系统,为用户进程提供了文件和文件系统相关的接口。VFS使得用户可以直接使用open、read这样的系统调用而无须考虑具体的文件系统和实际物理介质。


Unix使用了四种和文件系统相关的抽象概念:文件、目录项、索引节点和安装点(mount point);文件系统被安装在一个特定的安装点上,该安装点在全局层次结构中被称作命名空间,所有已安装文件系统作为根文件系统的枝叶。而windows将文件的命令空间分类为驱动字母(例如C:,这样也就把命令空间划分为设备和分区)。


文件的元数据(例如访问控制权限、拥有者、大小等)被存储在一个名为索引节点(inode)的单独数据结构中。在磁盘中,文件信息按照索引节点的形式存储在单独的块中,控制信息被集中存储在磁盘的超级块中,这样Unix中的文件的概念从物理映射到存储介质。


VFS有四个主要的对象类型:

  • 超级块对象,代表一个具体的已安装文件系统;
  • 索引节点对象,代表一个具体的文件;
  • 目录项对象,代表一个目录项,是路径的一个组成部分;
  • 文件对象,代表由进程打开的文件。
每个主要的对象都包含了一个操作对象,操作对象描述了内核对该对象可以使用的方法。


每个文件系统都必须实现超级块对象,该对象用于存储特定文件系统的信息,通常对应于存放在磁盘特定扇区中的文件系统超级块或文件系统控制块。对于基于内存而非磁盘的文件系统,会使用现场创建超级块并将其保存在内存中。超级块对象由super_block结构体表示,其中的s_op域指向超级块的操作函数列表(由super_oprations结构体表示,该结构体中的每一项都是一个指向超级块操作函数的指针,执行文件系统和索引节点的底层操作)。

索引节点对象包含了内核在操作文件或目录时需要的全部信息,对于Unix文件系统来说这些信息可以从磁盘索引节点直接读取,没有索引节点的文件系统通常将文件描述信息作为文件的一部分存储。
一个索引节点即代表文件系统中的一个文件,并且索引节点对象仅当文件被访问时才在内存中创建。索引节点对象由inode 结构体表示,其中inode_oprations域包含了VFS操作索引节点对象的所有方法。


文件对象是已打开文件在内存中的表示,该对象由相应的open系统调用创建,由close系统调用撤销。因为多个进程可以同时操作同一个文件,所以同一个文件也可能存在多个相应的文件对象。文件对象仅仅是进程的角度,struct file结构体包含path执行目录项对象(索引节点),因为只有目录项对象才表示已打开的实际文件。虽然一个文件对应的文件对象不唯一,但对应的索引节点和目录项是唯一的。


除了几种VFS主要对象外,内核还使用了另外一些标准数据结构来管理文件系统的其他相关数据,比如file_system_type对象用来描述各种特定文件系统类型(ext3/ext4)。


系统中的每个进程都有自己的一组打开的文件,像根文件系统、当前工作目录以及安装点等,内核提供了三个数据结构将VFS层和用户进程关联:file_struct、fs_struct、namespace结构体:

  • file_struct结构体有进程描述符中的files域指向,所有与每个进程相关的信息(如打开的文件及文件描述符)都保存在其中。
  • file_struct结构体由进程描述符的fs域指向,它包含文件系统和进程相关的信息(如当前进程的工作目录pwd和根目录)。
  • namespace结构体由进程描述符mmt_namespace域指向,使得进程在系统中可以看到唯一的安装文件系统;默认情况下所有进程共享相同的命名空间,只有在进程clone操作使用CLONE_NEWS标志时才会拷贝命名空间结构体。
上述数据结构都是通过进程描述连接起来的。

1 0
原创粉丝点击