中国科学技术大学计算机系 陈香兰(0512- ) Sprint 2011

Slides:



Advertisements
Similar presentations
Linux 操作系统分析 中国科学技术大学计算机系 陈香兰( 0512 - ) Autumn 2010.
Advertisements

因数与倍数 2 、 5 的倍数的特征
高级服务器设计和实现 1 —— 基础与进阶 余锋
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
孟宁 电话: 主页:
实用操作系统概念 张惠娟 副教授 1.
Oracle数据库 Oracle 子程序.
Lab2 syscall 参数问题 参数check在当前代码框架下并不具有任何含义, 它就只是个参数而已 参数不超过四个: 系统调用号
在PHP和MYSQL中实现完美的中文显示
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
Hadoop I/O By ShiChaojie.
SVN的基本概念 柳峰
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
辅导课程六.
网络常用常用命令 课件制作人:谢希仁.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2011
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2009
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
Unit 11.Operating System 11.1 What’s OS 11.2 Related Courses
Linux内核源代码导读 中国科学技术大学计算机系 陈香兰(0551- )
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
顺序表的删除.
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
实验一 体验Nachos下的并发程序设计 陈毅东 2006年春.
进程概念.
姚金宇 MIT SCHEME 使用说明 姚金宇
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
分裂对象模型 C++ otcl.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
信号量(Semaphore).
第4章 Excel电子表格制作软件 4.4 函数(一).
iSIGHT 基本培训 使用 Excel的栅栏问题
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
College of Computer Science & Technology
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Python 环境搭建 基于Anaconda和VSCode.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
第十七讲 密码执行(1).
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
Presentation transcript:

中国科学技术大学计算机系 陈香兰(0512-87161312) xlanchen@ustc.edu.cn Sprint 2011 Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512-87161312) xlanchen@ustc.edu.cn Sprint 2011

Linux的进程

主要内容 进程描述符 进程切换 进程的创建和删除 进程调度 2019/1/14 Linux操作系统分析

主要内容 进程描述符 进程切换 进程的创建和删除 进程调度 2019/1/14 Linux操作系统分析

进程和线程 多道程序对操作系统的需求进程 进一步提高并发度,对操作系统的需求 线程 进程是执行程序的一个实例 进程和程序的区别 进一步提高并发度,对操作系统的需求 线程 进程是执行程序的一个实例 进程和程序的区别 几个进程可以并发的执行一个程序 一个进程可以顺序的执行几个程序 线程和进程的区别 Linux 2.4内核以及之前的版本都不支持线程 2.6内核中有thread,但仍不是线程 Linux中的线程是在用户态实现的,不是本课程的内容 但Linux内核对用户态线程有一定的辅助支持 2019/1/14 Linux操作系统分析

进程描述符 为了管理进程,内核必须对每个进程进行清晰的 描述。 进程描述符提供了内核所需了解的进程信息 源码include/linux/sched.h定义 struct task_struct 数据结构很庞大 基本信息 管理信息 控制信息 2019/1/14 Linux操作系统分析 6

2019/1/14 Linux操作系统分析

Linux2.6进程的状态 include/linux/sched.h 简单过一下,与状态相关的一些宏 1)组合状态 2)状态判断 3)状态设置 2019/1/14 Linux操作系统分析 8

进程状态转换图 EXIT_ZOMBIE或者 EXIT_DEAD 或者 TASK_DEAD 2019/1/14 Linux操作系统分析 9

标识一个进程 使用进程描述符地址 使用PID (Process ID,PID) 进程和进程描述符之间有非常严格的一一对应关系, 使得用32位进程描述符地址标识进程非常方便 使用PID (Process ID,PID) 每个进程的PID都存放在进程描述符的pid域中 2019/1/14 Linux操作系统分析

进程的PID 进程的pid字段 include/linux/types.h include/asm-XXX/posix_typesYYY.h Pid最大值,参见kernel/pid.c XXX为体系结构名称 YYY为空,或者_64或者_32 顺序使用 && 循环使用 include/linux/threads.h 2019/1/14 Linux操作系统分析 11 11

stuct pid 阅读include/linux/pid.h中 “What is struct pid?” 2019/1/14 12

Pid的管理和分配 创建一个进程时, Pid名字空间 Pid位图 do_forkcopy_processalloc_pid Struct pid的cache 关于名字空间的更多信息,参见: Nsproxy.c以及pid_namespace.ch 2019/1/14 Linux操作系统分析 13

Init_pid_ns 在start_kernel中,调用pidmap_init进行合理的初始化 在kernel_init中,被修改为init进程 2019/1/14 Linux操作系统分析 14

分配第一个位图页 初始化struct pid的cache 2019/1/14 Linux操作系统分析 15

阅读alloc_pid、 alloc_pidmap函数 掌握基于位图的pid分配方法 last_pid+1,或者下一个bit0,或者一个新的map的第 一个bit或者从头开始(300以后) kernel/pid.c kernel/pid.c 2019/1/14 Linux操作系统分析 16

用户如何获得一个进程的pid 系统调用getpid 关于进程组 单独一个进程可以看成只有一个进程的组 getpid返回组pid 使用组链表 数据:tgid 单独一个进程可以看成只有一个进程的组 getpid返回组pid 2019/1/14 Linux操作系统分析

