OS_Lab2
Thinking2.1
Thinking 2.1 请根据上述说明,回答问题:在编写的 C 程序中,指针变量中存储的地址被视为虚拟地址,还是物理地址?MIPS 汇编程序中 lw 和 sw 指令使用的地址被视为虚拟地址,还是物理地址?
answer
两者都是虚拟地址
Thinking2.2
Thinking 2.2 请思考下述两个问题:
从可重用性的角度,阐述用宏来实现链表的好处。
查看实验环境中的 /usr/include/sys/queue.h,了解其中单向链表与循环链表的实现,比较它们与本实验中使用的双向链表,分析三者在插入与删除操作上的性能差异。
answer
类型灵活性:宏可以接受类型参数,可为不同的数据类型创建链表,而无需编写多个不同的链表实现。通过传递不同的类型给宏,为任何数据类型创建链表。
减少代码冗余:使用宏可以避免在多个地方重复编写相同的链表节点结构体定义(通过引用宏即可)。
易于维护:由于链表节点的定义是通过宏来实现的,因此需要修改链表节点的结构,只需要修改宏的定义即可,可以在整个代码中统一更新链表节点的结构。
跨项目重用:由于宏是在预处理阶段展开的 ...
OS_Lab1
Thinking 1.1
请阅读 附录中的编译链接详解,尝试分别使用实验环境中的原生 x86 工具链(gcc、ld、readelf、objdump 等)和 MIPS 交叉编译工具链(带有 mips-linux-gnu-前缀),重复其中的编译和解析过程,观察相应的结果,并解释其中向 objdump 传入的参数的含义。
新建 + 预处理
只编译而不链接 + 反汇编
传入参数为test.o,此处仅生成test.c的目标文件,未链接其他目标文件,故printf 的具体实现依然不在我们的程序中。
编译 + 反汇编
传入的参数为a.out,此处为test.c编译出的可执行文件,在链接(Link)阶段,printf 的实现被插入到最终的可执行文件中的。
objdump 传入的参数的含义
1234-D, --disassemble-all Display assembler contents of all sections --disassemble=<sym> Display assembler contents from <sym& ...
OS_作业1
第一题1. 什么是多道程序设计?多道程序设计与分时系统的区别是什么?
定义: 多道程序设计是一种计算机内存管理技术,其允许在计算机内存中同时存放多个相互独立的程序,并使这些程序在管理程序的控制下相互穿插运行。这种技术使得两个或两个以上的程序在计算机系统中同时处于开始到结束之间的状态。从宏观上看,这些程序似乎是并行运行的,因为多道程序都处于运行中且没有运行结束;但从微观上看,这些程序实际上是串行的,它们轮流使用CPU,交替执行。
多道程序设计技术的引入旨在提高CPU的利用率,提高计算机的硬件资源的利用率,充分发挥计算机系统部件的并行性。当一道程序因某种原因(如I/O请求)而暂停执行时,CPU会立即转去执行另一道程序,从而减少了CPU的等待时间,增加了系统的吞吐量,提高了系统的效率。
特点:多道、宏观上并行、微观上串行的。
区别:
分时系统是一种联机的多用户交互式操作系统,它是多道程序设计的延伸。在分时系统中,多个用户可以通过终端同时与计算机进行交互,每个用户都可以实时得到服务。分时系统采用时间片轮转的方式,每个用户获得一个时间片并运行,如果某个作业在分配的时间片用完之前计算还未完成, ...
OS_作业3
第一题
(1)进程整个的地址空间为 $2^{32}$ 字节,一页有 $2^{22}$ 字节
(2)
第一级页表的起始基地址:
根据页表项宇地址空间是线性映射的,0x80000000对应0x80000000 >> 12个页表项
由于一个页表项占4B空间,偏移为0x80000000 >> 12 * 4,即0x200000
起始基地址为0x80200000
通过逻辑地址0x80200000读出第一级页表所在的物理页框号(0x80200800存入数据为0x80200000该起始基地址,绕了两圈又回来了)
注:根据线性映射,每个虚拟地址都存在于某个页表内,可能是页目录项所在页表还是页表项所在页表。但是每个虚拟地址存在其对应的物理地址的条件是其对应的每一级页表都存在相应的的物理页表可供查询。
(3)
0x0访问缺失
0x00803004
页目录项的物理地址:0x1008
页表项的物理地址:0x500c
获取的物理地址:0x20004
0x00402001
页目录项的物理地址:0x1004
页表项的物理地址:0x1008
获取的物理地址:0x5001
注:根据实 ...
OS_作业2
第一题1. 动态内存分配需要对内存分区进行管理,一般使用位图和空闲链表两种方法。128MB的内存以n字节为单元分配,对于链表,假设内存中数据段和空闲区交替排列,长度均为64KB。并假设链表中的每个节点需要记录32位的内存地址信息、16位长度信息和16位下一节点域信息。这两种方法分别需要多少字节的存储空间?哪种方法更好?
内存:$128MB = 2^{27}B$
位图法(一个位来表示其状态(空闲或已分配))
储存空间:$\frac{2^{27}}{n*8}B$
链表法(每个空闲区都有一个节点来记录信息)
数据段和空闲区个数:$\frac{2^{27}}{2^{16}*2}=2^{10}$
储存空间:$2^{10}*2^3=2^{13}B$
两种方法需在不同要求下进行选择,没有绝对的更好。
位图法:
时间成本低:操作简单,直接修改其位图值即可
空间成本固定:不依赖于内存中的程序数量
没有容错能力:如果一个分配单元为1,不能肯定应该为1还是因错误变成1。
空闲链表法:
空间成本:取决于程序的数量。
时间成本:链表扫描通常速度较慢,还要进行链表项的插入、删除和修改。
有一 ...
OS_作业4
第一题
读者写者问题(写者优先): 1)共享读; 2)互斥写、读写互斥; 3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)。
123456789101112131415161718192021222324252627282930var mutex, wmutex, rwmutex:psemaphore;var readcount:integer;begin seminit(mutex.v,1;wmutex.v,1;rwmutex.v,1); readcount:=0; cobegin procedure reader; begin P(rwmutex); P(mutex); if readcount=0 then P(wmutex); readcount:=readcount+1; V(mutex); V(rwmutex); read P(mutex); readcount:=readcount-1; if readcount=0 then V(wmutex); V(mutex); end procedure ...
OS_作业5
第一题
(1)
先来先服务:
P1 -> P2 -> P3 -> P4 -> P5
短作业优先:
P2 -> P4 -> P3 -> P5 -> P1
非抢占式的优先数(最高响应比优先FRRF):
P1 -> P2 -> P4 -> P3 -> P5
10 1 1 2 5
轮转法:
P1 -> P2 -> P3 -> P4 -> P5 -> P1 -> P5 -> P1 -> P5 -> P1
P1:2 P2:1 P3:2 P4:1 P5:2 P1:2 P5:2 P1:2 P5:1 P1:4
(2)
先来先服务:
P1:周转时间 10,等待时间 0
P2:周转时间 11,等待时间 10
P3:周转时间 13,等待时间 11
P4:周转时间 14,等待时间 13
P5:周转时间 19,等待时间 14
平均周转时间:\frac{10 + 11 + 13 + 14 + 19}{5} = 13.4
短作业优先:
P1:周转时间 19,等待时间 9
P2:周转时间 ...
OS_作业6
第一题
分析磁盘访问数据的时间。假设磁盘请求以柱面 10、35、20、70、2、3 和 38 的次序进入磁盘驱动器。寻道时磁头每移动一个柱面需要5ms,以下各算法所需的寻道时间是多少:
(1) 先来先服务
(2) 最短寻道时间优先
(3) SCAN 算法
(4) LOOK 算法
说明:假设以上三种情况磁头初始位置为 15。对于(3)和(4),磁头当前向大柱面号方向运行,磁盘最大柱面号为 85。
(1)磁头移动的次序:
15 -> 10 -> 35 -> 20 -> 70 -> 2 -> 3 -> 38
寻道时间:$(5 + 25 + 15 + 50 + 68 + 1 + 35)*5=995$
(2)磁头移动的次序:
15 -> 10 -> 3 -> 2 -> 20 -> 35 -> 38 -> 70
寻道时间:$(5+7+1+18+15+3+32)*5=405$
15 -> 20 -> 10 -> 3 -> 2 -> 35 -> 38 -> 70
寻道时间:$ ...






