《计算机操作系统》实验指导书-2015

合集下载

实验指导(2015完全版)

实验指导(2015完全版)

操作系统上机实验指导书(第一版)闫大顺李晟编著吴家培主审计算机科学与工程学院2014.8操作系统实验指导本课程是为《计算机操作系统》课所开的实验。

计算机操作系统课程是一门实践性很强的技术课程,本课程实验的目的在于培养学生的实践能力,促进理论与实践的结合。

要求学生通过上机编程,熟悉对操作系统原理,并熟练使用程序接口,并了解如何模拟操作系统原理的实现,从而加深对操作系统原理的领会,加深对操作系统实现方法的理解,与此同时使学生在程序设计方面也能够得到很大程度的提高。

实验的目的是使学生理论联系实际,提高学生系统理解与开发能力。

这里所列的实验分为必做和选做。

具体实验题的选择,不仅要考虑课程内容,而且要考虑学生目前的编程能力,要由浅入深。

教师可通过运行示例或动画,帮助学生理解实验要求。

学生应选择自己熟悉的语言与开发环境去完成实验。

根据以往的教学经验,Delphi、C++ Builder,JBuilder由于提供了许多可重用的构件,易于学习、使用,VC++学习、使用困难较多。

实验要求尽量在windows操作系统下,也可以在Linux下完成,由于多数没有专门学习Linux,在其平台下做试验比较困难。

实验的硬件要求是能够支持VC++、Delphi、C++ Builder,JBuilder的微机即可。

每个学生都独立在一台计算机上完成自己的实验内容,杜绝学生的抄袭。

实验报告的要求1. 每位同学准备实验报告本,上机前作好充分的准备工作,预习本次实验的内容,事先熟悉与实验有关的软硬件环境。

2. 实验时遵守实验室的规章制度,爱护实验设备,对于实验设备出现的问题,要及时向指导老师汇报。

3. 提交实验文件格式:[班级][学号]_[实验题号].[扩展名]例:计051班学号为03的学生第四个实验的文件名为:j05103_4.c4. 最终的实验报告按照实验名称、实验目的、实验内容,实验过程(程序设计、实现与调试)、实验总结五部分书写,按时上交。

计算机操作系统 实验指导书

计算机操作系统 实验指导书

Linux 实验指导书Linux操作系统是一个向用户开放源码的免费的类UNIX操作系统。

它为在校学生学习操作系统课程提供了一个看得见摸得着的范例。

对于学生正确理解,掌握操作系统的基本知识具有重要意义。

鉴于此,本操作系统课程涉及的实验均在linux环境下进行。

安装linux系统的免费网址:ftp://ftp://ftp://要求:熟悉Linux的操作和开发环境首先介绍几个关于Linux系统的系统调用函数说明、参考值及定义1、fork()创建一个新进程。

int fork()其中返回值int联值意义如下:0:创建子进程,从子进程返回的id值大于0:从父进程返回的子进程id值-1:创建失败其源代码:#include <sys/types.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <string.h>extern int errno;int main(){char buf[100];pid_t cld_pid;int fd;int status;if ((fd=open("temp",O_CREA T|O_TRUNC | O_RDWR,S_IRWXU)) == -1){printf("open error %d",errno);exit(1);}strcpy(buf,"This is parent process write\n");if ((cld_pid=fork()) == 0){ /* 这里是子进程执行的代码*/strcpy(buf,"This is child process write\n");printf("This is child process\n");printf("My PID(child) is %d\n",getpid()); /*打印出本进程的ID*/printf("My parent PID is %d\n",getppid()); /*打印出父进程的ID*/write(fd,buf,strlen(buf));close(fd);exit(0);}else{ /* 这里是父进程执行的代码*/printf("This is parent process\n");printf("My PID(parent) is %d\n",getpid()); /*打印出本进程的ID */printf("My child PID is %d\n",cld_pid); /*打印出子进程的ID*/write(fd,buf,strlen(buf));close(fd);}wait(&status);}2、lockf(files,function,size)用作锁定文件的某些段或者整个文件,本函数适用的头文件为#include <unistd.h>参数定义:int lockf(files,function,size)int files,function;long size;其中:files是文件描述符:function是锁定和解锁;1表示锁定,0表示解锁。

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书实验概述本次操作系统实验是为了让学生通过实践了解操作系统的基本概念,原理和使用。