进程和进程的内核堆栈 Linux为每个进程分配一个8KB大小的内存区域 ,用于存放该进程两个不同的数据结构: Thread_info 进程的内核堆栈 进程处于内核态时使用, 不同于用户态堆栈 内核控制路径所用的堆栈 很少,因此对栈和Thread_info 来说,8KB足够了 Thread_info 2019/1/14 Linux操作系统分析

Thread_union C语言允许用如下的一个union结构来方便的表示 这样的一个混合体 include/linux/sched.h thread_info由体系结构相关部分定义 阅读include/asm-x86/thread_info.h 以及include/asm-x86/thread_info_32.h 2019/1/14 Linux操作系统分析

Thread_info的分配/回收/访问 进程描述符的分配/回收/访问 Thread_info的分配/回收/访问 alloc_thread_info free_thread_info 2019/1/14 Linux操作系统分析

2019/1/14 Linux操作系统分析

current_thread_info 从刚才看到的thread_info和内核态堆栈之间的配 对,内核可以很容易的从esp寄存器的值获得当 前在CPU上运行的进程的描述符指针 因为这个内存区是8KB=213大小,内核必须做的 就是让esp有13位的有效位,以获得进程描述符 的基地址 8191=8192-1=0x2000-1=0x1fff 取反:0xffffe000(最后13位为0) 2019/1/14 Linux操作系统分析

Current宏 2019/1/14 Linux操作系统分析

Current宏的使用 Current宏可以看成当前进程的进程描述符指针 ,在内核中直接使用 举例: 比如current->pid返回在CPU上正在执行的进程的PID 2019/1/14 Linux操作系统分析

进程链表 为了对给定类型的进程(比如所有在可运行状态 下的进程)进行有效的搜索,内核维护了几个进 程链表 所有进程链表 在进程描述符中: 2019/1/14 Linux操作系统分析

进程链表中的插入和删除 使用常规list数据结构操作 list_add list_add_tail list_del list_move list_empty list_for_each list_for_each_prev list_for_each_safe list_for_each_entry … 进程链表中的插入和删除 使用常规list数据结构操作 参见include/linux/list.h或者lib/list_debug.c 2019/1/14 Linux操作系统分析

例如,在do_fork调用的copy_process中 for_each_process宏扫描整个进程链表 RCU read copy update 2019/1/14 Linux操作系统分析

const struct sched_class,调度类 TASK_RUNNING状态的进程组织 入列/出列等操作: dequeue_task enqueue_task const struct sched_class,调度类 rt_sched_class fair_sched_class idle_sched_class 每个cpu有一个运行队列 关于调度的描述, 参见sched_coding.txt和 sched-design-CFS.txt 2019/1/14 Linux操作系统分析

运行队列数据结构 2019/1/14 Linux操作系统分析

struct cfs_rq 红黑树 2019/1/14 Linux操作系统分析 ……

struct rt_rq 基于优先级的运行队列 …… 2019/1/14 Linux操作系统分析

2019/1/14 Linux操作系统分析

2019/1/14 Linux操作系统分析

调度类 阅读调度类sched_class的定义源码 找到主要与运行队列有关的 Idle相关:idle_sched_class Fair相关 enqueue_task、dequeue_task Idle相关:idle_sched_class no enqueue/yield_task for idle tasks dequeue_task_idle Fair相关 enqueue_task_fair dequeue_task_fair Rt相关 enqueue_task_rt dequeue_task_rt 2019/1/14 Linux操作系统分析

Idle类特殊 2019/1/14 Linux操作系统分析

Fair类 进而查看 1)enqueue_entity 2)__enqueue_entity (红黑树) 3)sched_entity结构 4) struct rq 5)struct cfs_rq Completely Fair Scheduler 完全公平调度 2019/1/14 Linux操作系统分析

Rt类 进而查看: 1)enqueue_rt_entity 2)__enqueue_rt_entity 每个cpu有一个队列 3)sched_rt_entity 4)struct rq 5)struct rt_rq 6) struct rt_prio_array 2019/1/14 Linux操作系统分析 优先级队列

激活一个任务 activate_task 相对的:deactivate_task 2019/1/14 Linux操作系统分析

pidhash表及链接表 在一些情况下,内核必须能从进程的PID得出对 应的进程描述符指针。例如kill系统调用 初始化:pidhash_init Hash函数的使用情况 2019/1/14 Linux操作系统分析

可以从进程描述符得到进程的pid相关信息 Task_struct中: 2019/1/14 Linux操作系统分析

Pid数据结构 2.6内核为PID专门引入了一个数据结构,Why? 独立的进程;进程组;sessions 使用pid数字的注意之处 考虑进程的删除和创建 2019/1/14 Linux操作系统分析

pidhash表及链接表 2019/1/14 Linux操作系统分析

进程之间的亲属关系 程序创建的进程具有父子关系,在编程时往往需 要引用这样的父子关系。进程描述符中有几个域 用来表示这样的关系 2019/1/14 Linux操作系统分析

