当前位置:文档之家› 操作系统实验

操作系统实验

操作系统实验
操作系统实验

操作系统实验报告

——OS Lab

班级:

姓名:

学号:实验1 实验环境的使用

本次实验主要学习了OS Lab的基本使用方法;练习编译、调试

了EOS操作系统内核以及EOS应用程序。

无论是EOS操作系统内核还是EOS应用程序,开始时它们都只

是一些源代码文件。当编译器、链接器、软盘镜像编辑器等工

具,对它们的源代码文件进行逐步转化后,它们就变成了可以在

虚拟机(或者裸机)运行的EOS操作系统内核与EOS应用程

序。

思考与练习

思考生成EOS SDK文件夹的目的和作用。查看EOS SDK文件夹中的内容,明白文件夹的组织结构和各个文件的来源和作用。查看EOS应用程序包含了SDK文件夹中的哪些头文件,是如何包含的?

答:操作系统通过向开发者提供SDK来开放其API,开发者在为操作系统编写应用程序时,通过使用SDK来调用API。

如果要为操作系统开发应用程序,就需要首先获得操作系统的SDK。

SDK为了向开发者提供操作系统的API,往往会包含头文

件、导入库文件和动态链接库文件。

头文件的主要作用是导出操作系统使用的一些数据类型(例如操作系统中使用的结构体类型)和API函数的声明,一般会被放在SDK中的Inc(Include)文件夹中

导入库文件(Import Library)是根据操作系统需要导出的API函数而生成的特定格式的二进制文件导入库文件。导入库文件的主要作用是告诉应用程序的可执行文件,其调用的API 函数在操作系统中的地址,一般会被放在SDK中的Lib

(Library)文件夹中。

动态链接库文件(Dynamic Link Library)是包含了操作系统导出的API函数的可执行代码的二进制文件。动态链接库文件的格式一般与可执行文件是相同的,只是不能直接执行,一般会被放在SDK中的Bin(Binary)文件夹中。

在IDE 环境成功生成EOS的二进制文件后,会自动生成

EOS SDK。IDE环境会首先新建一个SDK文件夹,然后将eos.h(导出API函数的声明)、eosdef.h(导出数据类型的定义)和error.h(导出错误码)三个头文件复制到SDK文件夹中的INC文件夹中,将生成的四个二进制文件都复制到BIN 文件夹中(EOS SDK为了简单,将导入库文件也放入了BIN 文件夹,而没有使用LIB文件夹)。这样,EOS SDK就具有了开发EOS应用程序所需的头文件、导入库文件和动态链接库文件。在编写EOS应用程序的源代码之前,必须首先获得EOS SDK文件夹。然后,在EOS应用程序的头文件

eosapp.h中包含SDK/INC文件夹中的三个头文件。实际上,eosapp.h只需要包含eos.h文件就即可,因为在eos.h文件中已经包含了eosdef.h和error.h文件。

实验2 操作系统的启动

跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。

思考与练习

1. 为什么EOS操作系统从软盘启动时要使用boot.bin和

loader.bin两个程序?使用一个可以吗?它们各自的主要功能是什么?如果将loader.bin的功能移动到boot.bin文件中,则

boot.bin文件的大小是否仍然能保持小于512字节?

答:boot文件夹包含了两个汇编文件boot.asm和

loader.asm。这两个文件生成的二进制文件boot.bin和

loader.bin会被写入软盘镜像文件。操作系统启动时boot.bin和loader.bin引导软盘加载程序,二者缺一不可。使用Boot.bin的主要功能是引导软盘;loader.bin的主要功能是加载程序。如果把loader.bin功能移动到boot.bin程序中,必然导致程序规模扩大,可能使其大于512字节。

2. 软盘引导扇区加载完毕后内存中有两个用户可用的区域,为

什么软盘引导扇区程序选择将loader.bin加载到第一个可用区域的0x1000处呢?这样做有什么好处?这样做会对loader.bin文件的大小有哪些限制。

答:首先用户只用两个可用区域,加载位置非此即彼。第一个可用用户区是低地址区,且空间大小比较小,适合容纳小文件,所以我们选择将占用空间小的loder.bin加载到第一用户区。

优点:由低地址开始,便于检索查找。小文件占用小空间,节约资源。

限制:loader.bin文件必须小于1c00k.

实验3 进程的创建

练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。

调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位

思考与练习

1. 在源代码文件NewTwoProc.c提供的源代码基础上进行修

改,要求使用hello.exe同时创建10个进程。提示:可以使用PROCESS_INFORMATION类型定义一个有10个元素的数

组,每一个元素对应一个进程。使用一个循环创建10个子进

程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。

答:主要使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。

使用hello.exe同时创建10个进程的原代码及注释如下:

#include"EOSApp.h"

//main函数参数的意义:

//argc-argv数组的长度,大小至少为1,argc-1为命令行//参数的数量。

//argv-字符串指针数组,数组长度为命令行参数个数+1。其中//argv[0]固定指向当前

//进程所执行的可执行文件的路径字符串,argv[1]及其后面//的指针指向各个命令行参数。

//例如通过命令行内容"a:\hello.exe-a-b"启动进程//后,

hello.exe的main函数的参数argc的值为3

//argv[0]指向字符串"a:\hello.exe",argv[1]指向参数字//符串"-a",argv[2]指向参数字符串"-b"。

int main(int argc,char*argv[])

{

//启动调试EOS应用程序前要特别注意下面的问题://1、如果要在调试应用程序时能够调试进入内核并显示对应//的源码,必须使用EOS核心项目编译生成完全版本的SDK

//文件夹,然后使用此文件夹覆盖应用程序项目中的SDK文件//夹,并且EOS核心项目在磁盘上的位置不能改变。

//2、在启动调试应用程序之前必须首先删除/禁用所有的断

//点,在断点中断(int3)被命中后才能重新添加/启用断//点,否则启动调试会失败。

STARTUPINFO StartupInfo;

PROCESS_INFORMATION ProcInfo[10];

ULONG ulExitCode;//子进程退出码

INT nResult=0;//main函数返回值。0表示成功,非0

//表示失败。

int i,j;

//#ifdef_DEBUG

//__asm("int$3\n nop");

//#endif

printf("Create10processes and wait for the processes exit. ..\n\n");

//使子进程和父进程使用相同标准句柄。

StartupInfo.StdInput=GetStdHandle(STD_INPUT_HANDLE);

StartupInfo.StdOutput=GetStdHandle(STD_OUTPUT_HAND LE);

StartupInfo.StdError=GetStdHandle(STD_ERROR_HANDLE) ;//为一个应用程序同时创建10个子进程。

for(i=0;i<10;i++)

if(CreateProcess("A:\\Hello.exe",NULL,0,&StartupInfo,&Pro cInfo[i]));

else{

for(j=0;j

WaitForSingleObject(ProcInfo[j].ProcessHandle,INFINITE);

//得到并输出子进程的退出码。

GetExitCodeProcess(ProcInfo[j].ProcessHandle,&ulExitCode);

printf("\nThe process%d exit with%d.\n",j,ulExitCode);//关闭不再使用的句柄。

CloseHandle(ProcInfo[j].ProcessHandle);

CloseHandle(ProcInfo[j].ThreadHandle);

}

printf("CreateProcess Failed,Error code:0x%X.\n",GetLastErro r());

nResult=1;

return nResult;

}

for(i=0;i<10;i++){

//创建子进程成功,等待子进程运行结束。WaitForSingleObject(ProcInfo[i].ProcessHandle,INFINITE);//得到并输出子进程的退出码。

GetExitCodeProcess(ProcInfo[i].ProcessHandle,&ulExitCode);

}

for(i=0i<10;i++){

printf("\nThe process%d exit with%d.\n",i,ulExitCode);//关

闭不再使用的句柄。

CloseHandle(ProcInfo[i].ProcessHandle);

CloseHandle(ProcInfo[i].ThreadHandle);}

return nResult;

}

