Linux基本概念

一、操作系统的两种含义:

(1)完整的软件包,包括用来管理及算计的核心曾软件,以及附带的所有标准软件工具,例如命令行解释器、GUI、文件操作工具和文本编辑器等。

(2)更狭义地,是指管理和分配计算机资源(CPU, RAM和设备)的核心层软件。

“内核”和本书中的“操作系统”通常是指第二种含义。


二、操作系统(内核)的职能:

(1)进程调度。Linux属于抢占式多任务管理系统,多任务指多个进程可同时驻留于内存。哪个进程能使用CPU、使用多久。都由内核调度进程决定。

(2)内存管理。虚拟内存的优势如下:

  • 使进程之间相互隔离,进程与内核间相互隔离。
  • 只需将进程的一部分保持在内存中,可降低每个进程对内存的需求。且能加载更多进程到内存中。使得任意时刻RAM中至少有一个执行的进程的几率增大,提高CUP使用率。
(3)提供了文件系统。内核在在磁盘之上提供有文件系统,允许对文件执行创建、获取、更新以及删除。
(4)创建和终止进程。运行中的程序称为进程。一旦进程执行完毕,内核还要确保释放其占用的资源。
(5)管理对设备的访问。提供对外设的访问接口,还要仲裁多个进程对同一个设备的访问。
(6)联网。内核一用户进程的名义收发网络消息(数据包)。该任务包括将网络数据包路由至目标系统。
(7)提供API。
(8)类似LInux的多任务系统会为每个用户营造一种抽象:虚拟私有计算机。每个进程都以为只有自己在使用计算机,运转与虚拟地址空间中。用户和进程往往不知道内核的调度。


三、用户态和核心态。
在用户态上运行时,CPU只能访问被标记为用户空间的内存,如果访问内核空间中的内存会引发硬件异常。在内核态中运行时,CPU可访问内核空间内存,也能访问用户空间内存。有些操作仅在内核态中运行时能进行,如使用halt(宕机)操作关闭系统,以及一系列对硬件的操作。

四、进程的特点:不知道自己在RAM中的位置,也不知道自己是在磁盘的交换空间中还是在内存中。也不知道何时能用CPU……进程间不能直接通信(IPC由内核执行),进程本身不能创建出新进程,也不能时自己结束运行。相反的是内核。所有诸如“创建新进程”、“使用exit()终止进程”的语句,都是进程请求内核去做的。

五、
(1)shell是一种具有特殊用途的程序主要用于读取用户输入命令,并执行相应的程序相应命令。也称命令解释器。

(2)”登录shell“ 指的是用户刚登录时,有系统创建,用以运行shell的进程。

(3)对UNIX而言,shell只是一个用户进程。一台计算机的不同用户可使用不同种类的shell。

六、用户。
(1)系统会对每个用户的身份做唯一标识,用户可隶属于多个组。
(2)系统的每个用户都拥有唯一的登录名(用户名)和与之相对应的整数型用户ID(UID)。
(3)密码文件 /etc/passwd中,记录了如下信息:
  • 组ID:用户所属第一个组的整数型组ID。
  • 主目录:用户登录后所处于的初始目录。
  • 登录shell:执行以解释用户命令的程序名称。
七、用户。
(1)每个用户组都对应着系统组文件/etc/group中的一行记录,包含如下信息:
  • 组名:(唯一的)组名称。
  • 组ID(GID):与组相关的整数型ID。
  • 用户列表lushly该组的用户登录名列表
(2)超级用户。在系统中享有特权。其帐号的用户ID为0,通常登录名为root。在一般的UNIX系统中,超级用户凌驾于系统的权限检查之上。可以访问系统的任何文件,也能发送信号干预系统运行的所有用户进程。系统管理员可使用超级用户帐号来执行各种系统管理任务。

八、单根目录层级、目录、链接及文件。
(1)内核维护着一套单根目录结构,以放置系统的所有文件。(与Windows鲜明对比)。
(2)在Linux中,一切皆文件。目录都是一种特殊类型的文件。
(3)目录是一种特殊文件,内容采用表格形式,数据相包括文件名以及相对应文件的引用。这种”文件名+引用“的组合称为链接。
(4)每个目录至少包含两个记录:.和..,前者是指向目录自身的链接,后者是指向其上级目录——父目录的链接。
(5)除了根目录外,每个目录都由父目录。对根目录而言,..就是指向自身的链接。因此/..等于/ 。

九、符号链接是一种特殊标记的文件,一个符号就对应了目录中内容为”文件名+指针“的一条记录,指针指向的文件内容为另一个文件名的字符串。

十、避免使用“-”作为文件名的起始字符。因为shell命令中会被误认为命令行选项开关。文件名不可使用"/"和空字符"\0"。在特殊文件名前应该用"\"进行转义。

十一、文件的所有权和权限。
(1)每个文件都有一个与之相关的用户ID和组ID,分别定义文件的属主和属组。系统根据文件的所有权来判定用户对文件的访问权限。
(2)为了访问文件,系统把文件分为了3类:文件的属主(有时也称文件的用户)、与文件组ID相匹配的属组成员以及其他用户。可为以上三类用户分别设置3种权限(共9种权限位):读,写,执行。


