文档库 最新最全的文档下载
当前位置:文档库 › 华北电力大学 操作系统实验报告

华北电力大学 操作系统实验报告

华北电力大学 操作系统实验报告
华北电力大学 操作系统实验报告

综合实验报告

( 2013 -- 2014 年度第 1 学期)

名称:操作系统综合实验

题目:基于OS Lab的操作系统综合实验院系:计算机系

班级:网络

学号:201

学生姓名:

指导教师:王平,王晓辉

设计周数: 1

成绩:

日期:2013 年12 月

实验一:实验环境的使用

一、实验目的:

1、熟悉操作系统集成实验环境OS Lab的基本使用方法。

2、练习编译、调试EOS操作系统内核以及EOS应用程序。

二、实验内容:

1、启动OS Lab

2、学习OS Lab的基本使用方法

3、EOS内核项目的生成和调试

4、EOS应用程序项目的生成和调试

5、退出OS Lab

6、保存EOS内核项目

三、实验过程:

本实验实验过程主要按照eos操作系统实验教程上所对应的章节来进行。

实验结果:

(一)启动OS Lab :(无)

(二)学习OS Lab的基本使用方法:

(1)、创建了第一个项目:

(2)、生成了第一个项目

(3)、添加了func文件后

经过一系列的调试,打印出了相关内容,按shift+F5结束调试。

(4)、查看变量的值:有3种方法:

1、将鼠标移动到源代码编辑器中变量n的名称上,此时会弹出一个窗口显示

出变量n当前的值(由于此时还没有给变量n赋值,所以是一个随机值)。

2、在源代码编辑器中变量n的名称上点击鼠标右键,在弹出的快捷菜单中选

择“快速监视”,可以使用“快速监视”对话框查看变量n的值。然后,可以点击“关闭”按钮关闭“快速监视”对话框。

3、在源代码编辑器中变量n的名称上点击鼠标右键,在弹出的快捷菜单中选

择“添加监视”,变量n就被添加到了“监视”窗口中。使用“监视”窗口可以随时查看变量的值和类型。此时按F10进行一次单步调试,可以看到“监视”窗口中变量n的值会变为0

(1)、调用堆栈:使用“调用堆栈”窗口可以在调试的过程中查看当前堆栈上的函数,还可以帮助理解函数的调用层次和调用过程。

EOS内核项目的生成和调试:

(2)、新建EOS内核项目

(3)、生成项目

(4)、调试项目

(5)、查看软盘镜像文件中的内容

(6)、查看EOS SDK(Software Development Kit)文件夹

EOS应用程序项目的生成和调试

新建EOS应用程序项目

生成项目:按F7生成项目

调试项目:按F5进行各种调试

查看软盘镜像文件中的内容:使用FloppyImageEditor工具打开该项目中的Floppy.img文件,查看软盘镜像中的文件。L

修改EOS应用程序项目名称

(三)退出

(四)保存

四、实验总结:

经过试验1,我理解了OS Lab的基本操作方法和主要用途,这为以后的试验打下了基础。

实验二:操作系统的启动

一、实验目的

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

二、实验内容及其实验步骤

3.1 准备实验

1. 启动 OS Lab。

2. 新建一个 EOS Kernel 项目。

3. 在“项目管理器”窗口中打开 boot 文件夹中的 boot.asm 和 loader.asm 两个汇编文件。boot.asm是软盘引导扇区程序的源文件,loader.asm 是 loader 程序的源文件。简单阅读一下这两个文件中的 NASM 汇编代码和注释。

4. 按 F7 生成项目。

5. 生成完成后,使用 Windows 资源管理器打开项目文件夹中的 Debug 文件夹。找到由 boot.asm 生成的软盘引导扇区程序 boot.bin 文件,该文件的大小一定为 512 字节(与软盘引导扇区的大小

一致)。找到由 loader.asm 生成的 loader 程序 loader.bin 文件,记录下此文件的大小 1566 字节,在下面的实验中会用到。找到由其它源文件生成的操作系统内核文件 kernel.dll。

3.2 调试 EOS 操作系统的启动过程

3.2.1 使用 Bochs 做为远程目标机

3.2.2 调试 BIOS 程序

启动调试后,Bochs 在 CPU 要执行的第一条指令(即 BIOS 的第一条指令)处中断。此时,Display窗口没有显示任何内容,Console 窗口显示要执行的 BIOS 第一条指令的相关信息,并等待用户输入调试命

令,如图 10-1:

从Console 窗口显示的内容中,我们可以获得关于BIOS 第一条指令的如下信息:

行首的[0xfffffff0]表示此条指令所在的物理地址。

f000:fff0 表示此条指令所在的逻辑地址(段地址:偏移地址)。

jmp far f000:e05b 是此条指令的反汇编代码。

行尾的ea5be000f0 是此条指令的十六进制字节码,可以看出此条指令有5 个字节。

接下来可以按照下面的步骤,查看CPU 在没有执行任何指令之前主要寄存器中的数据,以及内存中的

数据:

1. 在Console 窗口中输入调试命令sreg 后按回车,显示当前CPU 中各个段寄存器的值,如图10-2。

其中CS 寄存器信息行中的“s=0xf000”表示CS 寄存器的值为0xf000。

2. 输入调试命令r 后按回车,显示当前CPU 中各个通用寄存器的值,如图10-3。其中“rip: 0x00000000:0000fff0”表示IP 寄存器的值为0xfff0。

3. 输入调试命令xp /1024b 0x0000,查看开始的1024 个字节的物理内存。在Console 中输出的这

1K 物理内存的值都为0,说明BIOS 中断向量表还没有被加载到此处。

4. 输入调试命令xp /512b 0x7c00,查看软盘引导扇区应该被加载到的内存位置。输出的内存值都

为0,说明软盘引导扇区还没有被加载到此处。

3.2.3 调试软盘引导扇区程序

3.2.4 调试加载程序

3.2.5 调试内核

调试内核的步骤如下:

1. 在 OS Lab 的“项目管理器”窗口中打开 ke 文件夹中的 start.c 文件,此文件中只定义了一个函数,就是操作系统内核的入口点函数 KiSystemStartup。