2. 在PsCreateProcess 函数中调用了PspCreateProcessEnvironment 函数后又先后调用了PspLoadProcessImage和PspCreateThread函数,学习这些函数的主要功能。能够交换这些函数被调用的顺序吗?思考其中的原因。

答:PspCreateProcessEnvironment的主要功能是创建进程控制块 并且为进程创建了地址空间和分配了句柄表。

PspLoadProcessImage是将进程的可执行映像加载到了进程的地址空间中。

PspCreateThread创建了进程的主线程。

这三个函数被调用的顺序是不能够改变的,加载可执行映像之前必须已经为进程创建了地址空间,这样才能够确定可执行映像可以被加载到内存的什么位置。

在创建主线程之前必须已经加载了可执行映像这样主线程才能够知道自己要从哪里开始执行,执行哪些指令。因此不能交换他们的顺序。

实验4线程的状态和转换

调试线程在各种状态间的转换过程,熟悉线程的状态和转换。

通过为线程增加挂起状态,加深对线程状态的理解。

思考与练习

1. 思考一下,在本实验中,当loop线程处于运行状态时,EOS

中还有哪些线程,它们分别处于什么状态。可以使用控制台命令pt查看线程的状态。

运行结果如下:

2. 当loop线程在控制台1中执行,并且在控制台2中执行suspend命令时,为什么控制台1中的loop线程处于就绪状态而不是运行状态?

答:打开控制台2时,loop线程处于活动就绪状态,此时在控制台2中使用挂起原语Suspend可以将该线程挂起,该线程便会转入静止就绪状态。处于静止就绪状态的线程,不会再被调度执行,直到使用原语Resume将该线程恢复为活动就绪状态。

3. 总结一下在图5-3中显示的转换过程,哪些需要使用线程控制块中的上下文(将线程控制块中的上下文恢复到处理器中,或者将处理器的状态复制到线程控制块的上下文中),哪些不需要使用,并说明原因。

新建→就绪

当创建一个进程或线程时,新进程的主线程或者新线程都会被

初始化为就绪状态,并被放入就绪队列中。

就绪→运行

当调度程序认为某个处于就绪状态的线程应当执行时,便使其成为当前运行的线程,该线程就会从就绪状态进入运行状态。

运行→就绪

当前运行线程因时间片用完或被更高优先级线程抢先时,当前运行线程就会由运行状态转入就绪状态。

运行→阻塞

当前运行线程可能因调用API函数WaitForSingleObject等待事件或者执行I/O请求而被阻塞,从而由运行状态转入阻塞状态。阻塞→就绪

处于阻塞状态的线程所等待的事件变为有效后,或等待超时后,该线程将被唤醒,从而由阻塞状态进入就绪状态。

任意状态→结束状态

线程可以由任意一个状态转入结束状态。例如,线程执行完毕会由运行状态转入结束状态,就绪线程或者阻塞线程如果被强制结束,也会转入结束状态。

4. 在本实验3.2节中总结的所有转换过程都是分步骤进行的,为了确保完整性,显然这些转换过程是不应该被打断的,也就是说这些转换过程都是原语操作(参见本书第2.6节)。请读者找出这些转换过程的原语操作(关中断和开中断)是在哪些代码中完成的。(提示,重新调试这些转换过程,可以在调用堆栈窗口列出的各个函数中逐级查找关中断和开中断的代码。)

答:在ps/psspnd.c文件中已经为原语Suspend实现了对应的函数PsSuspendThread:

STATUS PsSuspendThread( IN HANDLE hThread )

{

STATUS Status;

BOOL IntState;

PTHREAD Thread;

Status = ObRefObjectByHandle(hThread, PspThreadType, (PVOID*)&Thread);

if (EOS_SUCCESS(Status)) {

IntState = KeEnableInterrupts(FALSE); // 关中断

if (Ready == Thread->State) {

PspUnreadyThread(Thread);

ListInsertTail(&SuspendListHead, &Thread->StateListEntry);

Status = STATUS_SUCCESS;

} else {

Status = STATUS_NOT_SUPPORTED;

}

KeEnableInterrupts(IntState); // 开中断

ObDerefObject(Thread);

}

return Status;

}

实验5 进程的同步

使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。

调试跟踪EOS信号量的工作过程,理解进程同步的原理。

修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。

修改EOS的信号量算法

修改PsWaitForSemaphore函数

if(Semaphore->Count>0){

Semaphore->Count--;

flag=STATUS_SUCCESS;

}//如果信号量大于零,说明尚有资源,可以为线程分配 else

flag=PspWait(&Semaphore->WaitListHead,Milliseconds);

KeEnableInterrupts(IntState);//原子操作完成,恢复中断。return flag;

}//否则,说明资源数量不够,不能再为线程分配资源,因此要使线//程等待

修改PsReleaseSemaphore函数

if(Semaphore->Count+ReleaseCount>Semaphore-

>MaximumCount){

Status=STATUS_SEMAPHORE_LIMIT_EXCEEDED;

}else{

//记录当前的信号量的值。

if(NULL!=PreviousCount){

*PreviousCount=Semaphore->Count;

}

int mm=Semaphore->Count;

//目前仅实现了标准记录型信号量,每执行一次信号量的释放操//作

//只能使信号量的值增加1。

while((!ListIsEmpty(&Semaphore-

>WaitListHead))&&(ReleaseCount)){

PspWakeThread(&Semaphore-

>WaitListHead,STATUS_SUCCESS);

PspThreadSchedule();

ReleaseCount--;

}

Semaphore->Count=mm+ReleaseCount;

//可能有线程被唤醒,执行线程调度。

Status=STATUS_SUCCESS;

}

思考与练习

1. 思考在ps/semaphore.c文件内的PsWaitForSemaphore和

