操作系统中级模块实验三

合集下载

操作系统实验报告3

操作系统实验报告3

操作系统实验报告3一、实验目的本次操作系统实验的主要目的是深入了解和掌握操作系统中进程管理、内存管理以及文件系统等核心概念和相关技术,并通过实际的实验操作,提高对操作系统原理的理解和应用能力。

二、实验环境本次实验使用的操作系统为 Windows 10,开发工具为 Visual Studio 2019。

三、实验内容及步骤(一)进程管理实验1、创建进程使用 C++语言编写程序,通过调用 Windows API 函数`CreateProcess`来创建一个新的进程。

在创建进程时,设置进程的优先级、环境变量等参数,并观察进程的创建过程和相关的系统资源使用情况。

```cppinclude <windowsh>include <iostream>int main(){STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));sicb = sizeof(si);ZeroMemory(&pi, sizeof(pi));//设置进程的优先级为 HIGH_PRIORITY_CLASS DWORD priorityClass = HIGH_PRIORITY_CLASS;//创建进程if (!CreateProcess(NULL, //应用程序名称"notepadexe",//命令行参数NULL, //进程安全性NULL, //线程安全性FALSE, //不继承句柄priorityClass, //进程优先级NULL, //环境变量NULL, //当前目录&si,&pi)){std::cout <<"CreateProcess failed Error code: "<<GetLastError()<< std::endl;return 1;}//等待进程结束WaitForSingleObject(pihProcess, INFINITE);//关闭进程和线程的句柄CloseHandle(pihProcess);CloseHandle(pihThread);return 0;}```2、进程同步与互斥编写一个多线程程序,模拟生产者消费者问题。

操作系统实验报告三

操作系统实验报告三

操作系统实验报告三一、实验目的本次实验的目的是通过设计和实现一个简单的操作系统,加深对操作系统内核设计的理解,并学习操作系统内核的基本构建和运行原理。

二、实验背景操作系统是计算机系统中最核心的软件之一,它负责管理计算机的各种资源以及协调和控制应用程序的执行。

操作系统的设计和实现使计算机能够高效地运行并提供友好的用户接口。

操作系统也为应用程序提供了统一的软硬件访问接口,方便开发人员进行软件开发。

操作系统的设计和实现是计算机科学与技术领域中重要的研究方向之一。

通过操作系统的实验,可以深入了解操作系统的内部原理和机制,加深对操作系统的理解和认识。

三、实验内容本次实验需要设计和实现一个简单的操作系统,完成以下功能:1. 实现一个简单的内存管理模块,包括内存分配和释放的功能。

2. 实现一个简单的进程管理模块,包括进程的创建、撤销和切换的功能。

3. 实现一个简单的文件系统模块,包括文件的读写和目录的管理功能。

4. 实现用户与操作系统之间的交互界面,方便用户进行操作系统的使用。

四、实验步骤1. 设计和实现内存管理模块:a. 设计内存分配算法,根据系统的需要分配和释放内存空间。

b. 实现内存分配和释放的功能函数,确保能够正确地分配和释放内存空间。

2. 设计和实现进程管理模块:a. 设计进程控制块(PCB),记录进程的相关信息。

b. 实现进程的创建、撤销和切换的功能函数,确保进程能够正确地被创建、撤销和切换。

3. 设计和实现文件系统模块:a. 设计文件控制块(FCB),记录文件的相关信息。

b. 实现文件的读写和目录的管理功能函数,确保文件能够正确地被读写和目录能够正确地被管理。

4. 实现用户与操作系统之间的交互界面:a. 设计用户界面,包括命令解释器等。

b. 实现用户输入命令的解释和执行函数,确保用户能够正确地与操作系统进行交互。

五、实验结果与分析经过实验,我们成功地设计和实现了一个简单的操作系统,并完成了内存管理、进程管理和文件系统的功能实现。

操作系统 实验三 进程同步

操作系统 实验三 进程同步

集美大学计算机工程学院实验报告课程名称:操作系统指导教师:王丰实验成绩:实验编号:实验三实验名称:进程同步班级:计算12姓名:学号:上机实践日期:2015.5上机实践时间:2学时一、实验目的1、掌握用Linux信号灯集机制实现两个进程间的同步问题。

