新增资源及索引表-王辉静项目5拓展资源_linux内核分析笔记.docx

新增资源及索引表-王辉静项目5拓展资源_linux内核分析笔记.docx

ID:35976165

大小:24.43 KB

页数:4页

时间:2019-04-29

新增资源及索引表-王辉静项目5拓展资源_linux内核分析笔记.docx_第1页
新增资源及索引表-王辉静项目5拓展资源_linux内核分析笔记.docx_第2页
新增资源及索引表-王辉静项目5拓展资源_linux内核分析笔记.docx_第3页
新增资源及索引表-王辉静项目5拓展资源_linux内核分析笔记.docx_第4页
资源描述:

《新增资源及索引表-王辉静项目5拓展资源_linux内核分析笔记.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、linux内核分析笔记----进程管理     进程和线程的概念我就不讲了。总之,你记着:内核调度的对象是线程,而不是进程。linux系统中的线程很特别,它对线程和进程并不做特别区分。进程的另外一个名字叫任务(task).我和作者一样,习惯了把用户空间运行的程序叫做进程,把内核中运行的程序叫做任务。     内核把进程存放在叫做任务队列(tasklist)的双向循环链表中,链表中的每一项都是类型为task_struct,名称叫做进程描述符(processdescriptor)的结构,该结构定义在include/linux

2、/sched.h文件中,它包含了一个具体进程的所有信息。     linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色的目的。在2.6以前的内核中,各个进程的task_struct存放在它们内核栈的尾端。由于现在用slab分配器动态生成task_struct,所以只需在栈底或栈顶创建一个新的结构(structthread_info),他在asm/thread_info.h中定义,需要的请具体参考。每个任务中的thread_info结构在它的内核栈中的尾端分配,结构中task域存放的是指

3、向该任务实际task_struct指针。     在内核中,访问任务通常需要获得指向其task_struct指针。实际上,内核中大部分处理进程的代码都是通过task_struct进行的。通过current宏查找到当前正在执行的进程的进程描述符就显得尤为重要。在x86系统上,current把栈指针的后13个有效位屏蔽掉,用来计算thread_info的偏移,该操作通过current_thread_info函数完成,汇编代码如下:movl$-8192,%eaxandl %esp,%eax    最后,current再从thr

4、ead_info的task域中提取并返回task_struct的值:current_thread_info()->task;    进程描述符中的state域描述了进程的当前状态。系统中的每个进程都必然处于五种进程状态中的一种,什么运行态啦,阻塞态啦,它们之间转化的条件啦等等,这一点我也不细说了,为啥?随便一本操作系统的书里,讲得都比我好,要讲就要讲别人讲不好的,是不?现在我关心的问题是:当内核需要调整某个进程的状态时,该怎么做?这时最好使用set_task_state(task,state)函数,该函数将指定的进程设置

5、为指定的状态,必要的时候,它会设置内存屏蔽来强制其他处理器作重新排序。(一般只有在SMP系统中有此必要)否则,它等价于:task->state=state;另外set_current_state(state)和set_task_state(current,state)含义是等价的。    一般程序在用户空间执行。当一个程序执行了系统调用或者触发了某个异常,它就陷入内核空间。系统调用和异常处理程序是对内核明确定义的接口,进程只有通过这些接口才能陷入内核执行----对内核的所有访问都必须通过这些接口。    linux进程之

6、间存在一个明显的继承关系。所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程。该进程读取系统的初始化脚本并执行其他的相关程序,最终完成系统启动的整个过程。    系统中的每个进程必有一个父进程,每个进程也可以拥有一个或多个子进程。进程既然有父子之称,当然就有兄弟之意了。每个task_struct都包含一个指向其父进程task_struct且叫做parent的指针,同时包含一个称为children的子进程链表。所以访问父进程:structtask_struct*task=current-

7、>parent;按照如下方式访问子进程:structtask_struct*task;structlist_head*list;list_for_each(list,¤t->children){          task=list_entry(list,structtask_struct,sibling);}     其中init进程描述符是作为init_task静态分配的。通过上面的init进程,父子进程关系,兄弟进程关系以及进程描述符的结构,我们可以得到一个惊人的事实:可以通过这种关系从系统的任何一个进

8、程出发查找到任意指定的其他进程。而且方式还挺多的,这个就看书了,内容挺多我就不说了,只是最后需要指出的是,在一个拥有大量进程的系统中通过重复来遍历所有的进程是非常耗费时间的,因此,如果没有充足的理由千万别这样做。爱要一万个理由,这么做呢,没看出来.     许多的操作系统都提供了产生进程的机制,linux这优秀的系统

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。