2.2 Linux的发展和软件体系结构
1991年对于全球计算机界而言是一个不寻常的年份,这一年发生了一件对计算机界来说极具影响力的一件事情:芬兰赫尔辛基大学的一位名叫Linus Torvalds大学生为完成自己操作系统课程的作业,开始基于Minix(一种免费的小型UNIX操作系统)编写一些程序,当作业完成之后,他惊喜地发现自己的这些程序已经能够完全实现一个操作系统的基本功能。于是,他将这个操作系统的源代码发布在Internet上,并邀请所有对此感兴趣的人发表评论或者共同修改代码。随后,Linus Torvalds将这个操作系统命名为Linux,也就是Linus’s unix的意思,并且以可爱的胖企鹅(如图2-1所示)作为其标志,这是因为企鹅是南极洲的标志性动物,而根据国际公约规定南极洲不属于任何一个国家而是属于世界的,正好与Linux自由、开放的宗旨相符合。随着时间的推移,在众多程序员的共同努力、不断完善下,到1994年,Linux已经成长为一个功能完善、稳定可靠的操作系统。
图2-1 Linux操作系统标志
随着开发研究的不断深入,Linux的功能日趋完善,并已经成为世界上主流的操作系统之一。与其他操作系统相比,Linux继承了UNIX操作系统的优秀设计思想,几乎拥有最新UNIX系统的全部功能,其主要特点如下。
1.真正的多用户多任务
Linux是一款真正的多用户多任务的操作系统。多用户是指各个用户对于自己的文件、设备等有自己特殊的权限,保证了各用户之间互不影响。多任务则是指多个程序在Linux系统中同一时间段内彼此独立地运行。
2.良好的兼容性
Linux完全符合IEEE的面向UNIX的可移植操作系统(Portable Operating System for UNIX,POSIX)标准。在Windows系统、UNIX系统下可以执行的程序,几乎不需要做变更就完全可以在Linux系统上运行。
3.强大的可移植性
Linux是一款具有很强的可移植性的操作系统,迄今为止,Linux是支持最多硬件平台的操作系统,无论是掌上电脑、机顶盒、游戏机、个人计算机、小型机,还是中型机,甚至是大型计算机上都可以运行Linux操作系统。
4.高度的稳定性
Linux继承了UNIX的优良特性,可以连续数月、数年运行而无须重新启动。
5.可靠的安全性
在过去十几年的广泛使用中只有屈指可数的几个病毒感染过Linux,这种高可靠性、强免疫性可归功于Linux系统健壮的基础架构。Linux的基础架构是由相互无关的层组成,每层都有特定的功能和严格的权限许可,从而保证最大限度地安全运行。
6.友好的用户界面
Linux提供的用户界面包括字符界面和图形化用户界面两种。在字符界面,用户需要输入要执行的相关命令才能完成对应的操作。字符界面的这种操作方式运行效率很高,但是因为需要记忆大量的命令给用户带来了很多的不方便。
Linux的图形化用户界面整合了大量的应用程序和系统管理工具,并且可以通过鼠标的使用来进行各种操作。用户在图形化用户界面下能够方便、快捷地使用各种资源,完成各项工作。两种界面各有特色,因此现在均在使用。
7.丰富的网络功能
在Linux系统中,用户可以轻松实现网页浏览、文件传输、远程登录等工作,并且可以作为服务器提供WWW、FTP、E-Mail等服务。
2.2.1 Linux的发展
Linux是一种类UNIX的操作系统,由Linus Torvalds为首的一批Internet志愿者创建开发。Linux操作系统与其他商业性操作系统最大的区别在于它的源代码是完全公开的。
由于Linux从最初就加入了GNU计划,其软件发行遵循GPL原则,也就是说Linux与GNU计划中的其他软件一样都是自由软件。虽然目前很多Linux发行版本都可以通过Internet下载,除了网络费用和刻录光盘的费用,无须其他花费。但是按照GPL原则,生产Linux产品的公司和程序员是可以要求收取一定服务费用的。
近十年来,我国嵌入式系统事业快速发展、壮大起来,嵌入式软件技术得到飞速发展。2016年,在嵌入式产品研发的软件开发平台的选择上,嵌入式Linux以55%的市场份额遥遥领先于其他嵌入式开发软件平台,比去年增长13%,这已经是连续4年以此比例增长。由此可见,Linux凭借其得天独厚的优势和广泛的应用领域,已然成为众多嵌入式企业研发团队的首选。
从行业市场大环境来看,随着物联网、云计算等新兴领域日益成为信息产业的主旋律,作为这些产业应用技术中最核心部分的嵌入式系统,更是受到普遍的关注。可见,Linux的发展前景是十分广阔的。
这里所说的Linux实际上有狭义和广义两层含义。狭义的Linux是指Linux的内核(Kernel),它完成内存调度、进程管理、设备驱动等操作系统的基本功能,但是并不包括应用程序。广义的Linux是指以Linux内核为基础,包含应用程序和相关的系统设定与管理工具的完整操作系统。
到目前为止,Linux的内核仍由Linus Torvalds领导下的开发小组负责开发。因为Linux内核可自由获取,并且允许厂商自行搭配其他应用程序,所以不同厂商将Linux发行套件,即广义的Linux。因此,Linux的版本可分为两种:内核版本和发行版本。
1.Linux的内核版本
Linux的内核版本号由3个数字组成,一般表示形式:X.Y.Z。
●X:表示主版本号,通常在一段时间内不改变,比较稳定。
●Y:表示次版本号,若是偶数,则代表这个内核版本是正式版本,可以公开发行;若是奇数,则代表这个内核版本是测试版本,还不太稳定仅供测试。
●Z:表示修改号,这个数字越大,则表示该版本修改的次数越多,版本相对更完善。
Linux的正式版本一般只针对它的上个版本中的某些缺陷进行修改,而测试版本则是在正式版本的基础上继续增加一些新的功能,然后进行试用,试用稳定后就成为正式版本。正式版本和测试版本之间是相互关联的,主要是完善内核的功能。
2.Linux的发行版本
由于Linux源程序公布在网上,每个爱好者都可以对其进行修改、完善,截至目前为止大约有2000多个版本,能使用的数量已达到近400种,而且还在不断地增加。发行版本之间的差别主要在于包含的软件种类和数量的不同。下面简单介绍一下几种较为常见Linux的发行版本。
(1)最好的回归发行版:open SUSE
开发open SUSE版本的SUSE公司是最老的Linux企业。它成立于Linus Torvalds发布Linux的一年后,早于Red Hat的诞生,用户可以使用超稳定的openSUSELeap和始终保持最新的open SUSE Tumbleweed。
(2)最可定制的发行版:Arch Linux
ArchLinux是现阶段最好的滚动发行版,用户始终使用最新的软件包,并且它们还可以通过稳定的存储库运行预发布软件。它所提供的包和软件均可以在任何Linux发行版上运行。
(3)最好看的发行版:Elementary OS
不同的Linux发行版有不同的侧重点,在大多数情况下都是技术差异。ElementaryOS非常严格要求整体的外观和感觉。开发者创建了包括桌面环境在内的自己的组件,此外,他们只选择那些符合自己设计模式的应用程序。
(4)最佳新人:Solus
Solus操作系统于2015年诞生,并逐渐获得关注,它并不是Debian或Ubuntu的衍生物,而是一个从头开始创建的前瞻性操作系统。为集成GNOME,它搭配了从头开始构建的Budgie桌面环境。
(5)最好的教育操作系统:ezgo Linux
ezgo是一套开源、公益、免费、面向教育的操作系统,基于Linux而开发,它包含有丰富的互动教学软件和开放教材、知识,涵盖了数学、物理、化学、天文、地理、生物、计算机等多个学科。
(6)最好的云操作系统:ChromeOS
Chrome OS是一个为在线活动而设计的基于浏览器的操作系统。它的源码可供所有用户编译,极具吸引力。
(7)最好的笔记本电脑操作系统:UbuntuMATE
Ubuntu MATE是一个轻量级的、优秀的操作系统,它还提供很多的内容给用户体验。
(8)最好的旧硬件支持系统:Lubuntu
Lubuntu使用LXDE桌面环境,它是一款适合旧硬件的操作系统。
(9)最好的物联网操作系统:Snappy Ubuntu Core
Snappy Ubuntu Core是最好的物联网以及其他类似设备的基于Linux的操作系统,具有良好的软件管理功能,同时安全性方面相对其他版本有了极大的提升。该操作系统有很大的潜力,将几乎所有的东西都变成智能设备,比如咖啡机、无人驾驶飞机等。
(10)最好的台式机操作系统:Linux Mint Cinnamon
Linux Mint Cinnamon是最好的台式机操作系统,它对硬件强大的笔记本电脑也很适用。
(11)最好的游戏系统:Steam OS
Steam OS操作系统于2015年年底研发成功,主要是为了解决桌面版Linux在游戏方面的缺陷。
(12)最好的隐私保护操作系统:Tails
Tails是基于Debian的设计用来实现隐私保护和匿名化的操作系统。
(13)最好的多媒体制作系统:Ubuntu Studio
多媒体制作是基于Linux的操作系统的主要缺点之一,Linux上却没有像样的音频/视频制作软件,但一个多媒体制作系统需要的不仅仅是像样的应用程序。而Ubuntu Studio操作系统使用Xfce桌面环境并配备了众多的音频、视频和图像编辑等多媒体制作应用程序。
(14)最好的企业级系统:SLE/RHEL
Red Hat Enterprise Linux或者SUSE Linux Enterprise这两个名字是企业级系统的代名词。RHEL最大的优点是稳定、好用。
(15)最好的服务器操作系统:Debian/Cent OS
Debian或Cent OS是较好的服务器操作系统,这些发行版是社区主导的服务器版本,它们有着黄金标准,而且它们的支持周期很长。
(16)最好的移动操作系统:PlasmaMobile
尽管基于Linux的操作系统——Android正在主宰移动领域,但在2015年,KDE社区发布KDE的Plasma Mobile系统,该系统在移动设备上提供传统的Linux桌面应用程序。
(17)最好的ARM设备发行版:Arch Linux ARM
Arch Linux ARM(ALARM)是一个纯粹由社区主导的基于Arch Linux的发行版,这个发行版允许用户安装许多可能在其他发行版上无法获得的应用程序。
2.2.2 Linux软件体系结构
Linux的软件体系结构主要包括:设备驱动程序、内核、系统调用接口(System Call Interface,SCI)、C库、Shell和应用程序六大组成部分,其中内核是所有组成部分中最为基础、最为重要的部分。
1.设备驱动程序
该层的程序主要是和计算机硬件设备打交道,用于控制特定的硬件设备。
2.内核
内核(Kernel)是整个操作系统的核心,控制整个计算机的运行,提供相应的硬件驱动程序、网络接口程序,并管理所有应用程序的执行。Linux内核采用模块化的结构,主要是由C语言编写的,其主要模块包括:存储管理、CPU和进程管理、文件系统管理、设备管理和驱动、网络通信等。Linux内核的源代码通常安装在/usr/src/linux目录,可供用户查看和修改。
3.SCI
系统调用接口层主要是为了给用户空间提供一套标准的系统调用函数来访问Linux。
4.C库
C库层主要存放的是一组预先写好和测试过的可以被程序员直接用来开发软件的函数,为程序员开发程序节省大量的时间。
5.Shell
Shell是Linux系统的用户界面,负责将用户的命令解释为内核能够接受的低级语言,并将操作系统响应的信息以用户能理解的方式显示出来。当用户启动Linux,并成功登录到Linux后,系统就会自动启动Shell。从用户登录到用户退出登录,用户输入的每个命令都要由Shell接收,并由Shell解释输入的命令。如果用户输入的命令正确,Shell会去调用相应的命令或程序,并由内核负责其执行,从而实现用户所要求的功能。
Linux中可使用的Shell有许多种,但各种Shell的最基本功能是相同的,比较常用的Shell如下。
●Bourne Shell(又称B Shell)是最流行的标准Shell之一,几乎所有的UNIX/Linux都支持。不过BShell功能较少,用户界面也不太友好。它由贝尔实验室的S R Bourne开发,并由此得名。
●C Shell,因其语法类似C语言而得此名,C Shell易于使用并且交互性强,由加利福尼亚大学伯克利分校的Bill Joy开发。
●Korn Shell(又称为K Shell)也是常见的标准Shell,由David Korn开发并由此得名。
●Bourne-Again Shell(又称Bash),是专为Linux开发的Shell。它在BShell的基础上增加了许多功能,同时还具有C Shell和K Shell的部分优点。Bash是Linux默认采用的Shell。
Shell不仅是一种交互式命令解释程序,而且还是一种程序设计语言,该部分内容将在第5章进行详细介绍。
6.应用程序
随着Linux的普及和发展,Linux的应用程序还在不断增加,Linux环境下可使用的应用程序种类越来越丰富,数量越来越繁多,主要包括办公软件、多媒体软件、Internet相关软件等,它们有的运行在字符界面,有的运行在X Window图形化用户界面。
Linux的应用程序主要来源于以下几个方面:
●专门为Linux开发的应用程序,如gaim、OpenOffice.org等。
●原本是UNIX的应用程序移植到Linux,如vi。
●原本是Windows的应用程序移植到Linux,如RealOne播放器、Oracle等。
2.2.3 Linux的功能
Linux作为一种操作系统,当然具有操作系统的所有基本功能:CPU管理、存储管理、文件管理以及设备管理,从而实现对整个系统资源的管理。
1.CPU管理
CPU是计算机最重要的资源,对CPU的管理就是操作系统最核心的功能。Linux对CPU的管理主要体现在对CPU运行时间的合理分配管理上。
Linux是多用户多任务的操作系统,主要采用分时方式管理CPU的运行时间,也就是说Linux将CPU的运行时间划分为若干个很短的时间片,CPU依次轮流处理等待完成的任务,每项任务在分配给它的一个时间片内不能执行完成的话,就必须暂时中断,等待下一轮CPU对其进行处理,而此时CPU转向处理另一个任务。由于时间片的时间非常短,在不太长的时间内所有的任务都能被CPU执行到,都有所进展。从人的角度看,CPU在“同时”为多个用户服务,并“同时”处理多项任务。
Linux在分时的基础上,对CPU的管理还涉及CPU的运行时间在各用户或各任务之间的分配和调度,其具体体现为进程和作业的调度和管理。
2.存储管理
存储器分为内存与外存两种,内存用于存放当前执行中的程序代码和正在使用的数据。外存,包括硬盘、软盘、光盘、U盘等设备,主要用来保存数据,这里的存储管理主要是指对内存的管理。
Linux采用虚拟存储技术,也就是利用硬盘的空间来扩充内存空间,从而为程序的执行提供足够的空间。根据程序的局部性原理,Linux环境下任何一个程序执行时,只有那些确实用到的程序段和数据才会被写系统读取到内存中。当一个程序刚被加载执行时,Linux只为它分配虚拟内存空间,而只有当运行到那些必须被用到的程序段和数据时才会为它分配物理内存空间。
Linux遵循页式存储管理机制,虚拟内存和物理内存皆按页为单位加以分割,页的大小固定不变。当需要把虚拟内存中的程序段和数据调入或调出物理内存时,皆是以页为单位进行。虚拟内存中某一页与物理内存中某一页的对照关系保存在页表中。
当物理内存已经全部被占据,而系统又需要将虚拟内存中的部分程序段或数据调入物理内存时,Linux采用最近最少使用(Least Recently Used Algorithm,LRU)算法淘汰的物理页有以下两种处理方法。
●如果此页内容被调入物理内存后没有改动,则直接抛弃。如果今后需要还可以从虚拟内存复制。
●如果此页内容被调入物理内存后改动过,那么系统会将这一页的内容保存到磁盘的交换分区(swap分区)。如果今后需要则从交换分区恢复到物理内存。
3.文件管理
文件管理就是对外存上的数据实施统一管理。外存上所记录的信息,不管是程序还是数据都以文件的形式存在。操作系统对文件的管理依靠文件系统来实现。文件系统对文件存储位置与空间大小进行分配,实施文件的读写操作,并提供文件的保护与共享。
Linux采用的文件系统与Windows完全不同。目前Linux主要采用ext3或ext2文件系统,也可以采用ReiserFS、XJF等文件系统。ext2是所有Linux发行版本的基本文件系统,其方便安全,存取文件的性能也非常好。ext3是ext2的增强版本,它在ext2的基础上加入了记录元数据的日志功能,当系统非正常关机或重新启动后,ext3文件系统能够快速恢复系统。
由于采用了虚拟文件系统(Visual File System)技术,Linux可以支持多种文件系统,其中包括DOS的MS-DOS,Windows 2000的FAT32(在Linux中称之为vfat),光盘的ISO9660,甚至还包括实现网络共享的nfs等文件系统。
所谓虚拟化文件系统是操作系统和真正文件系统之间的接口。它将各种不同文件系统的信息进行转化,形成统一的格式后交给Linux操作系统处理,并将处理结果还原为原来的文件系统格式。对于Linux而言,它所处理的是统一的虚拟文件系统,而不需要知道文件所采用的真实文件系统。
Linux将文件系统通过挂载操作将其放置于某个目录,从而让不同的文件系统结合成为一个整体,可以方便地和其他操作系统共享数据。
4.设备管理
操作系统对计算机所有的外部设备进行统一的分配和控制,对设备驱动、设备分配与共享等操作进行统一的管理。
Linux操作系统把所有外部设备按其数据交换的特性分成以下3大类。
(1)字符设备
字符设备是以字符为单位进行输入/输出的设备,如打印机、显示终端等。字符设备大多连接在计算机的串行接口上。CPU可以直接对字符设备进行读写,而不需经过缓冲区。
(2)块设备
块设备是以数据块为单位进行输入/输出的设备,如磁盘、磁带、光盘等。数据块可以是硬盘或软盘上的一个扇区,也可以是磁带上的一个数据段。数据块的大小可以是512字节、1024字节或者4096字节等。CPU不能直接对块设备进行读写,无论是从块设备读取还是向块设备写入数据都必须首先将数据送到缓冲区,然后以块为单位进行数据交换。
(3)网络设备
网络设备是以数据包为单位进行数据交换的设备,如以太网卡。网络数据传送时必须按照一定的网络协议对数据进行处理,对数据进行压缩后,再加上数据包头和数据包尾形成一个较为安全的传输数据包后,才进行网络传输。
无论是哪种类型的设备,Linux都把它统一当作文件夹处理,只要安装了驱动程序,任何用户都可以像使用文件一样来使用这些设备,而不必知道它们的具体存在形式。