操作系统实验

简介: 操作系统实验

实验一:Windows API函数

一:实验要求

  1. 请在代码中你认为重要处加上注释。
  2. 除了粘贴代码外,请用专门的文字对程序的设计做简要介绍。
  3. 如果你在做这个程序的过程中遇到了困难、走了弯路,请一一列出,并说明导致问题的原因,以及你最终的解决办法。

二:实验的工程目标

  1. 熟悉Windows API函数文档的结构、风格;掌握Windows API的调用方法。
  2. 仔细阅读API函数的文档,确保缓冲区大小参数的正确有效。必要时对返回值进行检查。
  3. 编写代码获得当前用户名(GetUserName)、系统目录(GetSystemDirectory)、Windows所在目录(GetWindowsDirectory)、环境变量PATH的值等信息(ExpandEnvironmentStrings)。
  4. 选作:编写代码获得操作系统的版本信息(GetVersionEx)。

三:实验代码

#include <cstdio>#include <windows.h>#include <Lmcons.h>intmain() {
charcomputer_name_buffer[MAX_COMPUTERNAME_LENGTH+1];
DWORDcomputer_name_buffer_size=MAX_COMPUTERNAME_LENGTH+1;
GetComputerNameA(computer_name_buffer, &computer_name_buffer_size);
printf("ComputerName:%s\n", computer_name_buffer);
charuser_name_buffer[UNLEN+1];
DWORDuser_name_buffer_size=UNLEN+1;
GetUserNameA(user_name_buffer, &user_name_buffer_size);
printf("UserName:%s\n", user_name_buffer);
charsystem_directory_buffer[1000];
GetSystemDirectoryA(system_directory_buffer, 1000);
printf("SystemDirectory:%s\n", system_directory_buffer);
charwindows_directory_buffer[MAX_PATH];
GetWindowsDirectoryA(windows_directory_buffer, MAX_PATH);
printf("WindowsDirectory%s\n", windows_directory_buffer);
constchar*environment_string="%path%";
charenvironment_string_expanded[10000];
ExpandEnvironmentStringsA(environment_string, environment_string_expanded, 10000);
printf("EnvironmentPath:%s\n", environment_string_expanded);
OSVERSIONINFOversion;
ZeroMemory(&version, sizeof(OSVERSIONINFO));
version.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&version);
printf("Version:%d.%d %s\n", version.dwMajorVersion, version.dwMinorVersion, version.szCSDVersion);
return0;
}

四:实验结果

实验二:线程与互斥

一:实验要求

  1. 请在代码中你认为重要处加上注释。
  2. 除了粘贴代码外,请用专门的文字对程序的设计做简要介绍。
  3. 如果你在做这个程序的过程中遇到了困难、走了弯路,请一一列出,并说明导致问题的原因,以及你最终的解决办法

二:实验的工程目标

  1. 改写money的代码,用“高级锁”即信号量代替“低级锁”,并感受二者的性能差异。如果可以,请用clock函数测量这种差异(选作)。还可以比较使用多线程与单线程的性能差异(选作)。
  2. 提示:此处信号量代表什么资源?对全局变量money的访问权就是一种资源,这种资源的数量为1。

三:实验代码

