linux代码导读-进程管理_第1页
linux代码导读-进程管理_第2页
linux代码导读-进程管理_第3页
linux代码导读-进程管理_第4页
linux代码导读-进程管理_第5页
已阅读5页,还剩58页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux内核源代码导读内核源代码导读 中国科学技术大学计算机系中国科学技术大学计算机系陈香兰(陈香兰(05513606864)http:/ 2009进程(任务管理)进程(任务管理)2022-4-8Linux内核源代码导读内核源代码导读3主要内容主要内容v进程描述符v进程切换v进程的创建和删除2022-4-8Linux内核源代码导读内核源代码导读4进程的概念进程的概念v进程是执行程序的一个实例v进程和程序的区别几个进程可以并发的执行一个程序一个进程可以顺序的执行几个程序2022-4-8Linux内核源代码导读内核源代码导读5进程描述符进程描述符v为了管理进程,内核必须对每个进程进行清晰的描述。

2、v进程描述符提供了内核所需了解的进程信息源码include/linux/sched.h定义struct task_struct数据结构很庞大2022-4-8Linux内核源代码导读内核源代码导读6stack2022-4-8Linux内核源代码导读内核源代码导读7Linux2.6进程的状态进程的状态简单过一下,与状态相关的一些宏简单过一下,与状态相关的一些宏1)组合状态)组合状态2)状态判断)状态判断3)状态设置)状态设置2022-4-8Linux内核源代码导读内核源代码导读8进程状态转换图进程状态转换图EXIT_ZOMBIE或者或者EXIT_DEAD或者或者TASK_DEAD2022-4-8L

3、inux内核源代码导读内核源代码导读9标识一个进程标识一个进程v使用进程描述符地址进程和进程描述符之间有非常严格的一一对应关系,使得用32位进程描述符地址标识进程非常方便v使用PID (Process ID,PID)每个进程的PID都存放在进程描述符的pid域中2022-4-8Linux内核源代码导读内核源代码导读10进程和进程的进程和进程的内核内核堆栈堆栈vLinux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:Thread_info进程的内核堆栈进程处于内核态时使用不同于用户态堆栈内核控制路径所用的堆栈很少,因此对栈和描述符来说,8KB足够了 Thread_in

4、fo 2022-4-8Linux内核源代码导读内核源代码导读11Thread_unionvC语言允许用如下的一个union结构来方便的表示这样的一个混合体2022-4-8Linux内核源代码导读内核源代码导读12v进程描述符的分配/回收/访问vThread_info的分配/回收/访问alloc_thread_infofree_thread_info2022-4-8Linux内核源代码导读内核源代码导读132022-4-8Linux内核源代码导读内核源代码导读14从当前内核堆栈获得当前从当前内核堆栈获得当前thread_infov 根据thread_info描述符和内核态堆栈之间的配对,内核可以

5、很容易的从esp寄存器的值获得当前在CPU上运行的进程的描述符指针v 因为这个内存区是8KB=213大小,内核必须做的就是让esp有13位的有效位,以获得thread_info的基地址2022-4-8Linux内核源代码导读内核源代码导读15current宏进程描述符宏进程描述符2022-4-8Linux内核源代码导读内核源代码导读16可知,从每个可知,从每个cpu相关参数中,相关参数中,把把per_cpu_current_task,取出返回取出返回需要找到该参数的赋值之处!需要找到该参数的赋值之处!2022-4-8Linux内核源代码导读内核源代码导读17v考虑对应的x86_write_pe

6、rcpu的使用情况在在_switch_to中被调用中被调用2022-4-8Linux内核源代码导读内核源代码导读18Current宏的使用宏的使用vCurrent宏可以看成当前进程的进程描述符指针,在内核中直接使用比如current-pid返回在CPU上正在执行的进程的PID2022-4-8Linux内核源代码导读内核源代码导读19进程的进程的PIDv进程的pid字段Pid最大值最大值2022-4-8Linux内核源代码导读内核源代码导读20Pid的管理和分配的管理和分配v创建一个进程时,vPid名字空间do_forkcopy_processalloc_pidStruct pid的的cache