2、共享函数库的创建二、实验环境Ubuntu-VMware、Linux三、实验内容⏹需要的信号灯: System V信号灯实现☐用于控制司机是否可以启动车辆的的信号灯 S1=0☐用于控制售票员是否可以开门的信号灯 S2=0System V信号灯实现说明□ System V的信号灯机制属于信号灯集的形式, 一次可以申请多个信号灯.□同样利用ftok()生成一个key: semkey=ftok(path,45);□利用key申请一个包含有两个信号灯的信号灯集, 获得该集的idsemid=semget(semkey,2,IPC_CREAT | 0666);□定义一个联合的数据类型union semun{int val;struct semid_ds *buf;ushort *array;};□利用semctl()函数对信号灯初始化,参数有:信号灯集的id: semid要初始化的信号灯的编号:sn要设定的初始值:valvoid seminit(int semid, int val,int sn){union semun arg;arg.val=val;semctl(semid,sn,SETVAL,arg);}利用初始化函数,初始化信号灯:seminit(semid,0,0);//用来司机启动汽车的同步seminit(semid,0,1);//用来售票员开门的同步控制□利用semop()函数, 对信号灯实现V操作:sembuf是一个在头部文件中的预定义结构、semid—信号灯集id, sn—要操作的信号灯编号void semdown(int semid,int sn){/* define P operating*/struct sembuf op;op.sem_num=sn;op.sem_op=-1;//P操作为-1op.sem_flg=0;semop(semid,&op,1);}2、Linux的静态和共享函数库·Linux生成目标代码: gcc -c 源程序文件名(将生成一个与源程序同名的.o目标代码文件。

操作系统实验三

操作系统实验三

操作系统实验报告计算机0703班200729实验3 进程同步和通信-生产者和消费者问题模拟1. 目的:调试、修改、运行模拟程序,通过形象化的状态显示,使学生理解进程的概念,了解同步和通信的过程,掌握进程通信和同步的机制,特别是利用缓冲区进行同步和通信的过程。

通过补充新功能,使学生能灵活运用相关知识,培养创新能力。

2. 内容及要求:1) 调试、运行模拟程序。

2) 发现并修改程序中不完善的地方。

3) 修改程序,使用随机数控制创建生产者和消费者的过程。

4) 在原来程序的基础上,加入缓冲区的写互斥控制功能,模拟多个进程存取一个公共缓冲区,当有进程正在写缓冲区时,其他要访问该缓冲区的进程必须等待,当有进程正在读取缓冲区时,其他要求读取的进程可以访问,而要求写的进程应该等待。

5) 完成1)、2)、3)功能的,得基本分,完成4)功能的加2分,有其它功能改进的再加2分3. 程序说明:本程序是模拟两个进程,生产者(producer)和消费者(Consumer)工作。

生产者每次产生一个数据,送入缓冲区中。

消费者每次从缓冲区中取走一个数据。

缓冲区可以容纳8个数据。

因为缓冲区是有限的,因此当其满了时生产者进程应该等待,而空时,消费者进程应该等待;当生产者向缓冲区放入了一个数据,应唤醒正在等待的消费者进程,同样,当消费者取走一个数据后,应唤醒正在等待的生产者进程。

就是生产者和消费者之间的同步。

每次写入和读出数据时,都将读和写指针加一。

当读写指针同样时,又一起退回起点。

当写指针指向最后时,生产者就等待。

当读指针为零时,再次要读取的消费者也应该等待。

为简单起见,每次产生的数据为0-99的整数,从0开始,顺序递增。

两个进程的调度是通过运行者使用键盘来实现的。

4. 程序使用的数据结构进程控制块:包括进程名,进程状态和执行次数。

缓冲区:一个整数数组。

缓冲区说明块:包括类型,读指针,写指针,读等待指针和写等待指针。

5. 程序使用说明启动程序后,如果使用'p'键则运行一次生产者进程,使用'c'键则运行一次消费者进程。

操作系统实验报告3

操作系统实验报告3

操作系统实验3报告学号:姓名:专业:计算机科学与技术(普通班)操作系统实验 3实验内容:1、消息的创建、发送和接收:使用系统调用msgget()、msgsnd()、msgrev()、msgctl()编制一个对长度1K的消息进行发送和接收的程序。

