北大nachos课程提问汇总

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


LAB提问
32.如何让Nachos支持用户程序? 答:#ifdef USER_PROGRAM …… #endif DEFINES=_DUSER_PROGRAM_ ; 33.如何执行test中的用户程序? 答:进入userprog/ ./nachos -x ../test/halt 34.如何创建user address space? 答:Addrspace::Addrspace(); (1)在machine里为user program分配物理内存并初 始化; (2)建立页表; (3)把noff可执行文件load到内存中;
LAB提问
论题3:比较Nachos的进程控制块与Windows和Linux的异同。 Nachos的线程属性与Linux和Windows的有共同的部分,例如线程ID, 线程名,堆栈空间等。但是Linux和Windows的显然要比Nachos的复杂 很多。 线程状态也是一样,Linux和Windows也有Running, Ready, Wating/Blocked等状态。但具体部分却各有不同,例如Windows的为7 状态:Ready, Standby, Running, Waiting, Transition, Terminated, Initialized;Linux的则为:Running, Uninterruptible, Interruptible, Ready, Stopped, Zombie等。 另外,Nachos的线程创建函数名字与Linux一样也叫Fork,但原理似乎与 Windows的的CreateProcess更相似一些,因为Fork的父子线程之间没 有任何联系。
LAB提问
26.锁采用自旋锁还是睡眠锁?为啥? 答:不能采用自旋锁。因为线程竞争自旋锁,如果竞争不到,线程会不停的忙 等待,不停的重试请求。如果长时间得不到锁,自旋锁看起来就像死循环 一样。 27.锁和初始值为1的信号量的区别? 答:锁由持有者释放,信号量可由任何进程修改。
28.信号量的实现中,while可替换成If吗? 答:因为可能在当前进程阻塞的时候,其它进程用掉了信号量,于是就没有百度文库号量 了,会写出错,所以要用while循环来判断。 29.Wait操作的功能?如何实现? 答:当进入管程的一个进程无法继续时,在条件变量上执行原语,将使该进程阻塞, 进入等待队列。 30.Signal功能?如何实现? 答:另一进程通过在该条件变量上执行Signal操作,唤醒等待队列上的一个进程。 31.管程的作用? 答:实现进程互斥。把分散的各同类临界区集中起来,并为每个可共享资源设立一个 专门的管程 来统一管理各进程对该资源的访问,这样既便于系统管理共享资源, 又能保证互斥访问,是临界资源的管理者或封装者,进程必须通过管程访问临界 资源
LAB提问
35.怎样生成NOFF? 答(1)用gcc MIPS交叉编译器产生unix的一般格式的二 进制文件; (2)用bin/下的coff2noff把COFF格式转化为NOFF 格式; ; 36.如何运行user address.space 中的指令? 答:machine::Run() Onelnstruction:取指,译码,执行 37.执行多个用户程序? 答:(1)Machine->Run()多次 (2)用户内存管理
所以线程还是会正常进行Finish的。
LAB提问
论题6:什么情况下线程不能被销毁? 课堂上讨论过,线程不能销毁的原因主要是因为没有设立待销毁的线程栈,导致了如 果之前的线程尚未被销毁而后来的线程已经到达时,原先的线程就不会被销毁的情况。 上课也讨论过出现这种现象的情况,而其本质到底是什么呢? 线程不能被摧毁的条件是:两个或两个以上的线程先后Finish,期间没有调用过 scheduler->Run,就会出现这种情况。例如,新建多个直接Finish的线程,就只有 最后一个会被Destroy,其它的依然停留在Blocked状态。
LAB提问
论题4:为什么CheckOverflow没有起作用。 CheckOverflow被调用的时机是scheduler->Run时,即有线程Sleep或是Yield, 需要运行新的线程时。而oldThread->CheckOverflow()执行于SWITCH之前,也 就是说它是由旧的线程调用的,只能检查旧的线程是否有栈溢出。而不能检查新的线 程是否栈溢出。 这样一来,便使得新的线程建立之时,还没得到检查,便被linux系统检测出了段错误使程 序终止。所以CheckOverflow没能起到预期的作用。
LAB提问
20. Thread状态转化模型: 四种状态模型: 21. Nachos第一个线程是什么?跟其它线程的区别? 答:第一个线程是main线程。跟其它线程的区别是没有 fork() Nachos启动的全过程由main线程完成。 启动过程是怎么样? Main线程有哪些功能?(1)初始化操作系统各功能部分 (2)执行作业(3)关闭操作系统 Main没有运行,那么main函数线程的栈在哪里?在数组操 作系统,由linux操作为他自动分配Nachos内存空间。 画出栈结构图?
论题5:线程没有调用Finish,而是自然执行完毕之后,会以怎样的方式消失? 虽然从表面上看线程的代码段执行正常运行结束,并没有调用主动调用 Finish。但是实际上线程Fork开始的时候就进入ThreadRoot, ThreadRoot中包括了开中断,执行func代码段,最后执行Finish的部分。

