华中科技大学操作系统实验课 实验二

2023-10-27

一、实验目的

  • (1)理解进程/线程的概念和应用编程过程;
  • (2)理解进程/线程的同步机制和应用编程;

二、实验内容

  • 1)在Linux下创建一对父子进程。
  • 2)在Linux下创建2个线程A和B,循环输出数据或字符串。
  • 3)在Windows下创建线程A和B,循环输出数据或字符串。
  • 4)在Linux下创建一对父子进程,实验wait同步函数。
  • 5)在Windows下利用线程实现并发画圆/画方。
  • 6)在Windows或Linux下利用线程实现“生产者-消费者”同步控制
  • 7)在Linux下利用信号机制实现进程通信。
  • 8)在Windows或Linux下模拟哲学家就餐,提供死锁和非死锁解法。

三、实验要求

  • 2,6,8必做,其余任选2。课前提前预做,老师机房检查和答疑

实验一,在Linux下创建一对父子进程。

  • 提示 1:分别输出各自的进程号,父进程号和特别的提示字符串信息
  • 提示 2:让父进程提前结束或后结束,观察子进程的父进程 ID。
  • 提示 3:使用 PS 命令查看进程列表信息,核对进程号,父进程号
#include<unistd.h>
#include<stdio.h>
int main()
{
	pid_t p1=fork();
	if(p1>0){
		printf(" 父进程进程号:%d\n",getpid());
                printf(" 创建的子进程进程号:%d\n",p1);
		printf(" 暂时挂起父进程以便ps检查结果(10s):\n");
		sleep(2);
		printf(" 父进程结束\n");
	}else{
		printf(" 子进程进程号:%d\n",getpid());
		printf(" 父进程未结束时,子进程的父进程进程号:%d\n",getppid());
		sleep(4);
		printf(" \n父进程结束后,子进程的父进程进程号:%d\n",getppid());
		printf(" 子进程结束\n");
	}
	return 0;
}



编译运行

 gcc ./test.c -o test1.out
 ./test1.out

结果
在这里插入图片描述
在这里插入图片描述

使用 PS 命令查看进程列表信息,核对进程号,父进程号

ps -o pid,ppid,cmd

在这里插入图片描述

为什么没有./test1.out我也不知道!!!毁灭吧!

ps -ef|grep test1.out

在这里插入图片描述

实验二,在Linux下创建2个线程A和B,循环输出数据或字符串

  • 提示 1:使用 pthread 线程库
  • 提示 2:线程 A 递增输出 1-1000;线程 B 递减输出 1000-1。为避免输出太快,每隔 0.2 秒(可自行调节)输出一个数。
  • 提示 3:输出数据时,同时输出 A 或 B 以标示是哪个线程输出的,并注意格式化输出信息。

1.编写代码

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

//定义线程1运行函数
void* th_fn1(void *arg) //传入void*数值 a
{
	for(int i=1;i<=1000;i++){
		printf("A:%d\n",i);
		sleep(1);
	}
}

//定义线程2运行函数
void* th_fn2(void *arg) //传入void*数值 r
{
	for(int i=1000;i>0;i--){
		printf("B:%d\n",i);
		sleep(1);
	}
}

int main()
{
	int err;//定义错误存储
   	pthread_t  tid1,tid2;//定义线程标识符

   	//创建tid1线程
   	if(err=pthread_create(&tid1,NULL,th_fn1,NULL)){
		perror("pthread_create error");
	}


   	//创建tid2线程
   	if(err=pthread_create(&tid2,NULL,th_fn2,NULL)){
		perror("pthread_create error");
	}
	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);
	return 0;
}

2.编译运行

注意要加入-lpthread,才能使用线程。因为 pthread_create 等线程函数不在 C 标准库中。

gcc ./test2.c -o ./test2.out -lpthread

3.结果

在这里插入图片描述

