进程管理模拟实验指导书09

合集下载

实验一 进程管理模拟

实验一 进程管理模拟

3 、实验步骤: 实验步骤:
( 1 )复习进程管理部分内容 ( 2 )预习 C++ Builder 或 VC 、 Dephi 、 J++ Builder 线程编程 运行示例程序, ( 3 )运行示例程序,进一步明确实验要求 上机编程, ( 4 )上机编程,调式程度 ( 5 )完成实验报告
实验一
进程ቤተ መጻሕፍቲ ባይዱ理
1 、实验目的: 实验目的:
• 通过本次实验,进一步理解进程 PCB 的概 通过本次实验, 如何实现, 念,以及 PCB 如何实现,组织 • 复习数据结构中如何对链的操作,包括建 复习数据结构中如何对链的操作, 删除、 链、删除、插入结点等 • 通过实验使学生进一步了解进程、进程状 通过实验使学生进一步了解进程、 态、进程控制块等基本概念
2 、实验内容: 实验内容:
建立一个结点, ( 1 )建立一个结点,即 PCB 块包括用户标 识域、状态域(执行、等待、就绪)、 识域、状态域(执行、等待、就绪)、 link 域 建立三个队列(执行队列、就绪队列、 ( 2 )建立三个队列(执行队列、就绪队列、 等待队列) 等待队列) ( 3 )根据进程状态转换实现对三个队列的 具体操作 ( 4 )用 switch 选择语句选择状态 运行结果(其中的一种情况) ( 5 )运行结果(其中的一种情况)

进程管理模拟实验

进程管理模拟实验

进程管理一、目的与要求1.目的进程是操作系统最重要的概念之一,是了解操作系统实质的关键。

本课题实习的目的是,加深对进程概念及进程管理各部分内容的理解;熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构、通讯机构的实施。

2.要求要求设计一个允许n个进程并发运行的进程管理模拟系统。

该系统包括以下内容:(1)简单的进程控制(2)同步及通讯机构(3)中断机构(4)进程调度。

其进程调度算法可任意选择。

每个进程用一个PCB表示,其内容可根据具体情况设置。

各进程之间有一定的同步关系。

系统在运行过程中应能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。

二、范例1.题目支持多个进程并发运行的简单进程管理模拟系统本系统的同步机构采用信号量上的P、V操作的机制;控制机构包括阻塞和唤醒操作;时间片中断处理程序模拟时间片中断;进程调度程序负责为各进程分配处理机。

系统中涉及了3个并发进程。

它们之间的关系是:3个进程需要互斥使用临界资源S2,进程1和进程2又需互斥使用临界资源S1.本系统在运行过程中随机打印出各进程的状态变换过程,系统的调度过程及公共变量的变化情况。

2.算法与N~S图系统为进程设置了5种运行状态:e—执行态;r—高就绪态;t—低就绪态(执行进程因时间片到限而转入);w—等待态;c—完成态。

各进程的初始状态均设置为r.系统分时执行各进程,并规定3个进程的执行概率均为33%。

通过产生随机数x来模拟时间片。

当进程process1访问随机数x时,若x>=0.33;当进程process2访问x时,若x<0.33或x>=0.66;当进程process3访问x时,若x<0.66,则分别认为各进程的执行时间片到限,产生“时间片中断”而转入低就绪态t。

进程调度算法采用剥夺式最高优先数法。

各进程的优先数通过键盘输入予以静态设置。

调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。

操作系统实验1--进程管理

操作系统实验1--进程管理

设计一个有N个进程的进程调度程序一、实验目的通过一个简单的进程调度模拟程序的实现,加深对各种进程调度算法,进程切换的理解。

二、实验内容1、进程调度算法:采用动态最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)。

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

进程控制块可以包含如下信息:●进程名----进程标示数ID;●优先数----Priority,优先数越大优先权越高;●到达时间----进程的到达时间为进程输入的时间;●进程还需要运行时间----AllTime,进程运行完毕AllTime =0;●已用CPU时间----CPUTime;●进程的阻塞时间StartBlock----表示当进程在运行StartBlock个时间片后,进程将进入阻塞状态;●进程的阻塞时间StartTime----表示当进程阻塞StartTime个时间片后,进程将进入就绪状态;●进程状态----State;●队列指针----Next,用来将PCB排成队列。

3、调度原则●进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为进程输入的时间;●进程的运行时间以时间片为单位进行计算;●进程在就绪队列中带一个时间片,优先数加1;●每个进程的状态可以是就绪R(Ready)、运行R(Run)、阻塞B(Block)、或完成F(Finish)四种状态之一;●就绪进程获得CPU后都只能运行一个时间片,用已占用CPU时间加1来表示;●如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减3,然后把它插入就绪队列等待CPU;●每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查;●重复以上过程,直到所要进程都完成为止。

三、实验要求完成实验内容并写出实验报告,报告应具有以下内容:1、实验目的。

进程管理实验报告源代码(3篇)

进程管理实验报告源代码(3篇)

第1篇---进程管理实验报告一、实验目的1. 理解进程的概念和进程管理的基本原理。

2. 掌握进程的创建、调度、同步和通信等操作。

3. 通过编程实现简单的进程管理功能。