通过完成实验,学生将了解操作系统内核,进程调度,文件系统和输入输出等关键组成部分。

实验环境实验要求使用 Linux 操作系统,可以选择任意一种 Linux 发行版。

可以在物理机上安装 Linux,也可以使用虚拟机软件(如 VirtualBox)来运行 Linux 虚拟机。

实验准备在进行实验之前,需要完成以下准备工作:1.安装 Linux 操作系统(如 Ubuntu、Fedora 等)或虚拟机软件(如VirtualBox)。

2.熟悉 Linux 基本命令和操作,包括文件操作、进程管理等。

实验内容本次操作系统实验分为以下几个部分:1. 实验一:进程管理本部分实验要求学生了解进程管理的基本概念和原理,掌握进程创建、终止和状态转换等操作。

学生需要完成以下任务:•编写一个简单的 C 程序,实现进程的创建、终止和状态转换功能。

•使用 Linux 命令行工具编译、运行和调试 C 程序。

•观察和分析进程的状态转换过程。

2. 实验二:进程调度本部分实验要求学生了解进程调度算法的原理和实现方法,掌握优先级调度、轮转调度和最短作业优先调度等算法。

学生需要完成以下任务:•编写一个简单的 C 程序,模拟进程调度算法的执行过程。

•使用 Linux 命令行工具编译、运行和调试 C 程序。

•观察和分析不同调度算法对进程执行顺序的影响。

3. 实验三:文件系统本部分实验要求学生了解文件系统的基本概念和实现原理,掌握文件的创建、读写和删除等操作。

学生需要完成以下任务:•编写一个简单的 C 程序,实现文件的创建、读写和删除功能。

•使用 Linux 命令行工具编译、运行和调试 C 程序。

•观察和分析文件系统的存储结构和操作过程。

4. 实验四:输入输出本部分实验要求学生了解操作系统的输入输出机制和设备驱动程序的原理和实现方法,掌握文件读写、设备驱动和错误处理等操作。

各种笔记-计算机操作系统实验指导书20151130

各种笔记-计算机操作系统实验指导书20151130

实验一进程控制描述与控制[1] Windows“任务管理器”的进程管理背景知识Windows 2000的任务管理器提供了用户计算机上正在运行的程序和进程的相关信息,也显示了最常用的度量进程性能的单位。

使用任务管理器,可以打开监视计算机性能的关键指示器,快速查看正在运行的程序的状态,或者终止已停止响应的程序。

也可以使用多个参数评估正在运行的进程的活动,以及查看CPU 和内存使用情况的图形和数据。

其中:1) “应用程序”选项卡显示正在运行程序的状态,用户能够结束、切换或者启动程序。

2) “进程”选项卡显示正在运行的进程信息。

例如,可以显示关于CPU 和内存使用情况、页面错误、句柄计数以及许多其他参数的信息。

3) “性能”选项卡显示计算机动态性能,包括CPU 和内存使用情况的图表,正在运行的句柄、线程和进程的总数,物理、核心和认可的内存总数(KB) 等。

实验目的通过在Windows 任务管理器中对程序进程进行响应的管理操作,熟悉操作系统进程管理的概念,学习观察操作系统运行的动态性能。

工具/准备工作在开始本实验之前,请回顾教科书的相关内容。

需要准备一台运行Windows 2000 Professional操作系统的计算机。

实验内容与步骤1. 使用任务管理器终止进程2. 显示其他进程计数器3. 更改正在运行的程序的优先级启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口。

在本次实验中,你使用的操作系统版本是:____________________________________________________________________当前机器中由你打开,正在运行的应用程序有:1) __________________________________________________________________2) __________________________________________________________________3) __________________________________________________________________4) __________________________________________________________________5) __________________________________________________________________Windows“任务管理器”的窗口由______个选项卡组成,分别是:1) __________________________________________________________________2) __________________________________________________________________3) __________________________________________________________________当前“进程”选项卡显示的栏目分别是(可移动窗口下方的游标/箭头,或使窗口最大化进行观察) :1) __________________________________________________________________2) __________________________________________________________________3) __________________________________________________________________4) __________________________________________________________________5) __________________________________________________________________6) __________________________________________________________________7) __________________________________________________________________8) __________________________________________________________________1. 使用任务管理器终止进程步骤1:单击“进程”选项卡,一共显示了______个进程。

