linux进程管理与调度

linux进程管理与调度

ID:5401681

大小:225.50 KB

页数:25页

时间:2017-11-10

linux进程管理与调度_第1页
linux进程管理与调度_第2页
linux进程管理与调度_第3页
linux进程管理与调度_第4页
linux进程管理与调度_第5页
资源描述:

《linux进程管理与调度》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux进程管理与调度关于进程与线程Linux进程实现Linux进程调度策略Linux进程调度实现1Linux进程与线程Linux进程Linux线程进程作为资源分配的基本单位而存在,线程作为调度的基本单位而存在我们都知道linux是不断发展的.在早期版本中,linux的基本调度单元是Task,只到现在,依然是它.在早期版本中,一个Task对应着一个进程,完全没有线程这个概念.随着时间的发展,线程的概念出现的,但是linux并没有马上接受这一概念,要知道,线程是现代操作系统的特征,向一个现有的操作系统内核引入线程是一件伤筋动骨的

2、事情,更何况在线程概念的早期,受历史原因(UNIX)和硬件的限制(多核尚不是主流),线程的地位尚不确定.所以,linux并没有在内核中引入线程的概念.但是,linux提供了一个新的系统调用clone,通过该系统调用,内核中的多个进程可以共享一些信息,比如进程空间等.注意,此时linux内核的基础调度单元依然是Task,而且在内核看来,一个进程依然对应着一个Task.2Linux进程实现Linux进程描述符也称进程控制块PCB:shructtask_struct{unsignedlongstate;//进程的状态,在2.6.23已

3、经有9个状态unsignedlongpolicy;//描述进程调度策略.判断是实时进程还是非实时进程structtask_struct*parent;//组织进程的层次关系,指向父进程structlist_headtasks;//通过list_head组织成双向链表pid_tpid;//每个进程唯一的标号......};…}Linux进程描述符在内核栈底创建新的结构structthread_infoStructthread_info{structtask_struct*task;structexec_domain*exec_do

4、main;unsignedlongflags;unsignedlongstatus;_u32cpu;……};在linux内核中,进程被分为两部分,一部分是thread_info,保存在内核栈中,为了保持很小,因此只保存了必须的几个域,它有一个变量task,指向task_struct,这个结构保存了进程相关的所有信息。而对应的task_struct也保存了一个变量stack指向的就是一个thread_union的联合体Linux进程实现——相关的系统调用fork():创建普通进程,copyonwrite(要复制父进程的页表)创建后

5、子进程和父进程指向同一内存区域,仅当子进程有write发生时候,才会把改动的区域copy到子进程新的地址空间vfork():共享创建,完全无拷贝。(子进程作为父进程的一个单独线程在其地址空间运行,父进程阻塞)clone():介于fork()和vfork()之间,可以指定共享什么,拷贝什么。说明:vfork()与clone()可用于创建新的内核线程。Linux进程实现——相关的函数do_fork()://被clone(),fork(),vfork()调用,执行步骤如下:检查父进程标志是否为空。调用al

6、loc_task_struct()为新进程分配一段内存空间,并将父进程描述符的内容拷贝到子进程。检查进程是否得到所需资源及系统当前允许的最大进程数。如进程需要引用内核模块,则增加模块引用计数。更新从父进程拷贝来的信息。系统调用get_pid(),将获得的pid赋给新建的子进程。更新不能由父进程继承的域。为新进程的执行设置跟踪进程的相关内核数据结构,新进程入链表。置新进程状态为task_running,。向父进程返回pid。说明:创建进程的系统调用返回时(ret_from_sys_call),将根据存放系统调用返回值寄存器EAX的

7、内容(pid)是0还是一个小正整数来决定是运行父进程还是子进程。在linux中第一个进程是内核进程,pid为0,它是所有的进程的父进程。这个进程也叫swapper,或者说是idle.Linux进程状态TASK_RUNNING:进程在运行(是系统的当前进程)或者准备运行(等待被安排到系统的一个CPU上)。TASK_INTERRUPTIBLE:进程处于某个等待队列中,它能够被信号(signal)唤醒。等待资源的请求满足时,也被唤醒。TASK_UNINTERRUPTIBLE:进程处于某个等待队列中,不能被信号或中断唤醒,只有等待的资源

8、被满足时才被唤醒。TASK_ZOMBIE:进程已经停止,但还没有释放进程控制块。TASK_STOPPED:可能是被特定的信号终止,也可能是受其它进程的跟踪调用而暂时将CPU交给跟踪它的进程。Linux状态转换scheduleranddispatcher线程的实现

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

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

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