实验三、在Windows下创建线程A和B,循环输出数据或字符串。

  • 提示 1:使用 CreateThread 创建线程
  • 提示 2:线程 A 递增输出 1-1000;线程 B 递减输出 1000-1。为避免输出太快,每隔 0.2 秒输出一个数。
  • 提示 3:输出数据时,同时输出 A 或 B 标示是哪个线程输出的,并注意格式化输出信息

老师方法的代码

#include <iostream>
#include <thread>
#include <windows.h>

DWORD WINAPI add(LPVOID)
{
	for (int i = 1; i<=1000; i++) {
		std::cout << "A:" << i << std::endl;
		Sleep(5);
	}
	return 1;
}


DWORD WINAPI dec(PVOID pParam) {
	for (int i = 1000; i > 0; i--) {
		std::cout << "B:" << i << std::endl;
		Sleep(5);
	}

	return 0;
}

int main() {

	HANDLE hthread[2];
	DWORD threadID;
	DWORD threadID1;
	hthread[0] = CreateThread(NULL, 0, add, (LPVOID)1, 0, &threadID);
	hthread[1] = CreateThread(NULL, 0, dec, (LPVOID)2, 0, &threadID1);
	WaitForMultipleObjects(2, hthread, TRUE, INFINITE);
	return 0;
}

运行结果
在这里插入图片描述
从 C++11 开始,线程,成为了 C++ 标准库的一部分,所以我们可以不再使用 CreateThread 来创建线程,简简单单地使用 std::thread 即可。

而且,CreateThread 是平台相关的,而 std::thread 是跨平台的。
因此,干嘛用CreateThread

使用std::thread的代码

#include<iostream>
#include <thread>

void func_1() {
	for (int i = 1; i <= 1000; i++) {
		std::cout << i << std::endl;
	}
}

void func_2() {
	for (int i = 1000; i > 0; i--) {
		std::cout << i << std::endl;
	}
}


int main() {
	std::thread t1(func_1);
	std::thread t2(func_2);
	t1.join();
	t2.join();

	return 0;
}

运行结果
在这里插入图片描述

实验六、在Windows或Linux下利用线程实现“生产者-消费者”同步控制

  • 提示 1:使用数组(10 个元素)代替缓冲区。2 个输入线程产生产品(随机数)存到数组中;3 个输出线程从数组中取数输出。
  • 提 示 2 : Windows 使 用 临 界 区 对 象 和 信 号 量 对 象 , 主 要 函 数EnterCriticalSection() 、 LeaveCriticalSection() 、 WaitForSingleObject() 、ReleaseSemaphore()。
  • 提示 3:Linux 使用互斥锁对象和轻量级信号量对象,主要函数:sem_wait( ),sem_post( ),pthread_mutex_lock( ),pthread_mutex_unlock( )。
  • 提示 4:生产者 1 的数据:1000-1999 (每个数据随机间隔 100ms-1s),生产者 2 的数据:2000-2999 (每个数据随机间隔 100ms-1s)。
  • 提示 5:消费者每休眠 100ms-1s 的随机时间消费一个数据。
  • 提示 6:屏幕打印(或日志文件记录)每个数据的生产和消费记录。