PsReleaseSemaphore函数中,为什么要使用原子操作?可以参考本书第2章中的第2.6节。

答:在执行等待信号量和释放信号量的时候,是不允许cpu响应外部中断的,如果此时cpu响应了外部中断,会产生不可预料的结果,无法正常完成原子操作。

2. 绘制ps/semaphore.c文件内PsWaitForSemaphore和

PsReleaseSemaphore函数的流程图。

(1)PsWaitForSemaphore函数的流程图。

(2)PsReleaseSemaphore函数的流程图

3. 根据本实验3.3.2节中设置断点和调试的方法,练习调试消费者线程在消费第一个产品时,等待Full信号量和释放Empty信号量的过程。注意信号量计数是如何变化的。

答:这是因为临界资源的限制。临界资源就像产品仓库,只有“产品仓库”空闲生产者才能生产东西,有权向里面放东西。所以它必须等到消费者,取走产品,“产品空间”(临界资源)空闲时,才继续生产14号产品。

实验6 时间片轮转调度

调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。

为EOS添加时间片轮转调度,了解其它常用的调度算法。

为EOS添加时间片轮转调度

运行结果如图:

修改的代码如下:

VOID

PspRoundRobin(

VOID

)

{

if(NULL!=PspCurrentThread&&Running==PspCurrentThread->State)

{

PspCurrentThread->RemainderTicks--;

if (0 == PspCurrentThread->RemainderTicks)

{

PspCurrentThread->RemainderTicks = TICKS_OF_TIME_SLICE;

if(BIT_TEST(PspReadyBitmap, PspCurrentThread->Priority))

{

PspReadyThread(PspCurrentThread);

}

}

}

}

实验7 物理存储器与进程逻辑地址空间的管理

通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。

通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。

在应用程序进程中分配虚拟页和释放虚拟页

源程序并附上注释

#include "EOSApp.h"

int main(int argc, char* argv[])

{

#ifdef _DEBUG

__asm("int $3\n nop");

#endif

/* TODO: 在此处添加自己的代码 */

INT *d;

if(d=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMI T))

{//调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。

printf("Allocated %d bytes virtual memory of 0x%x\n\n",sizeof(int),d);

printf("virtual memory original value:0x%x\n\n",*d);//输出原始整型变量的值

*d=0xFFFFFFFF;//修改整型变量的值为0xFFFFFFFF

printf("virtual memory new value:0x%x\n\n",*d);//输出修改后的整型变量的值

printf("\nWait for 10 seconds\n");

Sleep(10000);// 调用API函数Sleep,等待10秒钟。系统以毫秒为单位

if(VirtualFree(d,0,MEM_RELEASE))//// 调用API函数VirtualFree,释放之前分配的整型变量的空间

printf("\nRealease virtual memory success!\n");

else {

printf("realease error\n");

return -1;

}

printf("\nEndless loop!");

for(;;){; }//进入死循环,这样应用程序就不会结束

return 0;

}

else

{

printf("error\n");

return -1;//若不能成功,打印error,并返回-1。

}

printf("Hello world!\n");

return 0;

}

实验8 分页存储器管理

学习i386处理器的二级页表硬件机制,理解分页存储器管理原理

查看EOS应用程序进程和系统进程的二级页表映射信息,理解页目录和页表的管理方式。

编程修改页目录和页表的映射关系,理解分页地址变换原理。

设计代码

PRIVATE VOID