二、实验环境1. 操作系统:Windows/Linux2. 编程语言:C/C++3. 开发环境:Visual Studio/Code::Blocks三、实验内容1. 进程的创建与终止2. 进程的同步与互斥3. 进程的通信4. 进程调度算法四、实验步骤1. 进程的创建与终止```cinclude <stdio.h>include <sys/types.h>include <unistd.h>int main() {pid_t pid;// 创建子进程pid = fork();if (pid < 0) {// 创建进程失败perror("fork failed");return 1;} else if (pid == 0) {// 子进程printf("Child process, PID: %d\n", getpid()); // 执行子进程的任务...sleep(5); // 子进程暂停5秒_exit(0); // 子进程退出} else {// 父进程printf("Parent process, PID: %d\n", getpid()); wait(NULL); // 等待子进程结束printf("Child process has terminated.\n");}return 0;}```2. 进程的同步与互斥```cinclude <stdio.h>include <pthread.h>pthread_mutex_t mutex;void thread_func(void arg) {pthread_mutex_lock(&mutex); // 加锁printf("Thread %ld is running\n", (long)arg);sleep(1); // 模拟任务执行pthread_mutex_unlock(&mutex); // 解锁return NULL;}int main() {pthread_t thread1, thread2;// 初始化互斥锁pthread_mutex_init(&mutex, NULL);// 创建线程pthread_create(&thread1, NULL, thread_func, (void )1); pthread_create(&thread2, NULL, thread_func, (void )2); // 等待线程结束pthread_join(thread1, NULL);pthread_join(thread2, NULL);// 销毁互斥锁pthread_mutex_destroy(&mutex);return 0;}```3. 进程的通信```cinclude <stdio.h>include <stdlib.h>include <sys/ipc.h>include <sys/shm.h>int main() {key_t key;int shmid;int data;// 生成共享内存标识符key = ftok("shmfile", 65);// 创建共享内存段shmid = shmget(key, sizeof(int), 0666 | IPC_CREAT); if (shmid == -1) {perror("shmget failed");exit(1);}// 连接到共享内存段data = (int )shmat(shmid, (void )0, 0);if (data == (int )(-1)) {perror("shmat failed");exit(1);}// 使用共享内存data = 100;printf("Data in shared memory: %d\n", data); // 分离共享内存段if (shmdt(data) == -1) {perror("shmdt failed");exit(1);}// 删除共享内存段if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl failed");exit(1);}return 0;}```4. 进程调度算法```cinclude <stdio.h>include <stdlib.h>include <sys/time.h>typedef struct {int pid;int arrival_time;int burst_time;int waiting_time;int turnaround_time;} Process;int main() {Process processes[] = {{1, 0, 5, 0, 0},{2, 1, 3, 0, 0},{3, 4, 8, 0, 0}};int n = sizeof(processes) / sizeof(processes[0]);// 计算等待时间和周转时间int total_waiting_time = 0, total_turnaround_time = 0;for (int i = 0; i < n; i++) {if (i == 0) {processes[i].waiting_time = 0;} else {processes[i].waiting_time = processes[i - 1].turnaround_time;}processes[i].turnaround_time = processes[i].burst_time + processes[i].waiting_time;total_waiting_time += processes[i].waiting_time;total_turnaround_time += processes[i].turnaround_time;}printf("Average Waiting Time: %f\n", (float)total_waiting_time / n);printf("Average Turnaround Time: %f\n", (float)total_turnaround_time / n);return 0;}```五、实验结果与分析(此处应填写实验结果,包括运行程序输出、图表等,以及对实验结果的分析。

进程管理实验报告_共10篇 .doc

进程管理实验报告_共10篇 .doc

★进程管理实验报告_共10篇范文一:_进程管理实验报告进程管理实验报告一、进程与线程1.实验目的:1.通过本实验学习Linux中创建进程的方法。

2.学习系统调用fork的使用方法。

3.学习系统调用exec族调用的使用方法。

2.实验准备1.进程的创建创建一个进程的系统调用很简单,只要调用fork函数就可以了。

#includepid_tfork();当一个进程调用了fork以后,系统会创建一个子进程,这个子进程和父进程是不同的地方只有它的进程ID和父进程ID,其他的都一样,就像父进程克隆(clone)自己一样,当然创建两个一模一样的进程是没有意义的,为了区分父进程和子进程,我们必须跟踪fork调用返回值。

当fork调用失败的时候(内存不足或者是用户的最大进程数已到)fork返回—1,否则fork的返回值有重要的作用。

对于父进程fork返回子进程ID,而对于fork 子进程返回0,我们就是根据这个返回值来区分父子进程的。

2.关于fork的说明使用该函数时,该函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。

将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数可以是一个子进程获得其所有子进程的进程ID。

而fork函数使子进程得到的返回值是0的理由是:一个子进程只会有一个父进程,所以子进程总是可以调用函数getpid获得其父进程的进程ID。

3.系统调用exec族调用的说明父进程创建子进程后,子进程一般要执行不同的程序。

为了调用系统程序,我们可以使用系统调用exec族调用。

Exec族调用有以下五个函数:intexecl(constchar*path,constchar*arg,?);intexeclp(constchar*file,constchar*arg,?);intexecle(constchar*path,constchar*arg,?);intexecv(constchar*path,constchar*argv[]);intexecvp(constchar*file,constchar*argv[]);exec族调用可以执行给定程序。

进程管理模拟实验报告

进程管理模拟实验报告

实验三进程管理模拟实验关键问题:阅读后面的C语言实例,修改程序,使其优先数在运行期间可以变化(动态优先数)。

例如当某进程被时间片中断次数增加到一定数目时,提高其优先权。

设计思路:首先在进程控制块中增加一个记录进程被中断的次数的整形变量sum;然后在初始化函数中对它初始化赋值为0;然后在block()函数中在每个进程被中断后sum进行加1操作,再显示该被中断进程被中断的次数;然后再find()函数中设计当某个进程被中断的次数达到3时修改该进程的优先权,并把该优先权设计为最高!然后再由find()函数返回被选中的进程的进程号!然后通过原来的相关代码来执行它相应的操作(其他部分代码不用变动)!实现的关键代码://在3个进程中按就绪状态及其优先数选出进程。

返回选出的进程号。

int find(){int j,pd=NIL,w=MAXPRI;for (j=0;j<3;j++) //选择高就绪状态优先级最高的进程{if(pcb[j].sum==3){pcb[j].priority=0;pcb[j].sum=0;printf("《进程%d中断次数达到3次,该进程优先权最高》\n",j+1);w=pcb[j].priority;pd=j;}else{if ((pcb[j].status=='r') && (pcb[j].priority<w)){w=pcb[j].priority;pd=j;}}}if (pd==NIL) //没有高就绪状态的进程,寻找低就绪状态的进程。

{for (j=0;j<3;j++){if(pcb[j].sum==3){pcb[j].priority=0;pcb[j].sum=0;printf("《进程%d中断次数达到3次,该进程优先权最高》\n",j+1);w=pcb[j].priority;pd=j;}else{if ((pcb[j].status=='t') && (pcb[j].priority<w)){w=pcb[j].priority;pd=j;}}}}return (pd);}程序运行结果:总结及进一步改善建议:该实验综合用了进程调度,进程控制,进程同步,进程调度算法等相应知识。

操作系统原理课程设计方案说明书进程管理器的模拟实现

操作系统原理课程设计方案说明书进程管理器的模拟实现

数学与计算机学院课程设计说明书课程名称: 操作系统原理-课程设计课程代码:8404161题目:进程管理器的模拟实现年级/专业/班:学生姓名:学号:开始时间:2018年12月11日完成时间:2018年12月24日课程设计成绩:指导教师签名:年月日《操作系统原理》课程设计任务书学院名称:数学与计算机学院课程代码:_8404061__专业:计算机科学与技术年级: 2009一、设计题目进程管理器的模拟实现二、主要内容目的:编程模拟实现进程管理器,加深对进程、程序概念掌握,并提高编程能力。

内容:利用Windows相关编程工具,实现进程管理器的相关功能:(1)显示当前正在运行的进程及其占用的资源(2)可以对某一进程进行停止;三、具体要求及应提交的材料1、完成系统的需求分析:包含功能需求、数据需求、性能需求等。

2、完成系统设计:包含系统概要设计<软件结构图)及详细设计<画出流程图)。