7、2022-4-8Linux内核源代码导读内核源代码导读21vPid位图vPid数据结构对对pid名字空间:名字空间:2.6内核为内核为PID专门引入了一个数据结构,专门引入了一个数据结构,Why? 独立的进程;进程组;独立的进程;进程组;sessions 使用使用pid数字的注意之处数字的注意之处 考虑进程的删除和创建考虑进程的删除和创建2022-4-8Linux内核源代码导读内核源代码导读22最初的最初的pid名字空间名字空间在在kernel_init中,被修改为中,被修改为init进程进程在在start_kernel中,调用中,调用pidmap_init进行合理的初始化进行合理的初始化20

8、22-4-8Linux内核源代码导读内核源代码导读23分配第一个位图页分配第一个位图页初始化初始化struct pid的的cache2022-4-8Linux内核源代码导读内核源代码导读24v2.6内核为PID专门引入了一个数据结构Why?l独立的进程;进程组;sessionsl使用pid数字的注意之处 考虑进程的删除和创建2022-4-8Linux内核源代码导读内核源代码导读25v阅读alloc_pid、 alloc_pidmap函数2022-4-8Linux内核源代码导读内核源代码导读26进程链表进程链表v为了对给定类型的进程(比如所有在可运行状态下的进程)进行有效的搜索,内核维护了几个进

9、程链表v所有进程链表在进程描述符中:2022-4-8Linux内核源代码导读内核源代码导读27v进程链表中的插入和删除使用常规list数据结构操作2022-4-8Linux内核源代码导读内核源代码导读28vlist_addvlist_add_tailvlist_delvlist_movevlist_emptyvlist_for_eachvlist_for_each_prevvlist_for_each_safevlist_for_each_entryv2022-4-8Linux内核源代码导读内核源代码导读29v例如,在do_fork调用的copy_process中vfor_each_proce

10、ss宏扫描整个进程链表2022-4-8Linux内核源代码导读内核源代码导读30TASK_RUNNING状态的进程组织状态的进程组织v对可运行队列的一些操作函数底层:常规的list数据结构操作v入列出列等操作:dequeue_taskenqueue_taskvconst struct sched_class,调度类,调度类rt_sched_classfair_sched_classidle_sched_classv每个每个cpu有一个运行队列有一个运行队列关于调度的描述,关于调度的描述,参见参见sched_coding.txt和和sched-design-CFS.txt2022-4-8Linu

11、x内核源代码导读内核源代码导读31运行队列数据结构运行队列数据结构2022-4-8Linux内核源代码导读内核源代码导读32vstruct cfs_rq红黑树红黑树2022-4-8Linux内核源代码导读内核源代码导读33vstruct rt_rq基于优先级的运行队列基于优先级的运行队列2022-4-8Linux内核源代码导读内核源代码导读342022-4-8Linux内核源代码导读内核源代码导读352022-4-8Linux内核源代码导读内核源代码导读36调度类调度类v 阅读调度类sched_class的定义源码v 找到主要与运行队列有关的 enqueue_task、dequeue_task

12、v Idle相关:idle_sched_class no enqueue/yield_task for idle tasks dequeue_task_idlev Fair相关 enqueue_task_fair dequeue_task_fairv Rt相关 enqueue_task_rt dequeue_task_rt2022-4-8Linux内核源代码导读内核源代码导读37Idle类特殊类特殊2022-4-8Linux内核源代码导读内核源代码导读38Fair类类进而查看进而查看1)enqueue_entity2)_enqueue_entity(红黑树)(红黑树)3)sched_entit

