- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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,%eaxandl %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()参
您可能关注的文档
- K310-2电子行业解决方案完整演示帐套.ppt
- jt人教版四年级下册语文23课古诗三首课件.ppt
- JGJT193_2009混凝土耐久性检验评定标准_武汉大学.ppt
- kj2.3.2研究有机物的一般步骤和方法(一).ppt
- KKTgeometry[从几何图形的角度来阐释KTT条件的意义].ppt
- jt1我长生果完美版.ppt
- JAVA面向对象第一章.ppt
- KIS旗舰版V4-0收银系统培训.pptx
- KL电器品牌战略的方案.ppt
- KPI-关键绩效指标.ppt
- 【可行性报告】2023年防静电刷行业项目可行性分析报告.docx
- 【可行性报告】2023年温室节能遮荫保温幕行业项目可行性分析报告.docx
- 【可行性报告】2023年石油加工催化剂行业项目可行性分析报告.docx
- 【可行性报告】2023年自媒体收益行业项目可行性分析报告.docx
- 【可行性报告】2023年高低压开关相关行业可行性分析报告.docx
- 【可行性报告】2023年日化相关行业可行性分析报告.docx
- 【可行性报告】2023年货物运输车相关项目可行性研究报告.docx
- 【可行性报告】2023年硅系铁合金相关行业可行性分析报告.docx
- 【可行性报告】2023年香柠檬果提取化妆品相关项目可行性研究报告.docx
- 【可行性报告】2023年智能电能表及配件项目可行性研究分析报告.docx
文档评论(0)