此篇文章主要会带你介绍Linux操作系统,包括Linux本身、Linux怎样使用、以及系统调用和Linux是怎样工作的。

Linux简介

UNIX是一个交互式系统,用于同时处理多进程和多用户同时在线。为何要说UNIX,那是由于Linux是由UNIX发展而至的,UNIX是由程序员设计,它的主要服务对象也是程序员。Linux承继了UNIX的设计目标。从智能手机到车辆,超级计算机和家用家电,从家用台式机到企业服务器,Linux操作系统无处不在。

大多数程序员都喜欢让系统尽量简单,典雅并具有一致性。举个反例,从最底层的角度来讲,一个文件应当只是一个字节集合。为了实现次序存取、随机存取、按键存取、远程存取只能是阻碍你的工作。相同的,假如命令

ls A*

意味着只列举以A为开头的所有文件,这么命令

rm A*

应当会移除所有以A为开头的文件而不是只删掉文件名是A*的文件。这个特点也是最小食惊原则(principleofleastsurprise)

最小食惊原则一半常用于用户界面和软件设计。它的原型是:该功能或则特点应当符合用户的预期,不应当使用户倍感震惊和惊讶。

一些有经验的程序员一般希望系统具有较强的功能性和灵活性。设计Linux的一个基本目标是每位应用程序只做一件事情并把他做好。所以编译器只负责编译的工作,编译器不会形成列表,由于有其他应用比编译器做的更好。

好多人都不喜欢冗余,为何在cp能够描述清楚你想干哪些时侯还使用copy?这完全是在浪费宝贵的hackingtime。为了从文件中提取所有包含字符串ard的行,Linux程序员应当输入

grep ard f

Linux插口

Linux系统是一种金字塔模型的系统,如下所示

linux操作系统分区_linux分区操作命令_linux操作系统分区类型

应用程序发起系统调用把参数放到寄存器中(有时侯置于栈中),并发出trap系统深陷指令切换用户态至内核态。由于不能直接在C中编撰trap指令,因而C提供了一个库,库中的函数对应着系统调用。有些函数是使用汇编编撰的,而且还能从C中调用。每位函数首先把参数放到合适的位置之后执行系统调用指令。因而假如你想要执行read系统调用的话,C程序会调用read函数库来执行。这儿顺便提一下,是由POSIX指定的库插口而不是系统调用插口。也就是说,POSIX会告诉一个标准系统应当提供什么库过程,它们的参数是哪些,它们必须做哪些以及它们必须返回哪些结果。

不仅操作系统和系统调用库外,Linux操作系统还要提供一些标准程序,例如文本编辑器、编译器、文件操作工具等。直接和用户打交道的是里面那些应用程序。因而我们可以说Linux具有三种不同的插口:系统调用插口、库函数插口和应用程序插口

Linux中的GUI(GraphicalUserInterface)和UNIX中的特别相像,这些GUI创建一个桌面环境,包括窗口、目标和文件夹、工具栏和文件拖放功能。一个完整的GUI还包括窗口管理器以及各类应用程序。

linux操作系统分区类型_linux操作系统分区_linux分区操作命令

Linux上的GUI由X窗口支持,主要组成部份是X服务器、控制按键、鼠标、显示器等。当在Linux上使用图形界面时,用户可以通过键盘点击运行程序或则打开文件,通过拖放将文件进行复制等。

Linux组成部份

事实上,Linux操作系统可以由下边这几部份构成

Shell

虽然Linux应用程序提供了GUI,而且大部份程序员仍偏好于使用命令行(command-lineinterface),称为shell。用户一般在GUI中启动一个shell窗口之后就在shell窗口下进行工作。

linux分区操作命令_linux操作系统分区类型_linux操作系统分区

shell命令行使用速率快、功能更强悍、而且便于扩充、并且不会带来肢体重复性胃炎(RSI)。

下边会介绍一些最简单的bashshell。当shell启动时,它首先进行初始化,在屏幕上输出一个提示符(prompt),一般是一个百分号或则欧元符号,等待用户输入

linux分区操作命令_linux操作系统分区_linux操作系统分区类型

等用户输入一个命令后,shell提取其中的第一个词,这儿的词指的是被空格或制表符分隔开的一连串字符。假设这个词是即将运行程序的程序名,这么都会搜索这个程序,假若找到了这个程序都会运行它。之后shell会将自己挂起直至程序运行完毕,然后再尝试读入下一条指令。shell也是一个普通的用户程序。它的主要功能就是读取用户的输入和显示估算的输出。shell命令中可以包含参数,它们作为字符串传递给所调用的程序。诸如

