Linux内核子系统
一、进程管理
进程与程序:
程序: 存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体。
进程: 是一个执行中的程序,它是动态的实体。
进程四要素:
a、有一段程序供其执行。这段程序不一定是某个进程所专有,可以与其他进程共用。
b、有进程专用的内核空间堆栈。
c、在内核中有一个task_struct数据结构,即通常所说的“进程控制块”。有了这个数据结构,进程才能成为内核调度的一个基本单位接受内核的调度。
d、有独立的用户空间。
1、进程调度 ----从就绪的进程中选出最适合的一个来执行。
进程调度涉及到的内容:
a、调度策略
SCHED_ NORMAL(SCHED_OTHER):普通的分时进程。
SCHED_FIFO:先入先出的实时进程。
SCHED_RR:时间片轮转的实时进程。
SCHED_BATCH:批处理进程。
SCHED_IDLE:只在系统空闲时才能够被调度执行的进程。
b、调度时机----即schedule()函数什么时候被调用。
主动式调度:
在内核中直接调用schedule()。当进程需要等待资源等而暂时停止运行时,会把自己的状态置于挂起(睡眠),并主动请求调度,让出CPU。
范例:
i、current->state = TASK_INTERRUPTIBLE;
ii、schedule();
被动式调度: 被动式调度又名:抢占式调度。分为:用户态抢占(Linux2.4、Linux2.6)和内核态抢占(Linux2.6)。
用户态抢占: 用户抢占发生在
i、从系统调用返回用户空间。
ii、从中断处理程序返回用户空间。
用户态抢占缺陷:
进程/线程一旦运行到内核态,就可以一直执行,直到它主动放弃或时间片耗尽为止。这样会导致一些非常紧急的进程或线程将长时间得不到运行,降低整个系统的实时性。
改进方式: 允许系统在内核态也支持抢占,更高优先级的进程/线程可以抢占正在内核态运行的低优先级进程/线程。
内核态抢占: 内核抢占可能发生在
i、中断处理程序完成,返回内核空间之前。
ii、当内核代码再一次具有可抢占性的时候,如解锁及使能软中断等。
c、调度步骤
Schedule函数工作流程如下:
i、清理当前运行中的进程;
ii、选择下一个要运行的进程;
iii、设置新进程的运行环境;
iv、进程上下文切换 。
二、内存管理
内存管理子系统的职能:
1、虚拟内存地址与物理内存地址之间的映射
地址映射管理包括两部分:
i、虚拟内存空间分布----用户空间,运行应用程序,内核空间(直接映射区 、vmalloc区 、永久映射区、固定映射区)
ii、虚拟地址转化为物理地址
2、物理内存的分配
Linux使用虚拟内存,因此程序中分配的都是虚拟地址,只有访问虚拟地址时,才会为其分配物理内存。 当获取到虚拟地址时,并不会为其分配物理内存。
当调用malloc函数时,只是分配了一个虚拟地址,当向其中写入数据时才会分配物理内存。
当使用 kmalloc 函数时,不仅为其分配虚拟地址,同时还会为其分配物理内存地址。
注:kmalloc申请空间是不用经过请页异常的,返回的虚拟地址已经对应了物理内存。Kmalloc可以分配到连续的物理内存,vmalloc分配的是非连续的物理内存。
三、虚拟文件系统
虚拟文件系统(VFS)是linux内核和具体I/O设备之间的封装的一层共通访问接口,通过这层接口,linux内核可以以同一的方式访问各种I/O设备。
虚拟文件系统(VFS)是linux内核和存储设备之间的抽象层,主要有以下好处:
--简化了应用程序的开发:应用通过统一的系统调用访问各种存储介质;
--简化了新文件系统加入内核的过程:新文件系统只要实现VFS的各个接口即可,不需要修改内核部分。
虚拟文件系统的4个主要对象
1、超级块
超级块(super_block)主要存储文件系统相关的信息,这是个针对文件系统级别的概念。
它一般存储在磁盘的特定扇区中,但是对于那些基于内存的文件系统(比如proc,sysfs),超级块是在使用时创建在内存中的。
超级块的定义在:<linux/fs.h>
2、索引节点
索引节点是VFS中的核心概念,它包含内核在操作文件或目录时需要的全部信息。
一个索引节点代表文件系统中的一个文件(这里的文件不仅是指我们平时所认为的普通的文件,还包括目录,特殊设备文件等等)。
索引节点和超级块一样是实际存储在磁盘上的,当被应用程序访问到时才会在内存中创建。
索引节点定义在:<linux/fs.h>
3、目录项
和超级块和索引节点不同,目录项并不是实际存在于磁盘上的。
在使用的时候在内存中创建目录项对象,其实通过索引节点已经可以定位到指定的文件,
但是索引节点对象的属性非常多,在查找,比较文件时,直接用索引节点效率不高,所以引入了目录项的概念。
路径中的每个部分都是一个目录项,比如路径: /mnt/cdrom/foo/bar 其中包含5个目录项,/ mnt cdrom foo bar
每个目录项对象都有3种状态:被使用,未使用和负状态
-- 被使用:对应一个有效的索引节点,并且该对象由一个或多个使用者
-- 未使用:对应一个有效的索引节点,但是VFS当前并没有使用这个目录项
-- 负状态:没有对应的有效索引节点(可能索引节点被删除或者路径不存在了)
目录项的目的就是提高文件查找,比较的效率,所以访问过的目录项都会缓存在slab中。
4、文件对象
文件对象表示进程已打开的文件,从用户角度来看,我们在代码中操作的就是一个文件对象。
文件对象反过来指向一个目录项对象(目录项反过来指向一个索引节点)
其实只有目录项对象才表示一个已打开的实际文件,虽然一个文件对应的文件对象不是唯一的,但其对应的索引节点和目录项对象却是唯一的。
文件对象的定义在: <linux/fs.h>
四、设备管理与驱动
设备分类:字符设备、块设备、网络设备
1、 字符设备
--是指每次与系统传输1个字符的设备
-- 字符设备通常为传真、虚拟终端和串口调制解调器、键盘之类设备提供流通信服务
--字符设备在实现时,大多不使用缓存器。系统直接从设备读取或者写入每一个字符
例如,键盘这种设备提供的就是一个数据流,当你敲入“abcdefg这个字符串时,键盘驱动程序会按照和输入完全相同的顺序返回这个由七个字符组成的数据流。它们是顺序的,先返回a,最后是g
2、块设备
-- 是指与系统间用块的方式移动数据的设备。如硬盘、CD-ROM和内存区域
--块设备通常支持随机存取和寻址,并使用缓存器
--操作系统为输入输出分配了缓存以存储一块数据。当程序向设备发送了读取或者写入数据的请求时,系统把数据中的每一个字符存储在适当的缓存中
--当缓存被填满时,会采取适当的操作(把数据传走),而后系统清空缓存
--它与字符设备不同之处就是其一般支持随机存储,而字符型是流形式,逐一存储
3、网络设备
它提供了对网络的访问,这是一个通过物理适配器和一种特定的协议(IP协议)进行的。网络设备打破了unix的“所有东西都是文件”的设计原则,它不是通过设备节点来访问,而是通过套接字API这样的特殊接口来访问。