- 1、本文档共25页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux进程管理与调度 关于进程与线程 Linux进程实现 Linux进程调度策略 Linux进程调度实现 1 Linux进程与线程 Linux进程 Linux线程 进程作为资源分配的基本单位而存在,线程作为调度的基本单位而存在 我们都知道linux是不断发展的.在早期版本中, linux的基本调度单元是Task, 只到现在, 依然是它. 在早期版本中, 一个Task对应着一个进程, 完全没有线程这个概念. 随着时间的发展, 线程的概念出现的, 但是linux并没有马上接受这一概念, 要知道, 线程是现代操作系统的特征, 向一个现有的操作系统内核引入线程是一件伤筋动骨的事情, 更何况在线程概念的早期, 受历史原因(UNIX)和硬件的限制(多核尚不是主流), 线程的地位尚不确定. 所以, linux并没有在内核中引入线程的概念. 但是, linux提供了一个新的系统调用clone, 通过该系统调用, 内核中的多个进程可以共享一些信息, 比如进程空间等. 注意, 此时linux内核的基础调度单元依然是Task, 而且在内核看来, 一个进程依然对应着一个Task. 2 Linux进程实现 Linux进程描述符也称 进程控制块PCB: shruct task_struct { unsigned long state; //进程的状态,在2.6.23已经有9个状态 unsigned long policy; //描述进程调度策略.判断是实时进程还是非实时进程 struct task_struct *parent; //组织进程的层次关系,指向父进程 struct list_head tasks; //通过list_head组织成双向链表 pid_t pid; //每个进程唯一的标号 ...... }; …} Linux进程描述符 在内核栈底创建新的结构struct thread_info Struct thread_info{ struct task_struct *task; struct exec_domain *exec_domain; unsigned long flags; unsigned long status; _u32 cpu; … … }; 在linux内核中,进程被分为两部分,一部分是thread_info,保存在内核栈中,为了保持很小,因此只保存了必须的几个域,它有一个变量task,指向task_struct,这个结构保存了进程相关的所有信息。而对应的task_struct也保存了一个变量stack指向的就是一个thread_union的联合体 Linux进程实现——相关的系统调用 fork(): 创建普通进程,copy on write(要复制父进程的页表) 创建后子进程和父进程指向同一内存区域,仅当子进程有write发生时候,才会把改动的区域copy到子进程新的地址空间 vfork(): 共享创建,完全无拷贝。(子进程作为父进程的一个单独线程在其地址空间运行,父进程阻塞) clone(): 介于fork()和vfork()之间,可以指定共享什么,拷贝什么。 说明:vfork()与clone()可用于创建新的内核线程。 Linux进程实现——相关的函数 do_fork()://kernel/fork.c 被clone(),fork(),vfork()调用,执行步骤如下: 检查父进程标志是否为空。 调用alloc_task_struct()为新进程分配一段内存空间,并将父进程描述符的内容拷贝到子进程。 检查进程是否得到所需资源及系统当前允许的最大进程数。 如进程需要引用内核模块,则增加模块引用计数。 更新从父进程拷贝来的信息。 系统调用get_pid(),将获得的pid赋给新建的子进程。 更新不能由父进程继承的域。 为新进程的执行设置跟踪进程的相关内核数据结构,新进程入链表。 置新进程状态为task_running, 。 向父进程返回pid。 说明:
文档评论(0)