2. 在 KiSystemStartup 函数中的代码行(第 61 行)KiInitializePic();添加一个断点。

3. 现在可以在 Console 窗口中输入调试命令 c 继续调试,在刚刚添加的断点处中断。

4. 在 start.c 源代码文件中的 KiSystemStartup 函数名上点击鼠标右键,在弹出的快捷菜单中选择“添加监视”,KiSystemStartup 函数就被添加到了“监视”窗口中。在“监视”窗口中可以看到此函数地址为{void (PVOID)} 0x800***** 与在虚拟内存 x80001117 处保存的函数入口地址相同,说明的确是由 Loader 程序进入了操作系统内核。

5. 按 F5 继续执行 EOS 操作系统内核,在 Display 窗口中显示 EOS 操作系统已经启动,并且控制台EOS 操作系统实验教程北京海西慧学科技有限公司https://www.wendangku.net/doc/ce18270234.html,126程序已经开始运行了。

3.2.6 EOS 启动后的状态和行为

查看 EOS 的版本号:

1. 在控制台中输入命令“ver”后按回车。

2. 输出EOS 版本后的控制台如图10-4 所示。

查看EOS 启动后的进程和线程的信息:

1. 在控制台中输入命令“pt”后按回车。

2. 输出的进程和线程信息如图10-5 所示。

3.2.6 EOS 启动后的状态和行为

三. 实验总结

通过本实验了解操作系统的启动过程,理解操作系统启动后的工作方式。

实验三:进程的创建:

一、实验目的:

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

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

二、实验内容:

1、准备实验:新建一个EOS Kernel项目,分别使用Debug配置和Release配置生成此项目。新建一个EOS应用程序项目,使用在第EOS Kernel生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。

2、练习使用控制台命令创建EOS应用程序的进程

3、练习通过编程的方式让应用程序创建另一个应用程序的进程

4、调试CreateProcess函数

5、调试PsCreateProcess函数

6、练习通过编程的方式创建应用程序的多个进程

三、实验过程:

1、准备实验:(无)

2、练习使用控制台命令创建EOS应用程序的进程:使用FloppyImageEditor工具将本实验文件夹内的Hello.exe文件添加到Floppy.img文件中。启动调试,在EOS 的控制台中输入命令“A:\Hello.exe”后回车。得到结果:

3、练习通过编程的方式让应用程序创建另一个应用程序的进程:使用NewProc.c 文件中的源代码替换之前创建的EOS应用程序项目中的EOSApp.c文件内的源代码。启动调试,得到如下结果:

可以看到父进程(EOSApp.exe)首先开始执行并输出内容,父进程创建了子进程(Hello.exe)后,子进程开始执行并输出内容,待子进程结束后父进程再继续执行。

4、调试CreateProcess函数:按F5启动调试EOS应用程序,在弹出异常对话框后点“是”,在main函数中调用CreateProcess函数的代码行添加一个断点。

5、调试PsCreateProcess函数:在PsCreateProcess函数中找到调用PspCreateProcessEnvironment函数的代码行添加一个断点。进入此中断,按F11进入PspCreateProcessEnvironment函数。在调用ObCreateObject函数的代码行添加一个断点,进入此中断,将表达式*NewProcess添加到“监视”窗口中,监视其值得变化。

接下来调试初始化进程控制块中各个成员变量的过程:

1)首先创建进程的地址空间,即4G虚拟地址空间。

2)按F5继续调试,到此断点处中断。

3)按F10执行此行代码后中断。

4)在“监视”窗口中查看进程控制块的成员变量Pas的值已经不再是0。说明已经初始化了进程的4G虚拟地址空间。

5)使用F10一步步调试PspCreateProcessEnvironment函数中后面的代码,在调试的过程中根据执行的源代码,查看“监视”窗口中*NewProcess表达式的值,。6)当从PspCreateProcessEnvironment函数返回到PsCreateProcess函数后,停止按F10。此时“监视”窗口中已经不能再显示表达式*NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式*ProcessObject添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。

7)接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意观察执行后的代码修改了进程控制块中的哪些成员变量。

8)按F5继续执行,EOS内核会为刚刚初始化完毕的进程控制块新建一个进程。激活虚拟机窗口查看新建进程执行的结果。

9)在OS Lab中选择“调试”菜单中的“停止调试”结束此次调试。

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、在启动调试应用程序之前必须首先删除/禁用所有的断点,在断

// 点中断 (int 3) 被命中后才能重新添加/启用断点,否则启动

// 调试会失败。

//

STARTUPINFO StartupInfo;

PROCESS_INFORMATION ProcInfoOne[5];

ULONG ulExitCode; // 子进程退出码

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

#ifdef _DEBUG

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

#endif

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

//

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

//

StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE);

StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE);

StartupInfo.StdError = GetStdHandle(STD_ERROR_HANDLE);

//

// 为一个应用程序同时创建两个子进程。

//

int i=0;

for(;i<5;i++)

{

if (CreateProcess("A:\\Hello.exe", NULL, 0, &StartupInfo, &ProcInfoOne[i])) {

//

// 创建子进程成功,等待子进程运行结束。

//

WaitForSingleObject(ProcInfoOne[i].ProcessHandle, INFINITE);

//WaitForSingleObject(ProcInfoTwo.ProcessHandle, INFINITE);

//

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

//

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

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

//GetExitCodeProcess(ProcInfoTwo.ProcessHandle, &ulExitCode);

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

//

// 关闭不再使用的句柄。

//

CloseHandle(ProcInfoOne[i].ProcessHandle);

CloseHandle(ProcInfoOne[i].ThreadHandle);

//CloseHandle(ProcInfoTwo.ProcessHandle);

//CloseHandle(ProcInfoTwo.ThreadHandle);

} else {

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

nResult = 1;

}

}

return nResult;

}

实验四:线程的状态和转换

一、实验目的:

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

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

二、实验内容及步骤:

1、准备实验:新建一个EOS Kernel项目。