#include <windows.h>#include <iostream>#include <ctime>usingnamespacestd;
intmoney=0;
CRITICAL_SECTIONlock;
DWORDWINAPIdad(LPVOID) {
EnterCriticalSection(&lock);
for (inti=0; i<100000; i++) {
money++;
    }
LeaveCriticalSection(&lock);
return0;
}
DWORDWINAPImom(LPVOID) {
EnterCriticalSection(&lock);
for (inti=0; i<100000; i++) {
money++;
    }
LeaveCriticalSection(&lock);
return0;
}
DWORDWINAPIoth(LPVOID) {
EnterCriticalSection(&lock);
for (inti=0; i<100000; i++) {
money++;
    }
LeaveCriticalSection(&lock);
return0;
}
intmain() {
clock_tstart, middle, finish;
doubleTimes;
start=clock();
HANDLEthread_dad;
HANDLEthread_mom;
HANDLEthread_oth;
InitializeCriticalSection(&lock);
thread_dad=CreateThread(nullptr, 0, dad, nullptr, 0, nullptr);
thread_mom=CreateThread(nullptr, 0, mom, nullptr, 0, nullptr);
thread_oth=CreateThread(nullptr, 0, oth, nullptr, 0, nullptr);
middle=clock();
Times= (double) (middle-start) /CLOCKS_PER_SEC;
cout<<"低级锁运行时间(秒): "<<Times<<endl;
WaitForSingleObject(thread_dad, INFINITE);
WaitForSingleObject(thread_mom, INFINITE);
WaitForSingleObject(thread_oth, INFINITE);
DeleteCriticalSection(&lock);
finish=clock();
Times= (double) (finish-middle) /CLOCKS_PER_SEC;
cout<<"高级锁运行时间(秒): "<<Times<<endl;
return0;
}

四:实验结果

实验三:页置换模拟

一:实验要求

  1. 请在代码中你认为重要处加上注释。
  2. 除了粘贴代码外,请用专门的文字对程序的设计做简要介绍。
  3. 如果你在做这个程序的过程中遇到了困难、走了弯路,请一一列出,并说明导致问题的原因,以及你最终的解决办法。

二:实验的工程目标

  1. 给定一个页面访问的轨迹,程序模拟先进先出置换算法下操作系统的行为。
  2. 参考FIFO置换算法的模拟程序,实现LRU算法的模拟程序。
  3. 选作:加上一列显示调出页;修复程序的bug(提示:FIFOQueue数组元素为0时,是表示没东西)
  4. 考虑下述页面走向:1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6,当内存块数量分别为3时,试问FIFO、LRU置换算法的缺页次数各是多少?

三:实验代码

#include <cstdio>constintMemCapacity=3;
intFIFOQueue[MemCapacity] = {0};
intexit_page=0;
intpageInMainMem(intpage) {
for (inti=0; i<MemCapacity; i++) {
if (FIFOQueue[i] ==page)
returni;
    }
return-1;
}
voidfoldPage(intpage) {
for (inti=MemCapacity-1; i>0; i--)
FIFOQueue[i] =FIFOQueue[i-1];
FIFOQueue[0] =page;
}
intmain() {
intpageFootprints[] = {1, 2, 3, 4, 2, 1, 5, 6, 2, 1, 2, 3, 7, 6, 3, 2, 1, 2, 3, 6};
intpageNum=sizeofpageFootprints/sizeofpageFootprints[0];
intRequestCount=0;
boolrequest;
printf("时刻\t访问页面\t主存状态\t缺页中断\t调入页\t调出页\n");
for (inti=0; i<pageNum; i++) {
printf("%3d\t %2d\t     ", i, pageFootprints[i]);
request=false;
if (pageInMainMem(pageFootprints[i]) ==-1) {
if (FIFOQueue[MemCapacity-1] !=0) {
exit_page=FIFOQueue[MemCapacity-1];
            }
foldPage(pageFootprints[i]);
RequestCount++;
request=true;
        }
for (intj: FIFOQueue)
printf("%2d ", j);
if (request) {
printf("\t\t+");
printf("\t     %d", pageFootprints[i]);
if (exit_page!=0) {
printf("\t    %d", exit_page);
            }
        }
printf("\n");
    }
printf("缺页中断次数 = %d\n", RequestCount);
printf("缺页率 = %d/%d = %.2f%%\n", RequestCount, pageNum, (float) RequestCount/ (float) pageNum*100);
return0;
}

四:实验结果

实验四:创建进程

一:实验要求

  1. 请在代码中你认为重要处加上注释。
  2. 除了粘贴代码外,请用专门的文字对程序的设计做简要介绍。
  3. 如果你在做这个程序的过程中遇到了困难、走了弯路,请一一列出,并说明导致问题的原因,以及你最终的解决办法。

二:实验的工程目标