3、测试:编写合适的测试用例完成系统的测试工作并分析结果。

4、完成后应上交的材料:课程设计说明书:包含封面、任务书、说明书<说明书见后面模板)。

包括系统设计目的要求,类的层次图<包括类成员列表)、设计思路,系统功能模块图、参考资料、程序清单、设计心得总结等。

对照自己设计的完成情况认真书写。

软件源程序光盘。

注:学生完成课程设计后,提交课程设计报告及相关电子文档,要求将前述全部内容依先后顺序写成设计报告一份,要求文字通畅、字迹工整,文字不少于20000字,装订成册。

四、进度安排课程设计共两周<15、16周)进行,其进度时间大致分配如下:五、参考资料[1]. 谢青松. 操作系统原理. 人民邮电出版社.2004[2]. 曹先彬. 操作系统原理与设计. 机械工业出版社[3]. 袁宝华. 操作系统实验教程. 北京交通大学出版社指导教师签名日期年月日系主任审核日期年月日目录1 引言41.1 问题的提出41.2国内外研究的现状41.3任务与分析42.程序的主要功能42.1创建进程功能42.2查看进程功能42.3 换出进程功能42.4杀死进程功能52.5退出功能53 程序运行平台54 总体设计55 程序说明66 模块分析86.1 创建模块86.2 查看模块116.3 换出模块116.4 杀死模块136.5 退出模块137 系统测试138 结论151 引言1.1 问题的提出进程管理器是我们经常用到的一个工具,我们可以通过C语言编程来模拟进程管理器的功能,加深对进程、程序概念掌握,并提高编程能力1.2国内外研究的现状进程管理器在各种操作系统中广泛应用,不管是windows还是linux 都有进程管理器,方便用户对系统资源进行管理。

进程管理模拟

进程管理模拟
查看置换后内存进程情况
4.杀死进程
进程杀死后运行结果(用负数来表示进程已经被杀死)
5进程之间的通讯(通过进程值的单偶关系来改变进程中标志量的值简单的描述进程之间的通讯)
实验总结
通过这次实验,使我对操作系统中的进程的概念有了进一步的了解。通过自己实际编写程序,对进程的创建以、查看、换出以及杀死某个进程等操作更加熟悉,是对课本知识的一次检验和加深印象的过程。
}பைடு நூலகம்
else
{
printf("\n请输入新进程的pid\n");
scanf("%d",&neicun[shumu].pid);
printf("\n请输入新进程的优先级\n");
scanf("%d",&neicun[shumu].youxian);
printf("\n请输入新进程的大小\n");
scanf("%d",&neicun[shumu].daxiao);
{
neicun[j].flag=22;
printf("\n发现偶数进程时,进程%d标志变量为%d",j,neicun[j].flag);//当进程中进程值为偶数,把所有进程中的标志位置
}
}
for(n=0;n<shumu;n++)
if(neicun[n].pid%2==1)
{
for(m=1;m<shumu;m++)
neicun[j].pid=-1;
printf("此进程%d被杀死",p);
}
}
}
voidtongxun()//通过进程是单双数改变进程中的参数,来达到进程之间通讯的简单描述

操作系统进程管理实验报告

操作系统进程管理实验报告

操作系统进程管理实验报告一、引言在现代计算机科学中,操作系统的进程管理是确保系统高效运行的关键环节。

本实验旨在通过观察和分析操作系统的进程管理行为,深入理解进程的创建、运行和终止过程,以及操作系统如何对进程进行调度和资源分配。

二、实验目标1、理解进程的基本概念、进程状态及转换。

2、掌握进程的创建、终止和调度方法。

3、观察和分析进程在运行过程中的资源消耗和调度行为。

4、分析操作系统对进程的资源分配和调度策略对系统性能的影响。

三、实验环境与工具本实验在Linux操作系统上进行,使用GNU/Linux环境下的工具进行进程的创建、监控和调度。

四、实验步骤与记录1、创建进程:使用shell命令“fork”创建一个新的进程。

记录下父进程和子进程的PID,以及它们在内存中的状态。

2、进程状态观察:使用“ps”命令查看当前运行进程的状态,包括进程的PID、运行时间、CPU使用率等。

同时,使用“top”命令实时监控系统的CPU、内存等资源的使用情况。

3、进程调度:在“crontab”中设置定时任务,观察系统如何根据预设的调度策略分配CPU资源给各个进程。

4、资源分配:通过修改进程的优先级(使用“nice”命令),观察系统如何调整资源分配策略。

5、终止进程:使用“kill”命令终止一个进程,并观察系统如何处理该进程占用的资源。

五、实验结果与分析1、创建进程:通过“fork”系统调用,成功创建了一个新的进程,并获取了父进程和子进程的PID。

在内存中,父进程和子进程的状态分别为“running”和“ready”。

2、进程状态观察:使用“ps”命令可以看到父进程和子进程的状态均为“running”,同时显示了它们的CPU使用率和运行时间等信息。

通过“top”命令,可以实时监控系统的CPU、内存等资源的使用情况,为进一步分析提供了数据支持。

3、进程调度:在“crontab”中设置定时任务后,系统会根据预设的调度策略以及各个进程的运行状态,动态地分配CPU资源给各个进程。

进程管理实验报告代码

进程管理实验报告代码

一、实验目的1. 理解进程的概念和进程状态转换。

2. 掌握进程同步与互斥的基本方法。

3. 学习使用信号量实现进程同步与互斥。

4. 熟悉进程调度算法。

