文档库 最新最全的文档下载
当前位置:文档库 › 操作系统第三版实验指导

操作系统第三版实验指导

操作系统第三版实验指导
操作系统第三版实验指导

实验一命令解释程序

1.1 实验目的

?掌握命令解释程序的设计方法。

?学习Windows系统调用的使用,了解目录操作、进程控制等相关知识。

?理解并发程序中的同步问题。

?培养C/C++语言程序设计技能,提高程序设计和文档编写能力。

?锻炼团队成员的交流与合作能力。

1.2 实验要求

1.2.1基本要求

本实验要求实现一个简单的命令解释程序,其设计类似于MS-DOS的Command程序,程序应当具有如下一些重要特征:

?能够执行cd、dir、tasklist、taskkill、history、exit等内部命令。

?能够创建前台进程和后台进程。

此外,还应做到:

?使用VC建立工程。

?提供清晰、详细的设计文档和解决方案。

本实验的具体要求如下:

(1)参考Command命令解释程序,采用控制台命令行输入,命令提示行是当前目录与提示符“>”,在提示符后输入命令,执行结果在控制台中显示,如图1-1所示。

(2)实现以下内部命令。

?cd <路径> 切换目录。

?dir 显示指定目录下的文件、目录及磁盘空间等相关信息。

?tasklist 显示系统当前进程信息,包括进程标识符pid、线程数、进程名等。

?taskkill 结束系统中正在运行的进程,须提供进程标识pid。

?history 显示控制台中曾经输入过的命令。

?exit 退出控制台。

(3)对前台进程和后台进程的操作。

本实验设计的命令解释程序可以将进程放在前台执行或者后台执行。

2

操作系统实用教程(第三版)实验指导

图1-1 命令解释器界面

启动前台进程,即在提示符下输入:

fp <可执行文件>

启动后台进程的命令格式为:

bg <可执行文件>

解释程序在前台进程运行期间需要一直等待,直到前台进程运行结束才打印命令提示符,而在后台进程运行期间不必等待,会立刻打印出命令提示符,允许用户输入下一条命令。命令解释程序中还需要捕获Ctrl+C组合键的信号来结束前台正在运行的进程,并返回用户输入界面,等待新命令输入。

(4)其他要求。

该命令解释程序应该具有相应的出错提示功能。程序每次接收用户输入的一行命令,在用户按下回车键(Enter)后开始执行命令。空命令只打印一个新的提示行,不做其他处理。定义空格为分隔符,程序应能处理命令行中出现的重复空格符。提供帮助命令help,供使用者查询每个命令的用法。

1.2.2 进一步要求

(1)实现管道命令。命令格式为:

<命令> {| <命令>}

管道命令的作用是将管道分隔符| 前一个命令的输出作为后一个命令的输入。

(2)仿照MS-DOS Command命令解释程序对现有命令语法进行改进,实现命令参数处理功能。例如dir命令,附加/A(显示具有指定属性的文件),附加/B(使用空格式),

实验一命令解释程序 3

附加/C(在文件大小中显示千位数分隔符)等参数。如dir /A。

(3)实现进程的前台/后台切换命令,这需要查阅相关Windows API来解决。

1.2.3 实验步骤建议

(1)熟悉Windows相关API函数的调用。

(2)编写小程序练习使用这些系统调用。

(3)编写命令解释器设计文档。

(4)按照设计文档编写代码。

(5)不断完善程序细节。

(6)测试。

(7)写实验报告(包括需求、设计、测试和使用说明等内容,格式可参考1.6节源程序与运行结果之“实验报告模板”)。

1.3 相关基础知识

1.3.1 命令解释程序与内核的关系

命令解释程序是用户和系统内核之间的接口程序。对于Windows系统来说,由于已经提供了具有良好交互性的图形用户界面,传统的控制台命令解释程序已经很少被广大用户所了解和使用了。但是,对于某些应用,例如删除所有扩展名为tmp的文件,或是删除某些具有特殊名字的病毒文件,在图形用户界面下很难甚至不能完成,这时需要通过Windows 提供的Command命令接口来完成。Command程序是一个命令语言解释器,它拥有自己内建的命令集,用户或其他应用程序都可通过对Command程序的调用完成与系统内核的交互。我们可以把系统内核想象成一个球体的中心,Command命令解释程序就是包围内核的外壳,如图1-2所示。

图1-2 硬件、内核、系统调用以及Command之间的层次关系

4

操作系统实用教程(第三版)实验指导

1.3.2 系统调用

应用程序是以函数调用的方式来通知操作系统执行相应的内核功能。操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,即操作系统把它所能够完成的功能以函数的形式提供给应用程序使用。应用程序对这些函数的调用叫做系统调用,这些函数的集合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称Windows API或Win32 API(注:某些Win32 API,如管理Windows线程的API等,它们并没有操纵内核对象,因此不是系统调用。本实验只讨论API的使用,不再做进一步区分)。所有在Win32平台上运行的应用程序都可以调用这些函数。

使用Windows API,应用程序可以充分挖掘Windows的32位操作系统的潜力。Microsoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用Windows API不但可以开发出在各种Windows平台上都能运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。

Windows的相关API都可以在MSDN中查到,包括定义、使用方法等。下面简单介绍本次实验中所涉及的Windows API。

1.GetCurrentDirectory函数

功能说明

查找当前进程的当前目录,调用成功返回装载到lpBuffer的字节数。

格式

DWORD GetCurrentDirectory(

DWORD nBufferLength,

LPTSTR lpBuffer

)

参数说明

nBufferLength:缓冲区的长度。

lpBuffer:指定一个预定义字串,用于装载当前目录。

2.WaitForSingleObject函数

功能说明

等待一个事件信号直至该信号出现或是超时。若有信号则返回WAIT_OBJECT_0,若等待超过dwMilliseconds时间还是无信号则返回WAIT_TIMEOUT。

格式

DWORD WaitForSingleObject(

HANDLE hHandle,

DWORD dwMilliseconds

)

实验一命令解释程序 5

参数说明

hHandle:事件的句柄。

dwMilliseconds:最大等待时间,以ms计时。

3.SetCurrentDirectory

功能说明

设置当前目录,非0表示成功,0表示失败。

格式

BOOL SetCurrentDirectory(

LPCTSTR lpPathName

)

参数说明

lpPathName:新设置的当前目录的路径。

4.FindFirstFile函数

功能说明

该函数用于到一个文件夹(包括子文件夹)中搜索指定文件,由这个函数返回的句柄可以作为一个参数用于FindNextFile函数。这样一来,就可以方便地枚举出与lpFileName 参数指定的文件名相符的所有文件。

格式

HANDLE FindFirstFile(

LPCTSTR lpFileName,

LPWIN32_FIND_DATA lpFindFileData

)

参数说明

lpFileName:文件名字符串。

lpFindFileData:指向一个用于保存文件信息的结构体。

5.FindNextFile函数

功能说明

继续查找FindFirstFile函数搜索后的文件。由这个函数返回的句柄可以作为一个参数用于FindNextFile()函数。这样一来,就可以方便地枚举出与lpFileName参数指定的文件名相符的所有文件。

格式