2、调试线程状态的转换过程:对第一步的项目启动调试,待EOS启动完毕,在EOS 控制台中输入命令“loop”后按回车。得到结果:

结束调试。

1. 控制台派遣线程被唤醒,由阻塞状态进入就绪状态。

2. loop线程由运行状态进入就绪状态。

3. 控制台派遣线程由就绪状态进入运行状态。

4. 待控制台派遣线程处理完毕由于空格键被按下而产生的键盘事件后,派遣线程会由运行状态重新进入阻塞状态,开始等待下一个键盘事件到来。

5. loop线程由就绪状态进入运行状态,继续执行死循环。

按F5继续执行,在PspSelectNextThread函数中的断点处中断。。

按F5继续执行,在PspUnreadyThread函数中的断点处中断。在快速监视对话框中查看“*Thread”表达式的值。关闭快速监视对话框后,在“调用堆栈”窗口中激活PspSelectNextThread函数对应的堆栈项,在“调用堆栈”窗口中激活PspUnreadyThread函数对应的堆栈项,然后按F10单步调试,直到返回PspSelectNextThread函数并将线程状态修改为Running。

按F5继续执行,在PspWait函数中的断点处中断。

3、为线程增加挂起状态:删除之前添加的所有断点。按F5启动调试。待EOS 启动完毕,在EOS控制台中输入命令“loop”后按回车。此时可以看到loop线程的执行计数在不停增长,说明loop线程正在执行。记录下loop线程的ID。按Ctrl+F2切换到控制台2,输入命令“suspend 31”(如果loop线程的ID是31)后按回车。命令执行成功的结果如图12-2所示。按Ctrl+1切换回控制台1,可以看到由于loop线程已经成功被挂起,其执行计数已经停止增长了。此时占用处理器的是EOS中的空闲线程。

Resume原语可以将一个被Suspend原语挂起的线程(处于静止就绪状态)恢复为就绪状态。但是PsResumThread函数中的这部分代码(第119行),完成这部分代码。

代码:/*

提供该示例代码是为了阐释一个概念,或者进行一个测试,并不代表着

最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。

*/

STATUS

PsResumThread(

IN HANDLE hThread

)

/*++

功能描述:

恢复指定的线程。

参数:

hThread - 需要被恢复的线程的句柄。

返回值:

如果成功则返回 STATUS_SUCCESS。

--*/

{

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);

//

// 将挂起的线程恢复为就绪状态。

// 线程由静止就绪状态(Static Ready)进入活动就绪状态(Active Ready)。

//

PspReadyThread(Thread);

//

// 执行线程调度,让刚刚恢复的线程有机会执行(如果真的能够调度到它的话)。

//

PspThreadSchedule();

Status = STATUS_SUCCESS;

} else {

Status = STATUS_NOT_SUPPORTED;

}

KeEnableInterrupts(IntState); // 开中断

ObDerefObject(Thread);

}

return Status;

}

测试方法:

待读者完成Resume原语后,可以先使用suspend命令挂起loop线程,然后在控制台2中输入命令“Resume 31”(如果loop线程的ID是31)后按回车。

思考题:思考一下,在本实验中,当loop线程处于运行状态时, EOS 中还有哪些线程,它们分别处于什么状态。可以使用控制台命令pt查看线程的状态。

三、实验总结:

明白了loop指令的用法以及resume原语的结构。

实验五:进程的同步

一、实验目的:

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

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

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

二、实验内容和步骤:

1、准备实验:新建一个EOS Kernel项目。生成EOS Kernel项目,从而在该项目文件中生成SDK文件夹。新建一个EOS应用程序项目。使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。

2、使用EOS的信号量解决生产者-消费者问题:在本实验文件夹中,提供了使用EOS的信号量解决生产者-消费者问题的参考源代码文件pc.c,仔细阅读此文件中的源代码和注释。使用pc.c文件中的源代码,替换之前创建的EOS应用程序项目中EOSApp.c文件内的源代码。按F5启动调试。立即激活虚拟机窗口查看生产者-消费者同步执行的过程。

结果:

3、调试EOS信号量的工作过程:启动调试,在main函数中创建Empty信号量的代码行添加一个断点。按F5继续调试,到此断点处中断。按F11调试进入CreateSemaphore函数。可以看到此API函数只是调用了EOS内核中的PsCreateSemaphoreObject函数来创建信号量对象。按F11调试进入semaphore.c 文件中的PsCreateSemaphoreObject函数。在semaphore.c文件的顶部查找到PsInitializeSemaphore函数的定义(第19行),在此函数的第一行(第39行)代码处添加一个断点。按F5继续调试,到断点处中断。观察PsInitializeSemaphore

函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的。按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开“调用堆栈”窗口,查看函数的调用层次。

生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,应该不需要阻塞就可以立即返回。

由于开始时生产者线程生产产品的速度较快,而消费者线程消费产品的速度较慢,所以当缓冲池中所有的缓冲区都被产品占用时,生产者在生产新的产品时就会被阻塞。

只有当消费者线程从缓冲池中消费了一个产品,从而产生一个空缓冲区后,生产者线程才会被唤醒并继续生产14号产品。

4、修改EOS的信号量算法:现在要求同时修改PsWaitForSemaphore函数和PsReleaseSemaphore函数中的代码,使这两个参数能够真正起到作用,使信号量对象支持等待超时唤醒功能和批量释放功能。

测试方法:修改完毕后,可以按照下面的方法进行测试:

1. 使用修改完毕的EOS Kernel项目生成完全版本的SDK文件夹,并覆盖之前的生产者-消费者应用程序项目的SDK文件夹。

2. 按F5调试执行原有的生产者-消费者应用程序项目,结果必须仍然与图13-2一致。如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改,并重复步骤1。

3. 将Producer函数中等待Empty信号量的代码行WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 替换为while(WAIT_TIMEOUT == WaitForSingleObject(EmptySemaphoreHandle, 300)){ printf("Producer wait for empty semaphore timeout\n"); }

