Linux 系统读书笔记

Posted by icoding168 on 2021-03-17 14:21:45

分类: Linux  

Linux可划分为以下四部分:

  • Linux内核
  • GNU工具
  • 图形化桌面环境
  • 应用软件

Linux 内核

Linux系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件, 并根据需要执行软件。

内核主要负责以下四种功能:

  • 系统内存管理
  • 软件程序管理
  • 硬件设备管理
  • 文件系统管理

系统内存管理

内核不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存(即实际并不存在的内存)。 内核通过硬盘上的存储空间来实现虚拟内存,这块区域称为交换空间(swap space)。内核不断地在交换空间和实际的物理内存之间反复交换虚拟内存中的内容,这使得系统以为它拥有比物理内存更多的可用内存。

软件程序管理

Linux操作系统将运行中的程序称为进程。进程可以在前台运行,将输出显示在屏幕上,也 可以在后台运行,隐藏到幕后。内核控制着Linux系统如何管理运行在系统上的所有进程。

内核创建了第一个进程(称为init进程)来启动系统上所有其他进程。当内核启动时,它会 将init进程加载到虚拟内存中。内核在启动任何其他进程时,都会在虚拟内存中给新进程分配一 块专有区域来存储该进程用到的数据和代码。

一些Linux发行版使用一个表来管理在系统开机时要自动启动的进程。在Linux系统上,这个 表通常位于专门文件/etc/inittab中。

另外一些系统(比如现在流行的Ubuntu Linux发行版)则采用/etc/init.d目录,将开机时启动 或停止某个应用的脚本放在这个目录下。这些脚本通过/etc/rcX.d目录下的入口(entry)启动, 这里的X代表运行级(run level)。

硬件设备管理

任何Linux系统需要与之通信的设备,都需要在内核代码中加入其驱动程序代码。驱动程序代码相当于应用程序和硬件设备的中间人,允许内核与设备之 间交换数据。在Linux内核中有两种方法用于插入设备驱动代码:

  • 编译进内核的设备驱动代码 
  • 可插入内核的设备驱动模块

以前,插入设备驱动代码的唯一途径是重新编译内核。每次给系统添加新设备,都要重新编 译一遍内核代码。随着Linux内核支持的硬件设备越来越多,这个过程变得越来越低效。不过好 在Linux开发人员设计出了一种更好的将驱动代码插入运行中的内核的方法。

开发人员提出了内核模块的概念。它允许将驱动代码插入到运行中的内核而无需重新编译内 核。同时,当设备不再使用时也可将内核模块从内核中移走。这种方式极大地简化和扩展了硬件设备在Linux上的使用。

Linux系统将硬件设备当成特殊的文件,称为设备文件。设备文件有3种分类:

  • 字符型设备文件
  • 块设备文件
  • 网络设备文件

字符型设备文件是指处理数据时每次只能处理一个字符的设备。大多数类型的调制解调器和 终端都是作为字符型设备文件创建的。块设备文件是指处理数据时每次能处理大块数据的设备, 比如硬盘。

网络设备文件是指采用数据包发送和接收数据的设备,包括各种网卡和一个特殊的回环设 备。这个回环设备允许Linux系统使用常见的网络编程协议同自身通信。

Linux为系统上的每个设备都创建一种称为节点的特殊文件。与设备的所有通信都通过设 备节点完成。每个节点都有唯一的数值对供Linux内核标识它。数值对包括一个主设备号和一 个次设备号。类似的设备被划分到同样的主设备号下。次设备号用于标识主设备组下的某个特定设备。

文件系统管理

Linux内核支持通过不同类型的文件系统从硬盘中读写数据=,Linux内核采用虚拟文件系统(Virtual File System,VFS)作为和每个文件系统交互的接口。 这为Linux内核同任何类型文件系统通信提供了一个标准接口,当每个文件系统都被挂载和使用 时,VFS将信息都缓存在内存中。

GNU 工具

核心GNU工具

