北大操作系统高级课程-陈向群作业-XV6进程线程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

阅读代码:

1.基本头文件:

types.h param.h

memlayout.h defs.h

x86.h asm.h

mmu.h elf.h

2.进程线程部分:

vm.c proc.h proc.c swtch.S kalloc.c

以及相关其他文件代码

强调一下:由于内存管理部分还没有学到,所以请同学们遇到相关的代码和问题时,先将问题记录下来,到学过之后,再结合进程线程管理部分进行深入学习,最后要求对XV6有整体的理解。

请大家围绕如下一些问题阐述原理课的相关内容,以及XV6中是如何实现的。

1.什么是进程,什么是线程?操作系统的资源分配单位和调度单位分别是什么?XV6中的

进程和线程分别是什么,都实现了吗?

答:进程是在多道程序系统出现以后,为了描述系统内部各作业的活动规律而引进的概念。进程有3个基本状态,运行状态、就绪状态和等待状态(或称阻塞状态);进程只能由父进程建立,系统中所有的进程形成一种进程树的层次体系;挂起命令可有进程自己和其他进程发出,但是解除挂起命令只能由其他进程发出。进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。

线程可称为轻量级的进程,是操作系统可以运行调度的最小单位。线程是进程内的一个相对独立的可执行的单元。若把进程称为任务的话,那么线程则是应用中的一个子任务的执行。

不论操作系统中是否引入了线程,操作系统中资源分配的基本单位都是进程。如果操作系统没有引入线程那么进程就是调度的基本单位。线程并不独立拥有资源,它仅仅分配了一些运行必备的资源。一个进程中的多个线程共同分享进程中的资源。在引入了线程的操作系统中,线程就变成了调度的基本单位,进程中的部分线程阻塞并不代表该线程被阻塞。

xv6操作系统实现了一个基于进程(没有实现线程)的简单进程管理机制。通过对proc.h 文件的阅读了解到xv6的进程中定义了一个context结构,一个枚举类型proc_state定义了UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE 这6种进程的状态,proc结构定义了进程控制块的内容,cpu结构定义了寄存器和栈指针。

2.进程管理的数据结构是什么?在Windows,Linux,XV6中分别叫什么名字?其中包含哪

些内容?操作系统是如何进行管理进程管理数据结构的?它们是如何初始化的?

答:进程管理的数据结构是进程控制块(PCB)。在Linux中进程控制块的结构是由一个叫task_struct的数据结构定义的,ask_struct存在/include/ linux/sched.h中,其中包括管理进程

所需的各种信息。在创建一个新进程时,系统在内存中申请一个空的task_struct 区,即空闲PCB 块,并填入所需信息。同时将指向该结构的指针填入到task[]数 组中。当前处于运行状态进程的PCB 用指针数组current_set[]来指出。这是因为Linux 支持多处理机系统,系统内可能存在多个同时运行的进 程,故current_set 定义成指针数组。Windows 的进程由执行体进程块EPROCESS 表示,EPROCESS 即执行体进程对象。在Windows 中,PCB 也称为内核进程块KPROCESS (KPROCESS 即内核进程对象)EPOCESS 和KPROCESS 位于内核空间,PEB 位于用户空间。XV6的进程控制块是proc 类中的proc 定义了进程ID ,进程状态,父进程,context 保存寄存器为内核的上下文切换,cpu 记录了内存地址和栈指针等。XV6中通过 对进程进行控制管理,get_raw_proc()方法可以创建一个新的进程并对进程进行初始化分配进程页表和内核堆栈。

3. 进程有哪些状态?请画出XV6的进程状态转化图。在Linux ,XV6中,进程的状态分别包

括哪些?你认为操作系统的设计者为什么会有这样的设计思路?

答:XV6进程包括UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE 这6种状态即未使用态、初始态、等待台、就绪态、运行态、僵尸态。状态转换图如下:

之所以这样设计是为了实现多道程序的交叉运行,和方便设计各种进程调度算法。在时间片轮转调度算法中RUNNING 的程序在时间片到的时候就会转成RUNNABLE 同时让出CUP 。而正在EUNNING 的程序如果遇到资源申请,就会主动放弃CPU 进入SLEEPING 状态。但是SLEEPING 状态的程序如果得到资源之后并不能马上进入RUNNING 而是先进入就绪队列等待CUP 调度。

Linux 的进程状态可分为R (TASK_RUNNING),可执行状态,S (TASK_INTERRUPTIBLE),可中断的睡眠状态,D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态,T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态,Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程,X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁。

4. 如何启动多进程(创建子进程)?如何调度多进程?调度算法有哪些?操作系统为何要

限制一个CPU 最大支持的进程数?XV6中的最大进程数是多少?如何执行进程的切换?什么是进程上下文?多进程和多CPU 有什么关系?

答:子进程都是由父进程创建的,比如使用fork()函数。创建的过程为

1).为子进程分配一个空闲的proc 结构(进程描述符)

2).赋予子进程唯一标识pid

3).以一次一页的方式复制父进程地址空间(有什么问题?)

4).获得子进程继承的共享资源的指针,如打开的文件和当前工作目录

5).子进程就绪,加入调度队列

6).对子进程返回标识符0;向父进程返回子进程

pid

相关文档
最新文档