〈程序设计〉(1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork( )两个子进程,SERVER和CLIENT,进行通信。

(2)SERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。

当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。

SERVER每接收到一个消息后显示一句“(server) received”。

(3)CLIENT端使用Key为75的消息队列,先后发送类型从10到1的消息,然后退出。

最后的一个消息,即是SERVER端需要的结束信号。

CLIENT每发送一条消息后显示一句“(client) sent”。

(4)父进程在SERVER和CLIENT均退出后结束。

〈程序〉# include <stdio.h># include <sys/types.h># include <sys/msg .h># include <sys/ipc.h># define MSGKEY 75 /*定义关键词MSGKEY*/struct msgform/*消息结构*/{long mtype ;char mtext[1030] ;/*文本长度*/} msg ;int msgqid , i ;void CLIENT( ){int i ;msgqid = msgget(MSGKEY , 07777) ;for(i = 10 ; i>= 1 ; i--){msg . mtype = I ;printf (“(client) sent\n”) ;msgsnd (msgqid , &msg , 1024 , 0) ;/*发送消息msg入msgqid消息队列*/}exit(0) ;}void SERVER( ){msgqid = msgget(MSGKEY , 0777 | IPC_CREAT) ;/*由关键字获得消息队列*/do{msgrev (msgqid , &msg , 1030 , 0 , 0) ;/*从msgqid队列接收消息msg */printf (“(server) received\n”) ;}while (msg . mtype != 1) ;/*消息类型为1时,释放队列*/msgctl (msgqid , IPC_RMID , 0) ;exit (0) ;}void main ( ){while ((i = fork ( )) = = -1) ;if (! i ) SERVER( ) ;while ((i = fork ( )) = = -1) ;if (! i ) CLIENT( ) ;wait (0) ;wait (0) ;}〈结果〉2、共享存储区的创建,附接和断接使用系统调用shmget()、shmat ()、shmdt ()、shmctl()编制一个与上述功能相同的程序。

操作系统实验三实验报告

操作系统实验三实验报告
三、实验内容
(一)进程创建
编写程序实现创建多个进程,并观察进程的执行情况。通过调用Windows API函数`CreateProcess`来创建新的进程。在创建进程时,设置不同的参数,如进程的优先级、命令行参数等,观察这些参数对进程执行的影响。
(二)进程控制
实现对进程的暂停、恢复和终止操作。使用`SuspendThread`和`ResumeThread`函数来暂停和恢复进程中的线程,使用`TerminateProcess`函数来终止进程。通过控制进程的执行状态,观察系统的资源使用情况和进程的响应。
(一)进程创建实验结果与分析
创建多个进程后,通过任务管理器观察到新创建的进程在系统中运行。不同的进程优先级设置对进程的CPU占用和响应时间产生了明显的影响。高优先级的进程能够更快地获得CPU资源,执行速度相对较快;而低优先级的进程则在CPU资源竞争中处于劣势,可能会出现短暂的卡顿或计一个多进程同步的程序,使用信号量、互斥量等同步机制来协调多个进程的执行。例如,实现一个生产者消费者问题,多个生产者进程和消费者进程通过共享缓冲区进行数据交换,使用同步机制来保证数据的一致性和正确性。
四、实验步骤
(一)进程创建实验步骤
1、打开Visual Studio 2019,创建一个新的C++控制台应用程序项目。
六、实验中遇到的问题及解决方法
(一)进程创建失败
在创建进程时,可能会由于参数设置不正确或系统资源不足等原因导致创建失败。通过仔细检查参数的设置,确保命令行参数、环境变量等的正确性,并释放不必要的系统资源,解决了创建失败的问题。
(二)线程控制异常
在暂停和恢复线程时,可能会出现线程状态不一致或死锁等异常情况。通过合理的线程同步和错误处理机制,避免了这些异常的发生。在代码中添加了对线程状态的判断和异常处理的代码,保证了线程控制的稳定性和可靠性。

操作系统实验3

操作系统实验3

操作系统实验3青岛科技⼤学实验报告2013年10 ⽉24⽇姓名王茂林专业集成电路班级 111班同组者课程操作系统实验项⽬试验3:进程的控制与互斥⼀、实验⽬的:1、掌握在⼦进程中使⽤execl()执⾏系统命令或调⽤其它已编译的可执⾏程序。

2、掌握⽗进程通过创建⼦进程完成某项任务的⽅法。

3、掌握系统调⽤exit()和_exit()的使⽤。

4、进⼀步理解进程并发执⾏的实质。

5、学习系统调⽤sleep()的使⽤⽅法。

6、学习系统调⽤lockf()的使⽤⽅法。

7、分析进程竟争资源的现象,学习解决进程互斥的⽅法。

⼆、实验内容:1、设计程序实现⽗进程创建多个⼦进程,⼦进程使⽤execl()函数调⽤已编译的其他可执⾏程序。

2、运⾏实验指导书32页程序,分析程序执⾏结果。

3、设计⼀程序,⽗进程创建⼀个⽂本⽂件,多个⼦进程利⽤系统调⽤lockf()实现对该⽂件进⾏互斥读或写操作。

三、实验步骤及结果:1、启动windows下已经安装好的VMware虚拟机进⼊linux系统2、等待系统初始化完毕后启动命令终端3、阅读实验指导书4、运⾏以下程序,分析程序运⾏结果。

运⾏程序如下:# include# include#include# includemain(){int p;printf("this is parent1");p=fork();if(p>0)printf("this is parent2");else{printf("this is child first\n");printf("this is child second");_exit(0);}}写⼊如下命令:执⾏后,将打开⽂本编辑器gedit书写如下源代码,保存。

编译运⾏后出现如下结果:在以上程序中,若将_exit(0)换为exit(0),运⾏结果为:原因:系统调⽤exit()和_exit()作⽤为使进程⾃动退出系统,他们的区别如下: exit():终⽌调⽤进程的执⾏。

操作系统实验三

操作系统实验三

实验三进程的创建一、实验目的·练习使用EOS API 函数CreateProcess 创建一个进程,掌握创建进程的方法,理解进程和程序的区别。

·调试跟踪CreateProcess 函数的执行过程,了解进程的创建过程,理解进程是资源分配的基本单位。

·调试跟踪CreateThread 函数的执行过程,了解线程的创建过程,理解线程是调度的基本单位。

二、实验内容1、执行了实验指导书3.2的步骤,学习到了如何使用控制台命令创建一个EOS应用程序的进程,结果如下图所示。

2、执行了实验指导书3.3的步骤,学习到了如何使用控制台命令创建一个EOS应用程序的进程,结果如下图所示。

3、执行了实验指导书3.4的步骤,观察到了系统中有三个进程,其中第一个是系统进程,镜像名称为空;另外两个是刚刚创建的应用程序的进程,镜像名称分别为“A:\EOSApp.exe”和“A:\Hello.exe”。

其中,A:\EOSApp.exe进程是父进程,其主线程处于运行状态;A:\Hello.exe 进程是子进程,其主线程处于就绪状态,当父进程的主线程通过调用WaitForSingleObject 函数进入阻塞状态让出处理器后,这个处于就绪状态的线程就会占用处理器开始运行。

这两个应用程序的进程和线程的优先级都为8。

说明了处于阻塞队列的进程等到I/O完成后按照优先级策略排成就绪队列,等到获得CPU后便可立即执行。

4、执行了实验指导书3.5的步骤,观察到了用于存储内核管理的数据,已经使用的虚拟地址空间都大于0x80000000,说明了内核在4G 虚拟地址空间;观察到了CreateProcess 函数中所有指令的虚拟地址都是大于0x80000000 的,验证了内核程序(kernel.dll)位于高2G 虚拟地址空间;观察到了“反汇编”窗口中main 函数所有指令的虚拟地址都是小于0x80000000 的,说明应用程序(eosapp.exe)位于低2G 的虚拟地址空间中;观察到了调试PspCreateProcessEnvironment 函数时*NewProcess 的值的变化情况,了解了各个成员变量的初始化情况;用NewTwoProc.c 文件中的源代码替换EOS 应用程序项目中EOSApp.c 文件内的源代码,生成后启动调试,查看多个进程并发执行的结果如图所示,了解了通过编程的方式创建一个应用程序的多个进程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三操作系统进程调度算法一、实验目的和要求:目的:对操作系统中使用的进程调度算法进行改进性设计。

要求:对教材中所讲述的几种进程调度算法进行深入的分析,然后选取其中的一种算法进行改进,并编程实现此算法。

二、实验内容:1、设计进程控制块PCB表结构,分别适用于优先数调度算法和先来先服务调度算法。

2、建立进程就绪队列。

对两种不同算法编制入链子程序。

3、编制两种进程调度算法:1)优先数调度;2)先来先服务三、实验原理:先来先服务调度算法:按进程进入就绪队列的先后次序选择可以占用处理器的进程。