二、实验环境1. 操作系统:Windows/Linux2. 编程语言:C/C++3. 开发工具:Visual Studio/Code::Blocks三、实验内容1. 进程状态转换2. 进程同步与互斥3. 信号量实现进程同步与互斥4. 进程调度算法四、实验步骤1. 进程状态转换```c#include <stdio.h>#include <unistd.h>void print_status(int state) {switch (state) {case 1: printf("创建状态\n"); break; case 2: printf("就绪状态\n"); break;case 3: printf("运行状态\n"); break; case 4: printf("阻塞状态\n"); break; case 5: printf("终止状态\n"); break; default: printf("未知状态\n"); break; }}int main() {int state = 1;print_status(state);sleep(1);state = 2;print_status(state);sleep(1);state = 3;print_status(state);sleep(1);state = 4;print_status(state);sleep(1);state = 5;print_status(state);return 0;}```2. 进程同步与互斥```c#include <stdio.h>#include <pthread.h>pthread_mutex_t lock;void thread_func(void arg) {pthread_mutex_lock(&lock);printf("线程 %d 进入临界区\n", (int )arg);sleep(2);printf("线程 %d 离开临界区\n", (int )arg);pthread_mutex_unlock(&lock);return NULL;}int main() {pthread_t tid1, tid2;int arg1 = 1, arg2 = 2;pthread_mutex_init(&lock, NULL);pthread_create(&tid1, NULL, thread_func, &arg1); pthread_create(&tid2, NULL, thread_func, &arg2); pthread_join(tid1, NULL);pthread_join(tid2, NULL);pthread_mutex_destroy(&lock);return 0;}```3. 信号量实现进程同步与互斥```c#include <stdio.h>#include <pthread.h>#include <semaphore.h>sem_t sem;void thread_func(void arg) {sem_wait(&sem);printf("线程 %d 进入临界区\n", (int )arg);sleep(2);printf("线程 %d 离开临界区\n", (int )arg);sem_post(&sem);return NULL;}int main() {pthread_t tid1, tid2;int arg1 = 1, arg2 = 2;sem_init(&sem, 0, 1);pthread_create(&tid1, NULL, thread_func, &arg1); pthread_create(&tid2, NULL, thread_func, &arg2);pthread_join(tid1, NULL);pthread_join(tid2, NULL);sem_destroy(&sem);return 0;}```4. 进程调度算法```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define MAX_PROCESSES 5typedef struct {int pid;int arrival_time;int burst_time;int wait_time;int turnaround_time;} Process;int compare(const void a, const void b) {Process proc1 = (Process )a;Process proc2 = (Process )b;return proc1->arrival_time - proc2->arrival_time;}void fcfs(Process processes[], int n) {processes[0].wait_time = 0;processes[0].turnaround_time = processes[0].burst_time;for (int i = 1; i < n; i++) {processes[i].wait_time = processes[i - 1].turnaround_time + processes[i].arrival_time - processes[i].burst_time;processes[i].turnaround_time = processes[i].wait_time + processes[i].burst_time;}}int main() {Process processes[MAX_PROCESSES] = {{1, 0, 3, 0, 0},{2, 1, 6, 0, 0},{3, 4, 4, 0, 0},{4, 6, 5, 0, 0},{5, 8, 2, 0, 0}};qsort(processes, MAX_PROCESSES, sizeof(Process), compare);fcfs(processes, MAX_PROCESSES);for (int i = 0; i < MAX_PROCESSES; i++) {printf("PID: %d, Wait Time: %d, Turnaround Time: %d\n", processes[i].pid, processes[i].wait_time, processes[i].turnaround_time);}return 0;}```五、实验结果与分析通过以上实验,我们了解了进程状态转换、进程同步与互斥、信号量实现进程同步与互斥以及进程调度算法。

进程调度模拟实验

进程调度模拟实验

进程调度模拟实验1.实验目的通过对进程调度算法的模拟加深对进程概念和进程调度过程的理解。

2.实验内容用C语言、Pascal语言或其他开发工具实现对N(N=5)个进程的调度模拟,要求至少采用两种不同的调度算法(如简单轮转法Round Robin和优先权高者优先算法Highest Priority First),分别进行模拟调度。

每个用来标识进程的进程控制块PCB用结构(记录)来描述,根据需要,它包括以下字段:进程标识数ID。

进程优先数Priority,并规定优先数越大的进程,其优先权越高。

采用简单轮转法时该字段无用。

进程已经占用的CPU时间CPUTIME(以时间片为单位,下同)。

进程还需占用的CPU时间ALLTIME。

当进程运行完毕时,ALLTIME变为0。

进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。

进程被阻塞的时间BLOCKTIME,表示已经阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。

进程状态STATE。

队列指针NEXT,用来将PCB排成队列。

优先数改变的原则(采用简单轮转法时该字段无用):进程在就绪队列中等待一个时间片,优先数增加1;进程每运行一个时间片,优先数减3。

假设在进行调度前,系统中有5个进程,它们的初始状态可以编程输入(更具有灵活性),也可以初始化为如下内容:ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STA TE0 9 0 3 2 3 READY1 38 0 3 -1 0 READY2 30 0 6 -1 0 READY3 29 0 3 -1 0 READY4 0 0 4 -1 0 READY为了清楚地观察诸进程的调度过程,程序应该将每个时间片内各进程的情况显示出来并暂停,参考格式如下:运行/Running:I就绪队列/Ready Queue:Idi,Idj,…阻塞队列/Block Queue:Idk,Idl,…======================================================================进程号优先数已运行时间需要时间开始阻塞时间阻塞时间状态0 P0 C0 A0 T0 B0 S01 P1 C1 A1 T1 B1 S12 P2 C2 A2 T2 B2 S23 P3 C3 A3 T3 B3 S34 P4 C4 A4 T4 B4 S4======================================================================3.实验分析和思考在实际的进程调度中,还有哪些可行的算法,怎样模拟?在实际的进程调度中,除了按算法选择下一个运行的进程之外,操作系统还应该做哪些工作?为什么对进程的优先数可以按上述原则进行修改?有什么好处?4.实验学时安排:6学时,在调度与死锁内容学习之后进行。

模拟进程管理

模拟进程管理

操作系统课程设计报告院系:计算机科学技术学院班级:计07--2班姓名:苏庆和学号:18 号指导教师:鲁静轩__________2009 年7 月5 日操作系统课程设计任务书一、设计题目:模拟进程管理二、设计目的《操作系统原理》课程设计是软件工程专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。

