操作系统实验2之带内存分配的处理机调度

一、实验题目
1) 假设主存空间大小,预设操作系统所占大小并构造未分分区表;未分分区表目内容:起址、长度、状态(未分/空表目);
2) 结合实验一,PCB的内容增加为:
PID;
要求运行时间;
优先权;
状态;
所需主存大小;
主存起始位置;
PCB指针;
3) 采用最先适应算法分配主存空间;
4) 进程完成后,回收主存,并与相邻空闲分区合并。
 
二、程序截图

图1 主程序窗口

图2 内存同步演示窗口

三、新增的内存块类和修改后的双链表类
Cmm.h
fndef CMM_H
#define CMM_H

#define DEFAULT_SIZE 
20
#define MM_TOTAL_SIZE 
100
#define MM_MAX_SIZE 
30
typedef unsigned 
int  uint;
/*要使用Clist,需提供prep,nextp,和<(),>()*/
class  Cmm
{
public:
    uint begin;
    uint size;
    Cmm
* prep;
    Cmm
* nextp;
public:
    Cmm():begin(
0),size(0),prep(NULL),nextp(NULL){}
    
/*p紧邻this,即p,this顺序*/
    bool extent_front(Cmm
* p)
    
{
        
if( p && this->begin==p->begin+p->size )
        
{
            
this->begin=p->begin;
            
this->size+=p->size;
            
return true;
        }

        
return false;
    }

    
/*this紧邻p,即this,p顺序*/
    bool extent_back(Cmm
* p)
    
{
        
if( p && p->begin==this->begin+this->size )
        
{
            
this->size+=p->size;
            
return true;
        }

        
return false;
    }

    bool div(uint needs)
    
{
        
if( size<needs )
            
return false;
        size
-=needs;
        begin
+=needs;
        
return true;
    }

}
;
#endif
list.h(模板化后,类的实现须和定义放到同一个文件中)
#ifndef PCBLIST_H
#define PCBLIST_H

/*hasa not isa,良好的链表应该这样吧*/
// template<class T>
// class Cnode
// {
// public:
//     T* prep;
//     T*  nextp;
//     T data;
// };

template
< class  T >
class  Clist
{
public:
    T
* head;
    T
* end;
public:
    
int count;
public:
    Clist():count(
0){end=new T;head=end;}
    
void push_back(T*);
    
void insert_before(T* inpcb,T* nextpcb);
    T
* pop(T*);
    T
* pop_front();
    T
* findp(int id);
    
void remove(T*);
    
//void swap(T*,T*);
    void sort();
    
void clear();
    
~Clist();
}
;
#endif

template
< class  T >
Clist
< T > :: ~ Clist()
{
    clear();
}


template
< class  T >
void  Clist < T > ::clear()
{
    
if( count )
    
{
        T
* tp=head;
        T
* p=tp;
        
while( tp=tp->nextp )
        
{
            delete p;
            p
=tp;
        }

        count
=0;
        head
=end;
    }

}


template
< class  T >
void  Clist < T > ::push_back(T *  p)
{
    
if( head==end )
    
{
        head
=p;
        p
->nextp=end;
        end
->prep=p;
    }

    
else
    
{
        p
->nextp=end;
        p
->prep=end->prep;
        end
->prep->nextp=p;
        end
->prep=p;
    }

    
++count;
}


template
< class  T >
void  Clist < T > ::insert_before(T *  inpcb,T *  nextpcb)
{
    
if( head==nextpcb )
    
{
        inpcb
->nextp=head;
        inpcb
->prep=NULL;
        head
->prep=inpcb;
        head
=head->prep;
        
++count;
    }

    
else if( end==nextpcb )
            push_back(inpcb);
    
else
    
{
        inpcb
->nextp=nextpcb;
        inpcb
->prep=nextpcb->prep;
        nextpcb
->prep->nextp=inpcb;
        nextpcb
->prep=inpcb;
        
++count;
    }

}


template
< class  T >
T
*  Clist < T > ::pop(T *  p)
{
    
if( p==head )
    
{
        head
=p->nextp;
        p
->nextp->prep=NULL;
    }

    
else
    
{
        p
->prep->nextp=p->nextp;
        p
->nextp->prep=p->prep;
    }

    p
->prep=p->nextp=NULL;
    
--count;
    
return p;
}


template
< class  T >
T
*  Clist < T > ::pop_front()
{
    
return pop(head);
}


template
< class  T >
void  Clist < T > ::remove(T *  p)
{
    pop(p);
    delete p;
}


template
< class  T >
T
*  Clist < T > ::findp( int  id)
{
    
ifthis->head==end ) return NULL;
    
else
    
{
        T
* p=head;
        
while( p->pid!=id ) p=p->nextp;
        
if( p==end ) return NULL;
        
return p;
    }

}

// template<class T>
// void Clist<T>::swap(T* a,T* b)
// {
//     T* p1;
//     if( a==b )
//         return;
//     a->nextp->prep=b;
//     a->prep->nextp=b;
//     b->nextp->prep=a;
//     b->prep->nextp=a;
//     p1=a->nextp;
//     a->nextp=b->nextp;
//     b->nextp=p1;
//     p1=a->prep;
//     a->prep=b->prep;
//     b->prep=p1;
// }
// 直接插入排序以减少排序次数
template < class  T >
void  Clist < T > ::sort()
{
    T
* ap;
    T
* bp=head;
    T
* tp;
    
while( bp!=end && bp->nextp!=end )
    
{
        ap
=bp->nextp;
        
if*ap>*bp && ap!=end )
        
{
            
//if:如果ap的优先级比头结点还大就直接插在头部
            
//else:判断插入位置,并插入
            if*head<*ap ) 
            
{
                pop(ap);
                insert_before(ap,head);    
            }

            
else
            
{
                tp
=bp->prep;
                
while*tp<*ap && tp!=head )
                    tp
=tp->prep;
                pop(ap);
                insert_before(ap,tp
->nextp);
            }

        }

        
else
            bp
=bp->nextp;
    }

}

------------------------------------
倦鸟投林兮日落山,我之故乡兮在何方?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值