计算机操作系统实验指导书

计算机操作系统实验指导书

实验一UNIX/LINUX入门实验目的1、了解UNIX的命令及使用格式。

2、熟悉UNIX/LINUX的常用基本命令。

实验内容1、通过WINDOWS操作系统中的远程登录程序telnet.exe 登录UNIX。

2、熟悉UNIX/LINUX的常用基本命令如ls、who、w、pwd、ps、pstree、top等。

实验指导一、UNIX的登录与退出1、登录在DOS环境下用MS提供的telnet程序(也可使用WINDOWS 自带的telnet图形界面程序或多功能的S-Term终端程序),可使PC作为终端(terminal)登录(login)UNIX服务器(UNIX Server)。

(1)执行格式:telnet hostname(主机名)或telnet 主机的IP地址例:telnet telnet 140.122.77.120(2)步骤login:(输入username)password:(输入密码)2、退出在UNIX系统提示符$下,输入logout、exit或shutdown 。

例:$ logout二、UNIX命令格式命令[选项] [处理对象]例:ls -la mydir注意:(1)命令一般是小写字串。

注意大小写有别(2)选项通常以减号(-)再加上一个或数个字符表示,用来选择一个命令的不同操作(3)同一行可有数个命令,命令间应以分号隔开(4)命令后加上&可使该命令后台(background)执行三、常用命令1、目录操作和DOS相似,UNIX采用树型目录管理结构,由根目录(/)开始一层层将子目录建下去,各子目录以/ 隔开。

用户login后,工作目录的位置称为home directory,由系统管理员设定。

‗~‘符号代表自己的home directory,例如~/myfile 是指自己home目录下myfile这个文件。

UNIX的通配符有三种:‘*‘ 和‘?‘ 用法与DOS相同,‗-‗代表区间内的任一字符,如test[0-5]即代表test0,test1,……,test5的集合。

操作系统实验指导书[2015春季学期]

操作系统实验指导书[2015春季学期]

操作系统实验指导书计算机科学与软件学院2015年实验一进程控制与描述一、实验目的通过对Windows XP编程,进一步熟悉操作系统的基本概念,较好地理解Windows XP的结构。

通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows XP进程的“一生”。

二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows XP,Visual C++ 6.0专业版或企业版。

三、实验内容和步骤第一部分Windows 编程Windows XP可以识别的程序包括控制台应用程序、GUI应用程序和服务应用程序。

本实验中主要用到的是控制台应用程序和GUI应用程序。

1、简单的控制台应用程序创建一个名为“Hello”的应用程序, 在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将程序键入记事本中,并把代码保存为1-1.cpp。

程序1-1 Windows XP的GUI应用程序#include <iostream>void main(){Std::cout<<”Hello, Windows XP”<<std::endl;}在“命令提示符”窗口运行CL.EXE,产生1-1.EXE文件:C:\> CL 1-1.cpp运行1-1.EXE程序,运行结果是:(如果运行不成功,则可能的原因是什么?)________________________________________________________________________________________________________________________________________2、GUI应用程序Windows XP Professional下的GUI应用程序,使用Visual C++编译器创建一个GUI应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。

计算机操作系统实验指导书

操书作系统实验指导实验目录实验一动态优先权进程调度 (3)实验二作业调度 (9)实验三动态分区首次适应分配算法模拟 (18)实验四请求分页存储管理页面淘汰模拟 (24)实验五磁盘调度算法模拟 (31)实验一动态优先权进程调度一、实验目的与要求:1.掌握进程调度中的优先权调度算法过程;2.掌握进程调度中时间片轮转调度算法的过程;3.加深掌握程序在Visual C++6.0环境下的编译、调试和运行。

二、实验内容:编写程序,用C语言来实现对N个进程采用动态优先权算法的进程调度。