cp src dest

会调用cp应用程序并包含两个参数src和dest。这个程序会解释第一个参数是一个早已存在的文件名,之后创建一个该文件的副本,名称为dest。

并不是所有的参数都是文件名,例如下边

head -20 file

第一个参数-20,会告诉head应用程序复印文件的前20行,而不是默认的10行。控制命令操作或则指定可选值的参数称为标志(flag),依照惯例标志应当使用-来表示。这个符号是必要的,例如

head 20 file

是一个完全合法的命令,它会告诉head程序输出文件名为20的文件的前10行,之后输出文件名为file文件的前10行。Linux操作系统可以接受一个或多个参数。

为了更容易的指定多个文件名,shell支持魔法字符(magiccharacter),也被称为键值(wildcards)。例如,*可以匹配一个或则多个可能的字符串

ls *.c

告诉ls列列举所有文件名以.c结束的文件。若果同时存在多个文件,则会在旁边进行并列。

另一个键值是问号,负责匹配任意一个字符。一组在中括弧中的字符可以表示其中任意一个,为此

ls [abc]*

会列列举所有以a、b或则c开头的文件。

shell应用程序不一定通过终端进行输入和输出。shell启动时,才会获取标准输入、标准输出、标准错误文件进行访问的能力。

标准输出是从鼠标输入的,标准输出或则标准错误是输出到显示器的。许多Linux程序默认是从标准输入进行输入并从标准输出进行输出。诸如

sort 

会调用sort程序,会从终端读取数据(直至用户输入ctrl-d结束),按照字母次序进行排序,之后将结果输出到屏幕上。

一般还可以重定向标准输入和标准输出,重定向标准输入使用进行重定向。容许一个命令中重定向标准输入和输出。诸如命令

sort out

会使sort从文件in中得到输入,并把结果输出到out文件中。因为标准错误没有重定向,所以错误信息会直接复印到屏幕上。从标准输入读入,对其进行处理并将其写入到标准输出的程序称为过滤器。

考虑下边由三个分开的命令组成的指令

sort temp;head -30 <temp;rm temp

首先会调用sort应用程序,从标准输入in中进行读取,并通过标准输出到temp。当程序运行完毕后,shell会运行head,告诉它复印前30行虚拟主机 linux,并在标准输出(默认为终端)上复印。最后,temp临时文件被删掉。轻轻的,你走了linux操作系统分区,你挥一挥袖子,不带走一片云彩。

命令行中的第一个程序一般会形成输出,在前面的事例中,形成的输出都不temp文件接收。但是,Linux还提供了一个简单的命令来做这件事,比如下边

sort <in | head -30

里面|称为竖线符号,它的意思是从sort应用程序形成的排序输出会直接作为输入显示,无需创建、使用和移除临时文件。由管线符号联接的命令集合称为管线(pipeline)。诸如如下

grep cxuan *.c | sort | head -30 | tail -5 >f00

对任意以.t结尾的文件中包含cxuan的行被讲到标准输出中,之后进行排序。那些内容中的前30行被head下来并传给tail,它又将最后5行传递给foo。这个事例提供了一个管线将多个命令联接上去。

可以把一系列shell命令放到一个文件中,之后将此文件作为输入来运行。shell会依照次序对她们进行处理linux操作系统分区,如同在按键上键入命令一样。包含shell命令的文件被称为shell脚本(shellscripts)。

推荐一个shell命令的学习网站:

shell脚本当然也是一段程序,shell脚本中可以对变量进行形参,也包含循环控制句子诸如if、for、while等,shell的设计目标是让其看上去和C相像(ThereisnodoubtthatCisfather)。因为shell也是一个用户程序,所以用户可以选择不同的shell。

Linux应用程序

Linux的命令行也就是shell,它由大量标准应用程序组成。那些应用程序主要有下边六种

不仅这种标准应用程序外,还有其他应用程序例如Web浏览器、多媒体播放器、图片浏览器、办公软件和游戏程序等。

我们在前面的事例中早已见过了几个Linux的应用程序,例如sort、cp、ls、head,下边我们再来认识一下其他Linux的应用程序。

我们先从几个事例开始讲起,例如

cp a b

是将a复制一个副本为b,而

mv a b