等待队列 当要把除了TASK_RUNNING状态之外的进程组织在一 起时,linux使用了等待队列 TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态的 进程再分成很多类,每一类对应一个特定的事件。在这种情况 下,进程状态提供的信息满足不了快速检索,因此,内核引进 了另外的进程链表,叫做等待队列 等待队列在内核中有很多用途,尤其是对中断处理、进 程同步和定时用处很大 2019/1/14 Linux操作系统分析

等待队列使得进程可以在事件的条件等待,并且 当等待的条件为真时,由内核唤醒它们 等待队列由循环链表实现 阅读相关的宏 2019/1/14 Linux操作系统分析

等待队列的链表 2019/1/14 Linux操作系统分析

在等待队列上内核实现了一些操作函数 add_wait_queue add_wait_queue_exclusive remove_wait_queue 2019/1/14 Linux操作系统分析

进程等待 等待一个特定事件的进程能调用下面几个函数中 的任一个 进程等待由需要等待的进程自己进行(调用) sleep_on sleep_on_timeout interruptible_sleep_on interruptible_sleep_on_timeout 进程等待由需要等待的进程自己进行(调用) 2019/1/14 Linux操作系统分析

sleep_on 相当于 阅读实际的sleep_on代码 2019/1/14 Linux操作系统分析

此外,还可能按照如下方式进行sleep 2019/1/14 Linux操作系统分析

例如事件等待wait_event__wait_event 等待,直到事件发生(有效,或…) 2019/1/14 Linux操作系统分析

进程的唤醒 利用wake_up或者wake_up_interruptible等一系列 的宏,都让插入等待队列中的进程进入 TASK_RUNNING状态 2019/1/14 Linux操作系统分析

__wake_up __wake_up_common 间接 default_wake_function try_to_wake_up activate_task 2019/1/14 Linux操作系统分析

/proc文件系统中的进程子目录 以进程的PID为目录名 2019/1/14 Linux操作系统分析

主要内容 进程描述符 进程切换 进程的创建和删除 进程调度 2019/1/14 Linux操作系统分析

进程切换(process switching) 为了控制进程的执行,内核必须有能力挂起正在 CPU上执行的进程,并恢复以前挂起的某个进程 的执行,这叫做进程切换,任务切换,上下文切 换 2019/1/14 Linux操作系统分析

进程上下文 包含了进程执行需要的所有信息 用户地址空间 包括程序代码,数据,用户堆栈等 控制信息 进程描述符,内核堆栈等 硬件上下文 用户地址空间 包括程序代码,数据,用户堆栈等 控制信息 进程描述符,内核堆栈等 硬件上下文 2019/1/14 Linux操作系统分析

尽管每个进程可以有自己的地址空间,但所有的 进程只能共享CPU的寄存器。 硬件上下文 尽管每个进程可以有自己的地址空间,但所有的 进程只能共享CPU的寄存器。 因此,在恢复一个进程执行之前,内核必须确保 每个寄存器装入了挂起进程时的值。这样才能正 确的恢复一个进程的执行 硬件上下文: 进程恢复执行前必须装入寄存器的一组数据 包括通用寄存器的值以及一些系统寄存器 通用寄存器如eax,ebx等 系统寄存器如eip,esp,cr3等等 2019/1/14 Linux操作系统分析

在linux中 一个进程的上下文主要保存在thread_info, task_struct的thread_struct中,其他信息放在内核态堆栈 中 thread_struct参见include/asm_x86/processor.h 在task_struct中 2019/1/14 Linux操作系统分析

上下文切换 schedule()函数选择一个新的进程来运行,并调 用context_switch进行上下文的切换,这个宏调 用switch_to来进行关键上下文切换 switch_to利用了prev和next两个参数: prev:指向当前进程 next:指向被调度的进程 阅读相关代码 2019/1/14 Linux操作系统分析

什么时候next进程真正开始执行呢? call=保存返回地址+跳转到target处执行 ret=从堆栈上获得返回地址,并跳转到该返回地址处 执行 ?当__switch_to正常返回时,发生了什么事情? 2019/1/14 Linux操作系统分析

标号为1的执行代码处 一个进程被正常切换出时,保存的eip总是标号 为1的那个位置 当这个进程再次被调度运行时,恢复在堆栈上的 返回地址总是这个1 2019/1/14 Linux操作系统分析

__switch_to __switch_to用来处理其他上下文的切换 此时,使用的堆栈是next进程的堆栈,这个堆栈 上没有__switch_to需要的参数prev和next 怎么传参呢? 仔细观察switch_to的定义 2019/1/14 Linux操作系统分析

__switch_to的关键操作 unlazy_fpu() 处理数学协处理器 关于per_cpu(init_tss, cpu)和esp0 保存和恢复fs、gs Current的变化 等等 关于任务状态段和内核堆栈 参见cpu_init看TSS初始化 2019/1/14 Linux操作系统分析

?哪里切换了进程的地址空间 从执行switch_to的位置往前找 2019/1/14 Linux操作系统分析

Project:进程的切换 对Linux中进程的切换过程进行分析,提交分析 报告 2019/1/14 Linux操作系统分析