操作系统原理实验报告

news2025/5/12 15:57:59

操作系统原理课程的实验报告汇总

实验三:线程的创建与撤销

实验环境:计算机一台,内装有VC++、office等软件

实验日期:2024.4.11

实验要求:

1.理解:Windows系统调用的基本概念,进程与线程的基本概念。

2.掌握:使用Windows系统调用创建与撤销线程的方法。

实验内容:

1.使用Windows系统提供的系统调用创建线程。

2.使用Windows系统提供的系统调用撤销线程。

3.使用Windows系统提供的系统调用挂起线程。

实验源代码


// 实验三:线程的创建与撤销.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "实验三:线程的创建与撤销.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// The one and only application object

CWinApp theApp;

using namespace std;
void ThreadName1();
static HANDLE hHandle1 = NULL;
DWORD dwThreadID1;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	hHandle1 = CreateThread((LPSECURITY_ATTRIBUTES) NULL,
		0,
		(LPTHREAD_START_ROUTINE) ThreadName1,
		(LPVOID) NULL,
		0,
		&dwThreadID1);
	Sleep(5000);
	CloseHandle(hHandle1);
	ExitThread(0);

	return nRetCode;
}

void ThreadName1()
{
	printf("xiancheng is Running\n");
}

实验总结:

代码没有任何问题,过编译不过运行是因为将VC++安装在了C盘,权限不够,将其重新安装在D盘即成功运行。

对于代码的一些注释:

HANDLE类型的hHandle1是用于存储线程返回句柄的变量

DWORD类型的dwThreadID1是用于存储线程标识符的变量

创建操作:CreateHandle方法中共需要6个变量,本次代码中第三个变量为创建一个名为ThreadName1的线程

挂起操作:Sleep(5000);将主线程挂起5秒

CloseHandle方法用于关闭句柄

撤销操作:ExitThread(0)方法用于撤销所有线程

实验四:线程的同步

实验环境:计算机一台,内装有VC++、office等软件

实验日期:2024.4.26

实验要求:

1.理解:线程同步的基本概念。

2.掌握:使用线程同步API实现多线程同步的方法。

实验内容:

1.使用Windows系统提供的系统调用创建与撤销线程。

2.使用Windows系统提供的线程同步API实现多线程同步。

3.使用Windows系统提供的线程同步API解决实际问题。

实验源代码

// 15 实验四:线程的同步.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "15 实验四:线程的同步.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// The one and only application object

CWinApp theApp;

using namespace std;

static HANDLE h1;
static HANDLE hHandle1 = NULL;
void func();

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;
	DWORD dwThreadID1;
	DWORD dRes,err;

	hHandle1 = CreateSemaphore(NULL, 0, 1, "SemaphoreName1");
	if(hHandle1 == NULL) printf("Semaphore Create Fail\n");
	else printf("Semaphore Create Success\n");

	hHandle1 = OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,
		NULL,
		"SemaphoreName1");
	if(hHandle1 == NULL) printf("Semaphore Open Fail\n");
	else printf("Semaphore Open Success\n");

	h1 = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
		0,
		(LPTHREAD_START_ROUTINE)func,
		(LPVOID)NULL,
		0,&dwThreadID1);
	if(h1==NULL) printf("Thread1 create Fail\n");
	else printf("Thread1 create Success\n");

	dRes = WaitForSingleObject(hHandle1,INFINITE);
	err = GetLastError();
	printf("WaitForSingleObject err =%d\n", err);

	if(dRes == WAIT_TIMEOUT) printf("TIMEOUT! dRes = %d\n", dRes);
	else if(dRes == WAIT_OBJECT_0) printf("WAIT_OBJECT! dRes = %d\n", dRes);
	else if(dRes == WAIT_ABANDONED) printf("WAIT_ABANDONED! dRes = %d\n", dRes);
	else printf("dRes = %d\n", dRes);

	CloseHandle(h1);
	CloseHandle(hHandle1);
	ExitThread(0);

	return nRetCode;
}

