OS:lab2实验报告
OS:lab2实验报告 Thinking 2.1 **在编写的C程序中,指针变量中存储的地址被视为虚拟地址,还是物理地址?MIPS汇编程序中lw和sw指令使用的地址被视为虚拟 地址,还是物理地址? ** 在编写的C程序中,指针变量中存储的地址为虚拟地址 汇编程序中lw,sw发送的也是虚拟地址 Thinking 2.2 请从可重用性的角度,阐述用宏来实现链表的好处 使用宏定义对链表操作进行封装,可以实现代码的复用,即减少了工作量,也提高了程序的可读性 请你查看实验环境中的 /usr/include/sys/queue.h,了解其中单向链表与循环链表的实现,比较它们与本实验中使用的双向链表,分析三者在插入与删除操作上的性能差异 对于单向链表,由于它只能获得每一项的后面一项,因此在删除时需要遍历整个链表;同样,如果是在某一项的前面插入,也需要从head开始遍历这个链表。但是如果是“在某一项之后插入”,单项链表可以直接进行该操作。 对于循环链表,因为它仍然是单向的,所以在“删除”、“某一项之前插入”、“某一项之后插入”三个操作的性能和单项链表相同。但是,由于循环链表首尾相连,同时维护了一个指向尾项的指针,因此它可以直接在尾部插入。 对于双向链表,因为它可以直接获得某一项的前后两项,所以无论是“删除”还是“在某一项前或后插入”都可以以O(1)的开销实现。但是,双向链表没有维护指向尾部的指针,因此无法直接将某一项插入链表尾部,如要实现该操作还需要遍历整个链表。 Thinking 2.3 选择Page_list正确的展开结构 C struct Page_list{ struct { struct { struct Page *le_next; struct Page **le_prev; } pp_link; u_short pp_ref; }* lh_first; } Thinking 2.4 请阅读上面有关TLB的描述,从虚拟内存和多进程操作系统的实现角度,阐述ASID的必要性。 操作系统会给每一个进程分配一个页表,每个页表都有自己的虚拟地址空间,而同一虚拟地址在不同地址空间中通常映射到不同的物理地址。如果没有ASID来区分当前虚拟地址是在哪个进程中使用,则可能会将该虚拟地址映射到错误的物理地址。(每一个进程都有自己的虚拟地址空间4G,ASID可以区分不同进程同一虚拟地址转换成物理地址的方法) 请阅读 MIPS 4Kc 文档《MIPS32® 4K™ Processor Core Family Software User’s Manual》的 Section 3.3.1 与 Section 3.4,结合 ASID 段的位数,说明 4Kc中可容纳不同的地址空间的最大数量 ASID有8位,即最多可以有$2^8$个地址空间(进程数量) Thinking 2.5 tlb_invalidate 和 tlb_out 的调用关系是怎样的? ...