山东大学操作系统实验报告
- 格式:docx
- 大小:37.47 KB
- 文档页数:46
软件学院操作系统实验报告实验题目:实验二、线程和进程/线程管道通信实验学号:201100300124日期:2013年04月19日班级:5班姓名:韩俊晓Email:hanjunxiao188@实验目的:通过Linux 系统中线程和管道通信机制的实验,加深对于线程控制和管道通信概念的理解,观察和体验并发进/线程间的通信和协作的效果,练习利用无名管道进行进/线程间通信的编程和调试技术。
实验要求:设有二元函数f(x,y) = f(x) + f(y)其中:f(x) = f(x-1) * x(x >1)f(x)=1(x=1)f(y) = f(y-1) + f(y-2)(y> 2)f(y)=1(y=1,2)请编程建立3个并发协作进程(或线程),它们分别完成f(x,y)、f(x)、f(y)其中由父进程(或主线程)完成:f(x,y) = f(x) + f(y)由子进程1(或线程1)完成:f(x) = f(x-1) * x(x >1)f(x)=1(x=1)由子进程2(或线程2)完成:f(y) = f(y-1) + f(y-2)(y> 2)f(y)=1(y=1,2)硬件环境:实验室计算机软件环境:Ubuntu08.4-Linux操作系统BASH_VERSION='3.2.33(1)-releasegcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1.实验说明:1)与线程创建、执行有关的系统调用说明线程是在共享内存中并发执行的多道执行路径,它们共享一个进程的资源,如进程程序段、文件描述符和信号等,但有各自的执行路径和堆栈。
线程的创建无需像进程那样重新申请系统资源,线程在上下文切换时也无需像进程那样更换内存映像。
多线程的并发执行即避免了多进程并发的上下文切换的开销又可以提高并发处理的效率。
Linux 利用了特有的内核函数__clone 实现了一个叫phread的线程库,__clone是fork 函数的替代函数,通过更多的控制父子进程共享哪些资源而实现了线程。
操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。
通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。
三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。
2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。
3、为新进程指定可执行文件的路径、命令行参数、进程属性等。
4、编写代码来等待新进程的结束,并获取其退出代码。
(二)进程同步实验1、设计一个生产者消费者问题的模型。
2、使用信号量来实现生产者和消费者进程之间的同步。
3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。
4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。
(三)进程通信实验1、选择使用管道来实现进程之间的通信。
2、创建一个匿名管道,父进程和子进程分别读写管道的两端。
3、父进程向管道写入数据,子进程从管道读取数据并进行处理。
四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。
通过观察进程的创建和执行过程,加深了对进程概念的理解。
(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。
分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。
(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。
数据能够准确地在进程之间传递,验证了管道通信的有效性。
五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。
通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。
(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。
《操作系统》实验报告一、实验目的操作系统是计算机系统中最为关键的组成部分之一,本次实验的主要目的是深入理解操作系统的基本原理和功能,通过实际操作和观察,熟悉操作系统的核心概念,包括进程管理、内存管理、文件系统和设备管理等,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、进程管理实验进程是操作系统中最基本的执行单元。
在这个实验中,我们使用C++编写程序来创建和管理进程。
通过观察进程的创建、执行和结束过程,理解进程的状态转换和资源分配。
首先,我们编写了一个简单的程序,创建了多个子进程,并通过进程标识符(PID)来跟踪它们的运行状态。
然后,使用等待函数来等待子进程的结束,并获取其返回值。
在实验过程中,我们发现进程的创建和销毁需要消耗一定的系统资源,而且进程之间的同步和通信需要谨慎处理,以避免出现死锁和竞争条件等问题。
2、内存管理实验内存管理是操作系统的核心功能之一,它直接影响系统的性能和稳定性。
在这个实验中,我们研究了动态内存分配和释放的机制。
使用 C++中的 new 和 delete 操作符来分配和释放内存。
通过观察内存使用情况和内存泄漏检测工具,了解了内存分配的效率和可能出现的内存泄漏问题。
同时,我们还探讨了内存分页和分段的概念,以及虚拟内存的工作原理。
通过模拟内存访问过程,理解了页表的作用和地址转换的过程。
3、文件系统实验文件系统是操作系统用于管理文件和目录的机制。
在这个实验中,我们对文件的创建、读写和删除进行了操作。
使用 C++的文件流操作来实现对文件的读写。
通过创建不同类型的文件(文本文件和二进制文件),并对其进行读写操作,熟悉了文件的打开模式和读写方式。
此外,还研究了文件的权限设置和目录的管理,了解了如何保护文件的安全性和组织文件的结构。
4、设备管理实验设备管理是操作系统与外部设备进行交互的桥梁。
山东大学软件学院操作系统实验报告实验题目:进程互斥实验实验目的:进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法,加深对于非对称性互斥问题有关概念的理解。
观察和体验非对称性互斥问题的并发控制方法。
进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。
实验要求:理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。
此外还有一间等候室,可容纳13位顾客等候进入理发室。
顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。
在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。
顾客理完发后,可向任何一位理发师付款。
但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。
理发师在没有顾客的时候就坐在理发椅子上睡眠。
理发师的时间就用在理发、收款、睡眠上。
请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。
总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识?为什么会出现进程饥饿现象?本实验的饥饿现象是怎样表现的?怎样解决并发进程间发生的饥饿现象?您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识?根据实验程序、调试过程和结果分析写出实验报告。
硬件环境:CPU:P4/1.8MHz 内存:256MB 硬盘:10GB软件环境:Ubuntu08.4-Linux 操作系统Gnome 桌面2.18.3BASH_VERSION='3.2.33(1)-releasegcc version 4.1.2vi 3.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1.问题分析假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。
操作系统原理实验报告——实验一张咪软件工程四班一、实验目的加深对于进程并发执行概念的理解。
实践并发进/线程的创立和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创立、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习Linux系统中进/线程创立与控制有关的系统调用的编程和调试技术。
二、实验要求编写一个多进程并发执行程序。
父进程每隔3秒重复建立两个子进程,首先创立的让其执行ls命令,之后创立执行让其执行ps命令,并控制ps命令总在ls命令之前执行。
三、实验软硬件环境实验环境均为Linux操作系统,开发工具为gcc和g++。
四、实验思路调用fock()创立子进程。
创立键盘中断信号后,使用pause()可以暂停子进程执行,继续创立新的子进程。
子进程并发执行子进程可以首先通过键盘中断信号唤醒子进程。
通过exec()调用族装入一个新的执行程序。
在建立子进程2并且唤醒子进程1后子进程sleep(seconds = 5)。
这样就可以先执行ps后执行ls。
最后就是父进程的结束,程序结束。
五、实验模型六、调试排错1、首先遇到的问题是,对linux的操作不熟悉,不太明白makefile怎么使用,直接用了gcc2、在创立多个子进程上遇到了问题,在fock〔〕后又直接跟了一个fork〔〕,这样创立的子进程是子进程的子进程,而不是父进程创立的第二个子进程。
所以应该在else语句块后面,也就是主进程执行段继续创立。
一般情况下,fork()按如下规那么编程:main(){ pid_t pid;pid=fork();if(pid<0) { // 建立子进程失败{ printf("Create Process fail!\n");exit(EXIT_FAILURE); }if (pid = = 0)//子进程代码;//如果需要创立子进程,可以按该方法嵌套else//父进程代码//如果需要创立子进程,可以按该方法嵌套}3、后来父进程与子进程无法重复建立,执行一次就结束了,又加了一个while循环实现重复建立,但无法退出,一直执行。
软件学院操作系统实验报告实验题目:实验一、进程控制实验学号:日期:2013年04月12日班级:5班姓名:韩俊晓Email:实验目的:加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习Linux系统中进程创建与控制有关的系统调用的编程和调试技术。
实验要求:编写一个多进程并发执行程序。
父进程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制ps命令总在ls 命令之前执行。
硬件环境:实验室计算机软件环境:Ubuntu08.4-Linux操作系统gcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1.实验说明:1)与进程创建、执行有关的系统调用说明进程可以通过系统调用fork()创建子进程并和其子进程并发执行.子进程初始的执行映像是父进程的一个复本.子进程可以通过exec()系统调用族装入一个新的执行程序。
父进程可以使用wait()或waitpid()系统调用等待子进程的结束并负责收集和清理子进程的退出状态。
fork()系统调用语法:#include <unistd.h>pid_t fork(void);fork成功创建子进程后将返回子进程的进程号,不成功会返回-1. exec 系统调用有一组6个函数,其中示例实验中引用了execve 系统调用语法:#include <unistd.h>int execve(const char *path, const char *argv[], const char * envp[]); path 要装入的新的执行文件的绝对路径名字符串.argv[] 要传递给新执行程序的完整的命令参数列表(可以为空). envp[] 要传递给新执行程序的完整的环境变量参数列表(可以为空). Exec执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。
计算机科学与技术学院操作系统实验报告实验题目:死锁问题在两个城市南北方向之间存在一条铁路,多列火车可以分别从两个城市的车站排队等待进入车道向对方城市行驶,该铁路在同一时间,只能允许在同一方向上行车,如果同时有相向的火车行驶将会撞车。
请模拟实现两个方向行车,而不会出现撞车或长时间等待的情况。
您能构造一个管程来解决这个问题吗?实验目的:通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。
从而进一步加深对于死锁问题的理解。
掌握解决死锁问题的几种算法的编程和调试技术。
练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。
硬件环境:Inter(R)Core(TM)i5-3210M CPU @ 2.50GHz 内存:4GB 硬盘:500G 软件环境:XUbuntu-Linux 操作系统Gnome 桌面 2.18.3BASH_VERSION='3.2.33(1)-releasegcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1、问题分析:管程-Monitor管程是一种高级抽象数据类型,它支持在它的函数中隐含互斥操作。
结合条件变量和其他一些低级通信原语,管程可以解决许多仅用低级原语不能解决的同步问题。
利用管程可以提供一个不会发生死锁或饥饿现象的对象;哲学家就餐问题和 Java语言中的 synchronized 对象都是很好的管程的例子.管程封装了并发进程或线程要互斥执行的函数。
为了让这些并发进程或线程在管程内互斥的执行,进入管程的进/线程必须获取到管程锁或二值信号量条件变量 Condition Variables条件变量提供了一种对管程内并发协作进程的同步机制。
如果没有条件变量,管程就不会有很有用。
多数同步问题要求在管程中说明条件变量。
条件变量代表了管程中一些并发进程或线程可能要等待的条件。
一个条件变量管理着管程内的一个等待队列。
如果管程内某个进程或线程发现其执行条件为假,则该进程或线程就会被条件变量挂入管程内等待该条件的队列。
操作系统课程设计报告学院:计算机科学与技术学院专业:计算机科学与技术班级:20**级*班姓名:***学号:20**********目录一实验平台 (2)二Project1建立线程系统 (2)Task1.1实现KThread.join() (2)1.要求 (2)2.分析 (2)3.方案 (3)4.实现代码 (3)Task1.2利用中断提供原子性,直接实现条件变量 (4)1.要求 (4)2.分析 (5)3.方案 (5)4.实现代码 (5)Task1.3实现waitUntil (7)1.要求 (7)2.分析 (7)3.方案 (7)4.实现代码 (8)Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen (10)1.要求 (10)2.分析 (10)3.方案 (11)4.实现代码 (11)Task1.5完成PriorityScheduler实现优先级调度 (13)1.要求 (13)2.分析 (13)3.方案 (14)4.实现代码 (14)Task1.6 (17)1.要求 (17)2.分析 (18)3.方案 (19)4.实现代码 (19)三Project2多道程序设计 (27)Task2.1 (27)1.要求 (27)2.分析 (28)3.方案 (28)4.实现代码 (31)Task2.2 (36)1.要求 (36)2.分析 (36)3.方案 (36)4.实现代码 (38)Task2.3 (43)1.要求 (43)2.分析 (43)3.方案 (44)4.实现代码 (45)Task2.4 (47)1.要求 (47)2.分析 (48)3.方案 (48)4.实现代码 (48)一实验平台开发语言:Java开发工具:Eclipse Luna操作系统:Ubuntu14.04二P roject1建立线程系统Task1.1实现KThread.join()1.要求实现Implement KThread.join()函数。
山东大学操作系统实验报告4进程同步实验计算机科学与技术学院实验报告实验题目:实验四、进程同步实验学号:日期:20120409 班级:计基地12 姓名:实验目的加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案了 Linux 系统 IPC进程同步工具的用法,练习并发协作进程的同步与互斥操作的编与调试技术实验内容抽烟者问题假设一个系统中有三个抽烟者进程每个抽烟者不断地卷烟并抽烟抽烟者卷起并抽掉一颗烟需要有三种材料烟草纸和胶水一个抽烟者有烟草一个有纸,另一个有胶水。
系统中还有两个供应者进程,它们无限地供应所有种材料但每次仅轮流提供三种材料中的两种。
得到缺失的两种材料的抽烟者卷起并抽掉一颗烟后会发信号通知供应者让它继续提供另外的两种材料。
这过程重复进行请用以上介绍 IPC同步机制编程实现该问题要求的功能硬件环境@CPUi3-2350MIntel?Cor42.30GHz MobileIntel?Sandybridgex86/MMX/SSE24G内存3操作系统:20.1 GB磁盘:软件环境:ubuntu13.04实验步骤:(1)新建定义了producer和consumer 共用的文件。
ipc.h函数原型和变量的IPC.(2)新建ipc.c文件,编写producer和consumer共用的IPC的具体相应函数。
(3)新建Producer文件,首先定义producer的一些行为,利用系统调用建立共享内存区域,设定其长度并获取共享内存的首地址。
然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。
当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。
(4)新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。
(完整)山东大学操作系统实验一实验报告
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)山东大学操作系统实验一实验报告)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)山东大学操作系统实验一实验报告的全部内容。
操作系统课程设计实验报告
结论分析与体会:
通过这次实验,我熟悉了操作系统实验的环境,进一步了解了Nachos的构成,对我以后顺利熟练的完成操作系统实验有很大的帮助!。
操作系统课程设计报告学院:计算机科学与技术学院专业:计算机科学与技术班级:20**级*班姓名:***学号:20**********目录一实验平台 (4)二Project1建立线程系统 (4)Task1.1实现KThread.join() (4)1.要求 (4)2.分析 (4)3.方案 (4)4.实现代码 (5)Task1.2利用中断提供原子性,直接实现条件变量 (6)1.要求 (6)2.分析 (6)3.方案 (7)4.实现代码 (7)Task1.3实现waitUntil (9)1.要求 (9)2.分析 (9)3.方案 (10)4.实现代码 (10)Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen (12)1.要求 (12)2.分析 (12)3.方案 (13)4.实现代码 (13)Task1.5完成PriorityScheduler实现优先级调度 (16)1.要求 (16)2.分析 (16)3.方案 (17)4.实现代码 (17)Task1.6 (20)1.要求 (20)2.分析 (21)3.方案 (22)4.实现代码 (22)三Project2多道程序设计 (31)Task2.1 (31)1.要求 (31)2.分析 (31)3.方案 (32)4.实现代码 (35)Task2.2 (40)1.要求 (40)2.分析 (40)3.方案 (41)4.实现代码 (42)Task2.3 (48)1.要求 (48)2.分析 (49)3.方案 (49)4.实现代码 (50)Task2.4 (53)1.要求 (53)2.分析 (53)3.方案 (54)4.实现代码 (54)一实验平台开发语言:Java开发工具:Eclipse Luna操作系统:Ubuntu14.04二P roject1建立线程系统Task1.1实现KThread.join()1.要求实现Implement KThread.join()函数。
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。
同时,实现进程的正常终止和异常终止,并分析其对系统的影响。
2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。
通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。
(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。
(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。
(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。
2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。
(2)创建多个进程,模拟对共享资源的并发访问。
(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。
(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
山东大学操作系统实验报告HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】操作系统实验报告计算机科学与技术学院目录一、进程控制实验实验目的加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习 Linux 系统中进程创建与控制有关的系统调用的编程和调试技术。
示例实验实验内容以下实验示例程序应实现一个类似shell 子命令的功能,它可以从执行程序中启动另一个新的子进程并执行一个新的命令和其并发执行。
实验演示结果独立实验实验内容参考以上示例程序中建立并发进程的方法,编写一个父子协作进程,父进程创建一个子进程并控制它每隔 3 秒显示一次当前目录中的文件名列表。
实验步骤算法设计通过进程间的通讯,先创建一个父进程一个子进程,父进程沉睡3秒,子进程作为当前父进程再次创建一个他的子进程,当前子进程执行显示当前目录文件列表功能,执行execve()方法后死亡。
While(1)在死循环里无限进行当前操作。
即达到父进程创建一个子进程并控制它每隔3秒显示一次当前目录中的文件名列表的要求。
开发调试过程打开一终端命令行窗体,新建一个文件夹,在该文件夹中建立名为的C 语言程序;再建立以下名为的 C 语言头文件;建立项目管理文件 Makefile;输入 make 命令编译连接生成可执行的 pctl 程序;执行 pctl 程序;再次执行带有子进程指定执行命令的 pctl 程序。
思考与分析1.反映的进程的特征和功能,在真实的操作系统中是怎样实现和反映出教材中讲解的进程的生命期、进程的实体和进程状态控制的。
对于进程概念和并发概念有哪些新的理解和认识子进程是如何创建和执行新程序的答:进程是一个可并发执行的程序在某数据集上的一次运行,是程序的一次运行过程。
软件学院实验报告实验题目:进程调度算法实验学号:20100030xxxx日期:2012-5-2班级:五班姓名:Email:实验目的:加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux 系统中进程调度策略的使用方法。
练习进程调度算法的编程和调试技术。
硬件环境:IBM实验室计算机软件环境:eclipse gcc编译器Ubuntu-Linux操作系统Gnome桌面实验步骤:1.认真阅读试验指导书所给出的相关知识与示例程序,在此基础上分析独立试验要求,然后着手开始编写程序。
2.用eclipse新建一个c project。
3.新建source folder4.新建名为psched.c的C语言程序5.再建立以下名为psched.h的C语言头文件6.build项目,产生可运行的二进制文件。
7.对程序进行调试,排除bug。
8.进入终端,运行程序,结果如下图所示:源代码:#include"psched.h"int main(int argc,char*argv[]){int pid;//存放⼦进程号struct sched_param p1;//设置⼦进程调度策略时使⽤的数据结构struct sched_param p2;//设置⽗进程调度策略时使⽤的数据结构if((pid=fork())<0){perror("process not create");exit(EXIT_FAILURE);}else if(pid==0){signal(SIGTSTP,handler1);//注册⼀个处理ctrl+z的信号量,将优先级减⼀signal(SIGINT,handler3);//注册⼀个处理ctrl+c的信号量,什么也不做sleep(1);while(1){printf("Child PID=%d priority=%d policy is%d\n",getpid(),getpriority(PRIO_PROCESS,0),sched_getscheduler(getpid()));sleep(3);}}else{signal(SIGINT,handler2);//注册⼀个处理ctrl+c的信号量,将优先级加⼀signal(SIGTSTP,handler4);//注册⼀个处理ctrl+z的信号量,什么也不做sched_setscheduler(pid,SCHED_OTHER,&p1);sched_setscheduler(getpid(),SCHED_OTHER,&p2);setpriority(PRIO_PROCESS,pid,10);setpriority(PRIO_PROCESS,getpid(),10);sleep(1);while(1){printf("Parent PID=%d priority=%d policy is%d\n",getpid(),getpriority(PRIO_PROCESS,0),sched_getscheduler(getpid()));sleep(3);}}return EXIT_SUCCESS;}#include<stdio.h>#include<stdlib.h>#include<sched.h>#include<sys/time.h>#include<sys/resource.h>#include<unistd.h>#include<signal.h>//⼦进程处理信号SIGTSTP的⽅法,将优先级减⼀void handler1(){setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,0)-1); }//⽗进程处理信号SIGINT的⽅法,将优先级加⼀void handler2(){setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,0)+1);}void handler3(){}void handler4(){}结论分析与体会:通过编写进程调度试验,首先,我更加熟练了如何编写多进程程序,更加了解了型号量的注册和使用方法。
计算机科学与技术学院操作系统实验报告学院:专业:班级:姓名:学号:日期:Email:目录实验一进程控制实验 (4)1.1实验目的 (4)1.2实验题目 (4)1.3实验步骤 (4)1.4结论分析与体会 (5)1.5附录:本实验全部程序源代码及注释 (5)1.5.1Pctl.c (5)1.5.2pctl.h (9)1.5.3makefile (10)实验三进程调度算法实验 (10)3.1实验目的 (10)3.2实验题目 (11)3.3实验步骤 (11)3.4结论分析与体会 (12)3.5附录:本实验全部程序源代码及注释 (12)3.5.1Psched.c (12)3.5.2Psched.h (14)3.5.3Makefile (16)实验四进程同步实验 (16)4.1实验目的 (16)4.2实验题目 (16)4.3实验步骤 (17)4.4结论分析与体会 (24)4.5附录:本实验全部程序源代码及注释 (24)4.5.1Ipc.c (24)4.5.2Ipc.h (32)4.5.3Consumer (35)4.5.4Producer (41)4.5.5makefile (50)实验七内存页面置换算法实验 (51)7.1实验目的 (51)7.2实验题目 (51)7.3实验步骤 (52)7.4附录:本实验全部程序源代码及注释 (55)7.4.1Vmrp.h (55) (57)7.5.3makefile (73)实验八磁盘移臂调度算法实验 (74)7.2实验目的 (74)8.2实验题目 (74)8.3实验步骤 (75)8.4附录:本实验全部程序源代码及注释 (76)8.4.1Dask.h (76) (78)8.4.3Makefile (94)实验一进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
山东大学软件学院实验报告实验题目:线程和进/线程管道通信实验实验目的:通过Linux 系统中线程和管道通信机制的实验,加深对于线程控制和管道通信概念的理解,观察和体验并发进/线程间的通信和协作的效果,练习利用无名管道进行进/线程间通信的编程和调试技术。
硬件环境:CPU: P4/1.8MHz 内存:256MB 硬盘: 10GB软件环境:Ubuntu08.4-Linux 操作系统Gnome 桌面2.18.3BASH_VERSION='3.2.33(1)-releasegcc version 4.1.2vi 3.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1、问题分析设有二元函数f(x,y) = f(x) + f(y)其中: f(x) = f(x-1) * x(x >1)f(x)=1(x=1)f(y) = f(y-1) + f(y-2)(y> 2)f(y)=1(y=1,2)请编程建立3 个并发协作进程,它们分别完成f(x,y)、f(x)、f(y)由问题分析可知应当用父子进程之间的协作,父进程用于实现f(x,y),分别创建两个子进程用于实现f(x)、f(y),父子进程之间用管道进行通信。
2、算法设计说明为实现进程间的通信、协作完成函数f(x,y) = f(x) + f(y),运用进程间通信,分别创建四个管道,用于父子进程间的通信read 和write。
一共创建了三个进程:一个父进程和两个子进程。
结论分析与体会:整个编写过程遇到了很多不懂的地方,犯了很多的错误。
1、管道的数量的选择在编写之初不够明确,使得在后面编写时还要进行修改,主要原因是分析时不够深入和细致。
2、管道的通信端口定义不明确,致使在后面编写时错误始终得不到解决。
3、函数编写错误。
附录代码:#include <stdio.h>#include <unistd.h>#include <stdlib.h>int main(int argc, char *argv[]){int pid1,pid2;//进程号int pipe11[2],pipe12[2];//存放第一、第二个无名管道标号,用于父子进程间通信int pipe21[2],pipe22[2];//存放第三、第四个无名管道标号,用于父子进程间通信int z,f_x=1,f_y=1,f_y1,f_y2=1;//存放要传递的整数//使用pipe()系统调用建立两个无名管道。
《操作系统》课程综合性的实验报告一、实验目的本次《操作系统》课程的综合性实验旨在通过实际操作和实践,深入理解操作系统的基本原理、功能和运行机制。
具体目标包括熟悉操作系统的进程管理、内存管理、文件系统管理以及设备管理等核心模块,提高对操作系统的整体认知和应用能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10 专业版开发工具:Visual Studio 2019编程语言:C++三、实验内容及步骤(一)进程管理实验1、创建多个进程使用 C++中的多线程库,创建多个进程,并观察它们的并发执行情况。
通过设置不同的优先级和资源需求,研究进程调度算法对系统性能的影响。
2、进程同步与互斥实现生产者消费者问题,使用信号量、互斥锁等机制来保证进程之间的同步和互斥。
观察在不同并发情况下,数据的正确性和系统的稳定性。
(二)内存管理实验1、内存分配与回收模拟内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
通过随机生成内存请求,观察不同算法下内存的利用率和碎片情况。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小和页表结构,观察页面置换算法(如 FIFO、LRU 等)对内存访问性能的影响。
(三)文件系统管理实验1、文件操作创建、读取、写入和删除文件,了解文件系统的基本操作和数据结构。
2、文件目录管理实现文件目录的创建、遍历和搜索功能,研究目录结构对文件访问效率的影响。
(四)设备管理实验1、设备驱动程序模拟编写简单的设备驱动程序,模拟设备的输入输出操作,如键盘输入和屏幕输出。
2、设备分配与调度研究设备分配算法,如先来先服务和优先级算法,观察设备的使用情况和系统的响应时间。
四、实验结果与分析(一)进程管理实验结果分析1、在创建多个进程的实验中,发现高优先级进程能够更快地获得CPU 资源,系统响应时间更短。
但过度提高某些进程的优先级可能导致其他进程饥饿。
2、对于进程同步与互斥问题,正确使用信号量和互斥锁能够有效地保证数据的一致性和系统的稳定性。
操作系统实验报告计算机科学与技术学院目录一、进程控制实验.................................................1.1 实验目的...................................................1.2示例实验.....................................................1.2.1实验内容...............................................1.3独立实验.....................................................1.3.1实验内容...............................................1.3.2实验步骤...............................................1.3.3实验演示结果...........................................1.3.4实验代码...............................................二、进程调度算法实验............................................2.1 实验目的...................................................2.2示例实验.....................................................2.2.1实验内容...............................................2.2.2实验演示结果...........................................2.3独立实验.....................................................2.3.1实验内容...............................................2.3.2实验步骤...............................................2.3.3实验演示结果...........................................2.3.4实验代码...............................................二、进程同步实验.................................................3.1 实验目的...................................................3.2示例实验.....................................................3.2.1实验内容...............................................3.2.2实验演示结果...........................................3.3独立实验.....................................................3.3.1实验内容...............................................3.3.2实验步骤...............................................3.3.3实验演示结果...........................................3.3.4实验代码...............................................三、内存页面置换算法实验.........................................4.1 实验目的...................................................4.2示例实验.....................................................4.2.1实验内容...............................................4.2.2实验演示结果...........................................4.3独立实验.....................................................4.3.1实验内容...............................................4.3.2实验步骤...............................................4.3.3实验演示结果...........................................4.3.4实验代码...............................................四、磁盘移臂调度算法实验.........................................5.1 实验目的...................................................5.2示例实验.....................................................5.2.1实验内容...............................................5.2.2实验演示结果...........................................5.3独立实验.....................................................5.3.1实验内容...............................................5.3.2实验步骤...............................................5.3.3实验演示结果...........................................5.3.4实验代码...............................................一、进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习 Linux 系统中进程创建与控制有关的系统调用的编程和调试技术。
1.2示例实验1.2.1实验内容以下实验示例程序应实现一个类似shell 子命令的功能,它可以从执行程序中启动另一个新的子进程并执行一个新的命令和其并发执行。
1.2.2实验演示结果1.3独立实验1.3.1实验内容参考以上示例程序中建立并发进程的方法,编写一个父子协作进程,父进程创建一个子进程并控制它每隔 3 秒显示一次当前目录中的文件名列表。
1.3.2实验步骤?1.3.2.1算法设计通过进程间的通讯,先创建一个父进程一个子进程,父进程沉睡3秒,子进程作为当前父进程再次创建一个他的子进程,当前子进程执行显示当前目录文件列表功能,执行execve()方法后死亡。
While(1)?在死循环里无限进行当前操作。
即达到父进程创建一个子进程并控制它每隔3秒显示一次当前目录中的文件名列表的要求。
1.3.2.2开发调试过程打开一终端命令行窗体,新建一个文件夹,在该文件夹中建立名为pctrl.c 的C语言程序;再建立以下名为 pctrl.h 的 C 语言头文件;建立项目管理文件 Makefile;输入 make 命令编译连接生成可执行的 pctl 程序;执行 pctl 程序;再次执行带有子进程指定执行命令的 pctl 程序。
1.3.2.3思考与分析1.反映的进程的特征和功能,在真实的操作系统中是怎样实现和反映出教材中讲解的进程的生命期、进程的实体和进程状态控制的。
对于进程概念和并发概念有哪些新的理解和认识?子进程是如何创建和执行新程序的?答:进程是一个可并发执行的程序在某数据集上的一次运行,是程序的一次运行过程。
而程序只是进程的一个组成部分,进程是程序的执行过程。
程序是静态的指令集合,而进程是动态的过程实体,是动态的产生、发展和消失。
此外所谓的进程并发执行是在宏观上并发,而在微观上交替执行。
每个进程都用一个唯一的整数形式的进程标识符来标识,通过fork()系统调用,可创建新进程。
新进程通过复制原来进程的地址空间而成。
这种机制允许父子进程方便的进行通信。
系统调用fork(),得到的子进程实际上是父进程的克隆体,要执行不同的新程序要使用系统调用exec(),以用新程序来取代进程的内存空间。
其功能是根据参数指定的文件名找到程序文件,把它装入内存,覆盖原来进程的映像,形成一个不同于父进程的子进程。
除了进程映像被更换之外,新进程的PID及其他PCB属性均保持不变,实际上是一个新进程“借壳”原来子进程开始运行。
父进程可通过系统调用waitpid()来把自己移出就绪队列来等待子进程的终止。
2.信号的机理是什么?怎样利用信号实现进程控制?每个信号对应一个正整数常量(为signal?number。
定义在系统头文件<signal.h>中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。
每个进程运行时,要通过信号机制来检查是否有信号到达。
若有,中断正在执行的程序,转向该信号相对应的处理程序,已完成对事件的处理;处理结束后再返回到原来的断点继续执行。
1.3.3实验演示结果1.3.4实验代码pctl.c文件:#include "pctl.h"int main(){int pid_1,pid_2; //存放子进程号int status_1,status_2; //存放子进程返回状态while(1){pid_1=fork() ;if(pid_1<0) // 建立子进程失败?{printf("Create Process fail!\n");exit(EXIT_FAILURE);}if(pid_1 == 0) // 子进程执行代码段{//报告父子进程进程号printf("I am Child-ls process %d\nMy father is %d\n",getpid(),getppid());/*getpid 返回当前进程的进程号,getppid 返回当前进程父进程的进程号*/pid_2=fork();if(pid_2<0)// 建立子进程失败?{printf("Create Process fail!\n");exit(EXIT_FAILURE);}if(pid_2==0) // 子进程执行代码段{//报告父子进程进程号printf("I am Child-ps process %d\nMy father is %d\n",getpid(),getppid());printf("%d child will Running: \n",getpid()); /*子进程被键盘中断信号唤醒继续执行*/status_2=execve("/bin/ps",NULL,NULL);//装入并执行新的程序}else{printf("wait for the ps-child end%d\n",pid_2);waitpid(pid_2,&status_2,0);//等待子进程2结束//status 用于保留子进程的退出状态}printf("%d child will Running: \n",getpid()); //装入并执行新的程序char *argv[]={"0",NULL};status_1 = execve("/bin/ls",argv,NULL);}else{printf("I am Parent process %d\n",getpid());printf("wait for the ls-child end %d\n",pid_1);waitpid(pid_1,&status_1,0);printf("child end,sleep...\n");sleep(3);// sleep 函数会令调用进程的执行挂起睡眠3秒}}return EXIT_SUCCESS;}pctl.h文件:#include <sys/types.h>#include <wait.h>#include <unistd.h>#include <signal.h>#include <stdio.h>#include <stdlib.h>//进程自定义的键盘中断信号处理函数typedef void (*sighandler_t) (int);void sigcat(){printf("%d Process continue\n",getpid());}二、进程调度算法实验2.1 实验目的加深对进程调度概念的理解,体验进程调度机制的功能,了解 Linux 系统中进程调度策略的使用方法。