内核

管理和分配计算机资源的核心层软件

  1. 进程调度:计算机内均配备有一个或多个 CPU(中央处理单元),以执行程序指令。Linux 属于抢占式多任务操作系统。“多任务”意指多个进程(即运行中的程序)可同时驻留于内存,且每个进程都能获得对 CPU 的使用权。“抢占”则是指一组规则。这组规则控制着哪些进程获得对 CPU 的使用,以及每个进程能使用多长时间,这两者都由内核进程调度程序(而非进程本身)决定。
  2. 内存管理:内存(RAM)仍然属于有限资源,内核必须以公平、高效地方式在进程间共享这一资源。
  3. 文件系统:内核在磁盘之上提供有文件系统,允许对文件执行创建、获取、更新以及删除等操作。
  4. 设备管理:内核既为程序访问设备提供了简化版的标准接口,同时还要仲裁多个进程对每一个设备的访问。
  5. 网络管理:内核以用户进程的名义收发网络消息(数据包)。

shell

shell 是一种具有特殊用途的程序,主要用于读取用户输入的命令,并执行相应的程序以响应命令。有时,人们也称之为命令解释器。

shell 的种类繁多,登入同一台计算机的不同用户同时可使用不同的 shell

文件I/O

在 Linux 系统中,一切都是“文件”:普通文件、驱动程序、网络通信等等。所有的操作,都是通过“文件 IO”来操作的。Linux 的文件既可以是真实保存到存储介质的文件也可以是自身内核提供的虚拟文件,还可以是设备节点。

同一套系统调用(open()、read()、write()、close()等)所执行的 I/O 操作,可施之于所有文件类型。

应用程序发起的 I/O 请求,内核会将其转化为相应的文件系统操作,或者设备驱动程序操作,以此来执行针对目标文件或设备的 I/O 操作。

C 编程语言在执行文件 I/O 操作时,往往会调用 C 语言标准库的 I/O 函数。也将这样一组I/O 函数称为 stdio 函数库,其中包括 fopen()、fclose()、scanf()、printf()、fgets()、fputs()等。stdio 函数位于 I/O 系统调用(open()、close()、read()、write()等)之上。

内存映射

调用系统函数 mmap()的进程,会在其虚拟地址空间中创建一个新的内存映射。

虚拟内存

虚拟内存的规划之一是将每个程序使用的内存切割成小型的、固定大小的“页”(page)单元。相应地,将 RAM 划分成一系列与虚存页尺寸相同的页帧。任一时刻,每个程序仅有部分页需要驻留在物理内存页帧中。这些页构成了所谓驻留集(resident set)。程序未使用的页拷贝保存在交换区(swap area)内—这是磁盘空间中的保留区域,作为计算机 RAM 的补充— 仅在需要时才会载入物理内存。若进程欲访问的页面目前并未驻留在物理内存中,将会发生页面错误(page fault),内核即刻挂起进程的执行,同时从磁盘中将该页面载入内存。

进程与线程

进程是资源(CPU、内存等)分配的基本单位,线程是CPU调度和分配的基本单位(程序执行的最小单位)。

同一时间,如果CPU是单核,只有一个进程在执行,所谓的并发执行,也是顺序执行,只不过由于切换速度太快,你以为这些进程在同步执行而已。多核CPU可以同一时间点有多个进程在执行。

执行程序时,内核会将程序代码载入虚拟内存,为程序变量分配空间以记录与进程有关的各种信息(比如,进程 ID、用户 ID、组 ID 以及终止状态等)。在内核看来,进程是一个个实体,内核必须在它们之间共享各种计算机资源。对于像内存这样的受限资源来说,内核一开始会为进程分配一定数量的资源,并在进程的生命周期内,统筹该进程和整个系统对资源的需求,对这一分配进行调整。程序终止时,内核会释放所有此类资源,供其他进程重新使用。其他资源(如 CPU、网络带宽等)都属于可再生资源,但必须在所有进程间平等共享。

每个进程都可执行多个线程

可将线程想象为共享同一虚拟内存及一干其他属性的进程。每个线程都会执行相同的程序代码,共享同一数据区域和堆。可是,每个线程都拥有属于自己的栈,用来装载本地变量和函数调用链接信息。

  • 进程间通讯:

    (1)有名管道/无名管道(2)信号(3)共享内存(4)消息队列(5)信号量(6)socket

  • 线程通讯:

    (1)信号量(2)读写锁(3)条件变量(4)互斥锁(5)自旋锁

TTY系列

TTY/Terminal/Console/UART

TTY 用来表示内核的一套驱动系统
Terminal 终端,暗含远端之意,也是一个输入输出设备,可能是真实设备,也可能是虚拟设备
Console 控制台,含控制之意,也是一种Terminal,权限更大,可以查看内核打印信息
UART 串口,它的驱动程序包含在TTY驱动体系之内
设备节点 含义
/dev/ttyS0、/dev/ttySAC0 串口
/dev/tty1、/dev/tty2、/dev/tty3、…… 虚拟终端设备节点
/dev/tty0 前台终端
/dev/tty 程序自己的终端,可能是串口、也可能是虚拟终端
/dev/console 控制台,又内核的cmdline参数确定

proc文件系统

proc 是一个虚拟文件系统,通常作为进程信息的伪文件系统,里面没有真正的文件,但是却包含系统运行信息(系统内存、设备mount、硬件配置)。proc 文件系统可以认为是内核的控制和信息中心,许多的系统应用程序只是简单的对这个文件进行读写使用

命令行参数(argc, argv),阻塞,非阻塞,原子操作等等