BOOL FindNextFile(

HANDLE hFindFile,

LPWIN32_FIND_DATA lpFindFileData

)

6

操作系统实用教程(第三版)实验指导参数说明

hFindFile:前一个搜索到的文件的句柄。

lpFindFileData:指向一个用于保存文件信息的结构体。

6.GetVolumeInformation函数

功能说明

用于获取磁盘相关信息。

格式

BOOL GetVolumeInformation(

LPCTSTR lpRootPathName,

LPTSTR lpVolumeNameBuffer,

DWORD nVolumeNameSize,

LPDWORD lpVolumeSerialNumber,

LPDWORD lpMaximumComponentLength,

LPDWORD lpFileSystemFlags,

LPTSTR lpFileSystemNameBuffer,

DWORD nFileSystemNameSize

)

参数说明

lpRootPathName:磁盘驱动器代码字符串。

lpV olumeNameBuffer:磁盘驱动器卷标名称。

nV olumeNameSize:磁盘驱动器卷标名称长度。

lpV olumeSerialNumber:磁盘驱动器卷标序列号。

lpMaximumComponentLength:系统允许的最大文件长度。

lpFileSystemFlags:文件系统标识。

lpFileSystemNameBuffer:文件系统名称。

nFileSystemNameSize:文件系统名称长度。

7.GetDiskFreeSpaceEx函数

功能说明

获取与一个磁盘的组织以及剩余空间容量有关的信息。

格式

BOOL GetDiskFreeSpaceEx(

LPCTSTR lpRootPathName,

PULARGE_INTEGER lpFreeBytesAvailableToCaller,

PULARGE_INTEGER lpTotalNumberOfBytes,

PULARGE_INTEGER lpTotalNumberOfFreeBytes, )

参数说明

lpRootPathName:不包括卷名的磁盘根路径名。

实验一命令解释程序7

lpFreeBytesAvailableToCaller:调用者可用的字节数量。

lpTotalNumberOfBytes:磁盘上的总字节数。

lpTotalNumberOfFreeBytes:磁盘上可用的字节数。

8.FileTimeToLocalFileTime函数

功能说明

将一个FILETIME结构转换成本地时间。

格式

BOOL FileTimeToLocalFileTime(

const FILETIME* lpFileTime,

LPFILETIME lpLocalFileTime

)

参数说明

lpFileTime:包含了UTC时间信息的一个结构。

lpLocalFileTime:用于装载转换过的本地时间的结构体。

9.FileTimeToSystemTime函数

功能说明

根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构。

格式

BOOL FileTimeToSystemTime(

const FILETIME* lpFileTime,

LPSYSTEMTIME lpSystemTime

)

参数说明

lpFileTime:包含了文件时间的一个结构。

lpSystemTime:用于装载系统时间信息的一个结构体。

10.CreateToolhelp32Snapshot函数

功能说明

为指定的进程、进程使用的堆(heap)、模块(module)、线程(thread)建立一个快照(snapshot)。快照建立成功则返回快照的句柄,失败则返回INV AID_HANDLE_VALUE。

格式

HANDLE WINAPI CreateToolhelp32Snapshot(

DWORD dwFlags,

DWORD th32ProcessID

)

参数说明

dwFlags:指定快照中包含的系统内容。

8

操作系统实用教程(第三版)实验指导

th32ProcessID:指定将要快照的进程ID。

11.Process32First函数

功能说明

Process32First是一个进程获取函数,当使用CreateToolhelp32Snapshot()函数获得当前运行进程的快照后,可以使用Process32First()函数获得第一个进程的句柄。

格式

BOOL WINAPI Process32First(

HANDLE hSnapshot,

LPPROCESSENTRY32 lppe

)

参数说明

hSnapshot:快照句柄。

lppe:指向一个保存进程快照信息的PROCESSENTRY32结构体。

12.Process32Next函数

功能说明

获取进程快照中下一个进程信息。

格式

BOOL WINAPI Process32Next(

HANDLE hSnapshot,

LPPROCESSENTRY32 lppe

)

参数说明

hSnapshot:由Process32First()函数或Process32Next()函数获得的快照句柄。

lppe:指向一个保存进程快照信息的PROCESSENTRY32结构体。

13.OpenProcess函数

功能说明

OpenProcess()函数打开一个已存在的进程对象。若成功,返回值为指定进程的打开句柄。若失败,返回值为空。

格式

HANDLE OpenProcess(

DWORD dwDesiredAccess,

BOOL bInheritHandle,

DWORD dwProcessId

)

参数说明

dwDesiredAccess:权限标识。

实验一命令解释程序9

bInheritHandle:句柄继承标识。

dwProcessId:进程ID。

14.SetConsoleCtrlHandler函数

功能说明

添加或删除一个事件钩子(handler)。

格式

BOOL SetConsoleCtrlHandler(

PHANDLER_ROUTINE HandlerRoutine,

BOOL Add

)

参数说明

HandlerRoutine:回调函数的指针。

Add:表示添加或是删除。

15.CreateProcess函数

功能说明

创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。

格式

BOOL CreateProcess(

LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

)

参数说明

lpApplicationName:指定可执行模块的字符串。

lpCommandLine:指定要运行的命令行。

lpProcessAttributes:决定返回句柄能否被继承,该参数定义了进程的安全特性。

lpThreadAttributes:决定返回句柄能否被继承,该参数定义了进程之主线程的安全特性。

bInheritHandles:表示新进程是否从调用进程处继承了句柄。

dwCreationFlags:控制优先类和进程的创建标志。

10

操作系统实用教程(第三版)实验指导

lpEnvironment:指向一个新进程的环境块。

lpCurrentDirectory:指定子进程的工作路径。

lpStartupInfo:决定新进程的主窗体显示方式的结构体。

lpProcessInformation:接收新进程的识别信息。

16.GetExitCodeProcess函数

功能说明

获取一个已中断进程的退出代码。

格式

BOOL GetExitCodeProcess(

HANDLE hProcess,

LPDWORD lpExitCode

)

参数说明

hProcess:为进程句柄。

lpExitCode:指向接受退出码的变量。

17.TerminateProcess函数

功能说明

以给定的退出码终止一个进程。

格式

BOOL TerminateProcess(

HANDLE hProcess,

UINT uExitCode

)

参数说明

hProcess:进程句柄。

uExitCode:进程退出码。

1.3.3 重要API的使用说明

这里详细介绍实验中涉及的、重要的Windows API函数。

1.创建进程

Windows中使用CreateProcess()函数创建进程,与Linux中的fork()函数有所不同。Windows里的进程/线程是继承自OS/2的。在Windows中,“进程”是指一个程序,而“线程”是一个“进程”里的一个执行“线索”。从核心上讲,Windows与Linux的多进程并无多大的区别,Windows中的线程相当于Linux中的进程,是一个实际正在执行的代码,同

实验一命令解释程序11

一个进程里的各个线程之间是共享数据段的。在Windows中,当使用CreateProcess()创建一个进程时,系统也会为其创建一个主线程,并从指定的可执行代码处开始运行,而不像Linux那样从创建处开始运行。此后,可以使用CreateThread()函数为进程创建更多的线程。