GNU项目的主旨在于为Unix系统管理员设计出一套类似于Unix的环境。这个目标促使该项目 移植了很多常见的Unix系统命令行工具。供Linux系统使用的这组核心工具被称为coreutils(core 5 utilities)软件包。

GNU coreutils软件包由三部分构成:

  • 用以处理文件的工具
  • 用以操作文本的工具
  • 用以管理进程的工具

shell

GNU/Linux shell是一种特殊的交互式工具。它为用户提供了启动程序、管理文件系统中的文 件以及运行在Linux系统上的进程的途径。shell的核心是命令行提示符。命令行提示符是shell负责交互的部分。它允许你输入文本命令,然后解释命令,并在内核中执行。

shell包含了一组内部命令,用这些命令可以完成诸如复制文件、移动文件、重命名文件、显 示和终止系统中正运行的程序等操作。shell也允许你在命令行提示符中输入程序的名称,它会将 程序名传递给内核以启动它。

你也可以将多个shell命令放入文件中作为程序执行。这些文件被称作shell脚本。你在命令行 上执行的任何命令都可放进一个shell脚本中作为一组命令执行。这为创建那种需要把几个命令放 在一起来工作的工具提供了便利。

在Linux系统上,通常有好几种Linux shell可用。不同的shell有不同的特性,有些更利于创建 脚本,有些则更利于管理进程。所有Linux发行版默认的shell都是bash shell。bash shell由GNU项 目开发,被当作标准Unix shell——Bourne shell(以创建者的名字命名)的替代品。bash shell的名 称就是针对Bourne shell的拼写所玩的一个文字游戏,称为Bourne again shell。

除了bash shell,还有其他几种常见的shell:

常用命令

ps

默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进程。

Linux系统中使用的GNU ps命令支持3种不同类型的命令行参数:

  • Unix风格的参数,前面加单破折线;
  • BSD风格的参数,前面不加破折线;
  • GNU风格的长参数,前面加双破折线。

top

ps命令虽然在收集运行在系统上的进程信息时非常有用,但也有不足之处:它只能显示 某个特定时间点的信息。如果想观察那些频繁换进换出的内存的进程趋势,用ps命令就不方便了。而top命令刚好适用这种情况。top命令跟ps命令相似,能够显示进程信息,但它是实时显示的。

top命令输出的第一部分显示的是系统的概况:

第一行显示了当前时间、系统的运行时间、登录的用户数以及系统的平均负载。平均负载有3个值:最近1分钟的、最近5分钟的和最近15分钟的平均负载。值越大说明系统 的负载越高。由于进程短期的突发性活动,出现最近1分钟的高负载值也很常见,但如果近15分 钟内的平均负载都很高,就说明系统可能有问题。

第二行显示了进程概要信息——top命令的输出中将进程叫作任务(task):有多少进程处在 运行、休眠、停止或是僵化状态(僵化状态是指进程完成了,但父进程没有响应)。

下一行显示了CPU的概要信息。top根据进程的属主(用户还是系统)和进程的状态(运行、 空闲还是等待)将CPU利用率分成几类输出。

紧跟其后的两行说明了系统内存的状态。第一行说的是系统的物理内存:总共有多少内存, 当前用了多少,还有多少空闲。后一行说的是同样的信息,不过是针对系统交换空间(如果分配 了的话)的状态而言的。

最后一部分显示了当前运行中的进程的详细列表,有些列跟ps命令的输出类似。

kill

在Linux中,进程之间通过信号来通信。进程的信号就是预定义好的一个消息,进程能识别 它并决定忽略还是作出反应。进程如何处理信号是由开发人员通过编程来决定的。大多数编写完善的程序都能接收和处理标准Unix进程信号。

kill命令可通过进程ID(PID)给进程发信号。默认情况下,kill命令会向命令行中列出的全部PID发送一个TERM信号。要发送进程信号,你必须是进程的属主或登录为root用户。TERM信号告诉进程可能的话就停止运行。不过,如果有不服管教的进程,那它通常会忽略这个请求。