4. 将Consumer函数中等待Full信号量的代码行WaitForSingleObject(FullSemaphoreHandle, INFINITE); 替换为while(WAIT_TIMEOUT == WaitForSingleObject(FullSemaphoreHandle, 300)){ printf("Consumer wait for full semaphore timeout\n"); }

5. 启动调试新的生产者-消费者项目,查看在虚拟机中输出的结果,验证信号量超时等待功能是否能够正常执行。如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改,并重复步骤1。

6. 如果超时等待功能已经能够正常执行,可以考虑将消费者线程修改为一次消费两个产品,来测试ReleaseCount参数是否能够正常使用。使用实验文件夹中NewConsumer.c文件中的Consumer函数替换原有的Consumer函数。

实验六:时间片轮转调度

一、实验目的

调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。为EOS添加时间片轮转调度,了解其它常用的调度算法。

二、预备知识

阅读本书第5章中的第5.4节。重点理解EOS当前使用的基于优先级的抢先式调

度,调度程序执行的时机和流程,以及实现时间片轮转调度的细节。

实验内容

3.1 准备实验3.2 阅读控制台命令“rr”相关的源代码

没有时间片轮转调度时“rr”命令的执行效果

3.3调试线程调度程序3.3.1 调试当前线程不被抢先的情况3.3.2 调试当前线程被抢先的情况

3.4 为EOS添加时间片轮转调度(行时间片轮转调度时“rr”命令的执行效果)

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

一、实验目的

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

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

二、实验内容

3.1 准备实验

3.2 阅读控制台命令“pm”相关的源代码,并查看其执行的结果(pm”命令的执行结果)

3.3 分配物理页和释放物理页(配物理页或者释放物理页后物理存储器的变化情况)

3.4阅读控制台命令“vm”相关的源代码,并查看其执行的结果

使用“vm”命令查看系统进程虚拟地址描述符的结果

使用pt命令查看有应用程序运行时进程和线程的信息

创建了一个应用程序进程后,系统进程中虚拟地址描述符的信息

使用“vm”命令查看应用程序进程虚拟地址描述符的结果

3.5 在系统进程中分配虚拟页和释放虚拟页

操作系统实验报告--实验一--进程管理

实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图

2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0;

电力系统自动化试卷及思考题答案2014年(华北电力大学)

1.那些实验是在EMS平台下进行?那些实验是在DTS平台下进行? EMS:1)电力系统有功功率分布及分析;2)电力系统无功功率分布及分析;3)电力系统综合调压措施分析;4)电力系统有功-频率分布;5)电力系统潮流控制分析;6)电力系统对称故障计算及分析;7)电力系统不对称故障及计算分析 DTS:1)电力系统继电保护动作特性分析;2)电力系统稳定性计算及分析;3)电力系统继电保护动作情况与系统稳定性关系分析 2.欲调节电压幅值,调有功P有效还是无功Q有效?为什么? 1)电压对无功变化更敏感,有功虽然对电压也有影响但是比较小 2)只考虑电压降落的纵分量:△U=(PR+QX)/U,从公式看出,电压降落跟有功P和无功Q 都有关系,只不过在高压输电系统中,电抗X>>R,这样,QX在△U的分量更大,调节电压幅值就是在调节无功。 3.重合闸有什么好处?若电气故障设为三相短路,故障分别持续t1和t2时长,则两个实验结果有什么不同? 重合闸好处:1)在线路发生暂时性故障时,迅速恢复供电,从而提高供电可靠性;2)对于有双侧电源的高压输电线路,可以提高系统并列运行的稳定性,从而提高线路的输送容量;3)可以纠正由于断路器机构不良,或继电器误动作引起的误跳闸 故障延时长的接地距离一段动作次数,相间距离一段动作次数,三相跳开次数比故障延时短的多,开关三相跳开的次数多。 4,.以实验为例,举例说明继电保护对暂态稳定的影响? 实验八中,实验项目一体现出选保护具有选择性,当其故障范围内出现故障时,有相应的断路器动作跳闸。实验项目二体现出保护是相互配合的。当本段拒动时,由上一级出口动作跳闸。实验项目三做的是自动重合闸的“前加速”和“后加速”保护。继电保护快速切除故障和自动重合闸装置就是使故障对系统的影响降到最低,尽早的将故障切除能避免故障电流对设备的冲击减小对系统的扰动,有利于暂态稳定的实现。 5.·在电力系统潮流控制分析试验中,可以通过改变发电机的无功进行潮流调整,也可以通过改变发电机所连升压变压器的分接头进行潮流调整,实验过程中这两项调整对发电机的设置有何不同?为什么? 改变发电机无功:设置发电机无功时以10MV AR增长。不能保证发电机有功功率和发电机电压恒定,他们可能会随着无功功率的改变有微小的变化。 改变变压器分接头:设置此时发电机相当于一个PV节点,即恒定的有功P和不变的电压U。原因:发电机是无功电源,也是有功电源,是电能发生元件;变压器是电能转换元件,不产生功率。 7在实验中考虑了哪些调压措施?若某节点电压(kv)/无功……电压升高3kv,则应补偿多少电容? 【实验】调节发电机端电压(调节有功,调节无功),调整变压器分接头 【百度】电力系统的调压措施主要有: 1靠调节发电机机端电压调压 2靠改变变压器分接头调压 3靠无功补偿调压 4靠线路串连电容改变线路参数调压 我的实验灵敏度系数为0.075,所以若电压升高3kv,应补偿3/0.075=40Mvar的电容 8在调频实验中。对单机单负荷系统,若发电机的额定功率……频率怎么变化?当负荷功率大于发电机功率的额定功率…… 通过K=△p/△f来判断f如何变化 9、几个实验步骤 实验九试探法求故障切除实验的实验步骤

操作系统实验心得

