Linux操作系统基础案例教程
上QQ阅读APP看书,第一时间看更新

2.3 Linux的结构

前文已经提到,一个Linux由两部分组成:“内核”及“各种系统和应用程序”,操作系统位于硬件和软件中间,因此人们把内核称为计算机系统软件的核心,它要为应用软件提供一组命令或系统调用接口,供应用程序调用,从而向用户隐藏系统使用的硬件设备。

2.3.1 Linux内核

内核是操作系统的核心,具有很多最基本的功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

Linux内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等,如图2-1所示。

图2-1 Linux内核结构

(1)内存管理

对任何一台计算机而言,其内存以及其他资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux采用了称为“虚拟内存”的内存管理方式。Linux将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是4KB)。Linux包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

不过内存管理要管理的可不止4KB缓冲区。Linux提供了对4KB缓冲区的抽象,例如slab分配器。这种内存管理模式使用4KB缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。

为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在/Linux/mm中找到。

(2)进程管理

进程实际是某特定应用程序的一个运行实体。在Linux系统中,能够同时运行多个进程,Linux通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度”,完成调度的程序称为调度程序。

进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其他资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。

通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰及“坏”程序对系统可能造成的危害。为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通信机制来帮助完成这样的任务。Linux中常见的进程间通信机制有信号、管道、共享内存、信号量和套接字等。

内核通过SCI提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec等函数),停止进程(kill、exit),并在它们之间进行通信和同步。

(3)文件系统

和DOS等操作系统不同,Linux操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如A:或C:等)来标识的。相反,和UNIX操作系统一样,Linux操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux将新的文件系统通过一个称为“挂载”或“挂上”的操作将其挂载到某个目录上,从而让不同的文件系统结合成为一个整体。Linux操作系统的一个重要特点是它支持许多不同类型的文件系统。Linux中最普遍使用的文件系统是ext2,它也是Linux土生土长的文件系统。但Linux也能够支持FAT、VFAT、FAT32、Minix等不同类型的文件系统,从而可以方便地和其他操作系统交换数据。由于Linux支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统。

虚拟文件系统(Virtual File System,VFS)隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,FAT等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

虚拟文件系统(VFS)是Linux内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS在SCI和内核所支持的文件系统之间提供了一个交换层。即VFS在用户和文件系统之间提供了一个交换层。

在VFS上面,是对诸如open、close、read和write之类的函数的一个通用API抽象。在VFS下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过50个)的插件。文件系统的源代码可以在/Linux/fs中找到。

文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要时就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。

因此,用户和进程不需要知道文件所在的文件系统类型,而只需要像使用ext2文件系统中的文件一样使用它们。

(4)设备驱动程序

设备驱动程序是Linux内核的主要部分。和操作系统的其他部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是SCSI硬盘,则需要使用SCSI驱动程序,而不是IDE驱动程序。

(5)网络接口(NET)

Linux提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP协议是Internet的标准协议,同时也是事实上的工业标准。Linux的网络实现支持BSD套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。

网络设备驱动程序负责与硬件设备通信,每一种可能的硬件设备都有相应的设备驱动程序。

各个子系统之间的依赖关系如下:

进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事情,就是将程序和数据装入内存。

进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。

虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK设备。

内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。

除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。这些资源包括所有子系统都用到的过程。例如:分配和释放内存空间的过程,打印警告或错误信息的过程,还有系统的调试例程,等等。

2.3.2 Linux应用程序

应用程序是在操作系统内核之上,便于用户进程调用系统内核提供的接口来完成所要执行的任务。直接调用接口是非常麻烦和困难的,于是系统提供shell来帮助用户使用和控制计算机,系统还提供其他一些软件来支持环境,以支持用户程序的运行。

其中shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口,它可以描述为一个解释器,对用户输入的内容和命令进行解释之后再发送到内核。

Linux拥有三种用户操作环境:桌面(Desktop)、窗口管理器(Window Manager)、命令行shell(Command Line shell)。每个用户都可以设置自己的用户操作界面。

shell是一个命令解释器,它解释由用户输入的命令并把命令发送到内核,不仅如此,shell还有自己的编程语言用于对命令进行编辑,它允许用户编写由shell命令组成的程序,shell编程语言具有普通编程语言的很多特点,例如它也有循环结构和分支控制结构等,用这种编程语言编写的shell程序与其他程序具有同样的效果。

shell目前主要有下列版本。

•Bourne shell:是贝尔实验室开发的。

•BASH:是GNU的Bourne Again shell,是GNU操作系统上默认的Shell,大部分Linux的发行套件使用的都是这种Shell。

•Korn shell:是对Bourne shell的发展,在大部分内容上与Bourne shell兼容。

•C shell:是Sun公司shell的BSD版本。