使用CreateProcess函数创建新的进程。程序中创建新的进程,新进程执行记事本的可执行文件打开记事本,主进程休眠,等待记事本进程结束。用户关闭记事本后,WinMain函数中的主进程关闭进程句柄后结束。

三:实验代码

#include <windows.h>intAPIENTRYWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intnCmdShow) {
TCHARsCommandLine[1000];
BOOLret;
DWORDdwExitCode;
PROCESS_INFORMATIONpi;
STARTUPINFOsi= {sizeof(si)};
//得到Windows目录GetWindowsDirectory(sCommandLine, MAX_PATH);
//启动"记事本"程序的命令行strcat(sCommandLine, "\\notepad.exe");
// 启动"记事本"作为子进程ret=CreateProcess(nullptr, sCommandLine, nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi);
if (ret) {
CloseHandle(pi.hThread);
//关闭子进程的主线程句柄WaitForSingleObject(pi.hProcess, INFINITE);
//等待子进程的退出GetExitCodeProcess(pi.hProcess, &dwExitCode);
//获取子进程的退出码CloseHandle(pi.hProcess);
//关闭子进程句柄    }
return0;
}

四:实验结果

实验五:进程中启动计算器子程序

一:实验要求

  1. 请在代码中你认为重要处加上注释。
  2. 除了粘贴代码外,请用专门的文字对程序的设计做简要介绍。
  3. 如果你在做这个程序的过程中遇到了困难、走了弯路,请一一列出,并说明导致问题的原因,以及你最终的解决办法。

二:实验的工程目标

用程序实现启动一个新的进程,并在进程中启动计算器应用程序(calc.exe)。

三:实验代码

#include<windows.h>#include<cstdio>intmain() {
charpath[10] ="calc.exe";
DWORDdwExitCode;
PROCESS_INFORMATIONpi;
DWORDret;
STARTUPINFOsi= {sizeof(si)};
ret=CreateProcess(nullptr, path, nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi);
if (ret) {
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hProcess);
    }
printf("\n进程结束,退出码是 %ld\n", ret);
return0;
}

四:实验结果

实验六:建立线程(一个线程,主线程不休眠)

一:实验要求

  1. 请在代码中你认为重要处加上注释。
  2. 除了粘贴代码外,请用专门的文字对程序的设计做简要介绍。
  3. 如果你在做这个程序的过程中遇到了困难、走了弯路,请一一列出,并说明导致问题的原因,以及你最终的解决办法。

二:实验的工程目标

程序演示使用函数_beginthreadex启动线程。

三:实验代码

#include <cstdio>#include <windows.h>#include <process.h>unsignedintWINAPIFun(LPVOIDlpParamter) {
while (true) {
printf("---Fun display!\n");
Sleep(500);//休眠0.5s    }
return0;
}
intmain() {
HANDLEhThread;
hThread= (HANDLE) _beginthreadex(nullptr, 0, Fun, nullptr, 0, nullptr);//创建线程,执行Fun函数while (true) {
printf("main display!\n");
Sleep(500);//休眠0.5s    }
CloseHandle(hThread);//关闭句柄return0;
}

四:实验结果