1-1:通过这次小实验,是我更加了解Linux一些常用指令的操作以及其作用,对于一个刚开始接触lniux操作系统的初学者来说非常有用,助于以后能够更进一步学习Linux操作系统。 1-2:在实验过程中,使用VI编辑器虽然不能像window操作系统那样对文本进行熟练度编辑,但是,VI编辑器使用命令来操作,将可以锻炼我的记忆力、对键盘的熟练读,还能帮助我们尽快适应linux操作系统的操作。 1-3:原本对liunx下的编译和调试环境不是很熟悉,但通过这次的实验,让我熟悉了linux 下的编译器和调试器的使用。 实验中使用了gcc命令,gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(#include)、预编译语句(如宏定义#define等)进行分析。 当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是链接。在链接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的库中链接到合适的地方。 1-4:API 接口属于一种操作系统或程序接口。通过实验,我了解了Windows的这种机制,加深了对API函数的理解。 2-1:通过本次实验了解了一些常用进程管理命令的使用,例如ps、kill命令,了解到换个kill与killall的不同,对于linux操作系统下的进程的学习打下基础,更好的学习进程。 2-2:本次实验是熟悉掌握Linux 系统常用进程创建与管理的系统调用,linux下使用fork()创建子进程,与windows下CreateProcess()创建子进程完全不同,通过比较小组更好的理解和掌握了进程的创建,对于进程的管理的理解也有了清晰地认识。 实验中遇到fork函数返回2次结果,经过分析结果如下: 由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因为fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。 调用fork之后,数据、堆栈有两份,代码仍然为一份但是这个代码段成为两个进程的共享代码段都从fork函数中返回,箭头表示各自的执行处。当父子进程有一个想要修改数据或者堆栈时,两个进程真正分裂。 2-3:通过这次实验对熟悉掌握和了解windows平台常用进线程控制API,有了更深刻的认识,认识到API函数对windows编程的重要性,了解进程线程在内存中的执行,特别认识互斥体Mutex对象,API函数一定要多用,才能记得。 3-1:该程序的输入变量具有限制,若输入除0和1的数据,则将视为0处理.改进的方法为修改if 语句中的条件为:1,即只要输入为非零,则有效。即逻辑表达式的值为真。(在逻辑数学里非零则表示为真!) 为了能较好的实现进程的同步,可以另外设一个标志量,标志临界资源是否正被访问,当a,b,c

华北电力大学 两级放大电路实验报告

实验三 两级放大电路 一、实验目的 进一步掌握交流放大器的调试和测量方法,了解两级放大电路调试中的某些特殊问题; 二、实验电路 实验电路如图5-1所示,不加C F ,R F 时是一个无级间反馈的两级放大电路。在第一级电路中,静态工作点的计算为 3Β11123 R V V R R R ≈ ++, B1BE1 E1C156V V I I R R -≈ ≈+, CE11C1456()V V I R R R =-++ 9B21789 R V V R R R ≈ ++, B2BE2 E2C21112V V I I R R -≈ ≈+, C2CE21101112()V V I R R R =-++ 图5-1 实验原理图 第一级电压放大倍数14i2V1be115 (//) (1)R R A r R ββ=- ++ 其中i2789be2211()////[(1)]R R R R r R β=+++ 第二级电压放大倍数21013V2be2211 (//) (1)R R A r R ββ=- ++ 总的电压放大倍数 O1O2 O2V V1V2O1 i i V V V A A A V V V = = ?=?g g g g g g

三、预习思考题 1、学习mutisim2001或workbenchEDA5.0C 电子仿真软件 2、按实际电路参数,估算E1I 、CE1V 、C1I 和E2I 、CE2V 、C2I 的理论值 3、按预定静态工作点,以β1 =β2 = 416计算两级电压放大倍数V A 4、拟定Om V g 的调试方法

四、实验内容和步骤 1、按图5-1连接电路(三极管选用元件库中NPN 中型号National 2N3904) 实验中电路图的连接如下 2、调整静态工作点 调节R 1和R 7分别使E1V =1.7V ,E2V =1.7V 左右,利用软件菜单Analysis 中DC Oprating Point 分析功能或者使用软件提供的数字万用表(Multimeter )测量各管C V 、E V 、B V 。可以通过计算获得C I ,CE V ,将结果填入表5-1中。 1)、静态工作点调节后,两处调节值如图所示:

操作系统实验报告

操作系统实验报告 ' 学号: 姓名: 指导老师: 完成日期: ~

目录 实验一 (1) 实验二 (2) 实验三 (7) 实验四 (10) 实验五 (15) 实验六 (18) 实验七 (22) \

实验一 UNIX/LINUX入门 一、实验目的 了解 UNIX/LINUX 运行环境,熟悉UNIX/LINUX 的常用基本命令,熟悉和掌握UNIX/LINUX 下c 语言程序的编写、编译、调试和运行方法。 二、实验内容 熟悉 UNIX/LINUX 的常用基本命令如ls、who、pwd、ps 等。 练习 UNIX/LINUX的文本行编辑器vi 的使用方法 熟悉 UNIX/LINUX 下c 语言编译器cc/gcc 的使用方法。用vi 编写一个简单的显示“Hello,World!”c 语言程序,用gcc 编译并观察编译后的结果,然后运行它。 三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。 四、实验程序 #include <> #include <> int main() { printf ("Hello World!\n"); return 0; } 五、实验感想 通过第一次室验,我了解 UNIX/LINUX 运行环境,熟悉了UNIX/LINUX 的常用基本命令,熟悉和掌握了UNIX/LINUX 下c 语言程序的编写、编译、调试和运行方法。

实验二进程管理 一、实验目的 加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质。 二、实验内容 (1)进程创建 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进程分别显示字符”b“和字符“c”。试观察记录屏幕上的显示结果,并分析原因。 (2)进程控制 修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。 (3)进程的管道通信 编写程序实现进程的管道通信。使用系统调用pipe()建立一个管道,二个子进程P1 和P2 分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,再接收P2)。 三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。 四、实验设计 1、功能设计 (1)进程创建 使用fork()创建两个子进程,父进程等待两个子进程执行完再运行。 (2)进程控制 使用fork()创建两个子进程,父进程等待两个子进程分别输出一句话再运行。 (3)进程的管道通信 先创建子进程1,向管道写入一句话,子进程1结束后创建子进程2,向管道写入一句话,最后父进程从管道中读出。 2、数据结构 子进程和管道。 3、程序框图

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科0901 学号: 0909090310

