Linux内核零碎知识
UNIX系统:内核、shell外壳、文件系统、工具或应用程序。
操作系统功能:进程与处理机管理、存储管理、设备管理、作业管理、文件管理。
内存是磁盘的缓存,cache是内存的缓存。
可把内核看作是不断对请求进行响应的服务器,这些请求可能来自在CPU上执行的进程,也可能来自发出中断请求的外部设备。
抢占内核主要特点是:一个在内核态运行的进程,可能在执行内核函数期间被另外一个进程取代。
使内核可抢占的目的是减少用户态进程的分派延迟,即从进程变为可执行状态到它实际开始运行之间的时间间隔。
cs代码段寄存器有两位字段存指明CPU的当前特权级CPL,0为内核态,3为用户态。
esp寄存器是CPU栈指针,用于存放栈顶单元的地址。从用户态切换到内核态后,进程的内核栈总是空的,因此,esp寄存器指向这个栈的顶端。一旦数据写入栈,esp的值递减。
使用联合结构表示一个进程的线程描述符和内核栈:
union thread_union{ struct thread_info thread_info; unsigned long stack[2048]; };
thread_info结构是52字节。
内核使用alloc_thread_info和free_thread_info宏分配和释放存储thread_info结构和内核栈的内存区。
进程最常用的是进程描述符的地址,而不是thread_info结构的地址。为了获得当前在CPU上运行进程的描述符指针,内核要调用current宏,本质上等价于current_thread_info()->task;current->pid返回在CPU上正在执行的进程的PID。
多处理器系统下,有必要把current定义为一个数组,每个元素对应一个可用CPU。
文件描述符:Linux跟踪打开文件而分配的一个数字,类似c语言的句柄。
每运行一个程序时,所有的shell都为其打开三个文件描述符:标准输入0,标准输出1,错误输出2。
不用缓冲的I/O:open read write lseek close提供了不用缓冲的I/O,这些函数都使用文件描述符。
硬件高速缓存Cache:缩小CPU和RAM之间的速度不匹配
IPC进程间通信:管道(速度慢、容量有限)、信号、信号量(同步)、共享内存(速度快)、消息队列(容量有限)、socket。
用户ID标识不同的用户,0为根或超级用户,通常登录名为root。
信号signal:通知进程已发生某种情况的一种技术。
信号量:内核信号量(由内核控制路径使用);System V IPC信号量(由用户态进程使用)。
内核信号量类似于自旋锁,因为当锁关闭着时, 它不允许内核控制路径继续进行。只有睡眠的函数才能获取内核信号量,中断处理程序和可延迟函数都不能使用内核信号量。
自旋锁spin lock是用来在多处理器环境中工作的一种特殊的锁。当发现“上锁”了,则反复执行一条紧凑的循环指令,直到锁被释放。自旋锁的循环指令表示“忙等”。
一般由自旋锁保护的每个临界区都是禁止内核抢占的。
系统中的并发度取决于:同时运转的I/O设备数;进行有效工作的CPU数。