
操作系统实验报告(共9页).docx
9页精选优质文档-----倾情为你奉上 操作系统课程实验 实 验 报 告 操作系统课程组 编 实验内容: 实验1、实验2姓名: 张梦圆 仇冠伦学号: 班级: 电子 2016-04 班成绩:西南交通大学电气工程学院 专心---专注---专业报告格式要求1. 只需回答每个实验中“实验结果”,需抄写问题 2. 正文和标题皆使用小四号宋体字,标题需加粗参见示例 1 3. 在回答问题涉及截图时,建议调整截图大小,使其适合阅读并节约版面 4. 在回答程序相关的问题时,建议灵活应用文本框和注解图形,以充分说明参见示例 2 5. 除了程序正确,正确规范的语言表达也是实验要求重点因此在实验中注意训练文本表达,准确表述自己的工作重心和亮点 示例 1: 实验 1-1. 基础练习实验 1-1a. 创建命令行应用程序(Win32 Console Application)1. 请说明使用的 Visual C++版本 答: …… 2. 请对程序执行结果截图 答: …… 3. 请在 Windows 文件资源管理器中找到该项目目录,请截图说明;并从中找到 main.cpp 文件、main.obj 和学号-1-1a.exe,亦请截图说明。
答: …… 示例 2: int main() { cout << “Hello world.” << endl; return 0; } 在命令行窗口输出字符串”Hello world” 并退出 main 函数 实验 1-1. 线程(Threads)实验 1-1a. HelloWorld 程序1. 请给出程序运行结果的截图 答: 2. 请结合程序,分析线程 t1 何时被创建、运行和结束 答: int main() { //Launch a thread std::thread t1(call_from_thread); 创建线程 //Join the thread with the main thread t1.join(); 等待子线程执行完毕之后再继续向下执行主线程 return 0; 线程结束 } 实验 1-1b. 多线程并发执行1. 请给出程序运行结果的截图。
答: 2. 请分析程序输出结果是否固定 答:主函数也是一条线程,通常叫做主线程,所以上面的代码实际上有 11 条线程在运行程序创建线程组,其线程的运行存在先后秩序不确定的现象 实验 1-1c. 线程中函数的参数1. 请给出程序运行结果的截图 答: 2. 请分析程序输出内容的格式不整齐的原因 答:有 i+1 个线程在竞争运行,程序内的 11 条线程都在竞争性地使用 stdout这个公共资源,所以输出结果不整齐 实验 1-2. 线竞争状态(Race conditions)1. 请给出程序运行结果的截图 答: 2. 请结合程序,解释程序中线程为何出现竞争状态 答:由于本例中使用多个线程模拟多个用户对广告的点击,存在多个线程同时访问同一个类(对象或方法),而在这种情况下,多个线程都能同时获取以及改变共享数据,竞争危害便发生了因为各个线程对数据操纵的顺序并不可预知,因此数据改变的结果取决于线程最终的运行顺序所有的线程都在“Racing”(竞争)以优先获取数据改变数据 实验 1-3. 互斥锁实验 1-3a. 互斥锁(Mutex)1. 请给出程序运行结果的 5 个截图 答: 2. 请结合程序,分析如何通过互斥锁解决竞争状态。
答:由于多线程之间共享全局变量就会导致出现资源竞争的问题,为了避免这种竞争出现,利用互斥锁可以实现线程同步,解决竞争状态 long total = 0; std::mutex m; // 对共享资源进行保护的互斥对象 void click() { m.lock(); // 访问之前,锁定互斥对象, 对线程上锁,此时其他线程阻塞等待该线程释放锁 for (int i = 0; i < ; ++i) { total += 1; } m.unlock(); // 访问完成后,释放互斥对象,等待下一个线程运行 } 3. 将 mutex 的锁定和释放放到 for 循环之内,测试结果,并分析其效果与当前程序有何不同 答:与之前相比,时间明显增加 实验 1-3b. lock_guard 模板类1. 请给出程序运行结果的 2 个截图 答: 2. 请结合程序,分析 lock_guard 如何使用互斥锁解决竞争状态 答:Lock_guard 是 Mute 的优秀辅助,此类辅助锁定互斥量,构造时锁定,析构时解锁,避免遗忘解锁,也就是说在其作用域内它会一直锁定要求的变量,以此实现线程同步,解决竞争状态。
3. 分析实验 1-3a 和实验 1-3b 的程序在执行时间上的性能差异 答:本题的两个例子我没看出执行时间上的性能差异 使用 mutex 互斥锁,来保证线程的安全性.但是这样是很麻烦的.我们需要手动的对锁进行操作.如果出现多个分支的情况,则需要多次书写unlock 操作引入 lock_guard 对象,可实现在作用域内的上锁与自动解锁 实验 1-3c. 原子(Atomic)1. 请给出程序运行结果的截图 答: 2. 请结合程序,分析如何通过原子容器解决竞争状态 答:引入原子操作的概念,并通过#include
答:条件变量的作用是用于多线程之间关于共享数据状态变化的通信当一个动作需要另外一个动作完成时才能进行,即:当一个线程的行为依赖于另外一个线程对共享数据状态的改变时,这时候就可以使用条件变量 在 print_id 函数中:如果标志位不为 true, 则等待,当前线程被阻塞, 当全局标志位变为 true 之后,线程被唤醒, 继续往下执行打印线程编号 id 在 go 函数中:先设置全局标志位为 true,唤醒所有线程 实验 2-2. 信号量(Semaphore) 1. 请给出程序运行结果的截图 答: 2. 请结合程序,解释如何用条件变量和互斥锁实现信号量 答:条件变量常与互斥锁同时使用,条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生,达到线程同步的目的:条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足在发送信号时,如果没有线程等待在该条件变量上,那么信号将丢失;而信号量有计数值,每次信号量 post 操作都会被记录 实验 2-3. 生产者-消费者问题 1. 请给出程序运行结果的截图 答: 2. 请结合程序,分析以上程序有何问题,如何修改,并给出修改后的程序。
答: 程序缺少头文件 semaphore.h,在程序中加入头文件 semaphore.h 即可 #pragma once #include
答: 步骤一: 步骤 2: 2. 请结合程序,分析以上程序为何有时出现死锁,何时出现死锁 答:程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁 互斥:资源不能共享,只能由一个进程持有,资源只能由 phi0 或 phi1 单独占用 占有且等待:当一个等待另外进程而阻塞时,资源不主动释放当程序执行s0.wait()或 s1.wait()时不主动释放该资源 不可抢占:操作系统不能强行抢占被进程持有的资源 循环等待:存在一个封闭的进程链,使得每一个进程都至少占有下个进程所需要的资源 。





![河南新冠肺炎文件-豫建科[2020]63号+豫建科〔2019〕282号](http://img.jinchutou.com/static_www/Images/s.gif)






