2024年6月12日发(作者:)
华北电力大学
实 验 报 告
实验名称
操作系统实验
课程名称
操作系统综合实验
专业班级: 学生姓名:
学 号:
成 绩:
指导教师: 实验日期:
|
|
|
|
实验一
一.实验目的
(1)熟悉操作系统集成实验环境OS Lab的基本使用方法。
(2)练习编译、调试EOS操作系统内核以及EOS应用程序。
二.实验内容
(1)启动OS Lab;
(2)学习OS Lab的基本使用方法:练习使用OS Lab编写一个Windows控制台应用程序,
熟悉OS Lab的基本使用方法(主要包括新建项目、生成项目、调试项目等);
(3)EOS内核项目的生成和调试 : 对EOS内核项目的各种操作(包括新建、生成和各
种调试功能等)与对Windows控制台项目的操作是完全一致的;
(4)EOS应用程序项目的生成和调试;
(5)退出OS Lab 。
三.实验内容问题及解答
1) 练习使用单步调试功能(逐过程、逐语句),体会在哪些情况下应该使用“逐过程”
调试,在哪些情况下应该使用“逐语句”调试。练习使用各种调试工具(包括“监视”窗
口、“调用堆栈”窗口等)。
答:逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里
面。 而逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行。
因此,在需要进入函数体时用逐语句调试,而不需要进入函数体时用逐过程调试。
2) 思考生成EOS SDK文件夹的目的和作用。查看EOS SDK文件夹中的内容,明白文
件夹的组织结构和各个文件的来源和作用。查看EOS应用程序包含了SDK文件夹中的哪
些头文件,是如何包含的?
答:EOS SDK是为应用程序调用系统API提供服务,可作为用户编程中可使用的
华 北 电 力 大 学 实 验 报 告
工具包集合。
EOS SDK文件夹主要包括INC头文件、LIB文件夹 导入库文件和BIN文件夹 动
态链接库,可执行程序,二进制文件。
EOS SDK包含的头文件有:eos.h负责导出API函数声明;eosdef.h负责导出函
数类型的定义;error.h 负责导出错误码。
四.实验过程
1.新建Windows控制台应用程序
生成项目:
执行项目:
调试项目:
2.
使用断点终端执行:
查看EOS SDK(Software Development Kit)文件夹:
修改EOS应用程序项目名称 :
五.实验心得
这次是验证性试验,具体步骤和操作方法都是与实验教程参考书上一致,实
验很顺利,实验过程没有遇到困难。通过这次实验,我掌握了OS Lab启动和
退出操作;练习使用OS Lab编写一个Windows控制台应用程序,熟悉OS Lab
的基本使用方法新建项目、生成项目、调试项目等。
第 页 共 页
实验2 操作系统的启动
一.实验目的
1.跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。
2.查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。
二.实验内容
1. 调试EOS操作系统的启动过程。
2.调试加载程序。Loader程序的主要任务是将操作系统内核(文件)加载
到内存中,然后让CPU进入保护模式并且启用分页机制,最后进入操作系统内核开始执
行(跳转到的入口点执行)。
3.调试内核。
启动后的状态和行为。查看EOS的版本号:
1)在控制台中输入命令“ver”后按回车。
2)输出EOS版本后的控制台如下图所示。
5 查看有应用程序运行时进程和线程的信息:
1)待 EOS启动完毕,在EOS控制台中输入命令“hello”后按回车。此时
应用程序就开始执行。
2)迅速按Ctrl+F2切换到控制台2,并输入命令“pt”后按回车。输出的进程和线程
信息如下图所示
华 北 电 力 大 学 实 验 报 告
三.实验内容问题及解答
1. 为什么EOS操作系统从软盘启动时要使用和两个程序?使用一个
可以吗?它们各自的主要功能是什么?如果将的功能移动到文件中,
则文件的大小是否仍然能保持小于512字节?
在IDE环境启动执行EOS操作系统时,会将、和三个二
进制写入软盘镜像文件中,然后让虚拟机来执行软盘中的EOS操作系统。
仅使用其中一个是不能运行的。
2. 软盘引导扇区加载完毕后内存中有两个用户可用的区域,为什么软盘引导扇区程序选择
将加载到第一个可用区域的0x1000处呢?这样做有什么好处?这样做会对
文件的大小有哪些限制。
首先用户只用两个可用区域,加载位置非此即彼。第一个可用用户区是低地址区,且空
间大小比较小,适合容纳小文件,所以我们选择将占用空加载到第一用户区。
优点:由低地址开始,便于检索查找。小文件占用小空间,节约资源。
限制:文件必须小于1c00k.
3. 练习使用Bochs单步调试BIOS程序、软盘引导扇区程序和loader程序,加深对操作系
统启动过程的理解。
实验3 进程的创建
一.实验目的
一. 练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理
解进程和程序的区别。
二. 调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资
源分配的单位。
二.实验内容
第 页 共 页
1. 准备实验. 启动OS Lab。
2. 练习使用控制台命令创建EOS应用程序的进程
3. 练习通过编程的方式让应用程序创建另一个应用程序的进程
4. 调试CreateProcess函数
5. 调试PsCreateProcess函数”。
6. 练习通过编程的方式创建应用程序的多个进程
三.实验内容问题及解答
1. 在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用
同时创建10个进程。
使用PROCESS_INFORMATION类型定义一个有10 个元素的数组,每一个元素对应一个进
程。
2. 学习本书第5章中的5.2节,了解关于线程的相关知识,然后尝试调试
PspCreateThread函数,观察线程控制块(TCB)初始化的过程。
3. 在PsCreateProcess函数中调用了PspCreateProcessEnvironment函数后又先
后调用了PspLoadProcessImage和PspCreateThread函数,学习这些函数的主要功
能。能够交换这些函数被调用的顺序吗?思考其中的原因。
PspCreateProcessEnvironment 创建了地址空间和分配了句柄表。
PspLoadProcessImage是将进程的可执行映像 加载到了进程的地址空间中。
PspCreateThread创建了进程的主线程。这三个函 4 知道自己要从哪里开始执行,执行哪
些指令。因此不能交换他们的顺序。
四.实验心得
本实验主要的问题就是用同时创建10个进程:因为编程基础不好,刚开始的
程序很难通过编译.最后使用PROCESS_INFORMATION类型定义一个有10个元素的数
组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等
待10个子进程结束,得到退出码后关闭句柄。并对细节做了部分修正才成功。
华 北 电 力 大 学 实 验 报 告
实验4线程的状态和转换
一.实验目的和要求
1. 调试线程在各种状态间的转换过程,熟悉线程的状态和转换。
2. 通过为线程增加挂起状态,加深对线程状态的理解。
二.实验内容及步骤
1.准备实验。
2.调试线程状态的转换过程。
3.线程由阻塞状态进入就绪状态
4. 线程由运行状态进入就绪状态
5. 线程由就绪状态进入运行状态
6线程由运行状态进入阻塞状态.
7. 为线程增加挂起状态
8. 完成Resume原语后,可以先使用suspend命令挂起loop线程,然后在控制台2中
输入命令“Resume 31”(如果loop线程的ID是31)后按回车。命令执行成功的结果如
下图所示。如果切换回控制台1后,发现loop线程的执行计数恢复增长就说明Resume原
语可以正常工作。
三.实验内容问题及解答
1. 思考一下,在本实验中,当loop线程处于运行状态时,EOS中还有哪些线程,它们分
别处于什么状态。可以使用控制台命令pt查看线程的状态。
第 页 共 页
2. 当loop线程在控制台1中执行,并且在控制台2中执行suspend命令时,为什么控制台
1中的loop线程处于就绪状态而不是运行状态?
3. 在本实验3.2节中只调试了图5-3中显示的最主要的四种转换过程,对于线程由新建进
入就绪状态,或者由任意状态进入结束状态的转换过程还没有调试,请读者找到这两个转
换过程执行的源代码,自己练习调试。
4. 总结一下在图5-3中显示的转换过程,哪些需要使用线程控制块中的上下文(将线程控
制块中的上下文恢复到处理器中,或者将处理器的状态复制到线程控制块的上下文中),
哪些不需要使用,并说明原因。
5. 在本实验3.2节中总结的所有转换过程都是分步骤进行的,为了确保完整性,显然这些
转换过程是不应该被打断的,也就是说这些转换过程都是原语操作(参见本书第2.6节)。
请读者找出这些转换过程的原语操作(关中断和开中断)是在哪些代码中完成的。(提示,
重新调试这些转换过程,可以在调用堆栈窗口列出的各个函数中逐级查找关中断和开中断
的代码。)
6. 修改EOS源代码,对已经实现的线程的挂起状态进行改进。首先,不再使用Zero状态
表示静止就绪状态,在枚举类型THREAD_STATE中定义一个新的项用来表示静止就绪状
态,并对PsSuspe
ndT
hread函数进行适当修改。其次,处于阻塞状态和运行状态的线程
华 北 电 力 大 学 实 验 报 告
也应该可以被挂起并被恢复,读者可以参考第5.2.4节中的内容以及图5-5来完成此项改
进。注意要设计一些方案对所修改的代码进行全面的测试,保证所做的改进是正确的。如
果完成了以上改进,请思考一下控制台命令pt需要进行哪些相应的修改?
设计代码
STATUS
PsResumThread(
IN HANDLE hThread
)
{
STATUS Status;
BOOL IntState;
PTHREAD Thread;
Status = ObRefObjectByHandle(hThread, PspThreadType, (PVOID*)&Thread);
if (EOS_SUCCESS(Status)) {
IntState = KeEnableInterrupts(FALSE); // 关中断
if (Zero == Thread->State) {
ListRemoveEntry(&Thread->StateListEntry);
PspReadyThread(Thread);
PspThreadSchedule();
Status = STATUS_SUCCESS;
} else {
Status = STATUS_NOT_SUPPORTED;
}
KeEnableInterrupts(IntState); // 开中断
ObDerefObject(Thread);
}
return Status;
}
实验5 进程的同步
一. 实验目的和要求
1. 使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。2. 通过为
线程增加挂起状态,加深对线程状态的理解。
第 页 共 页
2. 调试跟踪EOS信号量的工作过程,理解进程同步的原理。
3. 修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步
的原理。
二.实验内容及步骤
1.实验准备
1)启动OS Lab。
2)新建一个EOS Kernel项目。
3)生成EOS Kernel项目,从而在该项目文件夹中生成SDK文件夹。
4)新建一个EOS应用程序项目。
5)使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。
2. 使用EOS的信号量解决生产者-消费者问题
1)使用pc.c文件中的源代码,替换之前创建的EOS应用程序项目中EOSApp.c文件内
的源代码。
2)按F7生成修改后的EOS应用程序项目。
3)按F5启动调试。OS Lab会首先弹出一个调试异常对话框。
4)在调试异常对话框中选择“否”,继续执行。
5)立即激活虚拟机窗口查看生产者-消费者同步执行的过程,如图1
6)待应用程序执行完毕后,结束此次调试。
华 北 电 力 大 学 实 验 报 告
图 1
3调试EOS信号量的工作过程.
1.创建信号量: 信号量结构体(SEMAPHORE)中的各个成员变量是由API函数
CreateSemaphore的对应参数初始化的,查看main函数中创建Empty和Full信
号量使用的参数有哪些不同,又有哪些相同,思考其中的原因。
2. 等待、释放信号量
1) 等待信号量(不阻塞): 生产者和消费者刚开始执行时,用来放产品的缓冲区都是
空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,
应该不需要阻塞就可以立即返回
2) 释放信号量(不唤醒): 生产者线程通过等待Empty信号量使空缓冲区数量减少
了1,通过释放Full信号量使满缓冲区数量增加了1,这样就表示生产者线程生产了一
个产品并占用了一个缓冲区。
3) 等待信号量(阻塞): 由于开始时生产者线程生产产品的速度较快,而消费者线程消
第 页 共 页
费产品的速度较慢,所以当缓冲池中所有的缓冲区都被产品占用时,生产者在生产新的产
品时就会被阻塞.
4) 释放信号量(唤醒): 只有当消费者线程从缓冲池中消费了一个产品,从而产生一
个空缓冲区后,生产者线程才会被唤醒并继续生产14号产品.
4. 修改EOS的信号量算法
1)要求:在目前EOS Kernel项目的ps/semaphore.c文件中,
PsWaitForSemaphore函数的Milliseconds参数只能是INFINITE,
PsReleaseSemaphore函数的ReleaseCount参数只能是1。现在要求同时修改
PsWaitForSemaphore函数和PsReleaseSemaphore函数中的代码,使这两个参数能
够真正起到作用,使信号量对象支持等待超时唤醒功能和批量释放功能。
2)测试:
a. 使用修改完毕的EOS Kernel项目生成完全版本的SDK文件夹,并覆盖之前的生
产者-消费者应用程序项目的SDK文件夹。
b. 按F5调试执行原有的生产者-消费者应用程序项目,结果必须仍然与图1一致。
如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改,并重复步骤a。
实验六 时间片轮转调度
一.实验目的及要求
1.调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。
2.为EOS添加时间片轮转调度,了解其它常用的调度算法。
二.实验内容及步骤
华 北 电 力 大 学 实 验 报 告
1.准备实验
2. 阅读控制台命令“rr”相关的源代码
3.调试线程调度程序
a)调试当前线程不被抢先的情况
b) 调试当前线程被抢先的情况
三. 为EOS添加时间片轮转调度
a)要求:修改ps/sched.c文件中的PspRoundRobin函数(第337行),在其中实
现时间片轮转调度算法。
b)测试:
三.实验内容问题及解答
修改线程时间片的大小:
在成功为EOS 添加了时间片轮转调度后,将ps/psp.h第104行定义的
TICKS_OF_TIME_SLICE的值修改为1。在EOS控制台中输入命令“rr”后按回车。观察
执行的效果。 还可以按照上面的步骤为 TICKS_OF_TIME_SLICE 取一些其它的极端值,
例如 20 或 100 等,分别观察“rr”命令执行的效果。通过分析造成执行效果不同的原
因,理解时间片的大小对时间片轮转调度造成的影响。
a) TICKS_OF_TIME_SLICE的值为1
第 页 共 页
b) TICKS_OF_TIME_SLICE的值为20
c) TICKS_OF_TIME_SLICE的值为100
华 北 电 力 大 学 实 验 报 告
实验七 物理存储器与进程逻辑地址空间的
管理
一.实验目的及要求
1. 使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。2. 通
过为线程增加挂起状态,加深对线程状态的理解。
2. 调试跟踪EOS信号量的工作过程,理解进程同步的原理。
3. 修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进
程同步的原理。
二.实验内容及步骤
第 页 共 页
(1)、准备实验
(2)、执行控制台命令“pm”,查看物理存储器的信息
(3)、分配物理页和释放物理页:
a. 在pm命令函数中添加分配物理页和释放物理页的代码
b. 单步调试分配物理页和释放物理页
(4)、执行控制台命令“vm”,查看系统进程的虚拟地址描述符信息
执行控制台命令“vm”,查看当创建了一个应用程序进程后,系统进程和应用程
序进程中虚拟地址描述符的信息
(5)、在系统进程中分配虚拟页和释放虚拟页
(6)、在应用程序进程中分配虚拟页和释放虚拟页
(7)、结束实验
三.实现代码及其说明:
INT *d;
if(d = VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)){// 调用API
函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向
这个空间
printf("Allocated %d bytes virtual memory of 0x%xnn",sizeof(int),d);
printf("virtual memory original value:0x%xnn",*d);
*d = 0xFFFFFFFF;// 修改整型变量的值为0xFFFFFFFF
printf("virtual memory new value:0x%xnn",*d);
printf("nWait for 10 secondsn");
Sleep(10000);// 调用API函数Sleep,等待10秒钟。
if(VirtualFree(d,0,MEM_RELEASE))// 调用API函数VirtualFree,释放之前分
华 北 电 力 大 学 实 验 报 告
配的整型变量的空间
printf("nRealease virtual memory success!n");
else
printf("realease errorn");
printf("nEndless loop!");
for(;;);
}
else
{
printf("errorn");
return -1;//若不能成功分配,打印出error ,返回-1.
}
printf("Hello world!n");
return 0;
四.心得体会
本次实验主要问题在于如何处理异常情况,也就是程序的健壮性。最开始调试结果不
正确,在老师指导下进行了分步调试,修改了部分代码,最后成功了。最大的收获是:熟
练对代码分步调试,找出错误。
实验八 分页存储器管理
第 页 共 页
一.实验目的与要求
1.学习i386处理器的二级页表硬件机制,理解分页存储器管理原理。
2.查看EOS应用程序进程和系统进程的二级页表映射信息,理解页目录和页表的管
理方式。
3.编程修改页目录和页表的映射关系,理解分页地址变换原理。
二.实验步骤与代码:
设计代码
PRIVATE
VOID
ConsoleCmdMemoryMap(IN HANDLE StdHandle){
BOOL IntState;
ULONG PfnOfPageDirectory;
ULONG PageTotal = 0;
ULONG IndexOfDirEntry;
ULONG IndexOfTableEntry;
PMMPTE_HARDWARE pPde;
PMMPTE_HARDWARE pPte;
ULONG_PTR PageTableBase;
ULONG_PTR VirtualBase;
const char* OutputFormat = NULL;
ASSERT(PspCurrentProcess == PspSystemProcess);
IntState = KeEnableInterrupts(FALSE); // 关中断
ULONG PfnArray[2];
华 北 电 力 大 学 实 验 报 告
号
((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].PageFrameNumb
MiAllocateZeroedPages(2, PfnArray);
OutputFormat = "New page frame number: 0x%X, 0x%Xn";
fprintf(StdHandle, OutputFormat, PfnArray[0], PfnArray[1]);
KdbPrint(OutputFormat, PfnArray[0], PfnArray[1]);
IndexOfDirEntry = (0xE0000000 >> 22); // 虚拟地址的高 10 位是 PDE 标
er = PfnArray[0];
((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].Valid = 1; //
有效
((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].Writable = 1; //
可写
MiFlushEntireTlb(); // 刷新快表
PageTableBase = 0xC0000000 + IndexOfDirEntry * PAGE_SIZE;
IndexOfTableEntry = (0xE0000000 >> 12) & 0x3FF;
((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].PageFrameN
umber = PfnArray[1];
((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Valid = 1;
((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Writable
MiFlushEntireTlb(); // 刷新快表 = 1;
IndexOfTableEntry = (0xE0001000 >> 12) & 0x3FF;
((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].PageFrameN
第 页 共 页
umber = PfnArray[1];
((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Valid = 1;
((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Writable = 1;
MiFlushEntireTlb(); // 刷新快表
OutputFormat = "Read Memory 0xE0001000: %dn";
fprintf(StdHandle, OutputFormat, *((PINT)0xE0001000));
KdbPrint(OutputFormat, *((PINT)0xE0001000));
*((PINT)0xE0000000) = 100; // 写共享内存
fprintf(StdHandle, OutputFormat, *((PINT)0xE0001000));
KdbPrint(OutputFormat, *((PINT)0xE0001000));
OutputFormat = "nCR3->0x%Xn";
PfnOfPageDirectory =
(ULONG)(PspSystemProcess->Pas->PfnOfPageDirectory);
fprintf(StdHandle, OutputFormat, PfnOfPageDirectory);
KdbPrint(OutputFormat, PfnOfPageDirectory);
for(IndexOfDirEntry = 0; IndexOfDirEntry
+
<
pPde
IndexOfDirEntry
PTE_PER_TABLE;
=
*
IndexOfDirEntry++){
(PMMPTE_HARDWARE)((ULONG_PTR)PDE_BASE
PTE_SIZE);
if(!pPde->Valid)
continue;
OutputFormat = "PDE: 0x%X (0x%X)->0x%Xn";
VirtualBase = (IndexOfDirEntry << PDI_SHIFT);
华 北 电 力 大 学 实 验 报 告
fprintf(StdHandle, OutputFormat, IndexOfDirEntry, VirtualBase,
pPde->PageFrameNumber);
KdbPrint(OutputFormat, IndexOfDirEntry, VirtualBase,
pPde->PageFrameNumber);
PageTableBase = (ULONG_PTR)PTE_BASE + IndexOfDirEntry *
PAGE_SIZE;
for(IndexOfTableEntry = 0; IndexOfTableEntry < PTE_PER_TABLE;
IndexOfTableEntry++)
{ pPte = (PMMPTE_HARDWARE)(PageTableBase +
IndexOfTableEntry * PTE_SIZE);
if(!pPte->Valid)
continue;
OutputFormat = "ttPTE: 0x%X (0x%X)->0x%Xn";
VirtualBase = (IndexOfDirEntry << PDI_SHIFT) |
(IndexOfTableEntry << PTI_SHIFT);
fprintf(StdHandle, OutputFormat, IndexOfTableEntry, VirtualBase,
pPte->PageFrameNumber);
KdbPrint(OutputFormat, IndexOfTableEntry, VirtualBase,
pPte->PageFrameNumber);
}}
OutputFormat = "nPhysical Page Total: %dn";
fprintf(StdHandle, OutputFormat, PageTotal);
第 页 共 页
号
}
KdbPrint(OutputFormat, PageTotal);
OutputFormat = "Physical Memory Total: %dnn";
fprintf(StdHandle, OutputFormat, PageTotal * PAGE_SIZE);
KdbPrint(OutputFormat, PageTotal * PAGE_SIZE);
OutputFormat = "nNonused Page Count: %dn";
fprintf(StdHandle, OutputFormat, MiGetAnyPageCount());
KdbPrint(OutputFormat, MiGetAnyPageCount());
IndexOfDirEntry = (0xE0000000 >> 22); // 虚拟地址的高 10 位是 PDE 标
PageTableBase = 0xC0000000 + IndexOfDirEntry * PAGE_SIZE;
IndexOfTableEntry = (0xE0000000 >> 12) & 0x3FF;
((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Valid = 0;
IndexOfTableEntry = (0xE0001000 >> 12) & 0x3FF;
((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].Valid = 0;
((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].Valid = 0;
MiFlushEntireTlb();
MiFreePages(2, PfnArray);
OutputFormat = "nNonused Page Count: %dn";
fprintf(StdHandle, OutputFormat, MiGetAnyPageCount());
KdbPrint(OutputFormat, MiGetAnyPageCount());
KeEnableInterrupts(IntState); // 开中断
三.实验问题内容及解答
华 北 电 力 大 学 实 验 报 告
思考页式存储管理机制的优缺点。
优点:
1. 虚存量大,适合多道程序运行,用户不必担心内存不够的调度操作,动态页式管理
提供反了内存与外存图图统一管理的虚存实现方式。
2. 内存利用率高,不常用的页面尽量不留在内存。
3. 不要求作业连续存放,有效的解决了内存碎片问题。
缺点:
1. 要进行页面中断,缺页中断等处理,系统开销较大;
2. 有可能产生“抖动”现象;
3. 地址变换机构复杂,一般采用硬件实现,增加了机器成本。
实验心得与体会
通过操作系统试验 ,了解了操作系统的启动过程 ,运行方式,加深了对计算机 操
作系统的理解 。
第 页 共 页
发布评论