址空间、段页指针等等。
LAB提问
论题2:为什么“NOTE: DO NOT CHANGE the order of these first two members.”?如果要调换 的话需要怎样修改? 为什么不能交换顺序:进行线程之间的切换时,对原线程状态的保存是通过线程指针寻址来实现的。更具体来说, 是通过寻找线程指针指向的前若干个字节数据,来找到stackTop以及machineState数组,因为这些变 量刚好被分配在线程的内存空间的最前面。所以不能在它们之前添加变量。 另外,由于地址是相对于stackTop来寻址,所以如果stackTop位置改变,就会导致汇编代码中的寻址部分必须 改变。 分析如下:
论题7:为什么machineState数组的大小是18?实际上真的用到了那么多吗? 之所以发现这个问题,是因为在读switch.c的代码时,发现似乎并没有用 到machineState的太多空间。之后才发现,实际上并没有用到那么多, 留出足够的空间是为了保证HOST_SNAKE机型的运行。实际上,经过黄 柱彬的测试,数组大小变为8的时候可以正常运行,而改为7则不行,说明 i386只用到了machineState的前8位。
LAB提问
22. Thread类第一,二属性为什么不能改变位置?(为什么“NOTE: DO NOT CHANGE the order of these first two members.”?如果要调换的话需 要怎样修改? ) 答:为什么不能交换顺序:进行线程之间的切换时,对原线程状态的保存是通过线程指针寻 址来实现的。更具体来说,是通过寻找线程指针指向的前若干个字节数据,来找到 stackTop以及machineState数组,因为这些变量刚好被分配在线程的内存空间的 最前面。所以不能在它们之前添加变量。 另外,由于地址是相对于stackTop来寻址,所以如果stackTop位置改变,就会导致汇编 代码中的寻址部分必须改变。因为是用偏移量来回存寄存器状态,进行switch操作 的,交换位指针不保存到对应位置上,CPU的内容保存不到相应偏移量。 23. Thread对象finish过程,存在什么BUG? 下一个线程可能的情况? 答(1)New Thread (2)占主动抛弃cpu的Thread(3)占被动抛弃cpu的 Thread 24.基于优先级的抢占式调度如何实现? 答:(1)优先级实现;(2)调度时机 与时间片相关的调度时机? 25.Nachos如何保证同步操作的原子性? 答(1)关中断(2)单CPU

LAB提问
switch.h里第131至147行应该改为: #define _ESP 0 #define _EAX -4 #define _EBX -8 #define _ECX -12 #define _EDX -16 #define _EBP -20 #define _ESI -24 #define _EDI -28 #define _PC -32 #define PCState (18+_PC/4) #define FPState (18+_EBP/4) #define InitialPCState (18+_ESI/4) #define InitialArgState (18+_EDX/4) #define WhenDonePCState (18+_EDI/4)
LAB提问
论题1:Nachos线程实现了原理课中PCB哪些部分 ? (1)进程描述信息: 线程名 ,线程ID(之后添加),存储器管理,输入输出状态; (2)进程控制信息: 当前状态 ,优先级(之后添加) ,代码执行入口地址 ; (3) CPU现场信息:寄存器值 ; 未包括的部分:用户ID、代码执行入口地址、运行统计信息、进程同步与通信信息、虚拟地
相关文档
最新文档