每个进程使用进程pcb结构来描述。

优先数改变原则:进程在就绪队列中多呆一个时间片,优先数增加1;进程每运行一个时间片,优先数减3。

三、实验器材:微机+windows操作系统+VC++6.0四、实验步骤:#include <iostream>#include <iomanip>#include <algorithm>#include "define.h"using namespace std;PCB READY_QUEUE; // 就绪队列PCB BLOCK_QUEUE; // 阻塞队列bool compare_priority(const PCB& p1, const PCB& p2){return p1.PRIORITY > p2.PRIORITY;}bool compare_id(const PCB& p1, const PCB& p2){return p1.ID < p2.ID;}// inital PCB dataPCB produces[5]={{0,9,0,3,2,3,READY,NULL},{1,38,0,3,-1,0,READY,NULL},{2,30,0,6,-1,0,READY,NULL},{3,29,0,3,-1,0,READY,NULL},{4,0,0,4,-1,0,READY,NULL}};// inital queue( ready queue , block queue );void inital_queue(){READY_QUEUE.NEXT = NULL;BLOCK_QUEUE.NEXT = NULL;PCB * r = &READY_QUEUE;PCB * b = &BLOCK_QUEUE;// sort order by PRIORITY (DEC)sort(produces, &produces[4], compare_priority);for(int i=0; i<5; i++){if(produces[i].ALLTIME == 0){produces[i].STATE = FINISH;continue;}if(produces[i].STATE == BLOCK && produces[i].BLOCKTIME == 0){// block -> readyr->NEXT = &produces[i];produces[i].STATE = READY;r = r->NEXT;}else if(produces[i].STATE == BLOCK && produces[i].BLOCKTIME != 0) {// block -> blcokb->NEXT = &produces[i];produces[i].STATE = BLOCK;b = b->NEXT;}else if(produces[i].STATE == READY && produces[i].STARTBLOCK == 0) {// ready -> blockb->NEXT = &produces[i];produces[i].STATE = BLOCK;b = b->NEXT;}else if(produces[i].STATE == READY && produces[i].STARTBLOCK != 0) {// ready -> readyr->NEXT = &produces[i];produces[i].STATE = READY;r = r->NEXT;}}}void run(){PCB * r = READY_QUEUE.NEXT; // r point to the ready queue first pcb PCB * b = BLOCK_QUEUE.NEXT; // b point to the block queue first pcb PCB * running_pcb = r;r = r->NEXT;cout<<"--------------正在执行的进程--------------" << endl;cout << "running produce's ID = " << running_pcb->ID << endl;// update datarunning_pcb->ALLTIME--;running_pcb->CPUTIME++;running_pcb->PRIORITY -= 3;running_pcb->STARTBLOCK--;while(r){r->PRIORITY++;r = r->NEXT;}while(b){b->BLOCKTIME--;b = b->NEXT;}}void print_pcb(){cout<<"---------------就绪,阻塞队列-------------" << endl;PCB * r = READY_QUEUE.NEXT;cout << "READY_QUEUE -> ";while(r!=NULL){cout << "ID" << r->ID << " -> ";r = r->NEXT;}cout << " NULL " << endl;PCB * b = BLOCK_QUEUE.NEXT;cout << "BLOCK_QUEUE -> ";while(b!=NULL){cout << "ID" << b->ID << " -> ";b = b->NEXT;}cout << " NULL " << endl;PCB temp[5];memcpy(temp, produces, 5*sizeof(PCB));ort(temp, &temp[4], compare_id);cout <<"----------------所有进程信息--------------" << endl;cout << setw(11) << "ID"<< setw(11) << "PRIORITY"<< setw(11) << "CPUTIME"<< setw(11) << "ALLTIME"<< setw(11) << "STARTBLOCK"<< setw(11) << "BLOCKTIME"<< setw(11) << "STATE" << endl;for(int i=0; i<5; i++){cout << setw(11) << temp[i].ID ;cout << setw(11) << temp[i].PRIORITY ; cout << setw(11) << temp[i].CPUTIME ; cout << setw(11) << temp[i].ALLTIME ; cout << setw(11) << temp[i].STARTBLOCK ; cout << setw(11) << temp[i].BLOCKTIME ; if(temp[i].STATE==READY)cout << setw(11) << "READY" ;else if(temp[i].STATE==BLOCK)cout << setw(11) << "BLOCK" ;else if(temp[i].STATE==FINISH)cout << setw(11) << "FINISH" ;cout << endl;}}int main(){inital_queue();while(READY_QUEUE.NEXT!=NULL){run();inital_queue();print_pcb();system("pause");}cout << "finish all produces" << endl; return 0;}//头文件#ifndef DEFINE_H#define DEFINE_H// STATE#define READY 1#define BLOCK 2#define RUN 3#define FINISH 4// struct declarationstruct PCB{int ID;int PRIORITY;int CPUTIME;int ALLTIME;int STARTBLOCK;int BLOCKTIME;int STATE;PCB * NEXT;};void print_pcb();void inital_queue();void run();#endif五、实验结果:本次实验输入了5个进程,到达时间均为0。