相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
4月前
|
弹性计算 运维
阿里云操作系统智能助手OS Copilot实验测评报告
**OS Copilot 产品体验与功能反馈摘要** 运维人员发现OS Copilot易上手,文档清晰,助其高效排查故障(8/10分)。愿意推荐并参与开源开发。亮点在于知识问答,能快速筛选答案。相较于竞品,优点是新手友好、文档清晰,但功能扩展性待增强。期望增加系统错误排查与解决方案,并集成ECS等,以优化系统安装流程。
阿里云操作系统智能助手OS Copilot实验测评报告
|
4月前
|
运维 自然语言处理 弹性计算
阿里云操作系统智能助手OS Copilot实验测评报告
摘要: 体验阿里云OS Copilot活动,用户发现教程中存在步骤缺失和不明确之处,如服务器地区未明确、安全组配置细节不全、AccessKey创建过程复杂、代码示例需改进等。用户建议提供详细步骤,尤其是对于新手,以提高易用性。OS Copilot作为智能助手,其问答和编程辅助功能受到好评,但实验应展示更多连续交互能力。用户总体满意产品,期待更完善的引导。
240 8
阿里云操作系统智能助手OS Copilot实验测评报告
|
4月前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
OS Copilot是阿里云Linux的智能助手,助于提升运维效率,通过学习用户习惯提供智能建议。开发者反馈其在DevOps场景中非常有用,给予10分帮助度评价。用户赞赏其命令执行功能,希望能扩展多命令执行和错误自动修正。与ACK、ECS等集成,可自动化部署和CI/CD流程。文档清晰,适合新手,用户愿意推荐并参与开源开发。
104 3
阿里云操作系统智能助手OS Copilot实验测评报告
|
4月前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
阿里云OS Copilot是一款专为Linux设计的智能运维助手,利用大语言模型提供自然语言问答、命令执行辅助和系统调优功能。软件维护工程师反馈,OS Copilot易于上手,文档清晰,对提升运维效率有显著帮助,评分10/10。其轻量级设计、准确的回答是主要优点,但可能在复杂场景下表现不足。用户期望扩展到更多Linux发行版,增加系统优化建议、代码优化和日志分析功能,并能与其他产品如ACK、ECS联动。希望能有异常处理提示和日志输出以增强问题定位。
116 14
|
4月前
|
弹性计算 人工智能 运维
阿里云操作系统智能助手OS Copilot实验测评报告
**摘要:** 在阿里云与CSDN联合的OS Copilot测试中,一名学生体验者发现该智能助手是强大的编程学习工具,给予10分的帮助评价。尽管有新手上手难度和兼容性问题,他仍强烈推荐并有意参与开源开发。OS Copilot的亮点包括直接的交互式知识问答、编程辅助及命令执行。相比其他产品,其优点是简洁和准确性,但需改进新手教程。用户期待更多功能,如系统优化建议,扩大操作系统支持,并建议与阿里云产品如ACK、ECS集成,以提升运维效率。
117 12
|
4月前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
OS Copilot是Alibaba Cloud Linux基于大模型构建的操作系统智能助手,其旨在通过自然语言问答、辅助命令执行及系统运维调优等功能,提升用户对Alibaba Cloud Linux的使用效率。
|
4月前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
OS Copilot是针对Linux的智能助手,助力学习、运维及编程。用户界面直观,自然语言交互方便新手。官方文档详尽,但初次配置略复杂,适合学生和开发者。在提高代码编写和调试效率、系统学习上得分高,功能亮点包括代码生成、问答和命令执行。用户期待更多操作系统支持、自动错误分析和系统排查功能。
183 3
|
4月前
|
弹性计算 运维
阿里云操作系统智能助手OS Copilot实验测评报告
简介:体验OS Copilot对于新人使用是友好的,教程给出的比较全面,还支持语言问答,命令执行等优点,还允许用户直接在操作系统内部使用阿里云,完成ECS的实例查询等操作。但是在系统兼容上表现出不足,对于服务器地区不明确。但总体来说测评者对OS Copilot其智能化、高效化、专业化评价是高的。
|
4月前
|
弹性计算 人工智能 运维
阿里云操作系统智能助手OS Copilot实验测评报告
阿里云操作系统智能助手OS Copilot实验测评报告
110 2
|
4月前
|
弹性计算 运维 监控
阿里云操作系统智能助手OS Copilot实验测评报告
阿里云OS Copilot助力学生提升学习效率,简化Linux操作。作为学生,体验者发现它在代码理解和诊断上极具价值,给予新手友好体验,但存在命令执行限制和错误处理问题。评分10/10,愿推荐并参与未来开发。功能上,知识问答、辅助编程和命令执行深受喜爱。对比其他产品,OS Copilot简洁集成,但需改善多命令支持和错误分析。期望支持更多操作系统及与ACK等工具联动,增强系统管理和故障排查。
44 1