优先级调度算法:对每个进程确定一个优先数,该算法总是让优先数最高的进程先使用处理器。

对具有相同优先数的进程,再采用先来先服务的次序分配处理器。

系统常以任务的紧迫性和系统效率等因素确定进程的优先数。

进程的优先数可以固定的,也可随进程执行过程动态变化。

一个高优先数的进程占用处理器后,系统处理该进程时有两种方法,一是"非抢占式",另一种是"可抢占式"。

前者是此进程占用处理器后一直运行到结束,除非本身主动让出处理器,后者则是严格保证任何时刻总是让优先数最高的进程在处理器上运行(本实验采用“可抢占式”)。

四、实验提示:1、用两种算法对多个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。

2、为了便于处理,程序中的某进程运行时间以时间片为单位计算。

各进程的优先数及进程需运行的时间片数的初始值均由用户给定。

3、在优先数算法中,优先数可以先取值为n,进程每执行一次,优先数减3,进程还需要的cpu时间片数减1。

在先来先服务算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时进程还需要的时间片数减2,并排列到就绪队列的尾上。

4、对于遇到优先数一致的情况,采用FIFO策略解决。

5、流程图五、实验结论FCFS算法:void FCFS(){intstartWorkTime = 0;int first = get_firstProcess();isFinished_FCFS[first] = true;FinishTime[first] = ArrivalTime[first] + ServiceTime[first];startWorkTime += ServiceTime[first];WholeTime[first] = FinishTime[first] - ArrivalTime[first];WeightWholeTime[first] = WholeTime[first]/ServiceTime[first];intnextProcess = n;for (inti=1;i<n;i++){nextProcess = n;for (int j=0;j<n;j++){if (!isFinished_FCFS[j]){if (ArrivalTime[j]<=startWorkTime){if (nextProcess==n){nextProcess = j;}else{if (ArrivalTime[nextProcess]>ArrivalTime[j]){nextProcess=j;}}}}}isFinished_FCFS[nextProcess] = true;FinishTime[nextProcess] = ServiceTime[nextProcess] + startWorkTime;startWorkTime += ServiceTime[nextProcess];WholeTime[nextProcess] = FinishTime[nextProcess] - ArrivalTime[nextProcess];WeightWholeTime[nextProcess] =(double)WholeTime[nextProcess]/ServiceTime[nextProcess];}doubletotalWT = 0;doubletotalWWT = 0;for (inti=0;i<n;i++){totalWT+=WholeTime[i];totalWWT+=WeightWholeTime[i];}AverageWT_FCFS = totalWT/n;AverageWWT_FCFS = totalWWT/n;display();cout<<"平均周转时间="<<AverageWT_FCFS<<endl;cout<<"平均带权周转时间="<<AverageWWT_FCFS<<endl;cout<<"******************************************************"<<endl; }SJF算法:void SJF(){intstartWorkTime_SJF = 0;int first = get_firstProcess();isFinished_SJF[first] = true;FinishTime[first] = ArrivalTime[first] + ServiceTime[first];startWorkTime_SJF += ServiceTime[first];WholeTime[first] = FinishTime[first] - ArrivalTime[first];WeightWholeTime[first] = (double)WholeTime[first]/ServiceTime[first];intnextProcess_SJF = n;for (inti=1;i<n;i++){nextProcess_SJF = n;for (int j=0;j<n;j++){if (!isFinished_SJF[j]){if (ArrivalTime[j]<=startWorkTime_SJF){if (nextProcess_SJF==n){nextProcess_SJF = j;}else{if (ServiceTime[nextProcess_SJF]>ServiceTime[j]){nextProcess_SJF = j;}}}}}//for(j)isFinished_SJF[nextProcess_SJF] = true;FinishTime[nextProcess_SJF] = ServiceTime[nextProcess_SJF] + startWorkTime_SJF;startWorkTime_SJF += ServiceTime[nextProcess_SJF];WholeTime[nextProcess_SJF] = FinishTime[nextProcess_SJF] - ArrivalTime[nextProcess_SJF];WeightWholeTime[nextProcess_SJF] = (double)WholeTime[nextProcess_SJF]/ServiceTime[nextProcess_SJF];}//for(i)doubletotalWT = 0;doubletotalWWT = 0;for (inti=0;i<n;i++){totalWT+=WholeTime[i];totalWWT+=WeightWholeTime[i];}AverageWT_SJF = totalWT/n;AverageWWT_SJF = totalWWT/n;display();cout<<"平均周转时间="<<AverageWT_SJF<<endl;cout<<"平均带权周转时间="<<AverageWWT_SJF<<endl;cout<<"******************************************************"<<endl;}六、实验过程中所遇问题思考与讨论通过此次实验模拟了FCFS和FJS算法先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。

当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。

在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。

该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

SJF调度算法也存在不容忽视的缺点:该算法对长作业不利,如作业C的周转时间由10增至16,其带权周转时间由2增至3.1。

更严重的是,如果有一长作业(进程)进入系统的后备队列(就绪队列),由于调度程序总是优先调度那些(即使是后进来的)短作业(进程),将导致长作业(进程)长期不被调度。

该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理。

由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。

通过此次实验,获益匪浅。

相关文档
最新文档