CreateProcess()函数包含了多个参数,这里只介绍几个相关的参数,其他参数使用默认值。

BOOL CreateProcess(

LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

)

主要参数说明

lpApplicationName:这是指向一个NULL结尾的、用来指定可执行模块的字符串。这个字符串可以是可执行模块的绝对路径,也可以是相对路径。在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。这个参数可以设置为NULL,在这种情况下,可执行模块的名称必须处于lpCommandLine 参数的最前面并由空格符与后面的字符分开。

lpCommandLine:指向一个NULL结尾的、用来指定要运行的命令行。这个参数可以为空,这时函数将使用参数指定的字符串当作要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。

lpStartupInfo:指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体,包括窗口的显示位置、大小,是否有输入和输出及错误输出(具体参见MSDN的参数说明)。其中输出句柄可以用于进程的管道通信。使用这个结构体时要注意先要初始化它的大小,当进程创建的时候可以用GetStartupInfo来获得STARTUPINFO结构体。

lpProcessInformation:指向一个用来接收新进程的识别信息的PROCESS_INFOR- MATION结构体。其中包含了新进程的多个信息。例如进程句柄、进程主线程的句柄、进程ID、主线程ID。通过获得的进程信息即可对该进程进行进一步操作。

2.处理控制台消息

本实验需要在用户按下Ctrl+C组合键时终止当前进程的运行,这需要程序能够处理相应的控制台消息。处理控制台消息首先需要安装一个事件钩子,可通过SetConsoleCtrl- Handler()函数来完成。

12

操作系统实用教程(第三版)实验指导

格式

BOOL SetConsoleCtrlHandler(

PHANDLER_ROUTINE HandlerRoutine,

BOOL Add

)

参数说明

Add:值为TRUE时表示添加一个事件钩子,为FALSE时则表示删除对应的事件钩子。

HandlerRoutine:指向处理消息事件的回调函数的指针,原型如下

BOOL WINAPI HandlerRoutine(

DWORD dwCtrlType

)

所有的HandlerRoutine()函数都只有一个参数dwCtrlType,表示控制台发出了什么消息,可能有以下取值。

?Ctrl_C_Event:用户按下Ctrl+C组合键,或者由GenerateConsoleCtrlEvent API发出。

?Ctrl_Break_Event:用户按下Ctrl+Break组合键,或者由GenerateConsoleCtrlEvent API 发出。

?Ctrl_Close_Event:当试图关闭控制台程序时,系统发送关闭消息。

?Ctrl_Logoff_Event:用户退出时,但是不能确定是哪个用户。

?Ctrl_Shutdown_Event:当系统被关闭时的取值。

当收到事件消息时,HandlerRoutine()可以选择处理,或是简单的忽略。如果回调函数选择忽略,函数返回FALSE,系统将处理下一个钩子程序。如果选择处理消息,程序在处理完消息后应该返回TRUE。

1.4 实验设计

本实验是在Windows XP+VC 6.0环境下实现的,利用Windows SDK提供的系统接口(API)完成程序的功能。实验在Windows系统下安装VC后进行,因为VC是一个集成开发环境,其中包含了Windows SDK所有工具和定义,所以安装了VC后就不用特意安装SDK了。实验中所用的API,即应用程序接口,是操作系统提供的、用以进行应用程序设计的系统功能接口。要使用这些API,需要包含对这些函数进行说明的SDK头文件,最常见的就是windows.h。一些特殊的API调用还需要包含其他的头文件。

由于本实验涉及了较多的API,所以建议安装MSDN作为参考。

1.4.1 重要的数据结构

1.历史命令循环数组

在history命令中,用数组来存放我们输入过的历史命令。假设一个能够记录12条历

实验一命令解释程序13 史记录的数组如图1-3(a)所示。数组的定义如下:

typedef struct ENV_HISTROY{

int start=0;

int end=0;

char his_cmd[12][100];

} ENV_HISTORY;

ENV_HISTORY envhis;

可以看到,每个his_cmd[i]对应图中一块圆环,一共12块,能存放12条命令。当用户输入一个命令时,只需执行如下语句即可将输入存入相应数组中:

envhis.end=envhis.end+1;

strcpy(envhis.his_cmd[envhis.end],input);

但是,还需要考虑如图1-3(b)所示的情况。

图1-3 循环数组示意图

在这种情况下end=12,当我们再输入一条命令时,如果还是用上面两条命令进行处理“end=end+1”,则end=13就会出错。所以应对程序进一步修改为:

envhis.end=(envhis.end+1)%12;

if (envhis.end==envhis.start){

envhis.start=(envhis.start+1)%12;

}

strcpy(envhis.his_cmd[envhis.end],input);

经过这样的处理,就可以达到循环的目的了。

2.文件信息链表

在实验中,我们需要把dir命令取得的文件信息用链表保存,输出这些信息时对链表进行遍历。

链表结点的定义如下:

typedef struct files_Content

{

14

操作系统实用教程(第三版)实验指导

FILETIME time; //文件创建时间

char name[200]; //文件名

int type; //普通文件/目录标识

int size; //文件大小

struct files_Content *next;

}files_Content;

1.4.2 程序实现

实现程序的流程如图1-4所示。程序一开始需要对一些变量进行初始化,例如初始化

history。接着获得当前目录,打印命令提示符,等待用户输入。

相应的命令函数进行处理,显示处理结果。如果输入命令为

exit,则结束程序,否则继续打印提示符,等待用户输入。

1.解析命令

解析命令就是分析input数组中的输入,分离命令和参数。

参数和命令的分隔是由空格符完成的。将命令读入arg[0]指向

的字符串中,将命令参数读入arg[1]指向的字符串中。

例如:输入“cd c:\temp”命令,首先将命令存入input数

组,然后从input数组中依次读取命令中的字符。假设cd与

c:\temp之间无意中输入了多个空格,则先略去多余空格;之后

将cd存入arg[0]指向的字符串,将c:\temp存入arg[1]指向的字

符串中,以便进行下一步处理。