其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。

三、设计要求(1)选择课程设计题目中的一个课题,独立完成。

(2)良好的沟通和合作能力(3)充分运用前序课所学的软件工程、程序设计等相关知识(4)充分运用调试和排错技术(5)简单测试驱动模块和桩模块的编写(6)查阅相关资料,自学具体课题中涉及到的新知识。

(7)课题完成后必须按要求提交课程设计报告,格式规范,内容详实。

四、设计内容1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。

2.根据实现的功能,划分出合理的模块,明确模块间的关系。

3.编程实现所设计的模块。

4.程序调试与测试。

采用自底向上,分模块进行,即先调试低层函数。

能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。

调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;5.结果分析。

程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。

6.编写课程设计报告;设计报告要求:A4纸,详细设计部分主要叙述本人的工作内容设计报告的格式:(1)封面(题目、指导教师、专业、班级、姓名、学号)(2)设计任务书(3)目录(4)需求分析(5)概要设计(6)详细设计(含主要代码)(7)调试分析、测试结果(8)用户使用说明(9)附录或参考资料五、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在100行有效程序行左右,不得抄袭。

操作系统实验之进程管理实验报告

操作系统实验之进程管理实验报告
六、自我评价与总结
本次操作系统实验是模拟进程管理过程,解决哲学家的就餐问题。个人本 次实验还比较顺利,使用了比较熟悉的 c++语言进行算法的编写,比较巧妙的 定义了两个类来定义哲学家和筷子对象的属性以及相应的动作,方便在各种就 餐过程中对筷子的资源进行申请和释放,以及哲学家实现相应的动作。另一个 觉得比较好的地方是解决了死锁问题,通过判断当前哲学家是否可以同时拿起 左右筷子来避免死锁。
①至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以进餐,
最终总会释放出他所用过的两只筷子,从而可使更多的哲学家进餐;
②仅当左右两只筷子均可用时,才允许哲学家拿起筷子就餐;
③规定奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲
学家则相反。
本实验中采取方法 2.
三、数据结构及功能设计
}; bool b[5]; int i, j; srand(time(0)); j = rand() % 5; for (i = j; i < j + 5; i++) {
b[i % 5] = philosopher[i % 5].eat(); cout << endl << "********************************************************" << endl; } for (i = j; i < j + 5; i++) { if (b[i % 5]) {
五、测试用例及运行结果、分析
测试结果截图:
分析:产生了一个随机数 0,并依次加 1 对每个哲学家进行分析。分析时首先看 左筷子是否可用,然后看右筷子,若有一个不可用则放下手中的另一只筷子,并 说明 need waiting。然后再下一时间段对每个哲学家再次分析,直到每个哲学 家都吃上饭,程序结束。 通过实验结果可得,程序正确运行,且解决了死锁问题。

实验二-实验报告(进程管理)

实验二-实验报告(进程管理)

实验二模拟实现进程管理组长:李和林软件1402一、实验目的1.理解进程的概念,明确进程和程序的区别。

2.理解并发执行的实质。

3.掌握进程的创建,睡眠,撤销等进程控制方法。

二、实验内容用C语言,JAVA语言,C++语言编写程序,模拟实现创建新的进程;查看运行进程,换出某个进程;杀死运行进程。

三、实验准备1.进程的定义进程是程序在一个数据集合上的运行过程,是系统资源分配和调度的一个独立单位。

一个程序在不同的数据集合上运行,乃至一个程序在同样数据集合上的多次运行都是不同的进程。

2.进程的状态通常情况下,一个进程必须具有就绪,执行和阻塞三种基本情况。

1)就绪状态当进程已分配到除处理器外的所有必要资源后,只要再获得处理器就可以立即执行,这时进程的状态就为就绪状态。

在一个系统里,可以有多个进程同时处于就绪状态,通常把这些就绪进程排成一个或多个队列,称为就绪队列。

2)执行状态处于就绪状态的进程一旦获得处理器,就可以运行,进程状态也就处于执行状态,在单处理器系统中,只能有一个进程处于执行状态,在多处理器系统中,则可能有多个进程处于执行状态3)阻塞状态正在执行的进程因为发生某些事件而暂停运行,这种受阻暂停的状态称为阻塞状态,也可称为等待状态。

通常将处于阻塞状态的进程拍成一个队列,称为阻塞队列,在有些系统中,也会按阻塞原因的不同将阻塞状态的进程排成多个队列。