void func()
{
	BOOL rc;
	DWORD err;

	printf("Now In Thread\n");
	rc = ReleaseSemaphore(hHandle1,1,NULL);
	err = GetLastError();
	printf("ReleaseSemaphore err = %d\n", err);
	if(rc == 0) printf("Semaphore Release Fail\n");
	else printf("Semaphore Release Successs! rc = %d\n",rc);
}

实验总结:

  1. h1是线程句柄,hHandle1是信号量句柄
  2. CreateSemaphore用于创建一个信号量
  3. OpenSemaphore打开信号量
  4. CreateThread创建子线程
  5. WaitForSingleObject主线程等待子线程结束
  6. ReleaseSemaphore(hHandle1,1,NULL)是子线程唤醒主线

 实验五:线程的互斥

实验环境:计算机一台,内装有VC++、office等软件

实验日期:2024.5.11

实验要求:

1.理解:线程互斥的基本概念。

2.掌握:使用线程互斥API及临界区实现多线程互斥的方法。

实验内容:

1.使用Windows系统提供的系统调用创建与撤销线程。

2.使用Windows系统提供的线程互斥API实现多线程互斥。

3.使用Windows系统提供的线程互斥API解决实际问题。

实验源代码

// 实验五:线程的互斥.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "实验五:线程的互斥.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// The one and only application object

CWinApp theApp;

using namespace std;

static int count = 5;
static HANDLE h1;
static HANDLE h2;
LPCRITICAL_SECTION hCriticalSection;
CRITICAL_SECTION Critical;
void func1();
void func2();

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	DWORD dwThreadID1,dwThreadID2;
	hCriticalSection = &Critical;
	InitializeCriticalSection(hCriticalSection);

	h1 = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
		0,
		(LPTHREAD_START_ROUTINE)func1,
		(LPVOID)NULL,
		0,
		&dwThreadID1);
	if(h1 == NULL) printf("Thread1 create Fail\n");
	else printf("Thread1 create Success\n");

	h2 = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
		0,
		(LPTHREAD_START_ROUTINE)func2,
		(LPVOID)NULL,
		0,
		&dwThreadID2);
	if(h2 == NULL) printf("Thread2 create Fail\n");
	else printf("Thread2 create Success\n");

	Sleep(1000);

	CloseHandle(h1);
	CloseHandle(h2);
	DeleteCriticalSection(hCriticalSection);
	ExitThread(0);


	return nRetCode;
}

void func2()
{
	int r2;

	EnterCriticalSection(hCriticalSection);
	r2 = count;
	_sleep(100);
	r2 = r2 + 1;
	count = r2;
	printf("count in func2 = %d\n", count);
	LeaveCriticalSection(hCriticalSection);
}

void func1()
{
	int r1;

	EnterCriticalSection(hCriticalSection);
	r1 = count;
	_sleep(500);
	r1 = r1 + 1;
	count = r1;
	printf("count in func1 = %d\n", count);
	LeaveCriticalSection(hCriticalSection);
}

实验总结:

  1. EnterCriticalSection(…)进入临界区
  2. LeaveCriticalSection(…)退出临界区
  3. DeleteCriticalSection(…)删除临界区
  4. InitialCriticalSection(…)初始化临界区

实验六:系统内存使用统计

实验环境:计算机一台,内装有Visual Studio、office等软件

实验日期:2024.6.7

实验要求:

1.了解:Windows内存管理机制。

2.理解:页式存储管理技术,Windows内存管理基本数据结构。

3.掌握:Windows内存管理基本API的使用。

实验内容:

1.使用Windows系统提供的API和数据结构获取系统物理内存和虚拟内存信息。

2.分配及释放虚拟内存。

3.分配及释放物理内存。

4.当物理内存和虚拟内存空间发生变化时,分析产生变化的原因。

工程创建过程

勾选MFC 

实验源代码

// 实验六:系统内存使用统计.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "实验六:系统内存使用统计.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一的应用程序对象

CWinApp theApp;

