Linux内核设计与实现第3章进程管理.ppt

Linux内核设计与实现第3章进程管理.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux内核设计与实现第3章进程管理

第二章 进程管理;作业及实验(一);进程与线程;进程虚拟机制;如何查看进程信息;进程树;2.1 进程描述符及任务队列;2.1.1 分配进程描述符;每个任务的thread_info结构在它的内核栈的尾端分配。结构中task域中存放的是指向该任务实际task_struct的指针。;#define current (get_current()) 在x86系统上,current把栈指针的后13个有效位屏蔽掉,用来计算出thread_info的偏移,该操作通过current_thread_info()函数完成。汇编代码如下: movl $-8192,%eax andl %esp,%eax 最后,current 在从thread_info的task域中提取并返回task_struct的地址。 static inline struct task_struct *get_current(void) { return current_thread_info()-task; };2.1.3 进程状态;2.1.4 设置当前进程状态;2.1.5 进程上下文;2.1.5 进程树;通过下面代码获得其父进程的进程描述符: struct task_stuct *task = current-parent; 通过下面代码依次访问子进程 struct task_stuct *task; struct list_head *list; /*第一个参数用来指向当前项,第二个参数是需要检索的链表*/ list_for_each(list,current-children) { /*取得包含list_head的结构体*/ task = list_entry(list, struct task_struct,sibling); /*task 现在指向当前的某个子进程*/ } // *一个是指向给定的链表元素的指针,一个是其中嵌入了链表的结构体 *类型引用,另一个是结构体中链表成员的名称。 * list_entry - get the struct for this entry * @ptr: the struct list_head pointer. * @type: the type of the struct this is embedded in. * @member: the name of the list_struct within the struct. */ #define list_entry(ptr, type, member) \ container_of(ptr, type, member);Init进程的进程描述符是作为init_task静态分配的。以下是演示所有进程之间的关系: struct task_struct *task; for (task = current; task ! = init_task; task = task-parent) ; /* task 现在指向init*/ 任务队列是一个双向的循环链表。对于给定的进程,获取链表中的下一个进程: list_entry(task-tasks.next, struct task_struct, tasks) 获取前一个进程的方法相同: list_entry(task-tasks.pre, struct task_struct, tasks) 这两个例程通过next_task(task)和prev_task(task)宏实现。而实际上,for_each_process(task)宏提供了依次访问整个任务队列的能力。每次访问,任务指针都指向链表中的下一个元素: struct task_struct *task; for_each_process(task) { /*它打印出每一个任务的名称和PID*/ prink(“%s[%d]\n”, task-comm,task-pid); };2.2 进程创建;2.2.1 写时拷贝;2.2.2 fork();copy_process()函数完成的功能:;2.2.3 vfork() vfork()系统调用和fork()的功能相同,除了不拷贝父进程的页表项。子进程作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞,直到子进程退出或执行exec()。子进程不能向地址空间写入。现以彻底没多大用了。;线程的创建和普通进程的创建类似,只不过在调用clone()的时候需要传递一些参数标志来指明需要共享的资源: clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0); 传递给clone()的参数标志决定了新创建进程的行为方式和父子进程之间共享的资源种类。;clone()参

文档评论(0)

junjun37473 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档