0 0

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; 
} 
}
C 
2009年3月30日 22:35
目前还没有答案

相关推荐

    C语言模拟进程管理

    ### C语言模拟进程管理知识点详解 #### 一、需求分析 在现代操作系统中,进程管理是核心功能之一。尤其在多任务环境中,进程之间需要共享有限的资源,如CPU时间。因此,合理有效地分配这些资源变得至关重要。在本...

    【精品资料】C语言模拟进程管理.doc

    【C语言模拟进程管理】是针对操作系统中进程调度的一个实践性课题,主要目的是通过编程来理解和模拟操作系统如何管理和调度进程。在这个过程中,学生通常需要实现一个简单的操作系统内核,用C语言编写进程调度器,...

    c语言模拟银行家算法

    根据给定的信息,本文将详细解释“C语言模拟银行家算法”的实现原理及代码细节。 ### 一、银行家算法简介 银行家算法是一种避免死锁的算法,它通过检查系统的资源分配情况来确保系统不会进入不安全状态,从而防止...

    操作系统课程设计 用C语言实现进程调度

    在main函数中,我们首先输入进程数目,然后创建相应的进程控制块,最后使用while循环来模拟进程调度的过程。在每次循环中,我们首先检查当前进程的状态,如果是就绪状态,就将其加入就绪队列中,然后选择最高优先数...

    C语言模拟进程管理[参照].pdf

    在本项目中,学生使用C语言模拟了操作系统中的进程管理,包括进程调度的三种常见算法:最高优先级优先调度算法、简单轮转法调度算法和短作业优先调度算法。以下是这些算法的详细说明: 1. **最高优先级优先调度算法...

    模拟进程调度的c语言程序

    模拟进程调度的c语言程序 在linux下的模拟linux系统进程调度的程序。可以调试通过,以通过测试

    C语言模拟银行家算法

    在`isSafe`函数中,通常采用工作集(Working Set)算法来模拟进程的执行过程,查找是否存在一个安全序列。如果找到,返回1表示安全;否则,返回0表示不安全。 通过C语言模拟银行家算法,我们可以更好地理解和验证该...

    c语言 查杀进程

    在这个主题中,我们将深入探讨如何使用C语言编写程序来查看和终止操作系统中的进程。 首先,我们需要理解什么是进程。在操作系统中,进程是程序的一次执行实例,它包含了程序的内存映像、上下文信息(如寄存器状态...

    用C语言模拟Linux操作系统下处理机调度实验报告

    总的来说,这个实验提供了一个实践性的平台,让学生运用C语言模拟操作系统的核心功能,加深对处理机调度策略的理解,同时锻炼了编程和问题解决能力。通过这个实验,学习者能更好地把握操作系统中多任务并行执行的...

    DeBug_C语言开发的调试器_

    3. **单步执行**:通过模拟CPU执行来实现单步调试。每次执行一条指令后,都需要检查是否到达了断点或其他特殊条件。 4. **内存和寄存器的查看**:提供接口来查看和修改目标程序的内存和寄存器值,这对于理解程序的...

    764432724操作系统进程调度模拟C语言dev---作业自己写的,有问题交流2017-11-25

    3. **时间推进**:模拟系统时间,处理事件队列中的事件,如进程到达时将其添加到就绪队列,进程完成时更新系统状态。 4. **调度算法**:根据选择的调度算法,每次从就绪队列中选取下一个要执行的进程。 5. **统计...

    C语言编写的进程模拟系统

    3. **进程同步**:通过信号量、管程、事件标志等方式,模拟进程间的同步,防止竞争条件和死锁的发生。 4. **进程通信**:模拟进程间的数据交换,如使用共享内存、消息传递等方法。 5. **进程销毁**:模拟进程完成...

    进程模拟&进程队列&操作系统

    在实际应用中,模拟进程状态可以帮助我们理解操作系统的工作原理,尤其是在并发和并行计算领域。例如,我们可以编写程序模拟多个进程在不同状态之间的转换,根据输入号码动态调整进程队列,观察其对系统性能的影响。...

    进程调度 C语言 操作系统实验

    通过这个实验,学生可以深入理解进程调度的机制,了解不同调度算法如何影响系统性能,同时提升C语言编程和调试的能力。提交实验报告时,需要包括程序清单、实验数据和运行结果,以展示对进程调度算法的理解和应用。 ...

    进程调度程序模拟 进程调度程序模拟 进程调度程序模拟

    实验的结果分析和源代码部分展示了如何用C语言实现这些调度算法,并通过随机数生成器模拟进程的到达时间和执行时间,这有助于理解进程调度的动态过程。 通过这样的模拟实验,学生不仅能够理解进程调度的概念,还能...

    c语言模拟磁盘调度

    总的来说,C语言模拟磁盘调度是一个既有趣又有挑战性的任务,它涉及到操作系统原理、数据结构、多线程编程等多个领域的知识。通过这个项目,我们可以提升编程技能,加深对操作系统核心机制的理解。

    操作系统进程调试实验

    编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。  轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。  简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列...

    银行家算法(C语言)模拟OS资源分配

    程序首先初始化这些矩阵,然后模拟进程对资源的请求。当一个进程请求资源时,算法会检查是否满足以下两个条件: 1. 安全性检查:如果存在一个安全序列,即存在一个顺序,使得按照这个顺序分配资源,所有进程都能完成...

    进程管理模拟实验(附有截图)

    3 上机调试 并完成实验报告 "&gt;实验一:模拟进程管理一 目的:模拟进程管理实现进程的创建 撤销 封锁和唤醒功能 二 功能描述1 创建进程: 申请PCB表;填写PCB表;连接到就绪队列中2 撤销功能:按给定进程的标识符从...

    模拟进程调度程序

    为了让学生能够更深入地理解进程调度的算法、数据结构及其程序实现,本实验特别设计了模拟进程调度程序的编写任务,要求学生使用C语言完成对三种不同调度算法的模拟实现。 时间片轮转调度算法(Round Robin, RR)是...

Global site tag (gtag.js) - Google Analytics