操作系统课程设计指导书2015

操作系统课程设计指导书赵伟华梁红兵刘真2013年2月计算机学院目录第一章操作系统课程设计的内容与实施方法.............................................................. - 3 -1.1 操作系统课程设计总体要求............................................................................. - 3 -1.2 操作系统课程设计的内容................................................................................. - 3 -1.3 操作系统课程设计实施方案............................................................................. - 3 - 第二章基于DOS的多任务系统的实现........................................................................ - 5 -2.1 设计目的和内容要求......................................................................................... - 5 -2.2 线程描述.......................................................................................................... - 6 -2.3 线程的创建和撤消.......................................................................................... - 8 -2.4 线程调度设计................................................................................................ - 10 -2.5 基本实例程序的实现.................................................................................... - 23 -2.6 线程的阻塞和唤醒........................................................................................ - 26 -2.7 线程的同步与互斥........................................................................................... - 26 -2.8 利用消息缓冲队列通信机制实现线程间通信............................................... - 27 - 第三章简单文件系统的实现.................................................................................... - 32 -3.1 设计目的和内容要求......................................................................................... - 32 -3.2 预备知识............................................................................................................. - 33 -3.3实例系统的设计与实现...................................................................................... - 36 -操作系统课程设计第一章操作系统课程设计的内容与实施方法1.1 操作系统课程设计总体要求1.遵守机房纪律,服从机房调度。

14-15(2)实验指导书

《操作系统》实验讲义计算机科学与工程学院2015年3月实验一Linux初步实验预备知识一、创建实验平台如果实验室里的计算机安装了Windows操作系统,则可以先安装VMWare软件(一般使用工作站版本)并启动它,来创建一个虚拟机,然后在其中安装Linux操作系统。

这样就可以从虚拟机中启动Linux系统,并完成相应的实验。

VMWare软件和Linux操作系统的安装十分简单,这里就不做介绍。

二、Linux下的proc文件系统在Linux操作系统中,提供了一套非常有用的在用户态检查内核状态和系统特征的机制,这就是proc文件系统。

该文件系统安装在/proc 目录中。

比起Windows的任务管理器来,proc文件系统的功能更强大:它能提供更多的系统信息,能修改部分系统信息,还能通过编程来扩充其中的内容。

该文件系统将进程的地址空间、系统的硬件信息(包括CPU、内存状态以及网卡等各种硬件设备)、系统相关机制(中断、I/O)等内容全部设置成虚拟的Linux文件。

它以一种特殊的文件系统的方式,为访问系统内核数据的操作提供接口。

也就是说,这个文件系统中所有的文件都是特殊文件,这些特殊文件一般与外部设备无关,所涉及到的介质通常室内存和CPU。

当从一个特殊文件“读”出时,所读出的数据都是由系统内部按一定的规则临时生成的,或从内存中收集、加工出来的,反之亦然。

换言之,这些文件的内容都不存在任何存储设备上,而是在读/写的时候才根据系统中的有关信息生成出来,或映射到系统中的有关变量或数据结构中。

/proc 目录中的每个文件都有一组分配给它的非常特殊的文件许可权,并且每个文件属于特定的用户标识,这里面的文件仅仅包含以下几种权限(除非root用户特别授权):●只读任何用户都不能更改该文件,它用于表示系统信息。