ConsoleCmdMemoryMap(IN HANDLE StdHandle){

BOOL IntState;

ULONG PfnOfPageDirectory;ULONG PageTotal=0;ULON G IndexOfDirEntry;ULONG IndexOfTableEntry;PMMPTE_HA RDWARE pPde;PMMPTE_HARDWARE pPte;ULONG_PTR PageTableBase;ULONG_PTR VirtualBase;

const char*OutputFormat=NULL;

ASSERT(PspCurrentProcess==PspSystemProcess);IntStat e=KeEnableInterrupts(FALSE);//关中断

ULONG PfnArray[2];

MiAllocateZeroedPages(2,PfnArray);

OutputFormat="New page frame number:0x%X,0x%X\n"; fprintf(StdHandle,OutputFormat,PfnArray[0],PfnArray[1]);Kd bPrint(OutputFormat,PfnArray[0],PfnArray[1]);

IndexOfDirEntry=(0xE0000000>>22);

//虚拟地址的高10位是PDE标号

((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].PageFra meNumber=PfnArray[0];

((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].Valid= 1;//有效

((PMMPTE_HARDWARE)0xC0300000)[IndexOfDirEntry].Writable =1;//可写MiFlushEntireTlb();//刷新快表

PageTableBase=0xC0000000+IndexOfDirEntry*PAGE_SI ZE;IndexOfTableEntry=(0xE0000000>>12)&0x3FF;((PM MPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].PageFr ameNumber=PfnArray[1];

((PMMPTE_HARDWARE)PageTableBase)[IndexOfTableEntry].V alid=1;((PMMPTE_HARDWARE)PageTableBase)[IndexOfTa bleEntry].Writable=1;MiFlushEntireTlb();//刷新快表IndexOfTableEntry=(0xE0001000>>12)&0x3FF;

操作系统实验三

计算机操作系统实验报告 实验内容: P、V原语的模拟实现 实验类型:验证型 指导教师:毕国堂 专业班级: 姓名: 学号: 实验地点:东6E507 实验时间:2017/10/23

一、实验目的 1.理解信号量相关理论 2.掌握记录型信号量结构 3.掌握P、V原语实现机制 二、实验内容 1.输入给定的代码 2.进行功能测试并得出证正确结果 三、实验要求 1.分析signal和wait函数功能模块 ●Signal函数 在进行资源增加时,首先判断增加的资源是否存在,如果不存在则报错 并结束函数;如果存在则将需要增加的资源数量加一,然后再判断增加 后的资源数是否大于0,如果大于0则表示之前等待队列为空,没有需 要分配的进程;如果增加后的资源不大于0,表示之前等待队列中存在 进程,则将队首的进程取出并将资源分给该进程。 ●Wait 函数 在执行wait函数时,先判断请求的资源和进程是否存在,如果不存在则 报错提示;如果存在则将对应资源的资源数减一,然后判断减少后的资 源数是否小于0,如果小于0,表示该资源等待队列为空,可直接将资源 分配给请求的进程;如果不小于0则表示之前资源的等待队列不为空, 则将请求的进程插在等待队列最后。 2.画出signal和wait函数流程图

3.撰写实验报告 四、实验设备 1.PC机1台安装visual c++ 6.0 五、测试

1.首先将所有的资源分配完 2.这时再请求资源时就会出现等待现象 3.此时增加一个资源s0,则进程1对s0的等待结束直接获取资源s0 4.当再增加资源s0、s1时则进程1也结束对资源s1的等待,并且s0资源 为有空闲状态 六、实验思考 1.如何修改wait操作,使之能一次申请多个信号量? wait函数传入一个进程号和多个资源名,在wait函数中使用循环依

操作系统实验实验1

广州大学学生实验报告 1、实验目的 1.1、掌握进程的概念,明确进程的含义 1.2、认识并了解并发执行的实质 2.1、掌握进程另外的创建方法 2.2、熟悉进程的睡眠、同步、撤消等进程控制方法 3.1、进一步认识并发执行的实质 3.2、分析进程竞争资源的现象,学习解决进程互斥的方法 4.1、了解守护进程 5.1、了解什么是信号 5.2、INUX系统中进程之间软中断通信的基本原理 6.1、了解什么是管道 6.2、熟悉UNIX/LINUX支持的管道通信方式 7.1、了解什么是消息 7.2、熟悉消息传送的机理 8.1、了解和熟悉共享存储机制 二、实验内容 1.1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统 中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 1.2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及 'son ……',父进程显示'parent ……',观察结果,分析原因。 2.1、用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容 2.2、利用wait( )来控制进程执行顺序 3.1、修改实验(一)中的程序2,用lockf( )来给每一个进程加锁,以实现进程之间的互斥 3.2、观察并分析出现的现象 4.1、写一个使用守护进程(daemon)的程序,来实现: 创建一个日志文件/var/log/Mydaemon.log ; 每分钟都向其中写入一个时间戳(使用time_t的格式) ; 5.1、用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent! Child process2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 5.2、用软中断通信实现进程同步的机理

操作系统实验报告一

重庆大学 学生实验报告 实验课程名称操作系统原理 开课实验室DS1501 学院软件学院年级2013专业班软件工程2 班学生姓名胡其友学号20131802 开课时间2015至2016学年第一学期 总成绩 教师签名洪明坚 软件学院制

《操作系统原理》实验报告 开课实验室:年月日学院软件学院年级、专业、班2013级软件工 程2班 姓名胡其友成绩 课程名称操作系统原理 实验项目 名称 指导教师洪明坚 教师 评语教师签名:洪明坚年月日 1.实验目的: ?进入实验环境 –双击expenv/setvars.bat ?检出(checkout)EPOS的源代码 –svn checkout https://www.doczj.com/doc/023782464.html,/svn/epos ?编译及运行 –cd epos/app –make run ?清除所有的临时文件 –make clean ?调试 –make debug ?在“Bochs Enhanced Debugger”中,输入“quit”退出调试 –调试指令,请看附录A 2.实验内容: ?编写系统调用“time_t time(time_t *loc)” –功能描述 ?返回从格林尼治时间1970年1月1日午夜起所经过的秒数。如果指针loc 非NULL,则返回值也被填到loc所指向的内存位置 –数据类型time_t其实就是long ?typedef long time_t; 3.实验步骤: ?Kernel space –K1、在machdep.c中,编写系统调用的实现函数“time_t sys_time()”,计算用户秒数。需要用到 ?变量g_startup_time,它记录了EPOS启动时,距离格林尼治时间1970年1午夜的秒数 ?变量g_timer_ticks

计算机操作系统实训资料

计算机操作系统实验(训)指导书 学院:电子信息工程学院 班级:13计算机科学与技术本01班 学号: 姓名: 指导教师: 西安思源学院 电子信息工程学院

前言 操作系统是计算机科学与技术专业的一门重要的专业课,是一门实践性很强的技术课程。掌握操作系统原理、熟悉操作系统的使用是各层次计算机软硬件开发人员必不可少的基本技能。操作系统课程讲授理论原理比较容易,而如何指导学生进行实践则相对较难,导致学生不能深刻地理解操作系统的本质,也不能在实际中应用所学的操作系统理论知识及操作系统所提供的功能来解决实际问题。 本实验课程在操作系统原理课程教学中占有重要地位,目的是让学生及时掌握和巩固所学的基本原理和基础理论,加深理解。提高学生自适应能力,为将来使用和设计各类新的操作系统打下基础。 一般来说,学习操作系统分为以下几个层次: 1.学习并掌握操作系统的基本概念及原理,了解操作系统的实现机制。 2.掌握常用操作系统的使用、操作和维护,成为合格的系统管理员。 目前最常用的操作系统主要有UNIX、Linux、Windows等等。 3.通过分析操作系统源代码,掌握修改、编写操作系统的能力。开放源代码的操作系统Linux的出现为我们提供了机遇。 操作系统本身的构造十分复杂,如何在有效的时间内,使学生既能了解其实现原理又能对原理部分进行有效的实践,是操作系统教学一直在探索的内容。本实验课程以Windows和Linux操作系统为主要平台,从基本原理出发,通过几个实验,使学生能对操作系统的基本原理有更深入的了解,为将来从事操作系统方面的研究工作打下一定的基础。

目录 实验一Windows的用户界面 (4) 实验二Windows2003的任务与进程管理器 (6) 实验三Linux使用环境 (10) 实验四Linux进程管理、内存管理、设备管理 (13) 实验五Windows2003内存管理 (16) 实验六目录和文件管理 (19) 实验七用户与组群管理 (21)

操作系统实验之内存管理实验报告

学生学号 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称 计算机操作系统 开 课 学 院 计算机科学与技术学院 指导老师姓名 学 生 姓 名 学生专业班级 2016 — 2017 学年第一学期

实验三 内存管理 一、设计目的、功能与要求 1、实验目的 掌握内存管理的相关内容,对内存的分配和回收有深入的理解。 2、实现功能 模拟实现内存管理机制 3、具体要求 任选一种计算机高级语言编程实现 选择一种内存管理方案:动态分区式、请求页式、段式、段页式等 能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小等 能够选择分配、回收操作 内购显示进程在内存的储存地址、大小等 显示每次完成内存分配或回收后内存空间的使用情况 二、问题描述 所谓分区,是把内存分为一些大小相等或不等的分区,除操作系统占用一个分区外,其余分区用来存放进程的程序和数据。本次实验中才用动态分区法,也就是在作业的处理过程中划分内存的区域,根据需要确定大小。 动态分区的分配算法:首先从可用表/自由链中找到一个足以容纳该作业的可用空白区,如果这个空白区比需求大,则将它分为两个部分,一部分成为已分配区,剩下部分仍为空白区。最后修改可用表或自由链,并回送一个所分配区的序号或该分区的起始地址。 最先适应法:按分区的起始地址的递增次序,从头查找,找到符合要求的第一个分区。

最佳适应法:按照分区大小的递增次序,查找,找到符合要求的第一个分区。 最坏适应法:按分区大小的递减次序,从头查找,找到符合要求的第一个分区。 三、数据结构及功能设计 1、数据结构 定义空闲分区结构体,用来保存内存中空闲分区的情况。其中size属性表示空闲分区的大小,start_addr表示空闲分区首地址,next指针指向下一个空闲分区。 //空闲分区 typedef struct Free_Block { int size; int start_addr; struct Free_Block *next; } Free_Block; Free_Block *free_block; 定义已分配的内存空间的结构体,用来保存已经被进程占用了内存空间的情况。其中pid作为该被分配分区的编号,用于在释放该内存空间时便于查找。size表示分区的大小,start_addr表示分区的起始地址,process_name存放进程名称,next指针指向下一个分区。 //已分配分区的结构体 typedef struct Allocate_Block { int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct Allocate_Block *next; } Allocate_Block; 2、模块说明 2.1 初始化模块 对内存空间进行初始化,初始情况内存空间为空,但是要设置内存的最大容量,该内存空间的首地址,以便之后新建进程的过程中使用。当空闲分区初始化

操作系统实验报告

《操作系统原理》实验报告 实验项目名称:模拟使用银行家算法判断系统的状态 一、实验目的 银行家算法是操作系统中避免死锁的算法,本实验通过对银行家算法的模拟,加强对操作系统中死锁的认识,以及如何寻找到一个安全序列解除死锁。 二、实验环境 1、硬件:笔记本。 2、软件:Windows 7 , Eclipse。 三、实验内容 1.把输入资源初始化,形成资源分配表; 2.设计银行家算法,输入一个进程的资源请求,按银行家算法步骤进行检查; 3.设计安全性算法,检查某时刻系统是否安全; 4.设计显示函数,显示资源分配表,安全分配序列。 四、数据处理与实验结果 1.资源分配表由进程数组,Max,Allocation,Need,Available 5个数组组成; 实验采用数据为下表: 2.系统总体结构,即菜单选项,如下图

实验的流程图。如下图 3.实验过程及结果如下图所示

1.首先输入进程数和资源类型及各进程的最大需求量 2.输入各进程的占有量及目前系统的可用资源数量 3.初始化后,系统资源的需求和分配表 4.判断线程是否安全

5.对线程进行死锁判断 五、实验过程分析 在实验过程中,遇到了不少问题,比如算法无法回滚操作,程序一旦执行,必须直接运行到单个任务结束为止,即使产生了错误,也必须等到该项任务结束才可以去选择别的操作。但总之,实验还是完满的完成了。 六、实验总结 通过实验使我对以前所学过的基础知识加以巩固,也对操作系统中抽象理论知识加以理解,例如使用Java语言来实现银行家算法,在这个过程中更进一步了解了银行家算法,通过清晰字符界面能进行操作。不过不足之处就是界面略显简洁,对于一个没有操作过计算机的人来说,用起来可能还是有些难懂。所以,以后会对界面以及功能进行完善,做到人人都可以看懂的算法。

上海大学操作系统(二)实验报告(全)

评分: SHANGHAI UNIVERSITY 操作系统实验报告 学院计算机工程与科学 专业计算机科学与技术 学号 学生姓名

《计算机操作系统》实验一报告 实验一题目:操作系统的进程调度 姓名:张佳慧学号 :12122544 实验日期: 2015.1 实验环境: Microsoft Visual Studio 实验目的: 进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。本实习要求学生独立地用高级语言编写和调试一个简单的进程调度程序。调度算法可任意选择或自行设计。例如,简单轮转法和优先数法等。本实习可加深对于进程调度和各种调度算法的理解。实验内容: 1、设计一个有n个进程工行的进程调度程序。每个进程由一个进程控制块(PCB)表示。进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。 2、调度程序应包含2~3种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。 3、系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程。 操作过程: 1、本程序可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。为了便于处理,程序进程的运行时间以时间片为单位计算。进程控制块结构如下: 进程控制块结构如下: PCB 进程标识数 链指针 优先数/轮转时间片数 占用 CPU 时间片数 进程所需时间片数 进程状态 进程控制块链结构如下:

其中:RUN—当前运行进程指针; HEAD—进程就绪链链首指针; TAID—进程就绪链链尾指针。2、算法与框图 (1) 优先数法。进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减 1,说明它已运行了一个时间片,优先数也减 3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。 (2) 简单轮转法。进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加 1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。 (3) 程序框图

西北工业大学操作系统实验_OS3(10)

评语: 课中检查完成的题号及题数: 课后完成的题号与题数: 成绩: 指导教师: 实验报告三 实验名称:七、八日期:2013.05.23 班级:10011007 学号:2010302555 姓名:杨宏志实验七理解线程的相关概念 1. 实验目的 理解当操作系统引入线程的概念后,进程是操作系统独立分配资源的单位,线程成为系统调度的单位,与同一个进程中的其他线程共享程序空间。 2. 实验预习内容 预习线程创建和构造的相关知识,了解C语言程序编写的相关知识。 3. 实验内容及步骤 (1)编写一个程序,在其main()函数中创建一个(或多个)线程,观察该线程是如何与主线程并发运行的。输出每次操作后的结果; (2)在main()函数外定义一个变量shared(全局变量),在main()中创建一个线程,在main()中和新线程shared 进行循环加/减操作,观察该变量的变化; (3)修改程序把shared 变量定义到main()函数之内,重复第(2)步操作,观察该变量的变化。

4. 实验总结 (1) 观察上述程序执行结果,并分析原因; (2) 提交源程序清单,并附加流程图与注释。思考:分析进程和线程的不同之处。 5. 具体实现 1)观察线程并发性: #include #include #include void * func(void *params) { while(1) { printf("i am the thread 2\n"); sleep(1); } return NULL; } int main() { pthread_t tid; int res=pthread_create(&tid, NULL,func,NULL); while(1) { printf("i am main thread\n"); sleep(1); } return 0; }

计算机操作系统实验四

实验三进程与线程 问题: 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位,具有动态性、并发性、独立性、异步性和交互性。然而程序是静态的,并且进程与程序的组成不同,进程=程序+数据+PCB,进程的存在是暂时的,程序的存在是永久的;一个程序可以对应多个进程,一个进程可以包含多个程序。当操作系统引入线程的概念后,进程是操作系统独立分配资源的单位,线程成为系统调度的单位,与同一个进程中的其他线程共享程序空间。 本次实验主要的目的是: (1)理解进程的独立空间; (2)加深对进程概念的理解,明确进程和程序的区别; (3)进一步认识并发执行的实质; (4)了解红帽子(Linux)系统中进程通信的基本原理。 (5)理解线程的相关概念。 要求: 1、请查阅资料,掌握进程的概念,同时掌握进程创建和构造的相关知识和线程创建和 构造的相关知识,了解C语言程序编写的相关知识; (1)进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内

存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。 (2)进程的创建和构造: 进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。但是进程是一个动态的实体,它是程序的一次执行过程。进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码。新的进程通过克隆旧的程序(当前进程)而建立。fork() 和clone()(对于线程)系统调用可用来建立新的进程。 (3)线程的创建和构造: 线程也称做轻量级进程。就像进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。但是,与独立的进程相比,进程中的线程之间的独立程度要小。它们共享内存、文件句柄和其他每个进程应有的状态。 线程的出现也并不是为了取代进程,而是对进程的功能作了扩展。进程可以支持多个线程,它们看似同时执行,但相互之间并不同步。一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易,但你必须小心,确保它们不会妨碍同一进程里的其他线程。 线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制,但与进程不同的是,同类的多个线程是共享同一块内存空间和一组系统资源的,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小得多,正因如此,线程也被称为轻型进程(light-weight process)。一个进程中可以包含多个线程。 2、理解进程的独立空间的实验内容及步骤

操作系统实验报告_实验五

实验五:管道通信 实验内容: 1.阅读以下程序: #include #include #include main() { int filedes[2]; char buffer[80]; if(pipe(filedes)<0) //建立管道,filedes[0]为管道里的读取端,filedes[1]则为管道的写入端 //成功则返回零,否则返回-1,错误原因存于errno中 err_quit(“pipe error”); if(fork()>0){ char s[ ] = “hello!\n”; close(filedes[0]); //关闭filedes[0]文件 write(filedes[1],s,sizeof(s)); //s所指的内存写入到filedes[1]文件内 close(filedes[1]); //关闭filedes[0]文件 }else{ close(filedes[1]); read(filedes[0],buffer,80); //把filedes[0]文件传送80个字节到buffer缓冲区内 printf(“%s”,buffer); close(filedes[0]); } } 编译并运行程序,分析程序执行过程和结果,注释程序主要语句。

2.阅读以下程序: #include #include #include main() { char buffer[80]; int fd; unlink(FIFO); //删除FIFO文件 mkfifo(FIFO,0666); //FIFO是管道名,0666是权限 if(fork()>0){ char s[ ] = “hello!\n”;

操作系统实验3答案

实验三操作系统进程管理 一、实验目的 1) 掌握系统进程的概念,加深对Linux / UNIX进程管理的理解。 2) 学会使用ps命令和选项。 3) 列出当前shell中的进程。 4) 列出运行在系统中的所有进程。 5) 根据命令名搜索特定的进程。 6) 使用kill命令终止进程。 7) 根据用户名查找和终止进程。 二、实验内容和相应的答案截图,三、实验结果分析 步骤1:创建一个普通用户(参见实验二),以普通用户身份登录进入GNOME。 步骤2:打开一个“终端”窗口(参见实验二)。 步骤3:回顾系统进程概念,完成以下填空: 1) Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的__PID__进程标识符,用于跟踪从进程启动到进程结束。 2) 当启动新进程的时候,内核也给它们分配系统资源,如__内存_和__CPU_。 3) 永远不向父进程返回输出的进程叫做__僵进程__。 4) 由父进程派生出来的进程叫做____子___进程。 5) ___父_进程是一个派生另一个进程的进程。 6) 运行用于提供服务的Linux系统进程是_______________。 7) 如果父进程在子进程之前结束,它创建了一个______________进程。 步骤4:回顾ps命令和信息。基本的ps命令显示当前shell中的进程信息,用户只能够查看当前终端窗口中初始化的进程。输入ps命令,将结果填入表3-3中。 表3-3 实验记录 下面,在当前终端窗口中,练习使用给出的每个选项的ps命令。

