Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 133 additions & 3 deletions docs/operating-system/linux.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,66 @@
![Linux](https://user-gold-cdn.xitu.io/2018/7/3/1645eeb8e843f29d?w=426&h=240&f=png&s=32650)


### 1.3 操作系统的内核

**图源:
[简书](https://www.jianshu.com/p/85e931636f27) (如有侵权,请联系俺,俺会立刻删除)**

操作系统的内核是操作系统的核心部分。
它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。

我们常说的Linux,其实是指基于Linux内核开发的操作系统。
常见的Linux系统发行版有:Debian,RedHat,Ubuntu,Suse,Centeos等等。

### 操作系统的用户态与内核态

unix与linux的体系架构:分为用户态与内核态。
用户态与内核态与内核态是操作系统对执行权限进行分级后的不同的运行模式。

![用户态与内核态](../../media/pictures/linux/用户态与内核态.png)

#### 为什么要有用户态与内核态?
在cpu的所有指令中,有些指令是非常危险的,如果使用不当,将会造成系统崩溃等后果。
为了避免这种情况发生,cpu将指令划分为**特权级(内核态)指令**和**非特权级(用户态)指令。**

**对于那些危险的指令只允许内核及其相关模块调用,对于那些不会造成危险的指令,就允许用户应用程序调用。**

* 内核态(核心态,特权态): **内核态是操作系统内核运行的模式。**
内核态控制计算机的硬件资源,如硬件设备,文件系统等等,并为上层应用程序提供执行环境。

* 用户态: **用户态是用户应用程序运行的状态。**
应用程序必须依托于内核态运行,因此用户态的态的操作权限比内核态是要低的,
如磁盘,文件等,访问操作都是受限的。

* 系统调用: 系统调用是操作系统为应用程序提供能够访问到内核态的资源的接口。

#### 用户态切换到内核态的几种方式
* 系统调用: 系统调用是用户态主动要求切换到内核态的一种方式,
用户应用程序通过操作系统调用内核为上层应用程序开放的接口来执行程序。

* 异常: 当cpu在执行用户态的应用程序时,发生了某些不可知的异常。
于是当前用户态的应用进程切换到处理此异常的内核的程序中去。

* 硬件设备的中断: 当硬件设备完成用户请求后,会向cpu发出相应的中断信号,
这时cpu会暂停执行下一条即将要执行的指令,转而去执行与中断信号对应的应用程序,
如果先前执行的指令是用户态下程序的指令,那么这个转换过程也是用户态到内核台的转换。

#### 物理内存RAM(Random Access Memory 随机存储器)
物理内存是计算机的实际内存大小,它直接与CPU交换数据,也被称为主存。

#### 虚拟内存(Virtual Memory)
**虚拟内存是操作系统为了更高效率使用物理内存的一种概念,它是对物理内存的抽象。**
windows上的虚拟内存和Linux上的swap交换空间都是虚拟内存的一种实现技术。

#### Swap交换空间
简单理解: 当某个应用程序所需的内存空间不够了,
那么系统会判断当前物理内存是否还有足够的空闲可以分配给应用程序。
如果有,则应用程序直接进入内存运行;如果没有,系统就根据某种算法(如:LRU)挂起一个进程,
将挂起的进程交换到虚拟内存Swap中等待,并将应用程序调入内存执行。
虚拟内存是被虚拟出来的,可以使用硬盘(不仅仅是硬盘)来作为虚拟内存。

这就是为什么当我们运行一个所需内存比我们计算机内存还大的程序时,仍然可以正常运行,并感受不到内存的限制的原因。

## 二 初探Linux

### 2.1 Linux简介
Expand Down Expand Up @@ -84,11 +144,81 @@

也就是说在LINUX系统中有一个重要的概念:**一切都是文件**。其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。

### 3.2 Inode
inode是linux/unix文件系统和硬盘存储的基础,如果理解了inode,
将会对我们学习如何将复杂的概念抽象成简单概念有重大帮助。

#### Inode是什么?有什么作用?
文件存储在硬盘上,硬盘的最小存储单位是扇区(Sector),每个扇区存储512字节(0.5kb)。
操作系统读取硬盘的数据时,不会一个扇区一个扇区的读取,这样做效率较低,而是**一次读取多个扇区,
即一次读取一个块(block)。块由多个扇区组成,是文件读取的最小单位,块的最常见的大小是4kb,
约为8个连续的扇区组成。文件数据存储在块中,**
但还需要一个空间来存储文件的元信息metadata,如文件拥有者,创建时间,权限,大小等。
这种**存储文件元信息的区域就叫inode,译为索引节点。 每个文件都有一个inode,存储文件的元信息。
使用 stat 命令可以查看文件的inode信息。每个inode都有一个号码,
Linux/Unix操作系统不使用文件名来区分文件,而是使用inode号码区分不同的文件。**

**inode也需要消耗硬盘空间,所以在格式化硬盘的时候,操作系统会将硬盘分为2个区域,
一个区域存放文件数据,另一个区域存放inode所包含的信息,
存放inode的区域被称为inode table。**

文件的inode信息:

![文件inode信息](../../media/pictures/linux/文件inode信息.png)


### 3.3 文件类型与目录结构

**Linux支持很多文件类型,其中非常重要的文件类型有:
普通文件,目录文件,链接文件,设备文件,管道文件,Socket套接字文件等。

![文件类型](https://camo.githubusercontent.com/3d2c05419cb1f93fae15869cfc541c2bb3d5674b/68747470733a2f2f757365722d676f6c642d63646e2e786974752e696f2f323031382f372f332f313634356631613764363464656631613f773d39303126683d35343726663d706e6726733d3732363932)

- 普通文件: 普通文件是指txt,html,pdf等等的这样应用层面的文件类型,
用户可以根据访问权限对普通文件进行访问,修改和删除。

- 目录文件: 目录也是一种文件,打开目录实际上是打开目录文件。
目录文件包含了它目录下的所有文件名以及指向这些文件的指针。

![目录文件](../../media/pictures/linux/目录文件.png)

- 链接文件: 链接文件分为符号链接(软链接)文件和硬链接文件

- 硬链接(Hard Link):硬链接的文件拥有相同的inode,因为操作系统是靠inode来区分文件的,
2个inode相同的文件,就代表它们是一个文件。
删除一个文件并不会对其他拥有相同inode的文件产生影响,只有当inode相同的所有文件被删除了,
这个文件才会被删除。换言之,你建立一个文件的硬链接,这个文件和硬链接它们的inode是相同的,
无论你删除的是硬链接还是源文件,都不会对彼此造成影响,除非你把硬链接和源文件都删除,
这个文件才被删除。

- 符号链接(软链接)(Symbolic Link): 符号链接类似于Windows上的快捷方式,它保存了源文件的路径。
当符号链接被删除时,并不会影响源文件。但是当源文件被删除时,符号链接就找不到源文件了。

软链接和硬链接:

![软链接和硬链接](../../media/pictures/linux/软链接和硬链接.png)

- 设备文件
设备文件分为块设备文件和字符设备文件,设备文件一般存于/dev目录下。

- 字符设备文件: **字符设备是依照先后顺序被存取数据的设备,通常不支持随机存取,
此类设备可以按字节/字符来读取数据,** 如键盘,串口等等。

- 块设备文件: **块设备是可以被随机存取数据的设备,应用程序可以访问块设备上任何一块位置。
块设备以块的方式读取数据,在windows下也称为簇,块设备不支持字符的方式寻址。**
如硬盘,软盘,光碟等等。

**字符设备与块设备最根本的区别就是它们是否可以被随机访问。**
如键盘,当我们在键盘上敲下一个单词: "word"的时候,
那么系统肯定是需要按照顺序来进行读取word的字节流(字符流)的,随机访问在此时是没有意义的。

- 管道文件: 管道文件一般用于进程间通信,使用mkfifo命令可以创建一个管道文件。

- Socket套接字文件: 套接字文件被用于网络进程之间的通信,既可以使2台不同的机器进行通信,也可以用于本机的Socket网络程序。

### 3.2 文件类型与目录结构

**Linux支持5种文件类型 :**
![文件类型](https://user-gold-cdn.xitu.io/2018/7/3/1645f1a7d64def1a?w=901&h=547&f=png&s=72692)
### Linux目录树
所有可操作的计算机资源都存在于目录树这个结构中,对计算资源的访问,可以看做是对这棵目录树的访问。

**Linux的目录结构如下:**

Expand Down
Loading