●root写/proc 目录中的一些文件是可写的,但通常只能由root用户来写。

●root读有些文件对一般系统用户是不可见的,而对root用户是可见的。

《计算机操作系统》实验指导书

宁夏师范学院——数学与计算机科学学院《操作系统》实验指导《OPERATING SYSTEM》2013.08前言计算机操作系统是计算机科学与技术专业的主要专业基础课程,其实践性、应用性很强。

实践教学环节是必不可少的一个重要环节。

计算机操作系统的实验目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握操作系统的基本原理,加深对操作系统基本方法的理解,加深对课堂知识的理解,为学生综合运用所学知识,在Linux环境下调用一些常用的函数编写功能较简单的程序来实现操作系统的基本方法、并在实践应用方面打下一定基础。

要求学生在实验指导教师的帮助下自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个实验解决一类问题。

要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,并且能够进行简单分析和判断;能够熟练使用Linux用户界面;掌握操作系统中进程的概念和控制方法;了解进程的并发,进程之间的通信方式,了解虚拟存储管理的基本思想。

同时培养学生进行分析问题、解决问题的能力;培养学生完成实验分析、实验方法、实验操作与测试、实验过程的观察、理解和归纳能力。

为了收到良好的实验效果,编写了这本实验指导书。

在指导书中,每一个实验均按照该课程实验大纲的要求编写,力求紧扣理论知识点、突出设计方法、明确设计思路,通过多种形式完成实验任务,最终引导学生有目的、有方向地完成实验任务,得出实验结果。

任课教师在实验前对实验任务进行一定的分析和讲解,要求学生按照每一个实验的具体要求提前完成准备工作,如:查找资料、设计程序、完成程序、写出预习报告等,做到有准备地上机。

进行实验时,指导教师应检查学生的预习情况,并对调试过程给予积极指导。

实验完毕后,学生应根据实验数据及结果,完成实验报告,由学习委员统一收齐后交指导教师审阅评定。

目录操作系统实验大纲 (1)第一部分实验环境及所用系统函数介绍 (4)1.1 Linux操作系统简介 (4)1.2 Linux的使用 (4)第二部分实验内容 (8)实验一熟悉LINUX基本命令及编程环境 (8)实验二进程管理 (11)实验三进程调度 (15)实验四进程间通信 (20)实验五存储管理实验 (23)操作系统实验大纲一、教学目的和要求操作系统课程是一门理论性很强的专业课,操作系统实验是该课程的辅助课程。

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

《计算机操作系统》实验指导书实验类别:课内实验实验课程名称:计算机操作系统实验室名称:计算机科学与技术专业实验室实验课程编号: N02140113总学时:8 学分: 4.5适用专业:软件工程先修课程:计算机导论及操作、计算机硬件实验一进程同步控制1、开发语言及实现平台或实验环境C++/JA V ATurbo C / Microsoft Visual Studio 6.0 / Microsoft Visual Studio .NET 20102、实验目的(1)加强对进程概念的理解,尤其是对进程的同步与互斥机制的理解。

(2)分析进程竞争资源的现象,学习解决进程互斥与同步的方法。

3、实验要求(1)理解利用进程控制机制;(2)理解利用信号量进行进程同步控制原理;(3)使用某种编程语言进行模拟实现生产者-消费者进程。

4、实验原理(注意:这个仅是个例子,仅供参考)生产者-消费者问题描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。

为使生产者进程与消费者进程能够并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可以从一个缓冲区中取走产品去消费。

尽管所有的生产者和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已经装满产品的缓冲区中投放产品。

这是一个同步与互斥共存的问题。

生产者—消费者问题是一个同步问题。

即生产者和消费者之间满足如下条件:(1) 消费者想接收数据时,有界缓冲区中至少有一个单元是满的。

(2) 生产者想发送数据时,有界缓冲区中至少有一个单元是空的。

故设置两个信号量:(1) empty:说明空缓冲区的数目,初值为有界缓冲区的大小N。

(2) full:说明已用缓冲区的数目,初值为0。

