-
C语言模拟进程调试5
此程序主要的作用是根据进程的优先级来模拟操作系统的进程调度,每个进程相应的参数都是通过随机函数来随机产生的,还有一个根据进程优先级从大到小排列的队列,此队列是用指针来相连的,每次运行程序会去自动取得第一个进程运行一个指定的时间片,然后查看need参数,如果为0就完成,否则就根据此进程的优先级加入到进程队列,必须保证队列中的进程优先级是从大到小的顺序,还有就是进程每执行一次,它的优先级自动减1.
程序运行不到最后会出一个错,初步确定错误是出现在这个地方:while(flag) { if(temp!=tail && temp->priority < run->priority) { run->next = temp; pre->next = run; flag = 0; } if(temp==tail) { run->next = NULL; tail->next = run; tail = tail->next; flag = 0; } else { pre = temp; temp = temp->next; } }
应该是让进程重新进入队列时指针操作有误,这个地方指针真的挺难弄的
程序的全部代码如下:#include<stdio.h> #include<stdlib.h> #include<time.h> #define randomize() srand((unsigned)time(NULL)) //定义一个宏 //PCB结构体定义部分 typedef struct PCB { /** 进程标识符,取值1-5 **/ unsigned int id; /** 进程优先级,随机产生,值1-5 **/ signed int priority; /** 目前已占用的CPU时间数, 初值为0;当该进程被调 用执行时,每执行一个时 间片,Used加1 **/ unsigned int used; /** 进程尚需的CPU时间数,初值表示 该进程需要运行的总时间,取值 范围为5—10。并随机产生,每运 行一个时间片need减1;need为0则 进程结束。 **/ unsigned int need; /** 进程状态R(运行),W(就绪),F(完成); 初始时都处于就绪状态 **/ unsigned char status; /** 指向就绪队列中下一个进程的PCB的指针 **/ struct PCB *next; }; //程序入口主函数 int main(void) { struct PCB process[5]; int i=0; for(i;i<5;i++) { //初始化进程ID process[i].id = i+1; //初始化进程优先级 process[i].priority = rand()%5+1; //初绐化已占用时间数 process[i].used = 0; //初始化还要时间数(5-10) process[i].need = rand()%5+6; //初始化进程状态(就绪) process[i].status = 'W'; //初始化指向下一个PCB的指针 process[i].next = NULL; printf("process[%d]: id = %d",i+1,process[i].id); printf(" priority = %d",process[i].priority); printf(" used = %d",process[i].used); printf(" need = %d",process[i].need); printf(" status = %c",process[i].status); printf(" next = %s",process[i].next); printf("\n"); } randomize(); //形成一个按进程优先级从大到小排列的队列 int j = 0; int k = 1; for(j;j<5;j++) { struct PCB temp; for(k=j+1;k<5;k++) { if(process[j].priority<process[k].priority) { temp = process[j]; process[j] = process[k]; process[k] = temp; } } } printf("排序结果为:"); for(i=0;i<4;i++) { printf(" %d ",process[i].priority); process[i].next = &process[i+1]; } //初始化head,tail指针 struct PCB *head = &process[0]; struct PCB *tail = &process[4]; struct PCB *run = head; tail->next = NULL; printf("\n初始化head,tail指针:"); printf("head: %d ",head->priority); printf("tail: %d \n",(*tail).priority); printf("\n--------准备完成,开始调度---------\n"); while(head!=NULL) { if(head == NULL) break; else run = head; run->priority--; run->status='R'; run->used ++ ; if(run->need>0) run ->need -- ; head = head->next; printf("当前正在执行的进程ID:%d,status:%c,priority:%d,used:%d,need:%d\n" ,run->id,run->status,run->priority,run->used,run->need); printf("时间片:"); for(i=0;i<15000;i++) { int a=50000; while(a--); if(i%500==0) printf("#"); } if(run->need > 0) { printf(" 进入就绪队列\n"); if(head->next == NULL) head = run; else { run->status='W'; struct PCB *temp = head; struct PCB *pre = head; int flag = 1; while(flag) { if(temp!=tail && temp->priority < run->priority) { run->next = temp; pre->next = run; flag = 0; } if(temp==tail) { run->next = NULL; tail->next = run; tail = tail->next; flag = 0; } else { pre = temp; temp = temp->next; } } } } else printf(" 完成\n"); printf("\n"); } return 0; } 程序运行不到最后会出一个错,初步确定错误是出现在这个地方: while(flag) { if(temp!=tail && temp->priority < run->priority) { run->next = temp; pre->next = run; flag = 0; } if(temp==tail) { run->next = NULL; tail->next = run; tail = tail->next; flag = 0; } else { pre = temp; temp = temp->next; } }
2009年3月30日 22:35
目前还没有答案
相关推荐
### C语言模拟进程管理知识点详解 #### 一、需求分析 在现代操作系统中,进程管理是核心功能之一。尤其在多任务环境中,进程之间需要共享有限的资源,如CPU时间。因此,合理有效地分配这些资源变得至关重要。在本...
【C语言模拟进程管理】是针对操作系统中进程调度的一个实践性课题,主要目的是通过编程来理解和模拟操作系统如何管理和调度进程。在这个过程中,学生通常需要实现一个简单的操作系统内核,用C语言编写进程调度器,...
根据给定的信息,本文将详细解释“C语言模拟银行家算法”的实现原理及代码细节。 ### 一、银行家算法简介 银行家算法是一种避免死锁的算法,它通过检查系统的资源分配情况来确保系统不会进入不安全状态,从而防止...
在main函数中,我们首先输入进程数目,然后创建相应的进程控制块,最后使用while循环来模拟进程调度的过程。在每次循环中,我们首先检查当前进程的状态,如果是就绪状态,就将其加入就绪队列中,然后选择最高优先数...
在本项目中,学生使用C语言模拟了操作系统中的进程管理,包括进程调度的三种常见算法:最高优先级优先调度算法、简单轮转法调度算法和短作业优先调度算法。以下是这些算法的详细说明: 1. **最高优先级优先调度算法...
模拟进程调度的c语言程序 在linux下的模拟linux系统进程调度的程序。可以调试通过,以通过测试
在`isSafe`函数中,通常采用工作集(Working Set)算法来模拟进程的执行过程,查找是否存在一个安全序列。如果找到,返回1表示安全;否则,返回0表示不安全。 通过C语言模拟银行家算法,我们可以更好地理解和验证该...
在这个主题中,我们将深入探讨如何使用C语言编写程序来查看和终止操作系统中的进程。 首先,我们需要理解什么是进程。在操作系统中,进程是程序的一次执行实例,它包含了程序的内存映像、上下文信息(如寄存器状态...
总的来说,这个实验提供了一个实践性的平台,让学生运用C语言模拟操作系统的核心功能,加深对处理机调度策略的理解,同时锻炼了编程和问题解决能力。通过这个实验,学习者能更好地把握操作系统中多任务并行执行的...
3. **单步执行**:通过模拟CPU执行来实现单步调试。每次执行一条指令后,都需要检查是否到达了断点或其他特殊条件。 4. **内存和寄存器的查看**:提供接口来查看和修改目标程序的内存和寄存器值,这对于理解程序的...
3. **时间推进**:模拟系统时间,处理事件队列中的事件,如进程到达时将其添加到就绪队列,进程完成时更新系统状态。 4. **调度算法**:根据选择的调度算法,每次从就绪队列中选取下一个要执行的进程。 5. **统计...
3. **进程同步**:通过信号量、管程、事件标志等方式,模拟进程间的同步,防止竞争条件和死锁的发生。 4. **进程通信**:模拟进程间的数据交换,如使用共享内存、消息传递等方法。 5. **进程销毁**:模拟进程完成...
在实际应用中,模拟进程状态可以帮助我们理解操作系统的工作原理,尤其是在并发和并行计算领域。例如,我们可以编写程序模拟多个进程在不同状态之间的转换,根据输入号码动态调整进程队列,观察其对系统性能的影响。...
通过这个实验,学生可以深入理解进程调度的机制,了解不同调度算法如何影响系统性能,同时提升C语言编程和调试的能力。提交实验报告时,需要包括程序清单、实验数据和运行结果,以展示对进程调度算法的理解和应用。 ...
实验的结果分析和源代码部分展示了如何用C语言实现这些调度算法,并通过随机数生成器模拟进程的到达时间和执行时间,这有助于理解进程调度的动态过程。 通过这样的模拟实验,学生不仅能够理解进程调度的概念,还能...
总的来说,C语言模拟磁盘调度是一个既有趣又有挑战性的任务,它涉及到操作系统原理、数据结构、多线程编程等多个领域的知识。通过这个项目,我们可以提升编程技能,加深对操作系统核心机制的理解。
编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。 轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。 简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列...
程序首先初始化这些矩阵,然后模拟进程对资源的请求。当一个进程请求资源时,算法会检查是否满足以下两个条件: 1. 安全性检查:如果存在一个安全序列,即存在一个顺序,使得按照这个顺序分配资源,所有进程都能完成...
3 上机调试 并完成实验报告 ">实验一:模拟进程管理一 目的:模拟进程管理实现进程的创建 撤销 封锁和唤醒功能 二 功能描述1 创建进程: 申请PCB表;填写PCB表;连接到就绪队列中2 撤销功能:按给定进程的标识符从...
为了让学生能够更深入地理解进程调度的算法、数据结构及其程序实现,本实验特别设计了模拟进程调度程序的编写任务,要求学生使用C语言完成对三种不同调度算法的模拟实现。 时间片轮转调度算法(Round Robin, RR)是...