输入ps -f 命令,显示运行在系统中的某个进程的完全信息,填入表3-4中。 表3-4 实验记录 步骤5:列出系统中运行的所有进程。 输入ps -ef 命令,显示运行在系统中的各个进程的完全信息。执行该命令,并与ps –f 命令的输出结果对照,一致吗?有何不同? 答:不一致,后者显示了所有进程的完全可用信息,多了很多。 分析当前终端窗口中的输出结果,记录下来用于写实验报告。 a. 显示了多少个进程?答:59 b. 进程ID的PID是什么? c. 启动进程的命令(CMD) 是什么?答:sched d. 请观察,什么命令的PID号是1?答:init[5] e. 执行ps –ef >aaa命令,将ps命令的输出送到文本文件aaa。再次运行cat aaa | wc命令,计算进程的数目。其中,cat是显示文本文件命令。“|”是管道命令,就是将前一个命令的输出作为后一个命令的输入。wc 命令用来计算文本的行数,第一个数字显示的是行的数目,可以用来计算进程的数目。计算出进程数目并做记录。 执行man ps命令,可以打开Linux用户命令手册。了解ps命令的用法。输入wq命令可退出用户手册的阅读。man命令可以执行吗?结果如何? 答:Man ps时出现

Windows操作系统实验三实验报告