由于有界缓冲区是临界资源,因此,各生产者进程和各消费者进程之间必须互斥执行。

故设置一个互斥信号量mutex,其初值为1。

5、实验步骤参考实验代码如下:class Q{String name;int num=0;int size=10;}class Producer implements Runnable{Q q;Producer(Q q){this.q = q;="producer";}public void run(){while(true){synchronized(q){if(q.num<q.size){q.num++;System.out.println("producer已生产第:"+q.num+"个产品!");try{Thread.currentThread().sleep(100);} catch(InterruptedException e) {e.printStackTrace();}q.notify();}else{try{System.out.println("producer stop!");q.wait();} catch(InterruptedException e) {e.printStackTrace();}}}}}}class Consumer implements Runnable{Q q;Consumer(Q q){this.q = q;="consumer";}public void run(){while(true){synchronized(q){if(q.num>0){System.out.println("consumer要消费第:"+q.num+"个产品!");q.num--;try{Thread.currentThread().sleep(100);} catch(InterruptedException e) {e.printStackTrace();}q.notifyAll();}else{try{System.out.println("consumer stop!");q.wait();} catch(InterruptedException e) {e.printStackTrace();}}}}}}public class project{public static void main(String[] args){Q q = new Q();new Thread(new Producer(q)).start();new Thread(new Consumer(q)).start();}}实验二进程调度实验1、开发语言及实现平台或实验环境C++/JAVATurbo C / Microsoft Visual Studio 6.0 / Microsoft Visual Studio .NET 20102、实验目的(1)加深对进程的概念及进程调度算法的理解;(2)在了解和掌握进程调度算法的基础上,编制进程调度算法通用程序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。

3、实验要求(1)了解进程调度;(2)理解利用进程调度算法进行调度的原理;(3)使用某种编程语言进行算法模拟。

4、实验原理(注意:这个仅是个例子,可以参考本例,选择其他算法进行实验)一、例题:设计一个有N个进程的进程调度算法。

进程调度算法:采用最高优先数的调度算法(即把处理机分配给优先数最高的进程)。