抄别人作业就好

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华中科技大学操作系统实验课 实验二 的相关文章

  • 终端连接控制(stty的编写)

    终端连接控制 stty的编写 一 背景 文件与目录在之前已经学习过了 文件中包含着数据 这些数据可以被读出 写入 也可以用以操作 但文件不仅仅是计算机唯一的数据来源 计算机的数据还可以来自于许多的外部设备 比如扫描仪 照相机 鼠标等输入设备
  • Linux系统的安装(在VM虚拟机上安装CentOS 7)

    工具准备 物理计算机一台 配置要求 操作系统 win10 64位 大家基本上都是 硬盘可用容量 20G以上 内存容量 4G以上 虚拟机安装包 VMware workstation full 12 5 下载链接 点我下载 提取码 9gha C
  • Client-Server问题

    1 实验内容与要求 需要创建客户Client和服务器Server两个进程 它们通过管道进行通信 Client进程派生3个生产者线程 一个管道线程 共享一个20个slots的缓冲区 每个生产者线程随机产生一个数据 打印出来自己的id 进程 线
  • ps aux 和ps -aux和 ps -ef的选择

    Linux中的ps命令是Process Status的缩写 ps命令用来列出系统中当前运行的那些进程 ps命令列出的是当前那些进程的快照 就是执行ps命令的那个时刻的那些进程 如果想要动态的显示进程信息 就可以使用top命令 要对进程进行监
  • 操作系统PV操作及读者写者问题

    操作系统PV操作及读者写者问题 目录 1 信号量 2 P V操作原语可描述为以下式子 3 解释 4 互斥模式原理 5 同步模式原理 6 读者写者问题 1 信号量 PV操作与信号量的处理有关 信号量是表示资源的实体 是一个与队列有关的整型变量
  • Windows 添加永久静态路由

    route add p 10 10 0 0 mask 255 255 0 0 10 10 6 1 p 参数 p 即 persistent 的意思 p 表示将路由表项永久加入系统注册表
  • Java堆的自动垂直缩放

    多年以来 java一直是贪婪的应用程序的同义词 这种类型的应用程序在晚上打开冰箱并吞噬所有可用资源 直到崩溃 该行为的主要原因是缺乏一种有效的方式来将操作系统在Java堆中分配且不再使用的内存交还给操作系统 However with the
  • InfoQ视频直播分享报名:前贝尔实验室、Oracle架构师为你在线揭秘分布式平台内核...

    报名方式 关注InfoQ微信公众号 ID infoqchina 回复 InfoQ 即可观看在线直播技术分享 分享地点 u0026amp 时间 InfoQ直播微课堂将在熊猫 TV 网站播出 看腻了卖肉的女主播 来看看QCon 的明星讲师如何
  • LWIP在STM32上的移植

    本文做记录摘抄 加上自己的体会 文章标题 STM32使用LWIP实现DHCP客户端 http www cnblogs com dengxiaojun p 4379545 html 该文章介绍了几点 LWIP源码的内容 关键点 1 inclu
  • Linux系统如何看目录属于哪个磁盘分区

    Linux是先有目录 再有磁盘分区 df h 目录 例如 没有挂载磁盘的目录 显示在系统盘 root iZ2ze57v3n0zma46zqiq8nZ sh 1 5 5 df h alidata Filesystem Size Used Av
  • Windows驱动开发(一)第一个驱动程序

    首先我们需要了解 在操作系统中 是分两种权限的 一种是内核态 我们也称为0环 一种是用户态 称之为3环 而在我们的电脑中 驱动程序是运行在内核态的 这意味着和操作系统内核是在同一权限的 而普通的应用程序的权限是最低的 高权限谁不想拥有呢 因
  • Linux常用命令记录

    文章目录 1 软件安装 安装软件 来自源服务器 安装 deb软件 来自本地 deb文件 修复依赖关系 卸载软件 2 文件 文件夹操作 删除文件夹 移动文件 文件重命名 3 程序查看 处理 进程查看 查看端口占用情况 强制终止程序 4 解压文
  • 图解五种磁盘调度算法, FCFS, SSTF, SCAN, C-SCAN, LOOK

    一 FCFS 调度 先来先服务 磁盘调度的最简单形式当然是先来先服务 FCFS 算法 虽然这种算法比较公平 但是它通常并不提供最快的服务 例如 考虑一个磁盘队列 其 I O 请求块的柱面的顺序如下 98 183 37 122 14 124
  • 《深入理解计算机系统》实验四Architecture Lab

    前言 深入理解计算机系统 实验四Architecture Lab下载和官方文档机翻请看 深入理解计算机系统 实验四Architecture Lab下载和官方文档机翻 我觉得这个文档对整个实验很有帮助 如果你的Y86 64环境还没安装好可以看
  • linux 使用systemctl 启动服务报错: Error: No space left on device

    By default Linux only allocates 8192 watches for inotify which is ridiculously low And when it runs out the error is als
  • 操作系统常见面试题

    1 什么是进程 Process 和线程 Thread 有何区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动 进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体 是CPU调度和分派的基本单位 它是比进程更小的能
  • gdb attach 进程调试

    gdb调试正在运行的进程 GDB可以对正在执行的程序进行调度 它允许开发人员中断程序 并查看其状态 之后还能让这个程序正常地继续执行 gdb attach xxxxx xxxxx为利用ps命令获得的子进程process
  • Common块和Bss段的区别

    昨天看 程序员的自我修养 链接 装载与库 发现不是很理解为什么要用common块 然后仔细看了一番 有了自己的理解 common块 用来存放弱符号 而全局未初始化变量是弱符号 但是难道不是应该存放在 bss段吗 为什么要有common块呢
  • Linux(12):磁盘配额(Quota)与进阶文件系统管理

    磁盘配额 Quota 的应用与实作 Quota 的一般用途 针对 www server 例如 每个人的网页空间的容量限制 针对 mail server 例如 每个人的邮件空间限制 针对 file server 例如 每个人最大的可用网络硬盘
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位