Windows操作系统C/C++ 程序实验 姓名:___________________ 学号:___________________ 班级:___________________ 院系:___________________ ______________年_____月_____日

实验三Windows 2000/xp线程同步 一、背景知识 二、实验目的 在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000/xp线程同步的理解。 1) 回顾系统进程、线程的有关概念,加深对Windows 2000/xp线程的理解。 2) 了解事件和互斥体对象。 3) 通过分析实验程序,了解管理事件对象的API。 4) 了解在进程中如何使用事件对象。 5) 了解在进程中如何使用互斥体对象。 6) 了解父进程创建子进程的程序设计方法。 三、工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1) 一台运行Windows 2000/xp Professional操作系统的计算机。 2) 计算机中需安装V isual C++ 6.0专业版或企业版。 四、实验内容与步骤 1. 事件对象 清单4-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent() API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent() API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。两个进程在发出信号之后几乎立即终止。 步骤1:登录进入Windows 2000/xp Professional。 步骤2:在“开始”菜单中单击“程序”-“Microsoft V isual Studio 6.0”–“Microsoft V isual C++ 6.0”命令,进入V isual C++窗口。 步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-1.cpp。 步骤4:单击“Build”菜单中的“Compile 3-1.cpp”命令,并单击“是”按钮确认。系统

操作系统实验四

青岛理工大学课程实验报告

算法描述及实验步骤 功能:共享存储区的附接。从逻辑上将一个共享存储区附接到进程的虚拟地址空间上。用于建立调用进程与由标识符shmid指定的共享内存对象之间的连接。 系统调用格式:virtaddr=shmat(shmid,addr,flag) 该函数使用头文件如下: #include #include #include (8)shmdt( ) 功能:用于断开调用进程与共享内存对象之间的连接,成功时返回0,失败返回-1。 系统调用格式: int shmdt(shmaddr) char *shmaddr;/*采用shmat函数的返回值*/ (9)shmctl( ) 功能:共享存储区的控制,对其状态信息进行读取和修改。用于对已创建的共享内存对象进行查询、设置、删除等操作。 系统调用格式:shmctl(shmid,cmd,buf) 该函数使用头文件如下: #include #include #include 2、步骤: (1)定义进程变量(2)定义两个字符数组 (3)创建管道(4)如果进程创建不成功,则空循环(5)如果子进程创建成功,pid为进程号(6)锁定管道 (7)给Outpipe赋值(8)向管道写入数据 (9)等待读进程读出数据(10)解除管道的锁定 (11)结束进程等待子进程结束(12)从管道中读出数据 (13)显示读出的数据(14)父进程结束 创建jincheng.c 插入文字

