- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
xlanchen@2008.4.9 Linux内核源代码导读 Linux内核源代码导读 中国科学技术大学计算机系 陈香兰(0551-3606864) xlanchen@ /~xlanchen Spring 2009 进程(任务管理) 主要内容 进程描述符 进程切换 进程的创建和删除 进程的概念 进程是执行程序的一个实例 进程和程序的区别 几个进程可以并发的执行一个程序 一个进程可以顺序的执行几个程序 进程描述符 为了管理进程,内核必须对每个进程进行清晰的描述。 进程描述符提供了内核所需了解的进程信息 源码include/linux/sched.h定义struct task_struct 数据结构很庞大 Linux2.6进程的状态 进程状态转换图 标识一个进程 使用进程描述符地址 进程和进程描述符之间有非常严格的一一对应关系,使得用32位进程描述符地址标识进程非常方便 使用PID (Process ID,PID) 每个进程的PID都存放在进程描述符的pid域中 进程和进程的内核堆栈 Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构: Thread_info 进程的内核堆栈 进程处于内核态时使用不同于用户态堆栈 内核控制路径所用的堆栈很少,因此对栈和描述符来说,8KB足够了 Thread_union C语言允许用如下的一个union结构来方便的表示这样的一个混合体 进程描述符的分配/回收/访问 Thread_info的分配/回收/访问 alloc_thread_info free_thread_info 从当前内核堆栈获得当前thread_info 根据thread_info描述符和内核态堆栈之间的配对,内核可以很容易的从esp寄存器的值获得当前在CPU上运行的进程的描述符指针 因为这个内存区是8KB=213大小,内核必须做的就是让esp有13位的有效位,以获得thread_info的基地址 current宏进程描述符 考虑对应的x86_write_percpu的使用情况 Current宏的使用 Current宏可以看成当前进程的进程描述符指针,在内核中直接使用 比如current-pid返回在CPU上正在执行的进程的PID 进程的PID 进程的pid字段 Pid的管理和分配 创建一个进程时, Pid名字空间 Pid位图 Pid数据结构 最初的pid名字空间 2.6内核为PID专门引入了一个数据结构 Why? 独立的进程;进程组;sessions 使用pid数字的注意之处 考虑进程的删除和创建 阅读alloc_pid、 alloc_pidmap函数 进程链表 为了对给定类型的进程(比如所有在可运行状态下的进程)进行有效的搜索,内核维护了几个进程链表 所有进程链表 进程链表中的插入和删除 使用常规list数据结构操作 list_add list_add_tail list_del list_move list_empty list_for_each list_for_each_prev list_for_each_safe list_for_each_entry … 例如,在do_fork调用的copy_process中 for_each_process宏扫描整个进程链表 TASK_RUNNING状态的进程组织 对可运行队列的一些操作函数 底层:常规的list数据结构操作 入列出列等操作: dequeue_task enqueue_task const struct sched_class,调度类 rt_sched_class fair_sched_class idle_sched_class 每个cpu有一个运行队列 运行队列数据结构 struct cfs_rq struct rt_rq 调度类 阅读调度类sched_class的定义源码 找到主要与运行队列有关的 enqueue_task、dequeue_task Idle相关:idle_sched_class no enqueue/yield_task for idle tasks dequeue_task_idle Fair相关 enqueue_task_fair dequeue_task_fair Rt相关 enqueue_task_rt dequeue_task_rt Idle类特殊 Fair类 Rt类 激活一个任务 activate_task pidhash表及链接表 在一些情况下,内核必须能从进程的PID得出对应的进程描述符指针。例如kill系统调用 为了加速查找,引入了pid_hash散列表 pidhash表及链接表 进程之间的亲属关系 程序创建的进程具有父子关系,在编程时往往需要引用这样的父
文档评论(0)