十二、文件I/O模型。
(1)在UNIX中,同一套系统调用(open()、read()、write()、close())等所执行的I/O操作,可施之于所有文件类型,包括设备文件在内。(应用程序发起的I/O请求,内核会将其转化为相应的文件系统操作,或者设备驱动程序操作,以此来执行针对目标文件或设备的I/O操作。)因此采用这些系统调用的策划嗯需能够处理任何类型文件。
(2)就本质而言,内核只提供字节序列流这一种文件类型,可通过lseek()系统调用来随机访问磁盘文件、磁盘或磁带设备。
(3)许多程序和函数库都将新行符(ASCII:10)作为文本中一行的结束和另一行的开始。
(4)Linux中没有文件结束符的概念,宕读取文件时无返回数据,便认为到达文件末尾。


十四、文件描述符。
(1)I/O系统调用使用文件描述符(往往数值很少的)非负整数来指待打开的文件。获取文件描述符常用手法是使用open()。
(2)通常由shell启动的进程会继承3个已打开的文件描述符:描述符0为标准输入,指代为进程输入的文件;1为标准输出,指代供进程写入输出的文件;2为标准错误,指代供进程写入错误消息或者异常通告的文件。在交互式shell或程序中,上述三者一般都指向终端。在stdio函数库中,这几种描述符分别与文件流stdin、stdout、stderr相对应。
(3)文件指针指向一个FILE结构体,这个结构体里面有一个元素就是文件描述符。文件指针不是唯一的,文件描述符是唯一的。

十五、程序。
(1)过滤器。从stdin读取输入,加以转换,再将转换后的数据输出到stdout,常常将拥有上述行为的程序称为过滤器,cat、grep、sort、wc、sed、awk均在其列。

十六、命令行参数。C语言可以访问命令行参数。把main函数作如下声明即可。
int main(int argc, char* argv[]);
argc表示参数个数,argv数组成员指向各个参数字符串,argv[0]则指向程序名本身。

十七、进程是正在执行的程序实例,内核会将程序代码载入虚拟内存。程序终止时,内核会释放所有其占用的资源,供其它进程重新使用。

十八、进程可使用系统调用fork()来创建一个新进程。内核通过复制附近成来创建子进程。在刚刚完成复制后,可把子进程看作父进程的一个副本(数据段、栈段、堆段数据都相等),随后,子进程可修改这些内容,不会影响父进程(在内存中被标记为只读的程序文本则由父、子进程共享)。随后子进程常常会使用execve()去加载并执行一个全新程序。exected()会销毁原有的文本段、数据段、栈段、和堆段,并根据新程序的代码,创建新段来替换他们。C语言库中提供了一系列作用和execve()类似的函数,都已exec()开头,统称exec(),但实际上并不存在名为exec()的库函数。


十九、进程ID和父进程ID。
(1)终止进程的两个方法:
  • 进程通过_exit()系统调用(或相关的exit()库函数),请求退出。
  • 向进程传递信号,将其“杀死”。
(2)终止进程后,会生成一个“终止状态”——一个非负小整数,供父进程的wait()系统调用检测。一般0表示正常终止,非零标识有错误发生,大多数shell会将迁移执行程序的终止状态保存在shell变量$?中。

二十、init进程。init进程是“所有进程之父”,init进程的创建文件为/sbin/init。系统的所有进程都是由init或其后代(fork())创建出来的。init进程的进程号总为1,且总是以超级用户权限运行。init进程不能被杀死(超级用户也不能),只有关闭系统才能终止init进程。init的主要任务是创建并监控系统运行所需的一系列进程。


二十一、守护进程。
(1)“长生不老”。在系统引导时启动,直至系统关闭前一直存在。
(2)在后台运行,无控制终端供其读取或写入数据。

二十二、环境列表。每个进程都有一份环境列表,即在进程用户空间中维护的一组环境变量。列表其中每个元素都由一个名称及其相关值组成。在大多数shell中,可使用export命令来创建环境变量(C shell 使用setenv命令),如下所示:
$ export MYVAR = 'Hello world'
变量HOME定义了用户登录目录的路径名、变量PATH指明了用户输入命令后shell查找与之对应程序时所搜索的目录列表。

二十三、资源限制。使用setrlimit(),可为自己消耗的各类资源设定一个上限。软限制限制了进程可以消耗的资源总量,硬限制是软限制的调整上限。非特权用户可在[0~硬限制]之间调整软限制,但硬限制只能调低,不能调高。fork()创建的新进程会继承父进程的对资源限制。使用ulimit命令可调整shell的资源限制。shell为执行命令所创建的子进程会继承上述资源设置。

二十四、内存映射。系统函数mmap()会在虚拟地址空间中创建一个新的内存映射。映射分为两类:
(1)文件映射。将文件部分区域映射入调用进程的虚拟内存。映射一旦完成,对文件映射内容的访问则转化为对相应的内存区域的字节操作。映射页面会按需自动从文件中加载。
(2)并无文件的与之对应的匿名映射。其映射页面的内容会被初始化为0。
二十五、多个进程共享统一映射有如下两种方法。
(1)两个进程都针对某一文件的相同部分加以映射。
(2)由fork()创建的子进程自父进程出继承映射。

二十六、静态库。有时也称归档文件,是早期UNIX系统中唯一的一种目标库。是对已编译目标模块的一种结构化整合。要使用静态库中的函数,需要在创建程序的链接命令中指定相应的库。




posted @ 2016-11-03 20:11  sdflyb  阅读(1025)  评论(0编辑  收藏  举报