Linux进程管理和调度ppt课件.ppt





《Linux进程管理和调度ppt课件.ppt》由会员分享,可在线阅读,更多相关《Linux进程管理和调度ppt课件.ppt(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux进程管理与调度进程管理与调度 关于进程与线程 Linux进程实现 Linux进程调度策略 Linux进程调度实现1 Linux进程与线程进程与线程Linux进程进程 Linux线程线程进程作为资源分配的基本单位而存在,线程作为调度的基本单位而存在我们都知道linux是不断发展的.在早期版本中, linux的基本调度单元是Task,只到现在, 依然是它. 在早期版本中, 一个Task对应着一个进程, 完全没有线程这个概念. 随着时间的发展, 线程的概念出现的, 但是linux并没有马上接受这一概念, 要知道, 线程是现代操作系统的特征, 向一个现有的操作系统内核引入线程是一件伤筋动骨的
2、事情, 更何况在线程概念的早期, 受历史原因(UNIX)和硬件的限制(多核尚不是主流), 线程的地位尚不确定. 所以, linux并没有在内核中引入线程的概念. 但是, linux提供了一个新的系统调用clone, 通过该系统调用, 内核中的多个进程可以共享一些信息, 比如进程空间等. 注意, 此时linux内核的基础调度单元依然是Task, 而且在内核看来, 一个进程依然对应着一个Task. 2 Linux进程实现进程实现Linux进程描述符进程描述符也称 进程控制块PCB:shruct task_struct unsigned long state; /进程的状态,在2.6.23已经有9个
3、状态 unsigned long policy; /描述进程调度策略.判断是实时进程还是非实时进程struct task_struct *parent; /组织进程的层次关系,指向父进程 struct list_head tasks; /通过list_head组织成双向链表 pid_t pid; /每个进程唯一的标号 . ; Linux进程描述符进程描述符在内核栈底创建新的结构struct thread_infoStruct thread_info struct task_struct *task; struct exec_domain *exec_domain; unsigned long
4、flags; unsigned long status; _u32 cpu; ;在linux内核中,进程被分为两部分,一部分是thread_info,保存在内核栈中,为了保持很小,因此只保存了必须的几个域,它有一个变量task,指向task_struct,这个结构保存了进程相关的所有信息。而对应的task_struct也保存了一个变量stack指向的就是一个thread_union的联合体Linux进程实现进程实现相关的系统调用相关的系统调用 fork(): 创建普通进程,copy on write(要复制父进程的页表)创建后子进程和父进程指向同一内存区域,仅当子进程有write发生时候,才会
5、把改动的区域copy到子进程新的地址空间 vfork(): 共享创建,完全无拷贝。(子进程作为父进程的一个单独线程在其地址空间运行,父进程阻塞) clone(): 介于fork()和vfork()之间,可以指定共享什么,拷贝什么。说明:vfork()与clone()可用于创建新的内核线程。Linux进程实现进程实现相关的函数相关的函数 do_fork():/ 被clone(),fork(),vfork()调用,执行步骤如下: 检查父进程标志是否为空。 调用alloc_task_struct()为新进程分配一段内存空间,并将父进程描述符的内容拷贝到子进程。 检查进程是否得到所需资源及系统当前允许
6、的最大进程数。 如进程需要引用内核模块,则增加模块引用计数。 更新从父进程拷贝来的信息。 系统调用get_pid(),将获得的pid赋给新建的子进程。 更新不能由父进程继承的域。 为新进程的执行设置跟踪进程的相关内核数据结构,新进程入链表。置新进程状态为task_running, 。 向父进程返回pid。说明:说明: 创建进程的系统调用返回时(ret_from_sys_call),将根据存放系统调用返回值寄存器EAX的内容(pid)是0还是一个小正整数来决定是运行父进程还是子进程。在linux中第一个进程是内核进程,pid为0,它是所有的进程的父进程。这个进程也叫swapper,或者说是idl
7、e.Linux进程状态进程状态TASK_RUNNING:进程在运行 ( 是系统的当前进程 ) 或者准备运行(等待被安排到系统的一个CPU上)。TASK_INTERRUPTIBLE:进程处于某个等待队列中,它能够被信号(signal)唤醒。等待资源的请求满足时,也被唤醒。TASK_UNINTERRUPTIBLE: :进程处于某个等待队列中,不能被信号或中断唤醒,只有等待的资源被满足时才被唤醒。TASK_ZOMBIE: : 进程已经停止,但还没有释放进程控制块。 TASK_STOPPED:可能是被特定的信号终止,也可能是受其它进程的跟踪调用而暂时将CPU交给跟踪它的进程。 Linux状态转换状态转
8、换TASK_RUNNINGTASK_RUNNINGTASK_INTERRUPTIBLETASK_INTERRUPTIBLETASK_UNINTERRUPTIBLETASK_UNINTERRUPTIBLE拥有CPU拥有CPUTASK_STOPPEDTASK_STOPPEDTASK_ZOMBIETASK_ZOMBIEdo_fork()schedule()时间片到schedule()interruptible_sleep_on()schedule()sleep_on()do_exit()syscall_trace( )schedule( )sys_exit( )收到SIG_KILL或SIG_CONT
9、后,执行wake_up( )wake_up()wake_up_interruptible()scheduler and dispatcher线程的实现线程的实现在在Linux系统中,线程被当作与其他进程共享某些资源的进程系统中,线程被当作与其他进程共享某些资源的进程.线程的创建:与普通进程相似,需要指明共享资源。线程的创建:与普通进程相似,需要指明共享资源。如:如:clone (CLONE_VM | CLONE_FS | CLONE_FILES|CLONE_SIGHAND,0);对比:对比:clone (SIGCHLD, 0) /普通的fork() clone (CLONE_VFORK | C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 进程 管理 调度 ppt 课件

限制150内