13、y结构结构4) struct rq5)struct cfs_rqCompletely Fair Scheduler 完全公平调度完全公平调度2022-4-8Linux内核源代码导读内核源代码导读39Rt类类进而查看:进而查看:1)enqueue_rt_entity2)_enqueue_rt_entity每个每个cpu有一个队列有一个队列3)sched_rt_entity4)struct rq5)struct rt_rq6) struct rt_prio_array优先级队列优先级队列2022-4-8Linux内核源代码导读内核源代码导读40v激活一个任务activate_task相对的:相对的

14、:deactivate_task2022-4-8Linux内核源代码导读内核源代码导读41pidhash表及链接表表及链接表v在一些情况下,内核必须能从进程的PID得出对应的进程描述符指针。例如kill系统调用v为了加速查找,引入了pid_hash散列表初始化:初始化:pidhash_initTask_struct中:中:2022-4-8Linux内核源代码导读内核源代码导读42pidhash表及链接表表及链接表2022-4-8Linux内核源代码导读内核源代码导读43进程之间的亲属关系进程之间的亲属关系v程序创建的进程具有父子关系,在编程时往往需要引用这样的父子关系。进程描述符中有几个域用来

15、表示这样的关系2022-4-8Linux内核源代码导读内核源代码导读44等待队列等待队列v 当要把除了TASK_RUNNING状态之外的进程组织在一起时,linux使用了等待队列 TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态的进程再分成很多类,每一类对应一个特定的事件。在这种情况下,进程状态提供的信息满足不了快速检索,因此,内核引进了另外的进程链表,叫做等待队列v 等待队列在内核中有很多用途,尤其是对中断处理、进程同步和定时用处很大2022-4-8Linux内核源代码导读内核源代码导读45v等待队列使得进程可以在事件上的条件等待,并且当等待的条件为真时,由

16、内核唤醒它们v等待队列由循环链表实现阅读相关的宏阅读相关的宏2022-4-8Linux内核源代码导读内核源代码导读46v在等待队列上内核实现了一些操作函数add_wait_queue add_wait_queue_exclusiveremove_wait_queue2022-4-8Linux内核源代码导读内核源代码导读47进程等待进程等待v等待一个特定事件的进程能调用下面几个函数中的任一个sleep_onsleep_on_timeoutinterruptible_sleep_oninterruptible_sleep_on_timeoutv进程等待由需要等待的进程自己进行(调用)2022-4-

17、8Linux内核源代码导读内核源代码导读48sleep_on相当于相当于阅读实际的阅读实际的sleep_on代码代码2022-4-8Linux内核源代码导读内核源代码导读49v此外,还可能按照如下方式进行sleep2022-4-8Linux内核源代码导读内核源代码导读50v例如事件等待wait_event_wait_event等待,直到事件发生(有效,或等待,直到事件发生(有效,或)2022-4-8Linux内核源代码导读内核源代码导读51进程的进程的唤醒唤醒v利用wake_up或者wake_up_interruptible等一系列的宏,都让插入等待队列中的进程进入TASK_RUNNING状态

18、2022-4-8Linux内核源代码导读内核源代码导读52v_wake_upv_wake_up_common间接间接default_wake_functionactivate_tasktry_to_wake_up2022-4-8Linux内核源代码导读内核源代码导读53进程切换进程切换(process switching)v为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换,任务切换,上下文切换2022-4-8Linux内核源代码导读内核源代码导读54进程上下文进程上下文v包含了进程执行需要的所有信息用户地址空间包括程序代码,数据,用户堆栈等控制信息进程描述符,内核堆栈等硬件上下文2022-4-8Linux内核源代码导读内核源代码导读55硬件上下文硬件上下文v尽管每个进程可以有自己的地址空间,但所有的进程只能共享CPU的寄存器。v因此,在恢复一个进程执行之前,内核必须确保每个寄存器装入了挂起进程时的值。这样才能正确的恢复一个进程的执行v硬件上下文:进程恢复执行前必须装入寄存器的一组数据包括通用寄存器的值以及一些系统寄存器l通用寄存器l系统寄存器2022-4-8Linu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论