指导老师:宋虹

目录 课程设计内容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------6 文件系统的层次结构和功能模块 ---------------------6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录-------------------------------------------------- 12

课程设计内容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全 可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

实时操作系统报告

实时操作系统课程实验报告 专业:通信1001 学号:3100601025 姓名:陈治州 完成时间:2013年6月11日

实验简易电饭煲的模拟 一.实验目的: 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,基于多任务的模式的编程方法。锻炼综合应用多任务机制,任务间的通信机制,内存管理等的能力。 二.实验要求: 1.按“S”开机,系统进入待机状态,时间区域显示当前北京时间,默认模式“煮饭”; 2.按“C”选择模式,即在“煮饭”、“煮粥”和“煮面”模式中循环选择; 3.按“B”开始执行模式命令,“开始”状态选中,时间区域开始倒计时,倒计时完成后进入“保温”状态,同时该状态显示选中,时间区域显示保温时间; 4.按“Q”取消当前工作状态,系统进入待机状态,时间区域显示北京时间,模式为当前模式; 5.按“X”退出系统,时间区域不显示。 6.煮饭时长为30,煮粥时长为50,煮面时长为40. 三.实验设计: 1.设计思路: 以老师所给的五个程序为基础,看懂每个实验之后,对borlandc的操作有了大概的认识,重点以第五个实验Task_EX为框架,利用其中界面显示与按键扫描以及做出相应的响应,对应实现此次实验所需要的功能。 本次实验分为界面显示、按键查询与响应、切换功能、时钟显示与倒计时模块,综合在一起实验所需功能。 2.模块划分图: (1)界面显示: Main() Taskstart() Taskstartdispinit() 在TaskStartDispInit()函数中,使用PC_DispStr()函数画出界面。

(2)按键查询与响应: Main() Taskstart() 在TaskStart()函数中,用if (PC_GetKey(&key) == TRUE)判断是否有按键输入。然后根据key 的值,判断输入的按键是哪一个;在响应中用switch语句来执行对应按键的响应。 (3)切换功能: l计数“C”按 键的次数 M=l%3 Switch(m) M=0,1,2对应于煮饭,煮粥,煮面,然后使用PC_DispStr()函数在选择的选项前画上“@”指示,同时,在其余两项钱画上“”以“擦出”之前画下的“@”,注意l自增。 四.主要代码: #include "stdio.h" #include "includes.h" #include "time.h" #include "dos.h" #include "sys/types.h" #include "stdlib.h" #define TASK_STK_SIZE 512 #define N_TASKS 2 OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; OS_STK TaskStartStk[TASK_STK_SIZE]; INT8U TaskData[N_TASKS];

华北电力大学电力系统分析复试面试问题

保定校区电力系统及其自动化(电自) 面试:1。在线路保护中,什么情况下三段动作了,而一段二段都没有动作。 2、线路中的零序电流怎么测得。3、变压器Y-D11接线,正序负序零序电流的相位幅值怎么变化。4、零序电流保护有么有可能存在相继动作,为什么?5、隔离开关和断路器哪个先断开,为什么?6、电厂发电过程。 英语面试问题:先自我介绍,然后问问题1、为什么选择这个专业? 2、大学里最喜欢的课? 3、家庭成员介绍 笔试继电保护:差不多忘记了。。。记得几个大题1、一个环网的最大最小分支系数分析2、消除变压器不平衡电流的方法3、高频相差保护判断4、给一个阻抗继电器动作方程,让你画两个圆5、有零序电流保护计算题6、距离保护计算是被配合段有两条分支(即外汲),记得公式就行。7、振荡考的是大圆套小圆的,让你判断两个启动元件哪个是大圆,阐述短路与振荡的动作原理,及问有可能什么时候振荡是误动。 前面小题都考的很细。 英语听力,笔试很简单,不用准备。 保定校区电力系统及其自动化(电自) 英语面试老师直接叫我翻译学校的名字还有我学的专业课是什么初是的专业课成绩还有专业英语翻译 专业面试 1 船上的频率是多少 2你知道主要有那几中频率,分别是那些国家的 3两种不同的频率是通过什么连接起来的 4什么是

svc hv 5二机管的单向导通原理 6外面高压线路和地压线路的区别7变电站的无功补偿 笔试比较难我都不会那有零序电流保护镇定保护范围距离镇定 我强烈建议把继电保护学好专业课笔试好难 趁还有印象,先回忆一下 北京校区电气与电子工程学院电力系统及自动化 面试题目: 1.变压器中性点为何要接CT? 2.三相线路,a相短路,c相非短路点的电压、电流怎么求? 3.发电机机械时间常数增大,有什么影响? 4.影响无功潮流的因素有哪些? 还有就是电能质量指标等基础问题,当时一慌,回答的都很差 口试: 自我介绍 家乡介绍,说四种电力设备,读一篇科技短文(我读完是基本没什么感觉,英语平时没学好啊) 分在同一组的,大家的问题也都不一样,不过老师们会很和蔼,到了面试时,基本没有太紧张的感觉,希望对准备考研的有所帮助啊!

操作系统实验报告

操作系统实验报告 集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

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