for (i=0, j=0, k=0; i

{

if (input[i] == ' ' || input[i] == '\0')

图1-4 程序流程图{

if (j == 0) /*去掉连在一起的多个空格*/

continue;

else

{

buf[j++]='\0';

arg[k]=(char*)malloc(sizeof(char)*j);

strcpy(arg[k++], buf); /*将指令或参数复制到arg中*/

j=0; /*准备取下一个参数*/

}

}

else

{

实验一命令解释程序15

buf[j++]=input[i];

}

}

接下来根据arg[0]指向字符串的不同,确定应该执行的命令函数。

if (strcmp(arg[0], "cd") == 0) {

add_history(input); /*将输入的命令添加到历史命令中*/

for (i=3, j=0; i <= input_len; i++) /*获取cd命令的相关参数*/ buf[j++]=input[i];

buf[j]='\0';

arg[1]=(char*)malloc(sizeof(char) * j);

strcpy(arg[1], buf);

cd_cmd(arg[1]); /*显示cd命令*/

free(input);

continue;

}

上面一段代码显示执行的是cd命令,将用户输入的命令添加到历史命令中,通过一个for循环将空格后(空格保存在input[2]中)的参数存入buf,使arg[1]指向buf的首地址,再将arg[1]作为参数传给命令处理函数cd_cmd(arg[1])。

2.命令处理

命令的处理与执行命令的目的有关,其中系统调用是重要组成部分。

void cd_cmd(char *route)

{

if ( !SetCurrentDirectory(route)) /*设置当前目录,若失败则返回出错信息*/

{

printf(TEXT("SetCurrentDirectory failed (%d)\n"),

GetLastError());

}

}

以上是cd命令的处理函数,涉及的Windows API为SetCurrentDirectory()函数,它的作用是设置当前目录为指定路径,若失败则返回出错信息。

其余命令处理函数结构类似,具体实现请参照源代码,这里就不一一赘述了。

1.5 实验总结

本次实验为命令解释程序的设计和编写。通过实验,学生可以学习到用户如何通过命令行界面与系统内核进行交互,掌握系统调用的相关知识。在实验中,学生可以参考实验样例或MS-DOS、Linux等系统的命令解释(shell)程序,设计自定义的命令集,以完成更多的实用功能。此外,实验还使学生可以初步了解一些Windows核心编程的知识,并掌握一些常见Windows API的使用方法。

16

操作系统实用教程(第三版)实验指导

本次实验为Windows系列实验的第一次实验,希望学生在所有实验活动的过程中养成勤于分析问题、查阅资料和记录文档的习惯,加强团队沟通能力,使软件开发能力进一步提高。

1.6 源程序与运行结果

1.6.1 程序源代码

1.WinShell.h文件

#define BUFSIZE MAX_PATH

#define HISNUM 12 /*可以最多保存12个历史命令*/ char buf[BUFSIZE];

/*保存历史命令的结构体*/

typedef struct ENV_HISTROY{

int start;

int end;

char his_cmd[HISNUM][100];

}ENV_HISTORY;

ENV_HISTORY envhis;

/*保存文件或目录相关信息*/

typedef struct files_Content

{

FILETIME time;

char name[200];

int type;

int size;

struct files_Content *next;

}files_Content;

2.WinShell.c文件

#define _WIN32_WINNT 0x0501 /*Windows API版本*/

#include

#include

#include

#include

#include

#include

#include

实验一命令解释程序17

#include

#include

#include "WinShell.h"

int main()

{

/*******************声明程序中用到的函数********************/

void cd_cmd(char *dir); /*显示cd命令*/

void dir_cmd(char *dir); /*显示dir命令*/

void ftime(FILETIME filetime); /*显示文件创建时间*/

void GetProcessList(); /*获得系统当前进程列表*/

void history_cmd(); /*获得最近输入的命令*/

void add_history(char *inputcmd); /*将输入的命令添加到命令历史中*/ HANDLE process(int bg, char appName[]); /*创建进程*/

BOOL killProcess(char *pid); /* kill进程*/

BOOL WINAPI ConsoleHandler(DWORD CEvent); /*回调函数*/

void help(); /*显示帮助信息*/

char c, *input, *arg[2], path[BUFSIZE];

int input_len=0,is_bg=0,i,j,k;

HANDLE hprocess; /*进程执行结束,返回进程句柄*/ DWORD dwRet;

while(1)

{

/*将指向输入命令的指针数组初始化*/

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

arg[i]=NULL;

/*获得当前目录,返回的地址存入"path"中*/

/* BUFSIZE是最多能够保存的地址长度*/

dwRet=GetCurrentDirectory(BUFSIZE, path);

if (dwRet==0)

{

/*返回当前目录失败,输出出错信息*/

printf("GetCurrentDirectory failed (%d)\n", GetLastError());

}

else if (dwRet>BUFSIZE)

{

/*BUFSIZE长度小于返回地址长度,输出需要多少长度*/

printf("GetCurrentDirectory failed (buffer too small; need %d

chars)\n", dwRet);

}

else

18

操作系统实用教程(第三版)实验指导

/*输出当前目录*/

printf("%s>", path);

/***************************输入****************************/

input_len=0;

/*将无用字符过滤掉*/

while((c=getchar()) == ' ' || c == '\t' || c == EOF)

if (c == '\n') /*输入为空时,结束本次循环打印提示符*/ continue;

while(c != '\n')

{

buf[input_len++]=c;

c=getchar();

}

buf[input_len++]= '\0'; /*加上串结束符*/

/*分配动态存储空间,将命令从缓存复制到input中*/

input=(char*) malloc(sizeof(char) * (input_len));

strcpy(input, buf);

/*************************解析指令***************************/

for (i=0, j=0, k=0; i

{

if (input[i] == ' ' || input[i] == '\0')

{

if (j == 0) /*去掉连在一起的多个空格*/

continue;

else

{

buf[j++]='\0';

arg[k]=(char*)malloc(sizeof(char)*j);

strcpy(arg[k++], buf); /*将指令或参数复制到arg中*/

j=0; /*准备取下一个参数*/

}

}

else

{

buf[j++]=input[i];

}

}

/************************内部命令处理************************/

实验一命令解释程序19

/* cd命令*/

if (strcmp(arg[0], "cd") == 0){

add_history(input); /*将输入的命令添加到历史命令中*/ for (i=3, j=0; i <= input_len; i++)/*获取cd命令的相关参数*/ buf[j++]=input[i];

buf[j]='\0';

arg[1]=(char*) malloc(sizeof(char) * j);

strcpy(arg[1], buf);

cd_cmd(arg[1]); /*显示cd命令*/

free(input);

continue;

}

/*dir命令*/

if (strcmp(arg[0], "dir") == 0){

char *route;

add_history(input);

if (arg[1] == NULL) /*没有输入dir目录参数,dir目录为当前目录*/ {

route=path;

dir_cmd(route);

}

else

dir_cmd(arg[1]); /* dir目录参数由arg[1]获得*/ free(input);

continue;

}

/*tasklist命令*/

if (strcmp(arg[0], "tasklist") == 0) {

add_history(input);

GetProcessList(); /*获得系统当前进程列表*/

free(input);

continue;

}

/*前台进程*/

if (strcmp(arg[0], "fp") == 0) {

add_history(input);

if (arg[1] == NULL)

{

printf("没有指定可执行文件\n");

free(input);

continue;

20

操作系统实用教程(第三版)实验指导

}

is_bg=0; /*后台标志置0*/

hprocess=process(is_bg); /*返回创建的进程句柄*/

if (WaitForSingleObject(hprocess, INFINITE) == WAIT_OBJECT_0)

/*如果进程执行完毕,释放控制台*/

free(input);

continue;

}

/*后台进程*/

if (strcmp(arg[0], "bg&") == 0)

{

add_history(input);

if (arg[1] == NULL)

{

printf("没有指定可执行文件\n");

free(input);

continue;

}

is_bg=1; /*后台标志置1*/

process(is_bg);

free(input);

continue;

}

/*kill进程*/

if (strcmp(arg[0],"taskkill") == 0)

{

BOOL success;

add_history(input);

success=killProcess(arg[1]); /* arg[1]指向进程ID */

if (!success)

printf("kill process failed!\n");

free(input);

continue;

}

/*显示历史命令*/

if (strcmp(arg[0], "history") == 0)

{

add_history(input);

history_cmd(); /*获得最近输入的命令*/

free(input);

continue;

}

《操作系统原理》信管专业实验指导书资料

《操作系统原理》实验指导书 班级:_______________ 学号:_______________ 姓名:_______________ 山东建筑大学管理工程学院 信息管理与信息系统教研室

目录 引言 (1) 实验题目一 (2) 实验题目二 (4) 实验题目三 (6) 实验题目四 (8) 实验题目五 (10) 实验题目六 (12)

引言 操作系统是信息管理与信息系统专业一门重要的专业理论课程,了解和掌握操作系统的基本概念、功能和实现原理,对认识整个计算机系统的工作原理十分重要。 操作系统实验是操作系统课程的一个重要组成部分,通过试验环节的锻炼使同学们不仅能够对以前的所学过的基础知识加以巩固,同时能够通过上机实验,对操作系统的抽象理论知识加以理解,最终达到融会贯通的目的,因此,实验环节是同学们理解、掌握操作系统基本理论的一个重要环节。 本实验指导书,根据教材中的重点内容设定了相应的实验题目,由于实验课程的学时有限,我们规定了必做题目和选做题目,其中必做题目必须在规定的上机学时中完成,必须有相应的预习报告和实验报告。选做题目是针对有能力或感兴趣的同学利用课余时间或上机学时的剩余时间完成。

实验题目一:模拟进程创建、终止、阻塞、唤醒原语 一、题目类型:必做题目。 二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进 程控制功能的理解,掌握操作系统模块的设计方法和工作原理。 三、实验环境: 1、硬件:PC 机及其兼容机。 2、软件:Windows OS ,Turbo C 或C++、VC++、https://www.wendangku.net/doc/a52245266.html, 、Java 等。 四、实验内容: 1、设计创建、终止、阻塞、唤醒原语功能函数。 2、设计主函数,采用菜单结构(参见后面给出的流程图)。 3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供 随时查看各队列中进程的变化情况。 五、实验要求: 1、进程PCB 中应包含以下内容: 2、系统总体结构: 其中: 进程名用P1,P2标识。 优先级及运行时间:为实验题目二做准备。 状态为:就绪、运行、阻塞,三种基本状态。 指针:指向下一个PCB 。

操作系统实验报告

操作系统实验报告 集团企业公司编码:(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队列队尾指 针

操作系统实验实验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、用软中断通信实现进程同步的机理

操作系统实验_实验1

广州大学学生实验报告 开课学院及实验室:计算机科学与工程实验室 2015年11月11日 实验课 操作系统成绩 程名称 实验项 进程管理与进程通信指导老师陈康民目名称 (***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***) 进程管理 (一)进程的创建实验 一、实验目的 1、掌握进程的概念,明确进程的含义 2、认识并了解并发执行的实质 二、实验内容 1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一 个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……', 父进程显示'parent ……',观察结果,分析原因。 三、实验步骤 1、编写一段程序,使用系统调用fork( )创建两个子进程。 代码: #include main( ) { int p1,p2; while((p1=fork( ))= = -1); /*创建子进程p1*/ if (p1= =0) putchar('b'); else { while((p2=fork( ))= = -1); /*创建子进程p2*/ if(p2= =0) putchar('c'); else putchar('a'); } } 运行结果:

bca,bac, abc ,……都有可能。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。 代码:#include main( ) { int p1,p2,i; while((p1=fork( ))= = -1); /*创建子进程p1*/ if (p1= =0) for(i=0;i<10;i++) printf("daughter %d\n",i); else { while((p2=fork( ))= = -1); /*创建子进程p2*/ if(p2= =0) for(i=0;i<10;i++) printf("son %d\n",i); else for(i=0;i<10;i++) printf("parent %d\n",i); } } 结果:

操作系统实验指导书

实验前准备工作:Linux的安装 一. 实验目的 1.掌握Red Hat Linux操作系统的安装步骤。 2.掌握启动、关闭操作系统的方法。 二.实验准备 Red Hat Linux操作系统既可以单独安装在一个计算机系统中;也可以与其它操作系统如windows操作系统一起安装在一个计算机系统中,但注意在安装时要先装windows操作系统,再装Linux;或者利用主机的资源(如CPU、内存、硬盘),模拟出的一台新计算机。然后在虚拟机中安装windows、Linux等系统,使用虚拟机对主机的要求比较高,建议内存512MB以上。 1.硬盘分区 理解硬盘、分区的名称: ?IDE硬盘名称: /dev/hda, /dev/hdb …… ?SCSI硬盘名称:/dev/sda, /dev/sdb …… 分区名称:/dev/hda1, /dev/hda2 …… 一个硬盘最多分4个主分区和扩展分区,扩展分区最多只能建1个,扩展分区不能直接放数据,还必须建立逻辑分区才能使用。 安装Red Hat Linux至少需要两个硬盘分区:一个或多个―Linux native‖类型的分区,一个―Linux swap‖类型的分区。即使将Linux安装在一个专门的硬盘上,或者一台不安装其他操作系统的计算机上,仍然需要为其创建分区。在安装过程中,会提示用户为Red Hat Linux 创建分区,必须保证有足够的硬盘空间来创建分区。推荐以下分区配置: (1)一个根分区 (2)一个交换分区 (3)一个/usr分区 (4)一个/home分区。 2. 安装类型 Red Hat Linux提供了三种类型的安装: (1)客户机类型安装(workstation) (2)服务器类型安装(server system) (3)自定义类型的安装(custom system) 三.实验内容 请在虚拟机中安装Linux。 1. 安装虚拟机软件 常用的虚拟机软件有Vmware和VPC,如果主机性能较好,还能同时虚拟出多台虚拟机;一台虚拟机对应主机上的一个目录,删除该目录就删除了虚拟机;该目录拷到其它电脑

操作系统原理实验指导

操作系统实验指导 操作系统是计算机的最重要的系统软件,它在计算机中具有核心地位,其作用是对计算机系统资源进行统一的调度和管理,提供各种强有力的系统服务,为用户创造灵活而又方便的使用环境。一个精心设计的操作系统能极大地扩充计算机系统的功能,充分地发挥系统中各种资源的使用效率,提高系统工作的可靠性。 操作系统原理是计算机科学与技术专业的一门主要专业课程,它涉及计算机系统中各种软、硬资源管理的实现原理与方法,内容非常丰富,综合性非常强,并且还具有很强的实践性。只有把理论与实践紧密地结合起来,才能取得较好地学习效果。 培养计算机专业学生的系统程序设计能力,也是本课程的重要环节。系统程序要求结构清晰、合理、可读性好,有准确而简明的注释。通过实验可以培养学生正规系统程序设计能力。 本实验包括下列六个方面: 实验一几种操作系统的界面 实验二进程调度 实验三存储器管理 实验四存储器管理 实验五磁盘驱动调度 实验六文件管理系统 上述每个实验约需要10个学时。可根据实际情况选用。最好学生自己独立完成,如有困难,可参考一些示例,弄清每个实验的思想和实现方法,上机调试通过,不能完全照搬示例。 实验一几种操作系统的界面 1、目的与要求 目的:通过本实验,学生应熟悉1~2种操作系统的界面。在熟练使用的基础上,能了解各种命令和调用在系统中的大致工作过程,也就是通过操作系统的外部特性,逐步深入到操作系统的内在实质内容中去。 要求:能熟练地在1~2种操作系统环境下工作。学会使用各种命令,熟悉系统提供的各种功能。主动而有效地使用计算机。 熟悉系统实用程序的调用方法和各种系统调用模块的功能和用法。 2、示例 用1~2种操作系统提供的各种手段,建立、修改、编辑、编译和运行程序,最后撤消一个简单程序。要尽可能多地使用系统提供的各种命令和功能。 操作系统可为如下两种序列: (1)Windows 98或Windows 2000或Windows XP。 (2)Linux或Unix。 下面简要介绍一下Unix操作系统。 Unix是一个分时操作系统,面向用户的界面shell是一种命令程序设计语言,这种语言向用户提供了从低到高,从简单到复杂的三个层次的使用方式。它们是简单命令、组合命令和shell过程。 简单命令:Unix命令一律使用小写字母。 例如:ls -l 显示文件目录(长格式) rm 删除一个文件 cat 合并和传送文件、 cp 复制文件 mv 文件改名 cc 编译C语言源程序 组合命令:shell简单命令可以用管道算符|组合构成功能更强的命令。

操作系统实验指导_源码参考资料

华东交通大学 软件学院 操作系统实验报告 专业: 计算机科学与技术 姓名: 林庆达 学号: 3103005138 2005-6

试验一进程调度 一、实验目的: 编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 二、实验内容:以两种典型算法为例说明实现的算法 (一)、最高优先数优先的调度算法 1、实验原理 进程调度算法:采用最高优先数优先 的调度算法(即把处理机分配给优先数最 高的进程)和先来先服务算法。 每个进程有一个进程控制块(PCB) 表示。进程控制块可以包含如下信息:进 程名、优先数、到达时间、需要运行时间、 已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以 事先人为地指定(也可以由随机数产生)。 进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进 行计算。 每个进程的状态可以是就绪W (Wait)、运行R(Run)、或完成F(Finish) 三种状态之一。 就绪进程获得CPU后都只能运行一 个时间片。用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占 用CPU时间已达到所需要的运行时间, 则撤消该进程,如果运行一个时间片后进 程的已占用CPU时间还未达所需要的运 行时间,也就是进程还需要继续运行,此 时应将进程的优先数减1(即降低一级), 然后把它插入就绪队列等待CPU。 每进行一次调度程序都打印一次运 行进程、就绪队列、以及各个进程的PCB, 以便进行检查。 重复以上过程,直到所有进程都完成为止。 2、源代码: #include "stdio.h" #include #include #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0

操作系统实验一

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

实验(实验一) 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】启动字符终端

操作系统实验-实验指导书

3 《操作系统》实验指导书 实验学时:16 适用专业:计算机科学与技术,软件技术 操作系统上机实验 一、实验目的 主要目的是配合操作系统课程的学习,模拟实现操作系统的功能,有助于对操作系统的理解,同时加强学生对系统设计、程序编写、代码调试、软件开发过程基本技能的掌握。 上机作业应作到:覆盖讲授的所有原理内容,使得学生通过上机实践对原理有更深的理解;每一道上机作业,都要求学生必须完成一个完整的、可运行的小型软件,籍此提升基本的软件开发技能。 二、实验要求 (1)上机实验之前,学生应当为每次上机的内容作好充分准备。对每次上机需要完成的题目进行认真的分析,选择合适的算法,列出实验具体步骤,写出符合题目要求的程序清单,准备出调试程序使用的数据,以便提高上机实验的效率。 (2)按照实验目的和实验内容以及思考题的要求进行上机操作。录入程序,编译调试,反复修改,直到使用要求的算法,使程序正常运行,得出正确的输出结果为止。 (3)上机作业要求提交原始代码、设计文档和可运行程序。以完整的作业包的形式提交。实验报告应当包括:实验题目,程序清单,运行结果,所选取的算法及其优缺点以及通过上机取得了哪些经验。程序清单要求格式规范,注意加注释(包含关键

字、方法、变量等),在每个模块前加注释,注释不得少于20% 三、实验内容 上机实验包括:操作系统使用、SHELL编程、进程管理、进程调度、死锁处理、存储管理、文件系统几个部分。 实验1: SHELL编程 实验目的 熟悉linux常用命令,为以后的实验打下良好基础; 熟悉vi编辑器的使用; 了解Shell程序的语法规则,能编写简单的Shell程序。 实验内容 1、使用常用的Linux命令,主要包括如下命令: date, mail, write, man, ls, cat, mv, grep, tail, head, cp, wc, pwd, who等; 2、使用vi编辑器编辑文件,熟悉vi编辑器的各种操作模式和常用命令。 3、使用vi编辑器编写一段Shell程序,取名为mycal,实现与Linux中cal命令类 似的功能,当输入: $mycal [月份名] 年时,屏幕输出指定的年月的月历。例如: $mycal October 2009 屏幕输出2009年10月的月历。 注:参数可以是英文或者是数字。 实验2:观察Linux的行为 实验目的 了解Linux proc文件系统; 加深对Linux系统的理解; 增强Linux系统管理知识。 实验内容 在Linux中,proc文件系统提供了一套在用户态检查内核状态和系统特征的机制。proc文件系统将进程的地址空间、系统的硬件信息、系统相关机制(中断、I/O)等内容全部设置为虚拟的Linux文件,为访问系统内核数据的操作提供接口。 1、以root登录系统,并进入/proc目录,键入ls命令,查看/proc下的内容,同时 查看每个文件的读写权限。 2、根据/proc下的信息,回答:CPU的类型和型号、当前Linux版本、从启动到当 前时刻所经过的时间、当前内存状态。

实验指导(2015完全版)

操作系统上机实验指导书 (第一版) 闫大顺李晟编著 吴家培主审 计算机科学与工程学院 2014.8

操作系统实验指导 本课程是为《计算机操作系统》课所开的实验。计算机操作系统课程是一门实践性很强的技术课程,本课程实验的目的在于培养学生的实践能力,促进理论与实践的结合。要求学生通过上机编程,熟悉对操作系统原理,并熟练使用程序接口,并了解如何模拟操作系统原理的实现,从而加深对操作系统原理的领会,加深对操作系统实现方法的理解,与此同时使学生在程序设计方面也能够得到很大程度的提高。 实验的目的是使学生理论联系实际,提高学生系统理解与开发能力。这里所列的实验分为必做和选做。具体实验题的选择,不仅要考虑课程内容,而且要考虑学生目前的编程能力,要由浅入深。教师可通过运行示例或动画,帮助学生理解实验要求。学生应选择自己熟悉的语言与开发环境去完成实验。根据以往的教学经验,Delphi、C++ Builder,JBuilder由于提供了许多可重用的构件,易于学习、使用,VC++学习、使用困难较多。实验要求尽量在windows操作系统下,也可以在Linux下完成,由于多数没有专门学习Linux,在其平台下做试验比较困难。实验的硬件要求是能够支持VC++、Delphi、C++ Builder,JBuilder的微机即可。每个学生都独立在一台计算机上完成自己的实验内容,杜绝学生的抄袭。 实验报告的要求 1. 每位同学准备实验报告本,上机前作好充分的准备工作,预习本次实验的内容,事先熟悉与实验有关的软硬件环境。 2. 实验时遵守实验室的规章制度,爱护实验设备,对于实验设备出现的问题,要及时向指导老师汇报。 3. 提交实验文件格式:[班级][学号]_[实验题号].[扩展名] 例:计051班学号为03的学生第四个实验的文件名为:j05103_4.c 4. 最终的实验报告按照实验名称、实验目的、实验内容,实验过程(程序设计、实现与调试)、实验总结五部分书写,按时上交。实验总结是对于实验过程中出现的问题或疑惑的分析与思考。认真按照要求填写到实验报告纸上。

操作系统实验报告

操作系统实验报告 实验名称: 系统的引导 所在班级: 指导老师: 老师 实验日期: 2014年3 月29 日

一、实验目的 ◆熟悉hit-oslab实验环境; ◆建立对操作系统引导过程的深入认识; ◆掌握操作系统的基本开发过程; ◆能对操作系统代码进行简单的控制,揭开操作系统的神秘面纱。 二、实验容 1. 阅读《Linux核完全注释》的第6章引导启动程序,对计算机和Linux 0.11的引导过程进行初步的了解。 2. 按照下面的要求改写0.11的引导程序bootsect.s。 3. 有兴趣同学可以做做进入保护模式前的设置程序setup.s。 4. 修改build.c,以便可以使用make BootImage命令 5. 改写bootsect.s主要完成如下功能: bootsect.s能在屏幕上打印一段提示信息XXX is booting...,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等。 6. 改写setup.s主要完成如下功能: bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s 向屏幕输出一行"Now we are in SETUP"。setup.s能获取至少一个基本的硬件参数(如存参数、显卡参数、硬盘参数等),将其存放在存的特定地址,并输出到屏幕上。setup.s不再加载Linux核,保持上述信息显示在屏幕上即可。 三、实验环境

本实验使用的系统是windows系统或者是Linux系统,需要的材料是osexp。 四、实验步骤 1. 修改bootsect.s中的提示信息及相关代码; 到osexp\Linux-0.11\boot目录下会看到图1所示的三个文件夹,使用UtraEdit 打开该文件。将文档中的98行的mov cx,#24修改为mov cx,#80。同时修改文档中的第246行为图2所示的情形。 图1图2 图3 2. 在目录linux-0.11\boot下,分别用命令as86 -0 -a -o bootsect.obootsect.s和 ld86 -0 -s -obootsectbootsect.o编译和bootsect.s,生成bootsect文件; 在\osexp目录下点击MinGW32.bat依此输入下面的命令: cd linux-0.11 cd boot as86 -0 -a -o bootsect.obootsect.s ld86 -0 -s -o bootsectbootsect.o

操作系统实验报告

操作系统实验报告 学生学院计算机学院 专业班级计算机科学与技术3班学号3213005910 学生姓名林虹 指导教师丁国芳 2015 年12月15 日

目录 1 实验一进程调度 (1) 2 实验二银行家算法 (16) 3 实验三动态分区分配方式的模拟 (20) 4 实验四仿真各种磁盘调度算法 (26)

实验一进程调度 1. 实验目的 编写并调试一个模拟的进程调度程序,分别采用“短进程优先”、“时间片轮转”、“高响应比优先”调度算法对随机产生的五个进程进行调度,并比较算法的平均周转时间。以加深对进程的概念及进程调度算法的理解。 2. 实验要求 1.每个进程由一个进程控制块(PCB)表示,进程控制块可以包含如下信息:进程 名、优先数(响应比)、到达时间、需要运行时间(进程的长度)、已运行时间、进 程状态等等(可以根据需要自己设定)。 2.由程序自动生成进程(包括需要的数据,要注意数据的合理范围),第一个进程到 达时间从0开始,其余进程到达时间随机产生。 3.采用时间片轮转调度算法时,进程的运行时间以时间片为单位进行计算。 4.每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种 状态之一。 5.每进行一次调度,程序都要输出一次运行结果:正在运行的进程、就绪队列中的进 程、完成的进程以及各个进程的PCB,以便进行检查。 6.最后计算各调度算法的平均周转时间,并进行比较、分析。 3. 实验内容 a.算法原理 (1)短进程优先调度算法 “短进程优先”调度算法的基本思想是把CPU分配给就绪队列中需要时间最短的进程。 (2)时间片轮转算法 将系统中所有的就绪进程按照FCFS原则,排成一个队列。每次调度时将CPU 分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。在一个时间片结束时,发生时钟中断。调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前的队首进程。进程可以未使用完一个时间片,就出让CPU。 (3)高响应比优先算法 HRRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。 每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。

操作系统实验报告.

学生学号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系统调用使用方法。

Linux操作系统实验指导书

《Linux系统管理与维护》实验指导书 实验一初识Linux操作系统 一实验名称 初识Linux操作系统 二实验目的与要求 掌握Linux的启动、登录与注销。 三实验内容 1.以root用户和普通用户两种不同身份登录Linux,说出其登录后得差异。 2.图形模式下的注销、重启与关机。 3.学会在虚拟机上登录和注销Linux。 四操作步骤与结果分析 五问题与建议

实验二Linux的桌面应用 一实验名称 Linux的桌面应用 二实验目的与要求 熟悉Linux操作系统桌面环境 熟悉Linux文件系统及常用的操作 掌握Linux下使用外部存储设备、网络设备 掌握Linux下安装应用程序 三实验内容 1.查看GNOME提供的“应用程序”、“位置”或者“系统”菜单,运行其中的应用程 序和工具。 2.查看Linux文件目录结构,学会常用的文件目录操作,如复制、粘贴、移动、删 除、更名、创建文档、创建文件夹等。 3.练习在Linux下使用光盘和U盘。 4.学会网络配置,使计算机能够进行网络浏览等操作。 5.学会在Linux下安装新的应用软件。 四操作步骤与结果分析 五问题与建议

实验三Linux操作系统的安装 一实验名称 Linux操作系统的安装 二实验目的与要求 掌握安装Linux操作系统 三实验内容 1.通过学习《项目五Linux操作系统的安装及远程服务》的内容,学会如何安装Linux。 环境:windows 系统、vmware虚拟机、Redhat Linux镜像光盘。 通过安装向导将安装分为两步:1、基本安装,2、配置及具体安装。 在第一阶段重点如何分区,在第二阶段重点掌握如何设置密码及安装桌面环境。四操作步骤与结果分析 五问题与建议

操作系统原理实验报告(终版)

操作系统原理实验报告(终版)

————————————————————————————————作者:————————————————————————————————日期:

[键入文字] XX学校 实验报告 课程名称: 学院: 专业班: 姓名: 学号: 指导教师: 2011 年3 月

目录 实验1 进程管理 (3) 一、实验目的 (3) 二、实验内容 (3) 三、实验要求 (3) 四、程序说明和程序流程图 (4) 五、程序代码 (5) 六、程序运行结果及分析 (7) 七.指导教师评议 (8) 实验2 进程通信 (9) 一、实验目的 (9) 二、实验内容 (9) 三、实验要求 (9) 四、程序说明和程序流程图 (9) 五、程序代码 (11) 七.指导教师评议 (14) 实验3 存储管理 (15) 一、实验目的 (15) 二、实验内容 (15) 三、实验要求 (15) 四、程序说明和程序流程图 (16) 六、程序运行结果及分析 (23)

七.指导教师评议 (23) 实验4 文件系统 (24) 一、实验目的 (24) 二、实验内容 (24) 三、实验要求 (24) 四、程序说明和程序流程图 (24) 五、程序代码 (26) 六、程序运行结果及分析 (26) 七.指导教师评议 (27)

实验1 进程管理 一、实验目的 1. 弄清进程和程序的区别,加深对进程概念的理解。 2. 了解并发进程的执行过程,进一步认识并发执行的实质。 3. 掌握解决进程互斥使用资源的方法。 二、实验内容 1. 管道通信 使用系统调用pipe( )建立一个管道,然后使用系统调用fork( )创建2个子进程p1和p2。这2个子进程分别向管道中写入字符串:“Child process p1 is sending message!”和“Child process p2 is sending message!”,而父进程则从管道中读出来自两个子进程的信息,并显示在屏幕上。 2. 软中断通信 使用系统调用fork( )创建2个子进程p1和p2,在父进程中使用系统调用signal( )捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C),当捕捉到软中断信号SIGINT后,父进程使用系统调用kill( )分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2,子进程捕捉到信号后分别输出信息“Child process p1 is killed by parent!”和“Child process p2 is killed by parent!”后终止。而父进程等待2个子进程终止后,输出信息“Parent process is killed!”后终止。 三、实验要求 1. 根据实验内容编写C程序。 2. 上机调试程序。 3. 记录并分析程序运行结果。

操作系统实验报告

操作系统实验报告 银行家算法 班级:计算机()班 姓名:李君益 学号:(号) 提交日期: 指导老师: 林穗 一、设计题目 加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。 二、设计要求

内容: 编制银行家算法通用程序,并检测思考题中所给状态的安全性。 要求: (1)下列状态是否安全?(三个进程共享个同类资源) 进程已分配资源数最大需求数 (状态) (状态) (2)考虑下列系统状态 分配矩阵最大需求矩阵可用资源矩阵 问系统是否安全?若安全就给出所有的安全序列。若进程请求(),可否立即分配? 三、设计分析 一.关于操作系统的死锁 .死锁的产生 计算机系统中有许多独占资源,他们在任一时刻只能被一个进程使用,如磁带机,绘图仪等独占型外围设备,或进程表,临界区等软件资源。两个进程同时向一台打印机输出将导致一片混乱,两个进程同时进入临界区将导致数据库错误乃至程序崩溃。正因为这些原因,所有操作系统都具有授权一个进程独立访问某一辞源的能力。一个进程需要使用独占型资源必须通过以下的次序: ●申请资源 ●使用资源 ●归还资源 若申请施资源不可用,则申请进程进入等待状态。对于不同的独占资源,进程等待的方式是有差别的,如申请打印机资源、临界区资源时,申请失败将一位这阻塞申请进程;而申请打开文件文件资源时,申请失败将返回一个错误码,由申请进程等待一段时间之后重试。只得指出的是,不同的操作系统对于同一种资源采取的等待方式也是有差异的。 在许多应用中,一个进程需要独占访问多个资源,而操作系统允许多个进程并发执行共享系统资源时,此时可能会出现进程永远被阻塞的现象。这种现象称为“死锁”。 2.死锁的定义 一组进程处于死锁状态是指:如果在一个进程集合中的每个进程都在等待只能由该集合中的其他一个进程才能引发的时间,则称一组进程或系统此时发生了死锁。 .死锁的防止 .死锁产生的条件: ●互斥条件

操作系统实验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时出现

《计算机操作系统》实验指导书

《计算机操作系统》 实验指导书 (适合于计算机科学与技术专业) 湖南工业大学计算机与通信学院 二O一四年十月

前言 计算机操作系统是计算机科学与技术专业的主要专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。计算机操作系统的实验目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握操作系统的基本原理,加深对操作系统基本方法的理解,加深对课堂知识的理解,为学生综合运用所学知识,在Linux环境下调用一些常用的函数编写功能较简单的程序来实现操作系统的基本方法、并在实践应用方面打下一定基础。要求学生在实验指导教师的帮助下自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个实验解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,并且能够进行简单分析和判断;能够熟练使用Linux用户界面;掌握操作系统中进程的概念和控制方法;了解进程的并发,进程之间的通信方式,了解虚拟存储管理的基本思想。同时培养学生进行分析问题、解决问题的能力;培养学生完成实验分析、实验方法、实验操作与测试、实验过程的观察、理解和归纳能力。 为了收到良好的实验效果,编写了这本实验指导书。在指导书中,每一个实验均按照该课程实验大纲的要求编写,力求紧扣理论知识点、突出设计方法、明确设计思路,通过多种形式完成实验任务,最终引导学生有目的、有方向地完成实验任务,得出实验结果。任课教师在实验前对实验任务进行一定的分析和讲解,要求学生按照每一个实验的具体要求提前完成准备工作,如:查找资料、设计程序、完成程序、写出预习报告等,做到有准备地上机。进行实验时,指导教师应检查学生的预习情况,并对调试过程给予积极指导。实验完毕后,学生应根据实验数据及结果,完成实验报告,由学习委员统一收齐后交指导教师审阅评定。 实验成绩考核: 实验成绩占计算机操作系统课程总评成绩的20%。指导教师每次实验对学生进行出勤考核,对实验效果作记录,并及时批改实验报告,综合评定每一次的实验成绩,在学期终了以平均成绩作为该生的实验成绩。有以下情形之一者,实验成绩为不及格: 1.迟到、早退、无故缺勤总共3次及以上者; 2.未按时完成实验达3次及以上者; 3.缺交实验报告2次及以上者。

操作系统原理课程设计

操作系统原理课程设计 ——银行家算法模拟 指导老师:周敏唐洪英杨宏雨 杨承玉傅由甲黄贤英 院系:计算机学院计算机科学与技术班级:0237-6 学号:2002370609 姓名:刘洪彬 同组者:杨志 时间:2005/1/10---2005/1/14

银行家算法模拟 一、设计目的 本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。 二、设计要求 银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:两人一组,每组从所给题目中任选一个(如自拟题目,需经教师同意),每个学生必须独立完成课程设计,不能相互抄袭,同组者文档不能相同; 设计完成后,将所完成的工作交由老师检查; 要求写出一份详细的设计报告。 三、设计内容 编制银行家算法通用程序,并检测所给状态的系统安全性。 1)银行家算法中的数据结构 假设有n个进程m类资源,则有如下数据结构: 可利用资源向量Available。这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。Available[j]=K,则表示系统中现有Rj 类资源K个。 最大需求矩阵Max。这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。 分配矩阵Allocation。这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给没一进程的资源数。如果Allocation[i,j]=K,则表示进程i 当前已分得Rj类资源的数目为K。 需求矩阵Need。这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。

相关文档