每个进程有一个进程控制块(PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

进程的优先数及需要的运行时间可以事先人为的指定(也可以由随机数产生)。

进程的到达时间为进程的输入的时间。

进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

就绪进程获得CPU后都只能运行一个时间片。

用已占用CPU时间加1表示。

如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后,进程的已占用CPU时间还未达到所需要的运行时间,也就是进程还需要继续运行,此时应该将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。

重复以上过程,直到所要的进程都完成为止。

分析:使用固定队列与静动态优先级结合每个优先级为0~0xFF,并且以小的数字为高优先级,大的数字为低优先级,每次皆使用循环得到最高优先级的进程并执行,然后将其动态优先级设置为最低,并将其他进程动态优先级提高,以使得每个进程都有机会运行。

进程的优先级与运行时间由随机数产生。

二、代码试例#include <stdlib.h>#include <stdio.h>#include <time.h>/*常量和状态定义*/#define PRO_NUM 0x05 #define MAX_TIME 0xFF /*状态宏*/#define WAIT 0x01#define RUN 0x02#define FINISH 0x03#define ID_ERROR 0x10#define MIN_PRIOR 0xFF#define MAX_PRIOR 0x00typedef unsigned int Uint32;/*进程PCB*/struct PCB_Info{Uint32 s_id;Uint32 s_static_prior;Uint32 s_dynamic_prior;Uint32 s_start_time;Uint32 s_need_time;Uint32 s_used_time;Uint32 s_state;};/*进程队列*/PCB_Info g_queue[5];Uint32 g_time;/*模拟进程执行函数*/void Simulator();/*初始化5个进程函数*/void Init_Process();/*初始化进程队列函数*/void Init_Queue();/*创建进程函数*/Uint32 Create_Process(Uint32 pri,Uint32 needtime); /*系统运行函数*/void Run_Process();/*得到最高优先级进程ID函数*/Uint32 Get_PriProcess();/*进程时间片执行函数*/void Work_Process(Uint32 id);/*改变进程状态和优先级函数*/void Change_Process(Uint32 id);/*打印进程状态函数*/void Print_State();/*结束系统函数*/void End_Process();/*入口函数*/int main( int argc, char *argv[ ]){Simulator();return 0;}void Simulator(){Init_Process();Run_Process();End_Process();}void Init_Process(){int i;Uint32 id;srand( (unsigned)time( NULL ) );Init_Queue();for(i=0;i<PRO_NUM;++i){/*在这里修改随机数的范围,建议优先级取值为0到4之间,进程工作总时间为1到10之间*/id=Create_Process(rand()%4,1+rand()%10);if(id!=ID_ERROR){printf("**********************************\n");printf("创建进程成功\n");printf("进程ID号为:%d\n",id);printf("进程的静态优先权为:%d\n",g_queue[id].s_static_prior);printf("进程的动态优先权为:%d\n",g_queue[id].s_dynamic_prior);printf("进程的到达时间为:%d\n",g_queue[id].s_start_time);printf("进程需要时间为:%d\n",g_queue[id].s_need_time);printf("进程已用CPU时间为:%d\n",g_queue[id].s_used_time);printf("进程的状态为:%d\n",g_queue[id].s_state);printf("\n");}else{printf("创建进程失败\n");}}}void Init_Queue()int i;for(i=0;i<PRO_NUM;++i){g_queue[i].s_id=i;g_queue[i].s_dynamic_prior=MIN_PRIOR;g_queue[i].s_need_time=0;g_queue[i].s_start_time=0;g_queue[i].s_static_prior=MIN_PRIOR;g_queue[i].s_used_time=0;g_queue[i].s_state=FINISH;}}Uint32 Create_Process(Uint32 pri,Uint32 needtime) {int i=0;Uint32 id=ID_ERROR;for(i=0;i<PRO_NUM;++i){if(g_queue[i].s_state==FINISH){id=g_queue[i].s_id;g_queue[i].s_dynamic_prior=MIN_PRIOR;g_queue[i].s_need_time=needtime;g_queue[i].s_start_time=g_time;g_queue[i].s_state=WAIT;g_queue[i].s_static_prior=pri;g_queue[i].s_used_time=0x0;break;}}return id;}void Run_Process(){Uint32 id;while((id=Get_PriProcess())!=ID_ERROR){Work_Process(id);Change_Process(id);}}void Print_State(){int i;printf("时间进程ID\t状态已用时间需要时间开始时间静优先级动优先级\n");for(i=0;i<PRO_NUM;++i){printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",g_time,g_queue[i].s_id,g_queu e[i].s_state,g_queue[i].s_used_time,g_queue[i].s_need_time,g_queue[i].s_start_time,g_queue[i].s_static_prior,g_queue[i].s_dynamic_prior);}}Uint32 Get_PriProcess(){Uint32 id=ID_ERROR;int i,prev_id=ID_ERROR;Uint32 prior=MIN_PRIOR*2,temp_prior;for(i=0;i<PRO_NUM;++i){if(g_queue[i].s_state!=FINISH){temp_prior=g_queue[i].s_dynamic_prior+g_queue[i].s_static_prior;if(temp_prior<=prior){id=i;prior=temp_prior;}}}return id;}void Work_Process(Uint32 id){++g_time;g_queue[id].s_state=RUN;++g_queue[id].s_used_time;Print_State();}void Change_Process(Uint32 id){int i;if(g_queue[id].s_need_time==g_queue[id].s_used_time){g_queue[id].s_state=FINISH;}else{g_queue[id].s_dynamic_prior=MIN_PRIOR;g_queue[id].s_state=WAIT;}for(i=0;i<PRO_NUM;++i){if((i!=id)&&(g_queue[i].s_state!=FINISH)){g_queue[i].s_dynamic_prior>0?--g_queue[i].s_dynamic_prior:g_queue[i].s_dyna mic_prior=0;}}}void End_Process(){printf("所有进程结束状态:\n");Print_State();printf("所有进程已经结束!\n");}实验三银行家算法模拟1、开发语言及实现平台或实验环境C++/JA V ATurbo C / Microsoft Visual Studio 6.0 / Microsoft Visual Studio .NET 20102、实验目的(1)理解利用银行家算法避免死锁的问题;(2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。

相关文档
最新文档