1、描述计算机的组成及其功能。
计算机为现代一种用于高速计算的电子计算机器,可用于进行数值计算、逻辑计算并带有存储记忆功能。
计算机主要由硬件和软件组成。
硬件部分:
计算机硬件主要由五个部分组成分别为:运算器、控制器、存储器、输入设备、输出设备。这五大部件分别对应的不同的功能模块,以此来组成现代计算机。
1)运算器
运算器又名为算计逻辑单元(ALU,Arithmetic Logic Unit),负责完成计算机中的算术运算和逻辑运算。算术运算为:加、减、乘、除以及相应的复合运算。而逻辑运算即为:与、或、非等逻辑运算以及数据的比较和移位等操作。在计算机中任何复杂的运算均能通过转化为算术和逻辑运算来在运算器中执行。
2)控制器
控制器CU(Controller Unit),通常与运算器统称为中央处理器,即CPU,为计算机的核心中枢,负责统筹指挥五大部件的协调工作,保证计算机完成指定要求的工作。控制器一般由指令寄存器、指令译码器、时序电路和控制电路组成,其基本功能为从内存读取指令和执行指令。指示为指示计算机如何工作的一步操作,由操作码和操作数两部分组成。控制器通过地址访问存储器、并一一取出选中的单元指令,分析指令,并根据指定所产生的控制信号作用于其他各部件,来完成指令要求的工作。
3)存储器
存储器主要功能为存储程序和各种数据信息,并能在计算机运行过程中高速,自动地完成程序或数据的存取。计算机的存储器通常包括内存储器和外存储器。内存在计算机主机内,直接与运算器、控制器交换信息,容量体积小,存取速度快,一般只存放那些正在运行的程序和待处理的数据。而外存储器通常以硬盘等形式表现而存在,作为内存储器的延伸,用来存放一些系统必须使用,但又不急于使用的程序和数据,这些程序和数据必须调入内存才能够执行。外存储器通常读取数据较慢,但容量大,可以长时间保存大量信息。
4)输入设备
用来向计算机输入各种原始数据和程序的设备叫输入设备。输入设备把各种形式的信息,如数字、文字、图像等转换为数字形式的“编码”,即计算机能够识别的用1和0表示的二进制代码(实际上是电信号),并把它们“输入”(INPUT)到计算机内存储起来。键盘是必备的输入设备、常用的输入设备还有鼠标器、图形输入板、视频摄像机等。
5)输出设备
从计算机输出各类数据的设备叫做输出设备。输出设备把计算机加工处理的结果(仍然是数字形式的编码)变换为人或其它设备所能接收和识别的信息形式如文字、数字、图形、声音、电压等。常用的输出设备有显示器、打印机、绘图仪等。
软件部分:
主要分为系统软件和应用软件
系统软件:
系统软件(system software):用来运行或控制硬件所开发的计算机软件,如操作系统、编译器、数据库等等
常见的系统软件包含:
操作系统(Operating system):控制与管理硬件及软件资源,并提供用户操作接口,完成人机交互的软件,常见的有Unix、GNU/Linux、 MAC OS X、Microsoft Windows等
编译器(compiler):将使用汇编语言编写的代码,转换成计算机可识别的机器语言,常见的有GCC
解释器(interpreter):将高级编程语言一行一行解释运行。它的好处是可以消除编译整个程序的负担,缺点则是运行速度比较缓慢,且使用解释器的代码在运行过程中,不可脱离解释器。常见的使用解释器的语言包括Perl、Python、Ruby等
连接器(linker):将由汇编器或编译器产生的目标文件和外部程序库链接为一个可执行文件
加载器(loader):负责将程序加载到内存中,并配置内存与相关参数,使之能够运行
应用软件
应用软件(application software):为了某种特定用途而被开发的软件。它可以是一个特定的程序,也可以是一个由众多独立程序组成的庞大的软件系统
2、描述内核功能以及作用
1、Linux内核的核心功能
如下图所示,Linux内核只是Linux操作系统一部分。对下,它管理系统的所有硬件设备;对上,它通过系统调用,向Library Routine(例如C库)或者其它应用程序提供接口。
因此,其核心功能就是:管理硬件设备,供应用程序使用。而现代计算机(无论是PC还是嵌入式系统)的标准组成,就是CPU、Memory(内存和外存)、输入输出设备、网络设备和其它的外围设备。所以为了管理这些设备,Linux内核提出了如下的架构。
2、Linux内核的整体架构
2.1整体架构和子系统划分
上图说明了Linux内核的整体架构。根据内核的核心功能,Linux内核提出了5个子系统,分别负责如下的功能:
1. Process Scheduler,也称作进程管理、进程调度。负责管理CPU资源,以便让各个进程可以以尽量公平的方式访问CPU。
2. Memory Manager,内存管理。负责管理Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用Memory的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。
3. VFS(Virtual File System),虚拟文件系统。Linux内核将不同功能的外部设备,例如Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。这就是Linux系统“一切皆是文件”的体现(其实Linux做的并不彻底,因为CPU、内存、网络等还不是文件,如果真的需要一切皆是文件,还得看贝尔实验室正在开发的"Plan 9”的)。
4. Network,网络子系统。负责管理系统的网络设备,并实现多种多样的网络标准。
5. IPC(Inter-Process Communication),进程间通信。IPC不管理任何的硬件,它主要负责Linux系统中进程之间的通信。
2.2 进程调度(Process Scheduler)
进程调度是Linux内核中最重要的子系统,它主要提供对CPU的访问控制。因为在计算机中,CPU资源是有限的,而众多的应用程序都要使用CPU资源,所以需要“进程调度子系统”对CPU进行调度管理。
进程调度子系统包括4个子模块(见下图),它们的功能如下:
1. Scheduling Policy,实现进程调度的策略,它决定哪个(或哪几个)进程将拥有CPU。
2. Architecture-specific Schedulers,体系结构相关的部分,用于将对不同CPU的控制,抽象为统一的接口。这些控制主要在suspend和resume进程时使用,牵涉到CPU的寄存器访问、汇编指令操作等。
3. Architecture-independent Scheduler,体系结构无关的部分。它会和“Scheduling Policy模块”沟通,决定接下来要执行哪个进程,然后通过“Architecture-specific Schedulers模块”resume指定的进程。
4. System Call Interface,系统调用接口。进程调度子系统通过系统调用接口,将需要提供给用户空间的接口开放出去,同时屏蔽掉不需要用户空间程序关心的细节。
2.3 内存管理(Memory Manager, MM)
内存管理同样是Linux内核中最重要的子系统,它主要提供对内存资源的访问控制。Linux系统会在硬件物理内存和进程所使用的内存(称作虚拟内存)之间建立一种映射关系,这种映射是以进程为单位,因而不同的进程可以使用相同的虚拟内存,而这些相同的虚拟内存,可以映射到不同的物理内存上。
内存管理子系统包括3个子模块(见下图),它们的功能如下:
1. Architecture Specific Managers,体系结构相关部分。提供用于访问硬件Memory的虚拟接口。
2. Architecture Independent Manager,体系结构无关部分。提供所有的内存管理机制,包括:以进程为单位的memory mapping;虚拟内存的Swapping。
3. System Call Interface,系统调用接口。通过该接口,向用户空间程序应用程序提供内存的分配、释放,文件的map等功能。
2.4 虚拟文件系统(Virtual Filesystem, VFS)
传统意义上的文件系统,是一种存储和组织计算机数据的方法。它用易懂、人性化的方法(文件和目录结构),抽象计算机磁盘、硬盘等设备上冰冷的数据块,从而使对它们的查找和访问变得容易。因而文件系统的实质,就是“存储和组织数据的方法”,文件系统的表现形式,就是“从某个设备中读取数据和向某个设备写入数据”。
随着计算机技术的进步,存储和组织数据的方法也是在不断进步的,从而导致有多种类型的文件系统,例如FAT、FAT32、NTFS、EXT2、EXT3等等。而为了兼容,操作系统或者内核,要以相同的表现形式,同时支持多种类型的文件系统,这就延伸出了虚拟文件系统(VFS)的概念。VFS的功能就是管理各种各样的文件系统,屏蔽它们的差异,以统一的方式,为用户程序提供访问文件的接口。
我们可以从磁盘、硬盘、NAND Flash等设备中读取或写入数据,因而最初的文件系统都是构建在这些设备之上的。这个概念也可以推广到其它的硬件设备,例如内存、显示器(LCD)、键盘、串口等等。我们对硬件设备的访问控制,也可以归纳为读取或者写入数据,因而可以用统一的文件操作接口访问。Linux内核就是这样做的,除了传统的磁盘文件系统之外,它还抽象出了设备文件系统、内存文件系统等等。这些逻辑,都是由VFS子系统实现。
VFS子系统包括6个子模块(见下图),它们的功能如下:
1. Device Drivers,设备驱动,用于控制所有的外部设备及控制器。由于存在大量不能相互兼容的硬件设备(特别是嵌入式产品),所以也有非常多的设备驱动。因此,Linux内核中将近一半的Source Code都是设备驱动,大多数的Linux底层工程师(特别是国内的企业)都是在编写或者维护设备驱动,而无暇估计其它内容(它们恰恰是Linux内核的精髓所在)。
2. Device Independent Interface, 该模块定义了描述硬件设备的统一方式(统一设备模型),所有的设备驱动都遵守这个定义,可以降低开发的难度。同时可以用一致的形势向上提供接口。
3. Logical Systems,每一种文件系统,都会对应一个Logical System(逻辑文件系统),它会实现具体的文件系统逻辑。
4. System Independent Interface,该模块负责以统一的接口(快设备和字符设备)表示硬件设备和逻辑文件系统,这样上层软件就不再关心具体的硬件形态了。
5. System Call Interface,系统调用接口,向用户空间提供访问文件系统和硬件设备的统一的接口。
2.5 网络子系统(Net)
网络子系统在Linux内核中主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其它系统的功能。在Linux内核中,网络子系统几乎是自成体系,它包括5个子模块(见下图),它们的功能如下:
1. Network Device Drivers,网络设备的驱动,和VFS子系统中的设备驱动是一样的。
2. Device Independent Interface,和VFS子系统中的是一样的。
3. Network Protocols,实现各种网络传输协议,例如IP, TCP, UDP等等。
4. Protocol Independent Interface,屏蔽不同的硬件设备和网络协议,以相同的格式提供接口(socket)。
5. System Call interface,系统调用接口,向用户空间提供访问网络设备的统一的接口。
3、按系列罗列常见Linux的发行版,并描述不同发行版之间的联系与区别。
什么是Linux
Linux
是一种自由和开放源代码的类Unix操作系统。该操作系统的内核由Linus Torvalds于1991年10月5日首次发布。根据其发布的内核(kernel)搭配上GNU上的应用程序,成为了当今世界上运用领域最广泛、使用人数最多的操作系统。通常情况下,Linux被打包成供个人计算机和服务器使用的Linux发行版。
Linux发行版包含Linux内核和支撑内核的实用程序和库,通常还带有大量可以满足各类需求的应用程序。个人计算机使用的Linux发行版通常包含X Window和一个相应的桌面环境,如GNOME或KDE.
什么是Linux发行版
Linux发行版(Linux distribution)
是一种为一般用户预先集成好的Linux操作系统及各种应用软件。一般不需要用户重新编译,在直接安装之后,只需要作出小幅度的更改设置即可。Linux发行版通常包含了桌面环境、办公包、媒体播放器、数据库等应用软件。这些操作系统通常使用Linux、以及来自GNU计划的软件、和基于X Window的图形界面组成。
Linux发行版通常分为商业发行版和社区发行版。也有少部分既不属于发行版又不属于社区发行版,其中最有名的是Slackware.
著名的Linux发行版
按照程序包管理器的不同,通常Linux的发行版也被分成了不同的派系。
首先说一下什么是程序包管理器
程序本身是由二进制程序、配置文件、库文件以及帮助文件组成的。有时候我们发现,可能一个程序会有很多文件,非常不利于安装卸载管理,于是,又产生了程序包管理器。
程序包管理器的作用:
– 1)程序的组成文件打包成一个或有限几个文件;
– 2) 安装;
– 3) 卸载;
– 4) 查询;
因此,我们可以划分出如下的谱系
Redhat系
| 名称 | 基于 | 特点 |
| ———— |:————-:| —–: |
| Red Hat Enterprise | RPM管理包 | 红帽的商业版本
提供10年服务支持高|
| CentOS | RedHat | 根据RHEL代码编译的社区版
文档充足 |
| Fedora | RedHat |红帽官方的社区版
RH公司新技术测试平台 |
**Slackware系**
| 名称 | 基于 | 特点 |
| ———— |:————-:| —–:|
| Slackware | SLS | UNIX风格的Linux发行版
KISS(简洁)的设计理念|
| SUSE | Slackware | 界面华丽
照顾欧洲人的使用习惯 |
| opensuse | SUSE |suse的社区版 |
**Debian系**
| 名称 | 基于 | 特点 |
| ———— |:————-:| —–:|
| Debian | Dpkg管理包 | 一直为社区版
限制较少
功能较多
要求技术较高 |
| Adamantix | Debian | 关注安全 |
| Knoppix | Debian |对硬件支持极佳
对中日韩环境不够友好 |
| Gnoppix | Knoppix | Knoppix的GNOME版 |
| Ubuntu | Debian | 界面华丽
与Debian、GNOME开源社区关系紧密
有资金支持
|
| Linux Mint | Ubuntu | Ubuntu的衍生版
开箱即用 |
| Ubuntu Kylin | Ubuntu | 中文定制版 |
| BackTrack | Ubuntu | 专业安全检测操作系统
已不再维护 |
| Kali Linux | BackTrack | BackTrack替代者
安全渗透软件 |
其他
| 名称 | 基于 | 特点 |
| ———— |:————-:| —–:|
| Gentoo | Portage管理包 | 大量程序开放源代码
对硬件要求较高|
| ArchLinux | pacman管理包 | 软件更新速度快
包管理简易高效 |
| LFS(Linux From scratch) | |高端玩法
DIY系统 |
发行版之间的不同
在Linux发行版中,通常均使用软件包管理系统,不同的操作系统,软件包管理系统也不尽相同。比较常见的软件包管理系统有以下几种
– dpkg:一般为Debian系使用,前端管理工具为apt-get
– rpm(The RPM Package Manager):一般为Red Hat系使用,S.u.S.E也有使用,前端工具包含多种:
yum:作为RHEL及CentOS的前端工具
dnf:作为Fedora的前端工具
ZYpper:作为S.u.S.E及opensuse的前端工具
urpmi:作为Mandriva Linux及Mageia的前端工具
4、描述常见的开源协议(GPL,LGPL, BSD,Apache等)以及开源协议的区别
BSD开源协议(original BSD license、FreeBSD license、Original BSD license)
BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由
的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。
但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开
发自己的产品时,需要满足三个条件:
如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。如果再发布
的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布
代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而
很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在
必要的时候可以修改或者二次开发。
Apache Licence 2.0(Apache License, Version 2.0、Apache License, Version
1.1、Apache License, Version 1.0)
Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样
鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足
的条件也和BSD类似:
需要给代码的用户一份Apache Licence,如果你修改了代码,需要在被修改的文件中说明。
在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他
原来作者规定需要包含的说明。
如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。
你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。
Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需
要并作为开源或商业产品发布/销售。
GPL(GNU General Public License)
我们很熟悉的Linux就是采用了GPL。GPL协议和BSD,Apache Licence等鼓励代码重用的
许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但
不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种
linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软
件了。
GPL协议的主要内容是只要在一个软件中使用(”使用”指类库引用,修改后的代码或者衍生代
码)GPL协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的
”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。
由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源
代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。
其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。
LGPL(GNU Lesser General Public License)
LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之
GPL类库的的软件必须采用GPL协议不同。LGPL允许商业软件通过类库引用(link)方式使用LGPL
类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用
并发布和销售。
但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生
的代码都必须采用LGPL协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,
但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。
GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品
MIT(MIT)
MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他了限制.也就是说,你必
须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。
5、描述Linux的哲学思想,并按照自己的理解对其进行解释性描述。
一切皆文件
把几乎所有资源统统抽象为文件形式,包括硬件设备,甚至通信接口等 比如说:
物理终端:/dev/console
虚拟终端:/dev/tty#(#为1~6)
串行终端:/dev/ttyS#
伪终端:/dev/pts/#
把所有资源抽象成文件,不仅便于理解,且有助于管理
单一目的的小程序
一个程序只做一件事
组合小程序完成复杂任务
复杂的任务由多个程序组合完成
尽量避免跟用户交互
易于以编程的方式实现自动化任务
使用文本文件保存配置信息
文本是最易于实现的底层接口表现形式。通过文本保存,就可以使用文本编辑器实现大多数程序的管理工作
提供机制,而非策略
机制,是实现某个功能需要的原语操作和结构
策略,是某功能的具体实现
提供机制,而非策略,指的就是要给用户充分的自主可调配性
6、描述linux目录结构以及目录结构命名规定。
Linux发行版的基本目录名称:
Linux目录结构
/bin 存放系统命令
/boot 存放着系统的启动文件和内核
/dev 设备文件主目录(设备不在这里,具体设备息/proc目录中)
/proc 系统进程和系统硬件信息
/etc 系统 主配置文件 主目录
(windows下安装QQ,安装目录在E:盘,C盘也会写入相应的QQ软件信息
c盘的QQ文件称之为主配置文件(系统文件)---/etc)
/var 系统配置文件主目录
(E盘的QQ安装目录的文件称之为配置文件(功能型文件)---/var)
/home 普通用户的家目录
/lib&lib64 系统库文件存放的目录 .dll
/usr 系统帮助文档以及源码包安装位置 源码包不属于RedHat,属于广大的爱好开发者
usr目录是最庞大的目录,要用的应用程序和文件几乎都在这个目录
/sbin 超级用户使用的命令存放的目录
/mnt 用户挂载目录
/run 存放当前运行程序库的目录(当前运行的目录)
/root 超级用户root家目录
/tmp 临时文件存放目录 系统启动过程中会产生一些临时文件,这些临时文件就存放在tmp目录下
如果说tmp目录没有存储空间,系统一定启动不起来
/media 可移动介质挂载点
/opt 第三方应用程序文件存放目录
命名法则及规定:
文件命令规则:
1、除了/(根目录)之外,所有的字符都合法。
2、有些字符最好不用,如空格符、制表符、退格符和字符@#¥()- 等。
3、避免使用 ▪ 作为普通文件名的第一个字符。
4、大小写敏感。
变量命名规则:
1)变量名必须有一定的意义,并且意义准确。例如有一个变量用于保存图书的数目,可以命名为number_of_book或者num_of_book。不建议使用i,因为它没有意义。也不建议使用number或book,因为意义不准确。
2)不建议大小写混用。如定义一个计数变量,int nCount;这在Windows中是一个很好的变量名,其中nCount的首字母n用来说明这个变量的类型是int。但在Linux下不建议大小写混合使用,一般标识符只由小写字母,数字和下划线构成。
3)在失去意义的情况下,尽量使用较短的变量名。例如有一个变量,用于暂时存储一个计数值,把变量命名为tmp_count显然要比this_is_a_temperary_counter好。
4)不采用匈牙利命名法表示变量的类型。如int nCount;n用于说明变量的类型,在Linux中不建议这样命名变量。
5)函数名应该以动词开头,因为函数是一组具有特定功能的语句块。比如一个函数,它用于取得外部输入的数值,则可以命名为get_input_number。
6)尽量避免使用全局变量