- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验名称: 内核代码分析
一、实验目的:
掌握如何查看内核代码,进行深入研究分析。
二、实验要求
通过阅读源代码,分析研究linux 的进程调度策略和算法。
要求以源码(V2.4)为依据,回答下面的问题:
1. 进程调度队列是如何组织的?
2. 三种调度类型(SCHED_FIFO, SCHED_RR, SCHED_OTHER)的实现过程是怎样的?【注:
不同版本的内核对调度类型的定义有差异,例如2.6 的调度类型增加为4 种,任意给出
三种即可】
3. 优先级是如何定义和动态变化的?
4. 时间片是怎样赋值的?它与优先级的关系是怎样的?
5. 对实时进程和多CPU 是如何支持的?
6. 评价linux 的调度策略;假设一种应用场景,在此场景下提出改进意见。(选作)
提示:重点分析内核数据结构task_struct (在include/linux/sched.h 中)和调度函
数schedule() (在kernel/sched.c 中)
使用 source Insight 或者其它工具找出代码之间的依赖关系,可参考互联网相关代码
分析资料
以源码为依据,写出关于上述问题的分析报告。
实验步骤
1、重点分析内核数据结构 task_struct (在include/linux/sched.h 中)和调度函数
schedule()
Linux 的进程管理由进程控制块、进程调度、中断处理、任务队列、定时器、bottom
half 队列、系统调用、进程通信等等部分组成。Linux 系统的进程控制块用数据结构
task_struct 表示,这个结构体包含了一个进程所需的所有信息。它定义在
include/linux/sched.h 文件中。每个进程都会被分配一个task_struct 结构,它包含
了这个进程的所有信息,在任何时候操作系统都能跟踪这个结构的信息。
①、进程状态主要有如下:
TASK_RUNNING 正在运行或在就绪队列run-queue 中准备运行的进程,实际参与进程调度。
TASK_INTERRUPTIBLE 处于等待队列中的进程,待资源有效时唤醒,也可由其它进程通过信号
或定时中断唤醒后进入就绪队列run-queue 。
TASK_UNINTERRUPTIBLE 处于等待队列的进程,待资源有效时唤醒,不也可由其它进程通过信
号或者定时中断唤醒。
TASK_ZOMBIE 表示进程结束但尚未消亡的一种状态(僵死) ,此时,进程已经结束运行并且已经释
放了大部分资源,但是尚未释放进程控制块。
TASK_STOPPED 进程暂停,通过其它进程的信号才能唤醒。
源代码如下:
②、内核数据结构task_struck 源码和相关解释:
struct task_struct {
/*
* offsets of these are hardcoded elsewhere - touch with care
*/
volatile long state; /* -1 unrunnable, 0 runnable, 0 stopped */
//说明了该进程是否可以执行,还是可中断等信息
unsigned long flags; /* per process flags, defined below */
//Flage 是进程号,在调用fork()时给出
int sigpending;
//进程上是否有待处理的信号
mm_segment_t addr_limit; /* thread address space:
0-0xBFFFFFFF for user-thead
0-0xFFFFFFFF for kernel-thread
*/
//进程地址空间,区分内核进程与普通进程在内存存放的位置不同
struct exec_domain *exec_domain;
volatile long need_resched;
//调度标志,表示该进程是否需要重新调度,若非 0,则当从内核态返回到用
户态,会发生调度
unsigned long ptrace;
int lock_depth; /* Lock depth */ //锁深度
/*
* offset 32 begi
文档评论(0)