Linux与其他商用Unix内核竞争的优势
1、单块结构的内核:它是一个庞大、复杂的自我完善(do-it-yourself)程序,由几个逻辑上独立的成分构成,在这一点上,它是相当传统的,大多数商用Unix变体也是单块结构。
2、编译并静态链接的传统Unix内核:大部分现代操作系统内核可以动态地装载和卸载部分内核代码,通常把这部分代码称作模块(module)。Linux对模块的支持很好,可以自动按需要安装或卸载模块。
3、内核线程:一些Unix内核如Solaris被组织成一组内核线程(kernel thread),内核线程是一个能被独立调度的执行环境(context);也许它与用户程序有关,也许仅仅执行一些内核函数。线程之间的上下文切换比普通进程之间的上下文切换花费的代价要少好多,因为前者通常在同一个地址空间执行。
4、多线程应用程序支持:大多数现代操作系统在某种程度上都支持多线程应用程序,也就是说这些用户程序是根据很多相对独立的执行流来设计的,而这些执行流之间共享应用程序的大部分数据结构。一个多线程用户程序由很多轻量级进程(lightweight process)组成,这些进程可能对共同的地址空间、共同的物理内存页、共同的打开文件等等进行操作。
5、抢占式内核:当采用“可抢占的内核”选项来编译内核时,可以随意交错执行处于特权模式的执行流。
6、多处理器支持:几种Unix内核变体都利用了多处理器系统。几个处理器可以无区别地处理任何一个任务。
7、文件系统:Linux标准文件系统呈现出多种风格。有普通的Ext2文件系统,避免系统崩溃后冗长的文件系统检查的Ext3,有很多小文件时用ReiserFS。
8、STREAMS:尽管大部分的Unix内核内包含了SVR4引入的STREAMS I/O子系统,但是Linux并没有与此类似的子系统。
多用户系统
多用户系统(multiuser system)就是一台能并发和独立地执行分别属于两个或多个用户的若干应用程序的计算机。“并发”(concurrently)意味着几个应用程序能同时处于活动状态并竞争各种资源,如CPU、内存、硬盘等等。“独立”(independenctly)意味着每个应用程序能执行自己的任务,而无需考虑其他用户的应用程序在干什么。
多用户操作系统必须包含以下几个特点:
核实用户身份的认证机制;
防止错误的用户程序妨碍其他应用程序在系统运行的保护机制;
防止有恶意的用户程序干涉或窥视其他用户活动的保护机制;
限制分配给每个用户的资源数的记账机制。
用户和组
在多用户系统中,每个用户在机器上都有私用空间;典型地,他拥有一定数量的磁盘空间来存储文件、接受私人邮件等。操作系统需要保证所有用户的私有空间仅仅对该用户可见。
所有的用户由一个唯一的数字来标识,这个数字叫User ID,UID。通常一个计算机系统只能由有限的人使用,用户的UID会匹配一个口令。
为了和其他用户选择地共享资料,每个用户是一个或多个用户组的一名成员,组由唯一的用户User Group ID来标识。每个文件也恰好与一个组相对应。拥有文件的用户具有对文件的读写权限,同组用户仅有只读权限,而系统中的其他用户没有对文件的任何访问权限。
任何Unix操作系统都有个特殊的用户,叫做root,即超级用户。系统的管理员必须以root身份登录,可以访问每个文件,干涉每一个正在执行任务的用户程序。
进程
所有的操作系统都使用一种基本的抽象:进程(process)。一个进行可以定义为:“程序执行的一个实例”,或者一个运行程序的“执行上下文”。传统的操作系统一个进程是指在连续的地址空间内执行一个单独的指令序列;现代操作系统允许具有多个执行流的进程。Unix是具有抢占式进程的多处理器操作系统。
类Unix操作系统采用进程/内核模式。每个进程都以为它是系统中唯一的进程,可以独占操作系统所提供的服务。只要进程发出系统调用,硬件就会把特权模式由用户态转为内核态,然后进程以非常有限的目的开始一个内核过程的执行。这样,操作系统在进程的执行上下文中起作用,以满足进程的请求。一旦这个请求完全得到满足,内核过程将迫使硬件回到用户态,然后进程从系统调用的下一条指令继续执行。
内核体系结构
如前所述,大部分Unix内核时单模块结构:每一个内核层都被集成到整个内核程序中,并代表当前进程在内核态下运行。相反,微内核(microkernel)操作系统只需要内核有一个很小的函数集,通常包括几个同步原语、一个简单的调度程序和进程间通信机制。运行在微内核之上的几个系统进程实现从前操作系统级实现的功能,如内存分配、设备驱动、系统调用处理程序等。
尽管关于操作系统的学术研究都是面向微内核的,但是这样的操作系统比单块模块效率低。微内核的操作系统迫使系统程序员采用模块化的方法,因为任何操作系统层都是一个相对独立的程序,这种程序必须通过定义明确而清晰的软件接口与其他层交互。为了达到微内核理论上的很多优点而又不影响性能,Linux内核提供了模块(module)。模块是一个目标文件,其代码可以在运行时链接到内核或从内核解除链接。这种目标代码通常由一组函数组成,用来实现文件系统、驱动程序或其他内核上层功能。与微内核操作系统的外层不同,模块不是作为一个特殊的进程执行的,相反,与任何其他静态链接的内核函数一样,它代表当前进程在内核态下执行。
使用模块的主要优点包括:
模块化方法:因为任何模块都可以在运行时被链接或解除链接,因此系统程序员必须提出明确的软件接口以访问由模块处理的数据结构。
平台无关性:不依赖某个硬件平台。
节省内存使用:当需要模块功能时,把它链接到正在运行的内核中,否则解除链接。
无性能损失:模块的目标代码一旦被链接到内核,其作用与静态链接的内核的目标代码完全的等价。因此,当模块被调用时,无需显式地进行消息传递。