3.进程状态之间的转换4.进程控制块1)进程控制块的作用进程控制块是进程实体的重要组成部分,主要包含下述四个方面的信息:a)进程标示信息b)说明信息c)现场信息d)管理信息5.进程控制块的组织方式1)链接方式2)索引方式6.进程控制原语1)创建原语2)撤销原语3)阻塞原语4)唤醒原语7.程序代码#include<stdio.h>#include<iostream>using namespace std;void clrscr();void create();void run( );void exchange( );//唤出void kill( );void wakeUp( );//唤醒struct process_type{int pid;int priority;//优先次序int size;int state;//状态char info[10];};struct process_type internalMemory[20];int amount=0,hangUp=0,pid,flag=0;//数目,挂起void main( ){int n;int a;n=1;clrscr( );while(n==1){cout<<"\n********************************************";cout<<"\n* 进程演示系统 *";cout<<"\n********************************************";cout<<"\n 1.创建新的进程 2.查看运行进程 ";cout<<"\n 3.换出某个进程 4.杀死运行进程 ";cout<<"\n 5.唤醒某个进程¨ 6.退出系统 ";cout<<"\n*********************************************"<<endl;cout<<"请选择 ";cin>>a;switch(a){case 1:create( );break;case 2:run( );break;case 3:exchange();//换出break;case 4:kill();break;case 5:wakeUp();break;case 6:exit(0);default:n=0;}}}void create(){ //创建进程int i=0;if (amount>=20){cout<<" 内存已满,请先结束或换出进程";}else{for (i=0;i<20;i++){if (internalMemory[i].state==0){break;}}cout<<"请输入新进程的pid: "<<endl;cin>>internalMemory[ i ].pid;cout<<"请输入新进程的优先级: "<<endl;cin>>internalMemory[amount].priority;cout<<"请输入新进程的大小: "<<endl;cin>>internalMemory[amount].size;cout<<"请输入新进程的内容: "<<endl;cin>>internalMemory[amount].info;internalMemory[i].state=1;amount++;}}void clrscr()//清除内存空间{for (int i=0;i<19;i++){internalMemory[i].pid=0;internalMemory[i].priority=0;internalMemory[i].size=0;internalMemory[i].state=0;}amount=0;}void run(){for (int i=0;i<20;i++){if (internalMemory[i].state==1){cout<<"当前内存中的进程:\n"<<endl;cout<<"当前运行的进程: ";cout<<internalMemory[i].pid<<endl;cout<<"当前运行进程的优先级: ";cout<<internalMemory[i].priority<<endl;cout<<"当前运行进程占用的空间大小: ";cout<<internalMemory[i].size;}}}void exchange( ){//唤出优先级最小的进程if (!amount){cout<<"当前没有运行进程\n";return;}cout<<"\n输入换出进程的ID值: ";cin>>pid;for (int i=0;i<20;i++){if (pid==internalMemory[i].pid){if (internalMemory[i].state==1){internalMemory[i].state=2;hangUp++;cout<<"\n已经成功换出进程\n";}else if (internalMemory[i].state==0){cout<<"\n要换出的进程不存在";}else{cout<<"\n要换出的进程已被挂起\n";}flag=1;break;}}if (flag==0){cout<<"\n要换出的进程不存在";}}void kill( ){if (!amount){cout<<"当前没有运行进程\n";return;}cout<<"请输入要杀死的进程: ";cin>>pid;for (int i=0;i<20;i++){if (pid==internalMemory[i].pid){if (internalMemory[i].state==1){internalMemory[i].state=0;amount--;cout<<"此进程被杀死"<<pid;}else if (internalMemory[i].state==0){cout<<"\n要杀死的进程不存在\n";}else{cout<<"\n要杀死的进程已被挂起\n";}flag=1;break;}}if (!flag){cout<<"\n要杀死的进程不存在\n";}}void wakeUp(){if (!amount){cout<<"当前没有运行进程"<<endl;return;}if (!hangUp){cout<<"当前没有挂起进程";return;}cout<<"请输入pid: ";cin>>pid;for (int i=0;i<20;i++){if (pid==internalMemory[i].pid){flag=0;if (internalMemory[i].state==2){internalMemory[i].state=1;hangUp--;cout<<"已经成功唤醒进程\n";}else if (internalMemory[i].state==0){cout<<"\n要换醒的进程不存在\n";}else{cout<<"\n要唤醒的进程已被挂起\n";}break;}}if (flag){cout<<"\n要唤醒的进程已被挂起\n"<<endl;}}8.实现的结果。

操作系统实验(模拟进程管理)

操作系统实验(模拟进程管理)

操作系统实验————(1)模拟进程管理专业:信息管理与信息系统班级:信管082姓名:温静实验一进程管理1.目的和要求通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。

2.实验内容用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。

3.主体程序#include <conio.h>#include <stdio.h>#include <stdlib.h>struct PCB_type{ int pid;int priority;int cputime;int state;int shumu=0,pid_l;struct PCB_type neicun[20];struct PCB_type hc[10];int max=0;int number=0;void create();void run();void huanchu();void kill();/* 创建新进程*/void create(){if(shumu>=20){printf("\n内存已满,请先结束或换出进程\n");}else{shumu++;printf("\n请输入新进程的程序名\n");scanf("%d",&neicun[shumu-1].pid);printf("\n请输入新进程的优先级\n");scanf("%d",&neicun[shumu-1].priority);printf("\n请输入新进程的运行时间\n");scanf("%d",&neicun[shumu-1].cputime);printf("\n创建进程时令其状态为就绪\n");neicun[shumu-1].state=2;}printf("\n创建进程成功!\n");}/* 查看当前运行进程*/void run(){int max=0;for(int i=0;i<shumu;i++){if((neicun[i].state==1)&&(neicun[i].priority>=neicun[max].priority)) max=i;}neicun[max].state=3;printf("当前运行进程程序名:\n%d",neicun[max].pid);printf("\n该进程的优先级:\n%d",neicun[max].priority);printf("\n该进程的运行时间:\n%d",neicun[max].cputime);printf("\n该进程的状态:\n%d",neicun[max].state);}/* 换出*/void huanchu(){int k;printf("请输入要换出程序的程序名:");scanf("%d",&k);for(int j=0;j<shumu;j++){if(neicun[j].state==1){hc[number].pid=neicun[j].pid;hc[number].state=neicun[j].state;hc[number].priority=neicun[j].priority;hc[number].cputime=neicun[j].cputime;number++;neicun[j].pid=0;neicun[j].state=0;neicun[j].priority=0;neicun[j].cputime=0;pid_1++;}else printf("进程%d无法换出的pid:%d\n",j.neicun[j].pid);if(number!=0)for(int i=0;i<number;i++){printf("当前运行进程程序名:\n%d",hc[i].pid);printf("\n该进程的优先级:\n%d",hc[i].priority);printf("\n该进程的运行时间:\n%d",hc[i].cputime);printf("\n该进程的状态:\n%d",hc[i].state);}}PCB_type temp=neicun[0];for(k=0;k<=shumu;k++){if(neicun[k].priority>temp.priority)tmpe=neicun[k];}neicun[k].state=1;}/* 杀死进程*/void kill(){neicun[max].pid=0;neicun[max].priority=0;neicun[max].cputime=0;neicun[max].state=0;if(max==(shumu-1))shumu--;else{for(int j=max+1;j<shumu;j++){neicun[j-1].pid=neicun[j].pid;neicun[j-1].priority=neicun[j].priority;neicun[j-1].cputime=neicun[j].cputime;neicun[j-1].state=neicun[j].state;}shumu--;}max=0;run();}/* int k=0;printf("请输入要杀死程序的进程名:");scanf("%d",&k);if(neicun[k].state=1)neicun[k].state=2;neicun[k].cputime=0;neicun[k].pid=0;neicun[k].priority=0;neicun[k].state=0;if(k==(shumu-1))shumu--;else{for(int j=k+1;j<shumu;j++){neicun[j-1].pid=neicun[j].pid;neicun[j-1].priority=neicun[j].priority;neicun[j-1].cputime=neicun[j].cputime;neicun[j-1].state=neicun[j].state;}shumu--;}printf("进程%d已被杀死!,k");}*/int main(){int n,a;n=1;while(n==1){system("cls");printf("\n**********************************************");printf("\n* 进程演示系统*");printf("\n**********************************************");printf("\n 1.创建新的进程 2.查看运行进程");printf("\n 3.换出某个进程 4.杀死运行进程");printf("\n 5.退出系统");printf("\n**********************************************");printf("\n请选择(1~5):");scanf("%d",&a);switch(a){ case 1:create( );printf("\npress anykey to go on~");getch();break;case 2 :run();printf("\npress anykey to go on~");getch();break;case 3 :huanchu();printf("\npress anykey to go on~");getch();break;case 4 :kill();printf("\npress anykey to go on~");getch();break;case 5 :exit(0);default:n=0;break;}}}5.感想与心得体会做了两周的实验,问了很多同学,可程序还是有很多问题。

