[工学]lecture06.ppt

  1. 1、本文档共59页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]lecture06

第六讲 进程管理和调度 管理一个进程所需的所有信息 内核为每个新建进程分配相应的进程描述符 进程描述符是一个task_struct结构体 进程标识 内核对进程的标识:进程描述符的首地址 进程的ID:进程描述符中的PID 陷入内核 进程的线性地址空间中既包括用户程序,也包括内核代码 内核通过系统调用为用户提供服务 用户程序通过调用系统调用陷入内核 进入内核后执行的一系列指令称为内核控制路径 完成内核路径后,从系统调用返回用户程序 内核栈 每个进程在创建时,内核都会分配相应的内核栈 内核栈在内核空间中占8K或4K 内核栈的栈底由进程描述符的thread.ss0域和thread.eps0域指示 陷入内核时,将从用户栈切换到内核栈 将thread.ss0和thread.eps0装入ss和esp寄存器 内核栈和thread_info结构用一个公用体描述 thread_info安排在内核栈的起始地址上 内核如何标识一个进程 内核用进程描述符的首地址标识进程 已知内核栈首地址,如何获得进程描述符的首地址? 内核栈的首地址等于thread_info的首地址 获得内核栈的首地址就获得了thread_info的首地址 由thread_info中task域获得进程描述符的首地址 进程标识值存放在进程描述符的pid域中 pid_t pid; pid主要由用户使用 pid最大默认值为32768 通过/proc/sys/kernel/pid_max来修改 其它进程标识 线程组的组长 struct task_struct *group_leader; 线程组组长ID pid_t tgid; signal-pgrp:组长ID signal-session:会话元ID 用户标识 uid_t uid,euid,suid,fsuid; gid_t gid,egid,sgid,fsgid; 进程描述符中的state域描述了进程的状态 volatile long state; 五种状态 TASK_RUNNING 进程正在执行或在运行队列中等待执行 不区分运行状态和就绪状态 TASK_INTERRUPTIBLE 进程正在睡眠 当等待的条件满足时将被唤醒,即状态变为TASK_RUNNING 接收到信号将提前被唤醒 TASK_UNINTERRUPTIBLE 进程正在睡眠 与TASK_INTERRUPTIBLE类似,但信号不能提前唤醒之 只有在少数要求较高的情况下才会使用 TASK_ZOMBIE 进程已经结束,父进程还没有调用wait4()或waitpid() 多数资源被释放,但保留内核栈、thread_info结构和进程描述符 进程描述符包含退出状态、记账等信息,所以不能释放 内核栈和thread_info结构用于快速获得进程描述符,所以不能释放 父进程通过wait4()或waitpid()系统调用来了解进程退出后的情况 TASK_STOPPED 进程暂停运行 进程接收到SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU信号时将进入该状态 进程接收到SIGCONT信号将恢复到暂停前的状态 设置进程的状态 set_task_state(task, state); set_current_state(state); 进程通过系统调用陷入内核 进程上下文:内核代表当前进程执行 内核对current宏的引用有意义 内核可以被抢占,即在内核中执行时允许重新调度 对内核的执行时间要求不严格 内核使用进程的内核栈 任务队列 所有进程描述符通过tasks域串联成一个任务队列 struct list_head tasks; 任务队列是双向循环链表 队列中第一个元素是idel进程的描述符 这是一个内核变量,在系统启动阶段初始化 struct task_struct init_task = INIT_TASK(init_task); 如何获得特定进程的后一个或前一个进程的描述符 遍历任务队列 进程树 idel进程是所有进程的祖先 父进程由进程描述符的parent指针域指示 struct task_struct *parent; 进程描述符的children域是子进程链表的头节点 struct list_head children; 进程描述符的sibling域用于串联兄弟进程 struct list_head sibling; 获得当前进程的父进程描述符 遍历子进程 执行一个程序分为两个步骤 fork()系统调用:复制父进程 exec()系统调用:将程序调入,替换进程的地址空间 将程序装入物理页框 更新进程的页表 fork() fork()是通过clone()系统调用来实现的 fork() - clone() - do_fork() - copy_process()

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档