随机推荐

  • IT项目管理——08.项目质量管理

    年龄 40以下 学位 博士 专业 管理学相关专业 学术成果 以第一作者发表10篇以上高水平论文 个人品质 爱国敬业 做事严谨 为人正直 崇尚科学 教学经验 有过项目管理相关课程教学经验 投掷30次的结果 不能反映正态分布
  • 史上最管用的C盘深度清理秘籍

    使用电脑的用户都知道 使用电脑一段时间后 会堆积很多无用的文件 不仅占用磁盘空间 而且导致系统运行速度变慢 所以清理c盘垃圾是非常有必要的 无论我们给C盘分多大的分区 Windows都有办法把它填满 像休眠文件 系统页面文件这都是动辄GB级
  • 反激式开关电源的原理是什么

    反激式开关电源是一种常见的电源转换器 其原理是将输入电压通过一个开关管进行高频开关 将电压转换为脉冲信号 再通过变压器进行隔离和变换 最终输出所需的电压 具体来说 当开关管导通时 输入电压经过变压器变换后 输出电压上升 并通过输出电容器进行
  • 轻量级的Python IDE —— Thonny

    现在的开发工具太多了 而且每个开发工具都致力于做成最好用最智能的工具 所以功能越堆越多 越怼越智能 安装这些开发工具比较烧脑 经常需要经过许多配置步骤 作为一个 Python 开发者来说 好多人光是这些配置都要弄半天 配置好之后 打开软件
  • [架构之路-178]-《软考-系统分析师》-17-嵌入式系统分析与设计- 3- 分区操作系统(Partition Operating System)概述

    目录 本文概述 1 1 什么是分区操作系统 1 2 分区操作系统出现背景 1 前后台系统 Foreground Background System 2 实时操作系统 RTOS 本文概述 随着嵌入式系统日趋复杂化以及对安全性要求的不断提高 采
  • “因为无法从捐赠中抽成,谷歌把我的开源 App 下架了!”

    众所周知 苹果税和谷歌税的存在 即 只要你的 App 在 App Store 或 Google Play 上架 产生的收入就必须分给苹果或谷歌 这个 收入 包括 收费 App 的下载费 游戏充值费 订阅服务费等 广泛的抽成范围加上 30 的
  • 解决Ubuntu无法安装pycairo和PyGObject

    环境 虚拟机Ubuntu20 04 vscode无法安装pycairo和PyGObject 虚拟机Ubuntu20 04 vscode中运行Anaconda搭建的vens 的Python3 8 10 首先在vscode中点击ctrl shi
  • Jupyter Notebook是什么及使用

    一 什么是Jupyter Notebook Jupyter项目是一个非盈利的开源项目 源于2014年的python项目 Juptter Notebook 原名IPython Notbook 是IPython的加强网页版 一个开源web应用程
  • 华为OD机试真题- 非严格递增连续数字序列-2023年OD统一考试(B卷)

    题目描述 输入一个字符串仅包含大小写字母和数字 求字符串中包含的最长的非严格递增连续数字序列的长度 比如12234属于非严格递增连续数字序列 输入描述 输入一个字符串仅包含大小写字母和数字 输入的字符串最大不超过255个字符 输出描述 最长
  • STM32学习——什么是寄存器(存储器映射和寄存器映射)

    目录 STM32芯片里面有什么 一 驱动单元 1 ICode总线 2 DCode总线 3 系统总线 4 DMA总线 二 被动单元 1 内部的闪存存储器 2 内部的SRAM 3 FSMC 4 AHB到APB的桥 三 STM32的外设基地址映射
  • CTEX中无限期试用WinEdt的方法

    CTeX中文套装是基于Windows下的MiKTeX系统 集成了编辑器WinEdt和PostScript处理软件Ghostscript和GSview等主要工具 虽说是非商业的免费软件 但其中的WinEdt其实是收费的软件 CTEX软件利用了
  • ffmpeg 录制屏幕

    文章目录 1 ffmpeg 下载 2 screen capture recorder 下载 3 ffmpeg 录屏命令 4 ffmpeg 其他命令 后续 寻路篇 立理想 坐豪车 住豪宅 天天睡到自然醒 叹现状 小黄车 挤隔断 早上起来数星星
  • 常用框架分析(7)-Flutter

    框架分析 7 Flutter 专栏介绍 Flutter 核心思想 Flutter的特点 快速开发 跨平台 高性能 美观的用户界面 Flutter的架构 框架层 引擎层 平台层 开发过程 使用Dart语言编写代码 编译成原生代码 热重载 工具
  • Dell服务器系统升级,更改引导方式(以戴尔R720为例)

    1 重启服务器按住F2 进入system setup 选择第一项的 system BIOS 2 选择 Boot Setting 进入后启动模式有两种 BIOS和UEFI 当磁盘小于2TB的时候选择BIOS 当磁盘大于2TB的时候选择UEFI
  • vue项目引入antDesignUI组件

    快速安装ant design vue并配置 vue2 0 antDesign 1 7 8 第一步 安装ant deisgn vue 1 7 8 npm install ant design vue 1 7 8 save 第二步 配置pack
  • Centos7下载和安装教程

    1 CentOS下载 CentOS是免费版 推荐在官网上直接下载 网址 https www centos org download DVD ISO 普通光盘完整安装版镜像 可离线安装到计算机硬盘上 包含大量的常用软件 一般选择这种镜像类型即
  • 如何用openweather显示html,如何显示openweathermap天气图标

    我正在使用openweathermap显示天气预报 一切正常 但图标有问题 json响应代码是 Array city gt Array id gt 1271476 name gt Guwahati coord gt Array lon gt
  • makefile中wildcard的理解

    wildcard 用来明确表示通配符 因为在 Makefile 里 变量实质上就是 C C 中的宏 也就是说 如果一个表达式如 objs o 则 objs 的值就是 o 而不是表示所有的 o 文件 若果要使用通配符 那么就要使用 wildc
  • PCB制板流程及工艺

    PCB制板的流程一般包括以下几个步骤 1 设计电路原理图和PCB布局 首先 需要设计电路原理图和PCB布局图 电路原理图是电路的逻辑图 用于指导电路的设计和调试 PCB布局图是电路板上各个元件的布局图 包括焊盘 引脚 电源 地线等 电路原理
  • 华中科技大学操作系统实验课 实验二

    一 实验目的 1 理解进程 线程的概念和应用编程过程 2 理解进程 线程的同步机制和应用编程 二 实验内容 1 在Linux下创建一对父子进程 2 在Linux下创建2个线程A和B 循环输出数据或字符串 3 在Windows下创建线程A和B