调 试 过 程 及 实 验 结 果 运行: 运行后: 总 结 (对实验结果进行分析,问题回答,实验心得体会及改进意见) 虽然对pipe()、msgget()、msgsnd()、msgrcv()、msgctl()、shmget()、shmat()、 shmdt()、shmctl()的功能和实现过程有所了解,但是运用还是不熟练,过去没 见过,所以运行了一个简单的程序。 利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信,加深了对 其了解。 (1)管道通信机制,同步的实现过程:当写进程把一定数量的数据写入pipe, 便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程读一空pipe 时,也应睡眠等待,直到写进程将数据写入管道后,才将之唤醒,从而实现进 程的同步。 管道通信的特点:A管道是半双工的,数据只能向一个方向流动;需要双方通 信时,需要建立起两个管道;B. 只能用于父子进程或者兄弟进程之间(具有亲 缘关系的进程);C.单独构成一种独立的文件系统:管道对于管道两端的进程而

操作系统实验报告

《计算机操作系统》实验报告 教师: 学号: 姓名: 2012年3月6日 计算机学院

实验题目:请求页式存储管理(三) ----------------------------------------------------------------------------- 实验环境:VC6.0++ 实验目的:学生应独立地用高级语言编写几个常用的存储分配算法,并设计一个存储管理的模拟程序,对各种算法进行分析比较,评测其性能优劣,从而加深对这些算法的了解。实验内容: (1)编制和调试示例给出的请求页式存储管理程序,并使其投入运行。 (2)增加1~2种已学过的淘汰算法,计算它们的页面访问命中率。试用各种算法的命中率加以比较分析。(增加了FIFO) 操作过程: (1)产生随机数 (2)输入PageSize(页面大小1 /2/4/8 K) (pageno[i]=int(a[i]/1024)+1) (3)菜单选择

(4)OPT/ LRU/FIFO演示(pagesize=1K)

(5) 过程说明(PAGESIZE = 4K ) OPT :最佳置换算法(淘汰的页面是以后永不使用,或许是在最长时间内不再被访问的页面) //在Table 表中如果未找到,记录每个元素需要找的长度 //全部table 中元素找完长度,然后进行比较,找出最大的,进行淘汰 int max=0; int out; for(k=0;kmax){ max = table_time[k]; out = k; } }//找出最长时间,进行替换 table[out]=pageno[i]; page_out++;

操作系统实验报告

许昌学院 《操作系统》实验报告书学号: 姓名:闫金科 班级:14物联网工程 成绩: 2016年02月

实验一Linux的安装与配置 一、实验目的 1.熟悉Linux系统的基本概念,比如Linux发行版、宏内核、 微内核等。 2.掌握Linux系统的安装和配置过程,初步掌握Linux系统的 启动和退出方法。 3.熟悉Linux系统的文件系统结构,了解Linux常用文件夹的 作用。 二、实验内容 1.从网络上下载VMware软件和两个不同Linux发行版镜像文 件。 2.安装VMware虚拟机软件。 3.在VMware中利用第一个镜像文件完成第一个Linux的安装, 期间完成网络信息、用户信息、文件系统和硬盘分区等配 置。 4.在VMware中利用第二个镜像文件完成第二个Linux的安装, 并通过LILO或者GRUB解决两个操作系统选择启动的问题。 5.启动Linux系统,打开文件浏览器查看Linux系统的文件结 构,并列举出Linux常用目录的作用。 三、实验过程及结果 1、启动VMware,点击新建Linux虚拟机,如图所示:

2、点击下一步,选择经典型,点击下一步在选择客户机页面选择Linux,版本选择RedHatEnterpriseLinux5,如图所示: 3、点击下一步创建虚拟机名称以及所要安装的位置,如图所示: 4、点击下一步,磁盘容量填一个合适大小,此处选择默认值大小10GB,如图所示: 5、点击完成,点击编辑虚拟机设置,选择硬件选项中的CD-ROM(IDE...)选项,在右侧连接中选择“使用ISO镜像(I)”选项,点击“浏览”,找到Linux的镜像文件,如图所示: 6点击确定按钮后,点击启动虚拟机按钮,来到Linux的安装界面,如图所示: 7、到此页面之后,等待自动检测安装,如图所示: 8、等到出现如图所示页面后点击“skip”按钮,跳过检测,直接进入安装设置界面,如图所示: 9、安装设计界面如图所示: 10、点击Next按钮进入设置语言界面,设置语言为“简体中文”,如图所示: 11、点击Nest按钮进入系统键盘设置按钮,设置系统键盘为“美国英语式”,如图所示: 12、点击下一步按钮,弹出“安装号码”对话框,选择跳

兰州大学操作系统实验十文件全资料系统观察题目和问题详解

实验十 实验名称:10 文件系统观察 实验目的: 1.学习和掌握文件系统的基本概念 2.学习对文件和文件系统的观察和操作 3.学习和使用文件系统的权限控制 实验时间 3学时 预备知识: 1.基本命令 命令名主要选项功能说明ls -a, -l, -i 列出指定文件 stat 显示文件系统信息 cd 切换目录 pwd 报告当前路径 touch -a, -m 创建新文件 mv -i, -u 移动 cp -a, -i, -l, -s, -R 复制 rm -i,-r 删除文件 mkdir -p 创建目录

rmdir 删除目录(空目录) ln -s 建立 find -type, -name, -ctime 查找文件 locate 快速查找文件 grep -i,-l, -r, -v, -n 查找文件容 chmod -R 添加、删除、指派文件或目录的权限 chown 改变文件属主 chgrp 改变文件组 umask 查看、设置权限掩码 mkfs -t 创建文件系统 mke2fs -j, -b, -i 创建ext2/ext3文件系统 mount -t, -o, -a 挂载文件系统 umount 卸载文件系统 df -i, -h, -k, -a 提供硬盘及其分区、其它驱动器在文件系统中的装入位 置以及它们所占用的空间大小等信息。 du -c, -h 提供关于文件和目录所占空间的信息 fsck 检查文件系统 2.文件类型 类型说明 普通文件一组连续的数据用一个名称表示 目录实施了分级文件系统的结构 设备文件要访问硬件的每个程序都必须通过对应的设备文件来访问硬件 对存储在文件系统中其他点的文件的引用

操作系统实验一

本科实验报告 课程名称:操作系统 学号: 姓名: 专业: 班级: 指导教师: 课内实验目录及成绩 信息技术学院