操作系统实验指导书-实验二进程管理

操作系统实验指导书-实验二进程管理

实验二进程管理一、实验目的(1)加深对进程概念的理解,明确进程和程序的区别。

(2)深入了解操作系统如何组织进程和创建进程。

(3)进一步认识如何实现处理器调度。

二、实验预备知识(1)进程的概念(2)PCB。

(3)进程的组织方式。

(4)进程的创建。

(5)进程的调度。

三、实验内容1. 观察Windows2000/XP中的进程和线程熟悉Windows2000/XP中任务管理器的使用,通过任务管理器识别操作系统中的进程和线程的相关信息;掌握利用spy++.exe来察看Windows中各个任务的更详细信息。

具体实验步骤如下:(1)启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。

如下图所示:(2)调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表(填满即可):表一:统计进程的各项主要信息(3)从桌面启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。

再从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是,原因是。

(4)在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化、得到的结论是(说出explorer.exe进程的作用)。

5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表:表二:统计线程的各项信息进程:explorer.exe 中的各个线程6、注意某些线程前有“+”,如图所示:,说明二者之间的差异是。

2. 利用API在Windows下创建进程学习使用在Windows 2000/XP中利用API创建进程的方法;学习了解创建进程函数CreateProcess及其特性;设计测试程序,通过在命令行中加载相应的测试程序生成的命令文件,去按照命令文件中指定的程序路径打开相应的程序去执行。

模拟进程创建实验报告(3篇)

模拟进程创建实验报告(3篇)

第1篇一、实验目的1. 理解进程的概念和进程创建的基本原理。

2. 掌握使用C语言模拟进程创建的方法。

3. 熟悉进程的属性和进程之间的通信机制。

4. 分析实验结果,加深对进程管理的理解。

二、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019三、实验原理进程是计算机中程序执行的基本单位,是操作系统进行资源分配和调度的一个独立单位。

进程创建是操作系统的一个重要功能,它负责为进程分配必要的资源,并建立进程控制块(PCB)。

在模拟进程创建实验中,我们将使用C语言编写程序,模拟进程的创建、运行和销毁过程。

通过模拟进程的创建,我们可以了解进程的基本属性,如进程ID、进程状态、父进程ID等。

四、实验步骤1. 定义进程结构体,包含进程的基本属性,如进程ID、进程状态、父进程ID等。

```ctypedef struct {int pid; // 进程IDint state; // 进程状态int parent_pid; // 父进程ID// 其他属性} Process;```2. 编写进程创建函数,用于创建新进程。

```cProcess create_process(int parent_pid) {Process new_process;new_process.pid = ...; // 分配进程IDnew_process.state = ...; // 设置进程状态 new_process.parent_pid = parent_pid;// 设置其他属性return new_process;}```3. 编写进程运行函数,用于模拟进程的运行过程。

```cvoid run_process(Process p) {// 模拟进程运行过程// ...}```4. 编写进程销毁函数,用于销毁进程。

```cvoid destroy_process(Process p) {// 销毁进程资源// ...}```5. 编写主函数,模拟进程创建、运行和销毁过程。

[操作系统概论]实验指导书-实验一 进程管理

[操作系统概论]实验指导书-实验一  进程管理

实验一进程管理一、目的进程调度是处理机管理的核心内容。

本实验要求编写和调试一个简单的进程调度程序。

通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。

二、实验内容及要求1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。

可根据实验的不同,PCB结构的内容可以作适当的增删)。

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

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

2、系统资源(r1…r w),共有w类,每类数目为r1…r w。

随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。

3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。

建立进程就绪队列。

4、编制进程调度算法:时间片轮转调度算法本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。

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

三、实验环境操作系统环境:Windows或DOS系统。

编程语言:Turbo C、Visual C++、broland C++、Visual Basic、Delphi、Java等。

四、实验思路和设计1、程序流程图由学生自行完成。

2、主要程序代码//PCB结构体struct pcb{int id; //进程IDint ra; //所需资源A的数量int rb; //所需资源B的数量int rc; //所需资源C的数量int ntime; //所需的时间片个数int rtime; //已经运行的时间片个数char state; //进程状态,W(等待)、R(运行)、B(阻塞)struct pcb *next;} *hready=NULL,*hblock=NULL,*p; //hready,hblock分别为指向就绪和阻塞队列typedef struct pcb PCB;int m,n,r,a,b,c,h=0,i=1,time1Inteval; //m为要模拟的进程个数,n为初始化进程个数//r为可随机产生的进程数(r=m-n)//a,b,c分别为A,B,C三类资源的总量//i为进城计数,i=1…n//h为运行的时间片次数,time1Inteval为时间片大小(毫秒)//将进程插入到队列链尾(包括就绪队列和阻塞队列)PCB *insert(PCB *head,PCB*pcb) //带两个指针形参:队列指针head和当前进程PCB{PCB *pi,*p1;p1=head;pi=pcb;if (head==NULL){head=pi;pi->next=NULL;}else{while(p1->next!=NULL){p1=p1->next;}p1->next=pi;pi->next=NULL;}return(head);}//对进程进行初始化,建立就绪队列、阻塞队列。

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

进程管理模拟系统实验指导书2
一、实验目的
学习进程管理的设计与实现,学习和运用操作系统原理,设计一个操作系统子系统的模拟系统。

通过该系统的设计调试可增加对操作系统实现的感知性。

同时可发挥团队协作精神和个人创造能力。

使同学们对操作系统学习有一个实现的尝试和创新的思维。

二、实验规则
1.每组设计一个模拟系统(共100分)
2.每人设计系统中的一部分(满分60分)
3.集体调试创意(满分40分)
三、实验要求
1.进程管理功能以进程调度为主要功能。

