linux 概述
linux系统的抽象表示
用户进程
图形用户界面 服务器 命令行
linux内核
系统调用 进程管理 内存管理 设备驱动程序
硬件
中央处理器CPU 主内存RAM 硬盘 网络端口
内核和用户进程之间最主要的区别是: 内核在内核模式(kernel mode)中运行,而用户进程 则在用户模式(user mode)中运行。在内核模式中运行的代码可以不受限地访问中央处理器和内 存,
内核
我们之所以介绍主内存和状态,是因为内核的几乎所有操作都和主内存相关。其中之一是将 内存划分为很多区块,并且一直维护着这些区块的状态信息。每一个进程拥有自己的内存区块, 且内核必须确保每个进程只使用它自己的内存区块。 15
内核负责管理以下四个方面。
- 进程:内核决定哪个进程可以使用CPU。
- 内存:内核管理所有的内存,为进程分配内存,管理进程间的共享内存以及空闲内存。
- 设备驱动程序:作为硬件系统(如磁盘)和进程之间的接口,内核负责操控硬件设备。
- 系统调用和支持:进程通常使用系统调用和内核进行通信。
进程管理
进程管理涉及进程的启动、暂停、恢复和终止。
一个 进程让出CPU使用权给另一个进程称为上下文切换
内核负责上下文切换。我们来看看下面的场景,以便理解它的工作原理。
- CPU为每个进程计时,到时即停止进程,并切换至内核模式,由内核接管CPU控制权。
- 内核记录下当前CPU和内存的状态信息,这些信息在恢复被停止的进程时需要用到。
- 内核执行上一个时间段内的任务(如从输入输出设备获得数据,磁盘读写操作等)。
- 内核准备执行下一个进程,从准备就绪的进程中选择一个执行。
- 内核为新进程准备CPU和内存。
- 内核将新进程执行的时间段通知CPU。
- 内核将CPU切换至用户模式,将CPU控制权移交给新进程。
内存管理
内核在上下文切换过程中管理内存,这是一项十分复杂的工作,因为内核要保证以下所有条件
- 内核需要自己的专有内存空间,其他的用户进程无法访问;
- 每个用户进程有自己的专有内存空间;
- 一个进程不能访问另一个进程的专有内存空间;
- 用户进程之间可以共享内存;
- 用户进程的某些内存空间可以是只读的;
- 通过使用磁盘交换,系统可以使用比实际内存容量更多的内存空间。
新型的CPU提供了MMU(Memory Management Unit,内存管理单元),MMU使用了一种叫 作虚拟内存的内存访问机制,即进程不是直接访问内存的实际物理地址,而是通过内核使得进程 看起来可以使用整个系统的内存。
设备驱动程序和设备管理
对于设备来说,内核的角色比较简单。通常设备只能在内核模式中被访问(例如用户进程请求内核关闭系统电源),因为设备访问不当有可能会让系统崩溃。另一个原因是不同设备之间没有一个统一的编程接口,即使同类设备也如此,比如两个不同的网卡。所以设备驱动程序传统意义上来说是内核的一部分,它们尽可能为用户进程提供统一的接口,以简化开发人员的工作
系统调用和系统支持
内核还对用户进程提供其他功能。例如,系统调用(system call或syscall)为进程执行一些 它们不擅长或无法完成的工作。打开、读取和写文件这些操作都涉及系统调用。
fork()和exec()这两个系统调用对于我们了解进程如何启动很重要。
- fork():当进程调用fork()时,内核创建一个和该进程几乎一模一样的副本。
- exec():当进程调用exec(program)时,内核启动program来替换当前的进程。
一个简单的例子是你在命 令行运行ls命令来显示目录内容
shell -> fork() -> shell
|
v
copy of shell -> exec(ls) -> ls
用户空间
前面提到过,内核分配给用户进程的内存我们称之为用户空间。因为一个进程简单说就是内 存中的一个状态。用户空间也可以指所有用户进程占用的所有内存。(用户空间还有一个不太正 式的名称,叫userland。)
用户
Linux内核支持用户这一Unix的传统概念。一个用户代表一个实体,它有权限运行用户进程, 对文件拥有所有权。