实验(实验一) 1 实验名称:基本shell命令及用户管理 2 实验目的 2.1 掌握安装Linux操作系统的方法。 2.2 掌握Linux操作系统的基本配置。 2.3 了解GNOME桌面环境。 2.4 掌握基本shell命令的使用。 3 实验准备 3.1 下载VMware Workstation虚拟机软件(版本不限)。 3.2 准备Linux操作系统的安装源(内核版本和发行版本均不限)。 注:实验准备、实验内容4.1和4.2作为回家作业布置,同学们利用课余时间可在私人计算机上完成。 4 实验要求、步骤及结果 4.1 安装虚拟机软件。 【操作要求】安装VMware Workstation虚拟机软件,并填写以下4.1.1和4.1.2的内容。 4.1.1【VMware Workstation虚拟机版本号】 4.1.2【主要配置参数】 4.2 安装Linux操作系统。 【操作要求】安装Linux操作系统,版本不限。 Linux发行版本: Linux内核版本:

【主要操作步骤:包括分区情况】 1、创建一台虚拟机安装操作系统时客户机操作系统选择Linux 2、修改虚拟机的安装路径。 3、建一个新的虚拟磁盘,磁盘的空间20GB,并且将单个文件存储虚拟磁盘。 4、设置分区完毕,安装虚拟机 4.3 了解Linux操作系统的桌面环境之一GNOME。 【操作要求】查看桌面图标,查看主菜单,查看个人用户主目录等个人使用环境。【操作步骤1】桌面图标

【操作步骤2】主菜单 【操作步骤3】个人用户主目录 【操作步骤4】启动字符终端

操作系统实验报告

操作系统实验报告 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT

许昌学院 《操作系统》实验报告书学号: 姓名:闫金科 班级:14物联网工程 成绩: 2016年02月

实验一Linux的安装与配置 一、实验目的 1.熟悉Linux系统的基本概念,比如Linux发行版、宏内核、微内核等。 2.掌握Linux系统的安装和配置过程,初步掌握Linux系统的启动和退出方 法。 3.熟悉Linux系统的文件系统结构,了解Linux常用文件夹的作用。 二、实验内容 1.从网络上下载VMware软件和两个不同Linux发行版镜像文件。 2.安装VMware虚拟机软件。 3.在VMware中利用第一个镜像文件完成第一个Linux的安装,期间完成网络 信息、用户信息、文件系统和硬盘分区等配置。 4.在VMware中利用第二个镜像文件完成第二个Linux的安装,并通过LILO或 者GRUB解决两个操作系统选择启动的问题。 5.启动Linux系统,打开文件浏览器查看Linux系统的文件结构,并列举出 Linux常用目录的作用。 三、实验过程及结果 1、启动VMware,点击新建Linux虚拟机,如图所示: 2、点击下一步,选择经典型,点击下一步在选择客户机页面选择 Linux,版本选择RedHatEnterpriseLinux5,如图所示: 3、点击下一步创建虚拟机名称以及所要安装的位置,如图所示: 4、点击下一步,磁盘容量填一个合适大小,此处选择默认值大小 10GB,如图所示: 5、点击完成,点击编辑虚拟机设置,选择硬件选项中的CD-ROM (IDE...)选项,在右侧连接中选择“使用ISO镜像(I)”选项,点 击“浏览”,找到Linux的镜像文件,如图所示:

操作系统实验报告

实验二进程调度 1.目的和要求 通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。 2.实验内容 阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。 编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有 n 个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过 t 个时间片系统释放资源,唤醒处于阻塞队列队首的进程。 程序要求如下: 1)输出系统中进程的调度次序; 2)计算CPU利用率。 3.实验环境 Windows操作系统、VC++6.0 C语言

4 设计思想: (1)程序中进程可用PCB表示,其类型描述如下: struct PCB_type { int pid ;// 进程名 int state ;// 进程状态 2——表示“执行”状态 1——表示“就绪”状态 0——表示“阻塞”状态 int cpu_time ; //运行需要的CPU寸间(需运行的时间片 个数) } 用PCB来模拟进程; (2)设置两个队 列,将处于“就绪”状态的进程PCB挂在队列readyxx ;将处于“阻塞”状态的进程 PCB挂在队列blockedxx。 队列类型描述如下: struct QueueNode{

struct PCB_type PCB; Struct QueueNode *next; } 并设全程量: struct QueueNode *ready_head=NULL,//ready 队列队首指针 *ready_tail=NULL , //ready 队列队尾指针 *blocked_head=NULL,//blocked 队列队首指 针 *blocked_tail=NULL; //blocked 队列队尾指 针 (3)设计子程序: start_state(); 读入假设的数据,设置系统初始状态,即初始化就绪队列和 阻塞队列 dispath(); 模拟调度,当就绪队列的队首进程运行一个时间片后,放到就绪队列末尾,每次都是队首进程进行调度,一个进程运行结束 就从就绪队列中删除,当到 t 个时间片后,唤醒阻塞队列队首进程。

操作系统实验报告.

学生学号0121210680225 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称操作系统 开课学院计算机科学与技术学院 指导老师姓名刘军 学生姓名李安福 学生专业班级软件sy1201 2014 — 2015 学年第一学期

《操作系统》实验教学大纲 课程编号: 课程名称:操作系统/Operating System 实验总学时数:12学时 适应专业:计算机科学与技术、软件工程 承担实验室:计算机科学与技术学院实验中心 一、实验教学的目的和任务 通过实验掌握Linux系统下常用键盘命令、系统调用、SHELL编程、后台批处理和C程序开发调试手段等基本用法。 二、实验项目及学时分配 序号实验项目名称实验学时实验类型开出要求 01 Linux键盘命令和vi 2 设计必开 02 Linux下C编程 2 设计必开 03 SHELL编程和后台批处理 2 设计必开 04 Linux系统调用(time) 2 设计必开 05 Linux进程控制(fork) 4 设计必开 三、每项实验的内容和要求: 1、Linux键盘命令和vi 要求:掌握Linux系统键盘命令的使用方法。 内容:见教材p4, p9, p40, p49-53, p89, p100 2、Linux下的C编程 要求:掌握vi编辑器的使用方法;掌握Linux下C程序的源程序编辑方法;编译、连接和运行方法。 内容:设计、编辑、编译、连接以及运行一个C程序,其中包含键盘输入和屏幕输出语句。 3、SHELL编程和后台批处理 要求:掌握Linux系统的SHELL编程方法和后台批处理方法。 内容:(1) 将编译、连接以及运行上述C程序各步骤用SHELL程序批处理完成,前台运行。 (2) 将上面SHELLL程序后台运行。观察原C程序运行时输入输出情况。 (3) 修改调试上面SHELL程序和C程序,使得在后台批处理方式下,原键 盘输入内容可以键盘命令行位置参数方式交互式输入替代原键盘输入内容, 然后输出到屏幕。 4、Linux系统调用使用方法。

相关主题
文本预览
相关文档 最新文档