以进程控制为辅助功能。

2.体现操作系统原理中进程调度算法和进程控制算法。

按照操作系统原理设计。

3.结构化设计。

设计时构建出模块结构图并存于文件中。

模块化实现,对每一功能,每一操作使用模块、函数、子程序设计方法实现。

4.进程以PCB为代表。

队列、指针用图示。

每一步功能在桌面上能显示出来。

5.系统应具有排错功能,对可能出现的错误应具有排查功能和纠错能力。

6.界面自行设计,语言自行选择。

(可用VC/C++/C/C#语言,也可用你会的其他语言,甚至还可用PPT)
7.每人的设计功能都能表现或说明出来。

8.进程以队列法组织,对不同进程调度算法:
FIFO队列或PRI队列或rotate(轮转队列)用同一个进程序列组织,对阻塞队列可设置一个,也可设多个。

9.因为是模拟系统,所以要显示每个功能和操作结果。

显示应力求清晰、易读和一目了然(一屏),最好能用汉字,否则可用英语或汉语拼音。

10.操作方便,使用便捷。

可视化程度高。

11.设计出系统后,还需要写出(介绍系统采用的语言、支撑平台、小组成员及分工。

如何安装、如何启动、如何操作)
12.每组需写一份课程设计报告,内容包括:课程设计内容,课程设计设计思路,课程设计结构图,及分工内容、介绍。

13. 实验结果演示验收后,将可在任何环境下运行的可执行文件和系统说明书一起存盘并交盘。

(可合组一张盘),上标:班级、组号、姓名。

14. 实验结束后从中选出优秀作品,介绍给大家。

四、系统功能
1.创建进程:主要创建PCB,并在创建后显示PCB及所在RL队列。

内容包括①标识数(按产生顺序产生),②进程名(字母序列),③优先数(随机产生),④进程状态,⑤队列指针(可用数字或图表示),⑥其它(可自定义:如运行时间、家族等)。

创建进程的个数可人工设定,或可自动设定,也可两者兼有。

2.撤销进程:撤销进程主要显示PCB的消失和队列的变化。

3.进程队列的组织:进程队列可对创建的所有进程变化队形:可组织成FIFO队列,也可组织成PRI队列;或rotate队列,对队列有插入、移出的功能,也有在队列中某位置插入删除功能。

4.显示功能:模拟系统在整个演示过程中都需要可视化,因此显示功能非常重要,要求对队列、PCB每次操作前后予以显示,以表示操作功能的实施效果。

5.进程调度:按不同队列选取队首元素组织成进程调度算法的实施。

例如:FIFO、PRI、rotate。

同时进程调度后,被调度进程改变状态、优先级(在PRI中)、设定(或人工控制)时间片后,运行者或进入就绪队列RL,或进入阻塞队列sq。

阻塞PCB在一定时机(自定)后可进入RL。

其间每次变化或转换,应显示相应内容(PCB、队列或其它数据)。

在进入就绪、运行等状态后,可设置或消耗完时间片后被撤销。

6.可选功能:能对不同功能给予选择和显示。

五、实验方法与进度:
1.各组首先组织学习实验指导书,搞清实验内容,明确实验目的。

以此为基础商议系统构成,设计目标、界面、接口、模块及组员分工。

2.每组成员分头编程并调试,然后共同组合。

3.上机时间:8——16周二(计0903)、周三(09合)1,2节(计1,2,信)5,6节在Z4—326实验室上机,平时自己上机。

第8周:进程管理模拟子系统总体设计,框架设计,界面设计;第9周:进程管理的详细设计,编程;第10、11周:模块设计调试;第12、13周:组装调试;第14-15周:系统检查与验收;17周优秀作品交流。

4.第十四周开始验收和考评,在验收和考评每组成员时,问到问题涉及到哪位同学,这位同学就回答,根据回答、演示和整个系统功能给出每人成绩。

六、进程管理模拟系统设计框架之例、
数据结构PCB内容包括:进程名:name;标识数:n;优先数:pro;状态:st。

阻塞队列Sq内容包括:进程名:name;标识数:n;优先数:prost。

就绪队列Rl内容包括:进程名:name;标识数:n;优先数:prost。

模块设计方法:
模块设计可采用模块逐层调用方法。

例:创建进程
if(emp) then crq(Rl);/如果队列空,则调用创建模块创建就绪队列。

lsq(Rl);/调用显示模块显示就绪队列。

Crch(n)/创建过程
申请PCB块/创建进程调用创建PCB模块;
填写进程名;标识数;优先数;状态;家族;
lsp(PCB名);/调用显示模块显示新创建的进程。

in(Rl);/调用插入模块将所创建进程插入就绪队列。

lsq(Rl);/调用显示模块显示就绪队列。

……
七、整体构架和目标功能设计
将整体内容整理出来,对设计目标分析整理,按设计目标将整体内容及关系搭建出来。

例如:进程管理内容包括进程创建、进程阻塞、进程唤醒、进程撤销、进程调度等等,目标是进程调度和进程控制。

于是得出:进程管理下属包括进程创建、进程阻塞、进程唤醒、进程撤销、进程调度等功能。

整体中还包括进入和退出的功能。

1)目标模块设计
目标模块设计主要是模块功能的设计以及模块组成。

例如:创建进程模块功能有:寻找PCB;填写PCB;插入队列。

它由查找、填写、插队等模块(函数)组成。

2)调用关系设计根据目标模块设计,
设计调用关系并画出图示,以标明每个函数或模块由谁调用,调用谁。

3)具体模块设计(伪代码设计)
针对设计的每个模块功能、调用关系,写出操作顺序,此时可以用伪代码或类似自然语言的代码编写。

4)界面设计
依据调用关系和具体模块设计来设计主界面,再设计每一个具体界面。

力求一屏化设计界面
5)数据结构设计
依据调用关系和具体模块设计来确定总体结构和每个模块的数据结构。

要实现整体统一。

6)编程与调试——模块程序设计
利用所学语言将伪代码设计的模块用语言编写出程序来。

并对每个模块逐一加入不同数据(信息)调试运行,观其运行情况而修改程序。

反复调试修改,直至运行结果与设计目标一致为止。

7)链接与整体调试
将各个模块按照每个组成部分调试运行,观察运行结果,直至运行结果与设计目标一致为止;再加一层模块,调试运行,逐步加至整体,调试运行至成功。

相关文档
最新文档