是将a联通到blinux查看端口占用,并且删掉原文件。

前面这两个命令有一些区别,cp是将文件进行复制,复制完成后会有两个文件a和b;而mv相当于是文件的联通,联通完成后就不再有a文件。cat命令可以把多个文件内容进行联接。使用rm可以删掉文件;使用chmod可以容许所有者改变访问权限;文件目录的的创建和删掉可以使用mkdir和rmdir命令;使用ls可以查看目录文件,ls可以显示好多属性,例如大小、用户、创建日期等;sort决定文件的显示次序

Linux应用程序还包括过滤器grep,grep从标准输入或则一个或多个输入文件中提取特定模式的行;sort将输入进行排序并输出到标准输出;head提取输入的前几行;tail提取输入的前面几行;除此之外的过滤器还有cut和paste,容许对文本行的剪切和复制;od将输入转换为ASCII;tr实现字符大小写转换;pr为低格复印输出等。

程序编译工具使用gcc;

make命令用于手动编译,这是一个很强悍的命令,它用于维护一个大的程序,常常这类程序的源码由许多文件构成。典型的,有一些是headerfiles头文件,源文件一般使用include指令包含那些文件,make的作用就是跟踪什么文件属于头文件,之后安排手动编译的过程。

下边列举了POSIX的标准应用程序

程序应用

ls

列举目录

cp

复制文件

head

显示文件的前几行

make

编译文件生成二补码文件

cd

切换目录

linux操作系统分区类型_linux分区操作命令_linux操作系统分区

mkdir

创建目录

chmod

更改文件访问权限

ps

列举文件进程

pr

低格复印

rm

删掉一个文件

rmdir

删掉文件目录

tail

提取文件最后几行

tr

字符集转换

grep

分组

cat

将多个文件连续标准输出

od

linux操作系统分区类型_linux分区操作命令_linux操作系统分区

以八补码显示文件

cut

从文件中剪切

paste

从文件中粘贴

Linux内核结构

在前面我们看见了Linux的整体结构,下边我们从整体的角度来看一下Linux的内核结构

linux操作系统分区_linux分区操作命令_linux操作系统分区类型

内核直接位于在硬件上,内核的主要作用就是I/O交互、内存管理和控制CPU访问。上图中还包括了中断和调度器,中断是与设备交互的主要方法。中断出现时调度器都会发挥作用。这儿的低级代码停止正在运行的进程,将其状态保存在内核进程结构中,并启动驱动程序。进程调度也会发生在内核完成一些操作而且启动用户进程的时侯。图中的调度器是dispatcher。

注意这儿的调度器是dispatcher而不是scheduler,这三者是有区别的

scheduler和dispatcher都是和进程调度相关的概念,不同的是scheduler会从几个进程中随便选定一个进程;而dispatcher会给scheduler选择的进程分配CPU。

之后,我们把内核系统分为三部份。

从图中可以看出I/O层次的关系,最高层是一个虚拟文件系统,也就是说不管文件是来自显存还是c盘中,都是经过虚拟文件系统中的。从底层看,所有的驱动都是字符驱动或则块设备驱动。两者的主要区别就是是否容许随机访问。网路驱动设备并不是一种独立的驱动设备,它实际上是一种字符设备,不过网络设备的处理方法和字符设备不同。

里面的设备驱动程序中,每位设备类型的内核代码都不同。字符设备有两种使用方法,有一键式的诸如vi或则emacs,须要每一个按键输入。其他的例如shell,是须要输入一行按回车键将字符串发送给程序进行编辑。

网路软件一般是模块化的,由不同的设备和合同来支持。大多数Linux系统在内核中包含一个完整的硬件路由器的功能,而且这个不能和外部路由器相比,路由器里面是合同栈,包括TCP/IP合同,合同栈里面是socket插口,socket负责与外部进行通讯,充当了门的作用。

c盘驱动里面是I/O调度器,它负责排序和分配c盘读写操作,以尽可能降低盘片的无用联通。

在内核最顶楼的是系统调用插口,所有的系统调用都是经过这儿,系统调用会触发一个trap,将系统从用户态转换为内核态,之后将控制权移交给前面的内核部件。

良许个人陌陌

添加良许个人陌陌即送3套程序员必看资料

→精选技术资料共享

→高手如云交流社群

本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!

本文原创地址:https://www.linuxprobe.com/gylczxtdyxxz.html编辑:刘遄,审核员:暂无