using namespace std;
void GetMemSta(){
	MEMORYSTATUSEX MemInfo;
	MemInfo.dwLength = sizeof(MEMORYSTATUSEX);
	GlobalMemoryStatusEx(&MemInfo);
	printf("当前内存状态是:\n");
	printf("总物理内存大小:%dMB\n",MemInfo.ullTotalPhys/(1024*1024));
	printf("可用物理内存大小:%dMB\n",MemInfo.ullAvailPhys/(1024*1024));
	printf("总页文件大小:%dMB\n",MemInfo.ullTotalPageFile/(1024*1024));
	printf("可用页文件大小:%dMB\n",MemInfo.ullAvailPageFile/(1024*1024));
	printf("总虚拟内存大小:%dMB\n",MemInfo.ullTotalVirtual/(1024*1024));
	printf("可用虚拟内存大小:%dMB\n",MemInfo.ullAvailVirtual/(1024*1024));
	printf("内存利用率:%d\n",MemInfo.dwMemoryLoad);
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;
	LPVOID BaseAddr;
	GetMemSta();
	printf("现在分配300M的虚拟内存和200M的物理内存\n\n");
	BaseAddr=VirtualAlloc(NULL, 1024*1024*300,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
	if(BaseAddr==NULL) printf("虚拟内存分配失败\n");
	char * str = (char*)malloc(1024*1024*300);
	GetMemSta();
	printf("现在释放300M的虚拟内存和200M的物理内存\n\n");
	if(VirtualFree(BaseAddr,0,MEM_RELEASE)==0) printf("释放失败");
	free(str);
	GetMemSta();
	system("PAUSE");
	return nRetCode;
}

 实验结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Linux命令行大全(第2版)》PDF下载

内容简介 本书对Linux命令行进行详细的介绍,全书内容包括4个部分,第一部分由Shell的介绍开启命令行基础知识的学习之旅;第二部分讲述配置文件的编辑,如何通过命令行控制计算机;第三部分探讨常见的任务与必备工具&…

Java高频面试之并发编程-15

hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶 面试官:as-if-serial 是什么?单线程的程序一定是顺序执行的吗? as-if-serial 规则 定义: …

无人甘蔗小车履带式底盘行走系统的研究

1.1 研究背景与意义 1.1.1 研究背景 甘蔗作为全球最重要的糖料作物之一,在农业经济领域占据着举足轻重的地位。我国是甘蔗的主要种植国家,尤其是广西、广东、云南等地,甘蔗种植面积广泛,是当地农业经济的重要支柱产业。甘蔗不仅…

通俗易懂版知识点:Keepalived + LVS + Web + NFS 高可用集群到底是干什么的?

实验开始前,先搞懂为什么要部署该集群? 这个方案的目标是让网站 永不宕机,即使某台服务器挂了,用户也感觉不到。它主要涉及 负载均衡(LVS) 高可用(Keepalived) 共享存储&#xff…

https,http1,http2,http3的一些知识

温故知新,突然有人问我项目中🤔有使用http3么,一下不知从何说起,就有了这篇文章的出现。 https加密传输,ssltls https 验证身份 提供加密,混合加密 : 对称加密 非对称加密 原理&#xff1a…

go 通过汇编学习atomic原子操作原理

文章目录 概要一、原理1.1、案例1.2、关键汇编 二、LOCK汇编指令2.1、 LOCK2.2、 原理2.2.1、 缓存行2.2.2、 缓存一致性之MESI协议2.2.3、lock原理 三、x86缓存发展四、x86 DMA发展参考 概要 在并发操作下,对一个简单的aa2的操作都会出错,这是因为这样…

WebRTC 源码原生端Demo入门-1

1、概述 我的代码是比较新的,基于webrtc源码仓库的main分支的,在windows下把源码仓库下载好了后,用visual stdio 2022打开进行编译调试src/examples/peerconnection_client测试项目,主要是跑通这个demo来入手和调试,纯看代码很难…

【MySQL】第二弹——MySQL表的增删改查(CRUD)

文章目录 🎓一. CRUD🎓二. 新增(Create)🎓三. 查询(Rertieve)📖1. 全列查询📖2. 指定列查询📖3. 查询带有表达式📖4. 起别名查询(as )📖 5. 去重查询(distinct)📖6. 排序…

基于zernike 拟合生成包裹训练数据-可自定义拟合的项数

可以看到拟合误差其实还是有很多的,但是这个主要是包裹噪声产生的,用到了github 上的zernike 库,直接pip install 一下安装就可以了 import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Axes3D import matpl…

大模型赋能:2D 写实数字人开启实时交互新时代

在数字化浪潮席卷全球的当下,人工智能技术不断突破创新,其中大模型驱动的 2D 写实数字人正成为实时交互领域的一颗新星,引领着行业变革,为人们带来前所未有的交互体验。 一、2D 写实数字人概述 2D 写实数字人是通过计算机图形学…

5G-A来了!5G信号多个A带来哪些改变?

5G-A来了!5G信号多个A带来哪些改变? 随着科技不断进步,通信网络的迭代升级也在加速。自4G、5G的推出以来,我们见证了通信技术的飞跃式发展。最近,越来越多的用户发现自己手机屏幕右上角的5G标识已经变成了“5G-A”。那…

Chroma:一个开源的8.9B文生图模型

Chroma 模型讲解 一、模型概述 Chroma 是一个基于 FLUX.1-schnell 的 8.9B 参数模型。它采用了 Apache 2.0 许可证,完全开源,允许任何人使用、修改和在其基础上进行开发,不存在企业限制。该模型目前正在训练中,训练数据集从 20M…

[强化学习的数学原理—赵世钰老师]学习笔记01-基本概念

[强化学习的数学原理—赵世钰老师]学习笔记01-基本概念 1.1 网格世界的例子1.2 状态和动作1.3 状态转移1.4 策略1.5 奖励1.6 轨迹、回报、回合1.6.1 轨迹和回报1.6.2 回合 1.7 马尔可夫决策过程 本人为强化学习小白,为了在后续科研的过程中能够较好的结合强化学习来…

1、Kafka与消息队列核心原理详解

消息队列(Message Queue, MQ)作为现代分布式系统的基础组件,极大提升了系统的解耦、异步处理和削峰能力。本文以Kafka为例,系统梳理消息队列的核心原理、架构细节及实际应用。 Kafka 基础架构及术语关系图 术语简要说明 Produce…

免费公共DNS服务器推荐

当自动获取的DNS或本地运营商的DNS出现问题,可能导致软件无法连接服务器。此时,手动修改电脑的DNS设置或许能解决问题。许多用户觉得电脑上网速度慢、游戏卡顿,归咎于DNS问题。确实,我们可以自行设置一个DNS来改善网络体验。不少用…

【统计以空格隔开的字符串数量】2021-11-26

缘由一提标准的大一oj提木-编程语言-CSDN问答 void 统计以空格隔开的字符串数量() {//缘由https://ask.csdn.net/questions/7580109?spm1005.2025.3001.5141int n 0, x 0, g 0, k 1;string s "";cin >> n;getchar();while (n--){getline(cin, s);while …

OSCP备战-kioptrixvm3详细解法

探测IP arp-scan -l 得出目标IP:192.168.155.165 也可以使用 netdiscover -i eth0 -r 192.168.155.0/24 也可以使用 nmap -sN 192.168.155.0/24 --min-rate 1000 修改hosts文件 找到IP后,通过之前读取README.txt了解到,我们需要编辑host…

《从零构建大模型》PDF下载(中文版、英文版)

内容简介 本书是关于如何从零开始构建大模型的指南,由畅销书作家塞巴斯蒂安• 拉施卡撰写,通过清晰的文字、图表和实例,逐步指导读者创建自己的大模型。在本书中,读者将学习如何规划和编写大模型的各个组成部分、为大模型训练准备…

大数据应用开发和项目实战-电商双11美妆数据分析

数据初步了解 (head出现,意味着只出现前5行,如果只出现后面几行就是tail) info shape describe 数据清洗 重复值处理 这个重复值是否去掉要看实际情况,比如说:昨天卖了5瓶七喜,今天卖了5瓶七…

招行数字金融挑战赛数据分析赛带赛题二

赛题描述:根据提供的脱敏资讯新闻数据,选手需要对提供的训练集进行特征工程,构建资讯分类模型,对与测试集进行准确的新闻分类。 最终得分:0.8120。十二点关榜没看到排名,估算100? 训练集很小&am…