Linux 内核四大核心框架
一、进程调度
1、task_struct 结构在内存的存放与内核栈是不可分离。每个进程都有自己的内核栈。当进程从用户态进入内核时,CPU 就自动地设置该进程的内核栈。也就是讲,CPU 从任务状态段 TSS 中装入内核栈指针 esp。
在 lntel 系统中,栈起始于末端,并朝这个内存区开始的方向增长。进程描述符存放在从 0x018fa000 开始的地址,只要把数据写进栈中,esp 的值就递减。
通过这个联合结构可以看出,内核栈系统规划占用 8KB 内存区。实际上进程 task_struct 结构所占的内存由内核动态分配的,更准确的讲,内核根本不给 task_struct 分配内存,而仅给内核栈分配 8KB 的内存。task_struct 结构大小占用 1K 字节左右,内核栈的大小不能超 7KB(对于内核栈完全足够)。
为何要将内核栈与 task_struct 放在一起有什么好处:
a. 内核可以方便而快速地找到这个结构;
b. 避免在创建进程时动态分配额外的内存;
c. task_struct 结构的起始地址总是开始于页大小(page_size)的边界。
上面这段代码相当一组汇编指令(设置 p 是指向当前进程 task_struct 结构的指针)
movl $0xffffe000,%ecx
andl %esp,%ecx
movl %ecx,p
2、内核线程
内核线程(thread)或叫守护进程(daemon),在 OS 中占据相当大的比例,当 Linux OS 启动之后,尤其是 Xwindows 也启动之后,我们可以用 ps 命令查看系统中的进程,但我们会发现很多以'd'结尾的进程名,这些进程就是内核线程。
内核线程也可以叫做内核任务,它们周期性地执行,比如,磁盘高速缓存的刷新网络连通的维护,页面的换入换出等。
Linux OS 内核线程与普通进程有本质的区别:
a. 内核线程执行的是内核中的函数,而普通进程只有通过系统调用才能够执行内核中的函数;
b. 内核线程只运行在内核戊,而普通进程既可以运行在用户态,也可以运行在内核态;
c. 因为内核线程指只运行在内核态,它只能使用大于 PAGE_OFFSET(3G)的地址空间。另一个方面,不管在用户态还是内核态,普通进程可以使用 4GB 地址空间。
内核线程是由 kernel_thread()函数的内核态下进行创建。系统中大部分的内核线程是在系统的启动过程中建立:的。
3、Linux 调度程序 ---> 基本原理及调度算法
调度的实质就是资源的分配,系统通过不同的调度算法来实现资源分配。非常优先的调度算法考虑因素:公平、高效、周转时间、响应时间、吞量。
调度算法:
a. 时间片轮转调度算法: 时间片(time slice)就是分配给进程运行的一段时间。
b. 优先权调度算法(非抢占式优先权算法、抢占式优先调度算法)
c. 多级反馈队列调度: 这种调度算法本质:综合时间片轮转调度和抢占式优先权调度的优点,
优先权高的进程先运行给定的时间片,相同优先权的里程轮流进行给定时间片。
d. 实时调度(实时系统,就是系统对外部事件有求必应、尽快响应)。
4、Linux 进程何时调度
a. 进程状态转换的时刻:进程终止、进程睡眠;
b. 当前进程的时间片用完;
c. 设备驱动程序;
d. 进程从中断、异常、系统调用返回到用户态时。
二、内存管理
Intel 368 的段机制和页机制是 Linux 实现虚拟存储管理的一种硬件平台。Linux 内存管理主要体现在虚拟内存管理。虚拟内存管理功能:进程保护、内存映射、共享虚拟内存。
Linux 虚拟内存结构见 PDF 文档。
实现虚拟内存组成模块,大部分代码放在/mm 目录的。
因为每个进程可以通过系统调用进入内核,Linux 内核由系统内的所有进程共享。
更多 Linux 内核视频
版权声明: 本文为 InfoQ 作者【hanaper】的原创文章。
原文链接:【http://xie.infoq.cn/article/f1ae36a96f26abb9dca82dcf0】。文章转载请联系作者。
评论