structPCB_type { intpid;//进程名 intstate;//进程状态 2——表示“执行”状态 1——表示“就绪”状态 0——表示“阻塞”状态 intcpu_time;//运行需要的CPU时间(需运行的时间片个数) } 用PCB来模拟进程; (2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;将处于“阻塞”状态的进程PCB挂在队列blocked中。队列类型描述如下: structQueueNode{ structPCB_typePCB; StructQueueNode*next; } 并设全程量: structQueueNode*ready_head=NULL,//ready队列队首指针 *ready_tail=NULL,//ready队列队尾指 针

华北电力大学操作系统实验报告

华北电力大学 实验报告 | | 实验名称____ 操作系统综合实验 课程名称______ 操作系统 | | 专业班级:网络学生姓名: 学号:成绩: 指导教师:王德文/姜丽梅实验日期:2015年11月4日

实验一实验环境的使用 一、 实验目的 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 Labo 三、 实验内容问题及解答 1. 练习使用单步调试功能(逐过程、逐语句),体会在哪些情况下应该使用“逐过 程”调试, 在哪些情况下应该使用“逐语句”调试。练习使用各种调试工具(包括“监 视”窗口、“调用堆栈”窗口等)。 答:逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里面。 而逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行。因此,在需要进 入函数体时用逐语句调试,而不需要进入函数体时用逐过程调试。 四、实验过程 1. 新建Windows 控制台应用程序 生成项目: 执行项目: 调试项目: int Func (Int 口〕,// 芦明F UEK 函数 i. nx n - 0, n = FunjcdO); print f CHello World 查看 EOS SDK( Software Development Kit )文件夹: 修改EOS 应用程序项目名称: pflMSni-E-l (Prftss Ctrl+FVFR switcli corisnlfi uiitdnu...) Ucleone to EOS shell 五、实验心得 这次是验证性试验,具体步骤和操作方法都是与实验教程参考书上一致, 实验很顺利, 实验过程没有遇到困难。通过这次实验,我掌握了 OS Lab 启动和退出操作;练习使用 OS Lab 编写一个Windows 控制台应用程序,熟悉 OS Lab 的基本使用方法新建项目、生 成项目、调试项目等。 2. 使用断点终端执行: 13

操作系统实验报告一

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

《操作系统原理》实验报告 开课实验室:年月日学院软件学院年级、专业、班2013级软件工 程2班 姓名胡其友成绩 课程名称操作系统原理 实验项目 名称 指导教师洪明坚 教师 评语教师签名:洪明坚年月日 1.实验目的: ?进入实验环境 –双击expenv/setvars.bat ?检出(checkout)EPOS的源代码 –svn checkout https://www.wendangku.net/doc/ce18270234.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

操作系统实验报告心得体会

操作系统实验报告心得体会 每一次课程设计度让我学到了在平时课堂不可能学到的东西。所以我对每一次课程设计的机会都非常珍惜。不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。所以在这两周的课设中,熬了2个通宵,生物钟也严重错乱了。但是每完成一个任务我都兴奋不已。一开始任务是任务,到后面任务就成了自己的作品了。总体而言我的课设算是达到了老师的基本要求。总结一下有以下体会。 1、网络真的很强大,用在学习上将是一个非常高效的助手。几乎所有的资料都能够在网上找到。从linux虚拟机的安装,到linux的各种基本命令操作,再到gtk的图形函数,最后到文件系统的详细解析。这些都能在网上找到。也因为这样,整个课程设计下来,我浏览的相关网页已经超过了100个(不完全统计)。当然网上的东西很乱很杂,自己要能够学会筛选。 不能决定对或错的,有个很简单的方法就是去尝试。就拿第二个实验来说,编译内核有很多项小操作,这些小操作错了一项就可能会导致编译的失败,而这又是非常要花时间的,我用的虚拟机,编译一次接近3小时。所以要非常的谨慎,尽量少出差错,节省时间。多找个几个参照资料,相互比较,

慢慢研究,最后才能事半功倍。 2、同学间的讨论,这是很重要的。老师毕竟比较忙。对于课程设计最大的讨论伴侣应该是同学了。能和学长学姐讨论当然再好不过了,没有这个机会的话,和自己班上同学讨论也是能够受益匪浅的。大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。 3、敢于攻坚,越是难的问题,越是要有挑战的心理。这样就能够达到废寝忘食的境界。当然这也是不提倡熬夜的,毕竟有了精力才能够打持久战。但是做课设一定要有状态,能够在吃饭,睡觉,上厕所都想着要解决的问题,这样你不成功都难。 4、最好在做课设的过程中能够有记录的习惯,这样在写实验报告时能够比较完整的回忆起中间遇到的各种问题。比如当时我遇到我以前从未遇到的段错误的问题,让我都不知道从何下手。在经过大量的资料查阅之后,我对段错误有了一定的了解,并且能够用相应的办法来解决。 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的 1)访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址 2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域

华北电力大学EDA实验报告

课程设计报告 (2013--2014年度第1学期) 名称:电子电工实习(EDA部分)院系:科技学院信息系 班级: 学号: 学生姓名: 指导教师:张宁孙娜 设计周数:分散1周 成绩: 日期:2013年11月9日

一、课程设计(综合实验)的目的与要求 1、实验目的 设计一个具有基本功能的电子钟 2、实验要求 (1)、在6位数码管上按24小时进制显示“时”“分”“秒”; (2)、有对“时”“分”“秒”的校时功能; (3)、具有正点报时功能。当快到正点,即某点59分50秒时,电子钟报时,蜂鸣器鸣叫,10秒后结束; 二、设计实验 1、设计原理及其框图 (1)数字钟的构成

数字钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。它的计时周期为24小时,显示满刻度为23时59分59秒,。因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和蜂鸣器组成。干电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度。将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。译码显示电路将“时”、“分”、“秒”计数器的输出状态送到六段显示译码器译码,通过六位LED 六段显示器显示出来。整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时。校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整的。 (2)、简述74LS163 2、设计思路 通过分析实验要求得出:选用74LS163芯片共计6片,采用同步计数的方法来设计相关计时器(同一源输入脉冲接至CLK ,控制ENT 使能端实现计数),秒位计时器与分位计时器均为60进制,时位计时器为24进制。 控制验证当数字电子钟的输出为59分50秒时,与一个本电路所用的源输入脉冲信号,利用与门的特性输出相应的高低电平接通蜂鸣器实现整点报时。 三、实验具体设计 1、秒位计时电路设计(60进制) 秒低位计数用十进制计数器(74163改装)计数,由脉冲信号触发计数,9秒(秒低位输出1001B )时,秒低位清零;秒高位计数用六进制计数器(74163改装)计数,9秒时,秒高位芯片ENT 输入高电平,由此触发计数,59秒(秒低位输出1001B ,秒高位输出0101B )时,秒高位清零。如图(1)所示 74LS163芯片 4位二进制输出

嵌入式实时操作系统实验报告

嵌入式实时操作系统实验报告 任务间通信机制的建立 系别计算机与电子系 专业班级***** 学生姓名****** 指导教师 ****** 提交日期 2012 年 4 月 1 日

一、实验目的 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。 二、实验内容 1.建立并熟悉Borland C 编译及调试环境。 2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。 3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。观察程序运行结果并记录。 4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。 5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。 三、实验原理 1. 信号量 μC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样μC/OS-II 才能支持信号量。

华北电力大学电力系统分析考研及期末考试必备

华北电力大学电力系统分析考研及期末考试必备 1、什么是动力系统、电力系统、电力网? 答:通常把发电企业的动力设施、设备和发电、输电、变电、配电、用电设备及相应的辅助系统组成的电能热能生产、输送、分配、使用的统一整体称为动力系统; 把由发电、输电、变电、配电、用电设备及相应的辅助系统组成的电能生产、输送、分配、使用的统一整体称为电力系统; 把由输电、变电、配电设备及相应的辅助系统组成的联系发电与用电的统一整体称为电力网。 2、现代电网有哪些特点? 答:1、由较强的超高压系统构成主网架。2、各电网之间联系较强,电压等级相对简化。3、具有足够的调峰、调频、调压容量,能够实现自动发电控制,有较高的供电可靠性。4、具有相应的安全稳定控制系统,高度自动化的监控系统和高度现代化的通信系统。5、具有适应电力市场运营的技术支持系统,有利于合理利用能源。 3、区域电网互联的意义与作用是什么? 答:1、可以合理利用能源,加强环境保护,有利于电力工业的可持续发展。 2、可安装大容量、高效能火电机组、水电机组和核电机组,有利于降低造价,节约能源,加快电力建设速度。 3、可以利用时差、温差,错开用电高峰,利用各地区用电的非同时性进行负荷调整,减少备用容量和装机容量。 4、可以在各地区之间互供电力、互通有无、互为备用,可减少事故备用容量,增强抵御事故能力,提高电网安全水平和供电可靠性。 5、能承受较大的冲击负荷,有利于改善电能质量。 6、可以跨流域调节水电,并在更大范围内进行水火电经济调度,取得更大的经济效益。 4、电网无功补偿的原则是什么? 答:电网无功补偿的原则是电网无功补偿应基本上按分层分区和就地平衡原则考虑,并应能随负荷或电压进行调整,保证系统各枢纽点的电压在正常和事故后均能满足规定的要求,避免经长距离线路或多级变压器传送无功功率。 5、简述电力系统电压特性与频率特性的区别是什么? 答:电力系统的频率特性取决于负荷的频率特性和发电机的频率特性(负荷随频率的变化而变化的特性叫负荷的频率特性。发电机组的出力随频率的变化而变化的特性叫发电机的频率特性),它是由系统的有功负荷平衡决定的,且与网络结构(网络阻抗)关系不大。在非振荡情况下,同一电力系统的稳态频率是相同的。因此,系统频率可以集中调整控制。 电力系统的电压特性与电力系统的频率特性则不相同。电力系统各节点的电压通常情况下是不完全相同的,主要取决于各区的有功和无功供需平衡情况,也与网络结构(网络阻抗)有较大关系。因此,电压不能全网集中统一调整,只能分区调整控制。

操作系统实验报告16487

西安邮电大学 (计算机学院) 课实验报告 实验名称:进程管理 专业名称:计算机科学与技术 班级: 学生: 学号(8位): 指导教师: 实验日期:*****年**月**日

一. 实验目的及实验环境 目的:(1)加深对进程概念的理解,明确进程和程序的区别。 (2)进一步认识并发执行的实质。 (3)分析进程竞争资源现象,学习解决进程互斥的方法。 (4)了解Linux系统中进程通信的基本原理。 环境:Linux操作系统环境: 二. 实验容 (1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。 (2)阅读Linux的fork.c源文件,分析进程的创建过程。 三.方案设计 (1)进程的创建 编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。(2)进程的控制 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。 如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。 (3)①编写一段程序,使其现实进程的软中断通信。 要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Processll is Killed by Parent! Child Processl2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止 Parent Process is Killed! 程序流程图如下:

华北电力大学实验报告

华北电力大学 实验报告 实验名称:超外差收音机安装与调试 一、实验目的 1.了解常用电子器件的类别、型号、规格、性能及其使用范围,能查阅有关的 电子器件图书。能够正确识别和选用常用的电子器件,并且能够熟练使用万用表。 2.学习并掌握超外差收音机的工作原理 3.了解超外差式收音机的调试方法。

4.熟悉手工焊锡的常用工具的使用及其维护与修理,基本掌握手工电烙铁的焊 接技术。 二、实验原理图 三、元器件清单 元件型号数量位号元件型号数量位号 三极管9013 2只V6、V7 电阻56Ω1只R5 三极管9014 1只V5 电阻100KΩ2只R7、R10 三极管9018 4只V1、V2、V3、V4 电阻120KΩ1只R1 发光二极管红色1只LED 瓷片电容103 1只C2 磁棒及线圈4x8x80mm 1套T1 瓷片电容C1、C4、C5 振荡线圈TF10(红色)1只T2 瓷片电容223 7只C6、C7、C10 中频变压器TF10(黄色)1只T3 瓷片电容C11 中频变压器TF10(白色)1只T4 电解电容 4.7uF 2只C3、C8 中频变压器TF10(绿色)1只T5 电解电容100uF 3只C12、C13、C9 输入变压器蓝色1只T6 双联电容CBM-223PF 1只CA 扬声器0.5W 8Ω1只BL 耳机插座?3.5mm 1只CK 电位器10KΩ1只RP 装配说明书1分 电阻51Ω1只R8 机壳上盖1个 电阻100Ω2只R13、R15 机壳下盖1个 电阻120Ω2只R12、R14 刻度面板1块 电阻150Ω1只R3 调谐拨盘1只 电阻220Ω1只R11 电位器拨盘1只 电阻510Ω1只R16 磁棒支架1只

相关文档
相关文档 最新文档