Делаю лабу по ОС, модель алгоритма диспетчеризации процессов SJF. Ничего сложного, просто создаётся двусвязный список и из него выбираются процессы, которым нужно меньше всего процессорного времени. Вроде код я написал, но он через раз падает. Думаю, у меня ошибки где-то в удалении. Весь день пялюсь в код а понять почему указатели начинают указывать черти куда не могу. код:#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
//process states
#define WAITS 2
#define RUNS 3
//number of proc requests
#define NUM 5 //0
//process count
#define PROC_NUM 10
//max cpu time
#define MAX_CT 100
#define ushort unsigned short
#define uint unsigned int
struct proclst
{
ushort pid;
ushort state;
uint cputime;
};
struct ff
{
struct proclst *proc;
struct ff *next;
struct ff *prev;
};
struct proclst list[PROC_NUM];
struct ff *start=0, *last;
struct ff *Add2FIFO( struct ff *lst, struct proclst *pr )
{
struct ff *tmp;
tmp = (struct ff *)malloc( sizeof( struct ff) );
tmp->proc = pr;
tmp->next = 0;
tmp->prev = lst;
if( lst ) lst->next = tmp;
return tmp;
}
//find proc with lowest cputime
struct ff *next_proc( )
{
struct ff *tmp, *z = 0;
int lowest = MAX_CT;
tmp = start;
while( tmp )
{
if( tmp->proc->cputime < lowest )
{
lowest = tmp->proc->cputime;
z = tmp;
}
tmp = tmp->next;
}
return z;
}
void GetFromFIFO()
{
struct ff *nxt,*q;
nxt = next_proc(); //find proc with lowest cpu time
while( nxt )
{
nxt->proc->state = RUNS;
printf( " pid = %d, CPU time = %d \n", nxt->proc->pid, nxt->proc->cputime );
if( nxt->prev ) nxt->prev->next = nxt->next; //remove record
else //if our record starts
{ //our record is first [start], so shift start position
start = nxt->next;
if(start) start->prev = 0;
}
free( nxt );
nxt = next_proc();
}
}
void init()
{
int i;
srand( GetTickCount() );
for( i=0; i<PROC_NUM; i++ )
{
list[i].state = WAITS;
list[i].cputime = 1 + rand() % MAX_CT; //random cpu time 1..MAX_CT
list[i].pid = i;
}
printf( " + init ok\n" );
}
void createlist()
{
int i;
srand( GetTickCount() );
//create fifo list
last = 0;
for( i=0; i<NUM; i++ )
{
last = Add2FIFO( last, &list[rand() % PROC_NUM] ); //add random proc 2 fifo
if(!i) start = last;
}
printf( " + fifo list created\n" );
}
int main( int argc, char* argv[] )
{
init();
createlist();
GetFromFIFO();
return 0;
}