서북 농 림 과학기술 대학 운영 체제 실험 3 (2) - 디자인 테스트 실험

고정 메모리 할당
메모리 관리 스케줄 링 시 뮬 레이 션 프로그램 을 작성 하고 디 버 깅 하 며 저장 관리 알고리즘 을 파악 하고 저장 관리 중의 주소 변환 과정 을 이해 합 니 다. 실험 작업
4. 567917. 고정 식 파 티 션 배분 의 저장 관리 방안 을 설계 하고 파 티 션 의 분배 와 회수 과정 을 모 의 한다.모든 작업 이 일괄 처리 작업 이 라 고 가정 하고 동적 으로 메모 리 를 신청 할 수 없습니다.구역 의 분배 와 회 수 를 실현 하기 위해 구역 표를 설정 하고 표 의 관련 정보 에 따라 분배 하 며 구역 의 분배 와 회수 상황 에 따라 이 표를 수정 할 수 있다.요구 ∶ 1) 모델 묘사, 데이터 구조 정의 2) 코드 작성 및 디 버 깅 실행.3) 실행 중인 데이터 와 결 과 를 드 립 니 다
#include
#include 
#include
#include
//#include
#define n 10  /*             n,       n  10*/
#define m 10  /*              m,       m  10*/
#define minisize 100 /*        ,            minisize,           ,   minisize,     */
struct
{
    float address;  /*         */
    float length;  /*       ,     */
    int flag;   /*          , "0"     */
} used_table[n]; /*     */
struct
{
    float address;  /*       */
    float length;  /*     ,     */
    int flag;   /*         , "0"     , "1"     */
} free_table[m]; /*    */
void allocate(char J,float xk) /* J  ,          xk     */
{
    int i,k;
    float ad;
    k=-1;
    for(i=0; i<m; i++) /*1                                        */
        if(free_table[i].length>=xk&&free_table[i].flag==1)
            if(k==-1||free_table[i].length<free_table[k].length)
                k=i;
    if(k==-1)/*        ,  */
    {
        printf("      
"
); return; } /* , : minisize , ; minisize , */ if(free_table[k].length-xk<=minisize) { free_table[k].flag=0; ad=free_table[k].address; xk=free_table[k].length; } else { free_table[k].length=free_table[k].length-xk; ad=free_table[k].address+free_table[k].length; } /* */ i=0; while(used_table[i].flag!=0&&i<n) /*2 */ i++; if(i>=n) /* */ { printf(" ,
"
); /* */ if(free_table[k].flag==0) /* */ free_table[k].flag=1; else { /* */ free_table[k].length=free_table[k].length+xk; return; } } else { /* */ used_table[i].address=ad; used_table[i].length=xk; used_table[i].flag=J; } return; }/* */ void reclaim(char J) /* J */ { int i,k,j,s,t; float S,L; /* */ s=0; while((used_table[s].flag!=J||used_table[s].flag==0)&&s<n) s++; if(s>=n)/* J */ { printf("
"
); return; } /* */ used_table[s].flag=0; /* S L*/ S=used_table[s].address; L=used_table[s].length; j=-1; k=-1; i=0; /* , k, j*/ while(i<m&&(j==-1||k==-1)) { if(free_table[i].flag==1) { if(free_table[i].address+free_table[i].length==S)k=i;/* */ if(free_table[i].address==S+L)j=i;/* */ } i++; } if(k!=-1) if(j!=-1) /* 3 */ { free_table[k].length=free_table[j].length+free_table[k].length+L; free_table[j].flag=0; } else /* , , */ free_table[k].length=free_table[k].length+L; else if(j!=-1) /* , , */ { free_table[j].address=S; free_table[j].length=free_table[j].length+L; } else /* , */ { /* */ t=0; while(free_table[t].flag==1&&t<m) t++; if(t>=m)/* , , */ { printf(" ,
"
); used_table[s].flag=J; return; } free_table[t].address=S; free_table[t].length=L; free_table[t].flag=1; } return; }/* */ int main( ) { int i,a; float xk; char J; /* :*/ free_table[0].address=10240; /* 10240*/ free_table[0].length=10240; /* 10240, 10k*/ free_table[0].flag=1; /* */ for(i=1; i<m; i++) free_table[i].flag=0; /* */ /* :*/ for(i=0; i<n; i++) used_table[i].flag=0; /* */ while(1) { printf("*********************************************"); printf("
\t\t
"
); printf("*********************************************"); printf("

\t\t0- "
); printf("
\t\t1- "
); printf("
\t\t2- "
); printf("
\t\t3- "
); printf("

\t\t\t\t (0~3) :
"
); scanf("%d",&a); switch(a) { case 0: exit(0); /*a=0 */ case 1: /*a=1 */ printf(" J xk:
"
); scanf("%*c%c%f",&J,&xk); allocate(J,xk); /* */ break; case 2: /*a=2 */ printf(" "); scanf("%*c%c",&J); reclaim(J); /* */ break; case 3: /*a=3 */ /* */ printf(" :

"
); for(i=0; i<m; i++) printf("%6.0f%9.0f%6d
"
,free_table[i].address,free_table[i].length, free_table[i].flag); printf(" ,
"
); getch(); printf(" :

"
); for(i=0; i<n; i++) if(used_table[i].flag!=0) printf("%6.0f%9.0f%6c
"
,used_table[i].address,used_table[i].length, used_table[i].flag); else printf("%6.0f%9.0f%6d
"
,used_table[i].address,used_table[i].length, used_table[i].flag); break; default: printf("
"
); }/*case*/ }/*while*/ return 1; }/* */

동적 메모리 할당
가 변 적 인 파 티 션 배분 의 저장 관리 방안 을 설계 하고 데이터 구 조 를 정의 하 며 코드 를 작성 하여 실행 하고 디 버 깅 합 니 다.요구 ∶ 1) 구역 의 분배 와 회수 과정 을 시 뮬 레이 션 하여 실현 한다.2) 구역 별 관리 알고리즘 은 첫 번 째 적응 알고리즘, 순환 첫 적응 알고리즘 과 최 적 적응 알고리즘 세 가지 중 하 나 를 선택 하거나 스스로 정의 할 수 있다.
#include
#include 
#include
#include
//#include
#define ALLOCATE_ERROR -1
#define ALLOCATE_SUCCESS 0
#define n 10  /*             n,       n  10*/
#define m 10  /*              m,       m  10*/
#define minisize 100 /*        ,            minisize,           ,   minisize,     */
struct
{
    float address;  /*         */
    float length;  /*       ,     */
    int flag;   /*          , "0"     */
} used_table[n]; /*     */
struct
{
    float address;  /*       */
    float length;  /*     ,     */
    int flag;   /*         , "0"     , "1"     */
} free_table[m]; /*    */
void allocate ( char J, float xk ) /* J  ,          xk     */
{
    int i, k;
    float ad;
    k = -1;
    for ( i = 0; i < m; i++ ) /*1                                        */
        if ( free_table[i].length >= xk && free_table[i].flag == 1 )
            if ( k == -1 || free_table[i].length < free_table[k].length )
                k = i;
    if ( k == -1 ) /*        ,  */
    {
        printf ( "      
"
); return; } /* , : minisize , ; minisize , */ if ( free_table[k].length - xk <= minisize ) { free_table[k].flag = 0; ad = free_table[k].address; xk = free_table[k].length; } else { free_table[k].length = free_table[k].length - xk; ad = free_table[k].address + free_table[k].length; } /* */ i = 0; while ( used_table[i].flag != 0 && i < n ) /*2 */ i++; if ( i >= n ) /* */ { printf ( " ,
"
); /* */ if ( free_table[k].flag == 0 ) /* */ free_table[k].flag = 1; else { /* */ free_table[k].length = free_table[k].length + xk; return; } } else { /* */ used_table[i].address = ad; used_table[i].length = xk; used_table[i].flag = J; } return; }/* */ void allocateFirstFit ( char JobName, double xk ) // { int k; float address_new; int i; for ( i = 0; i < m; i++ ) if ( free_table[i].length >= xk && free_table[i].flag == 1 ) if ( k == -1 || free_table[i].length < free_table[k].length ) k = i; if ( k == -1 ) { printf ( " " ); exit ( -1 ); } /* , : minisize , ; minisize , */ if ( free_table[k].length - xk <= minisize ) { free_table[k].flag = 0; // , address_new = free_table[k].address; // xk = free_table[k].length; //xk } else { free_table[k].length = free_table[k].length - xk; // address_new = free_table[k].address + free_table[k].length; } // i = 0; while ( used_table[i].flag != 0 && i < n ) /*2 */ i++; if ( i >= n ) /* */ { printf ( " ,
"
); /* , */ if ( free_table[k].flag == 0 ) /* */ free_table[k].flag = 1; else { /* */ free_table[k].length = free_table[k].length + xk; return; } } else { // used_table[i].address = address_new; used_table[i].length = xk; used_table[i].flag = 1; // } return; } void reclaim ( char J ) /* J */ { int i, k, j, s, t; float S, L; /* */ s = 0; while ( ( used_table[s].flag != J || used_table[s].flag == 0 ) && s < n ) s++; if ( s >= n ) /* J */ { printf ( "
"
); return; } /* */ used_table[s].flag = 0; /* S L*/ S = used_table[s].address; L = used_table[s].length; j = -1; k = -1; i = 0; /* , k, j*/ while ( i < m && ( j == -1 || k == -1 ) ) { if ( free_table[i].flag == 1 ) { if ( free_table[i].address + free_table[i].length == S ) k = i; /* */ if ( free_table[i].address == S + L ) j = i; /* */ } i++; } if ( k != -1 ) if ( j != -1 ) /* 3 , */ { free_table[k].length = free_table[j].length + free_table[k].length + L; free_table[j].flag = 0; } else /* , , */ free_table[k].length = free_table[k].length + L; else if ( j != -1 ) /* , , */ { free_table[j].address = S; free_table[j].length = free_table[j].length + L; } else /* , */ { /* */ t = 0; while ( free_table[t].flag == 1 && t < m ) t++; if ( t >= m ) /* , , */ { printf ( " ,
"
); used_table[s].flag = J; return; } free_table[t].address = S; free_table[t].length = L; free_table[t].flag = 1; } return; }/* */ int main( ) { int i, a; float xk; char J; /* :*/ free_table[0].address = 10240; /* 10240*/ free_table[0].length = 10240; /* 10240, 10k*/ free_table[0].flag = 1; /* */ for ( i = 1; i < m; i++ ) free_table[i].flag = 0; /* */ /* :*/ for ( i = 0; i < n; i++ ) used_table[i].flag = 0; /* */ while ( 1 ) { printf ( "*********************************************" ); printf ( "
\t\t
"
); printf ( "*********************************************" ); printf ( "

\t\t0- "
); printf ( "
\t\t1- "
); printf ( "
\t\t2- "
); printf ( "
\t\t3- "
); printf ( "

\t\t\t\t (0~3) :
"
); scanf ( "%d", &a ); switch ( a ) { case 0: exit ( 0 ); /*a=0 */ case 1: /*a=1 */ printf ( " J xk:
"
); scanf ( "%*c%c%f", &J, &xk ); allocateFirstFita ( J, xk ); /* */ break; case 2: /*a=2 */ printf ( " " ); scanf ( "%*c%c", &J ); reclaim ( J ); /* */ break; case 3: /*a=3 */ /* */ printf ( " :

"
); for ( i = 0; i < m; i++ ) printf ( "%6.0f%9.0f%6d
"
, free_table[i].address, free_table[i].length, free_table[i].flag ); printf ( " ,
"
); getch(); printf ( " :

"
); for ( i = 0; i < n; i++ ) if ( used_table[i].flag != 0 ) printf ( "%6.0f%9.0f%6c
"
, used_table[i].address, used_table[i].length, used_table[i].flag ); else printf ( "%6.0f%9.0f%6d
"
, used_table[i].address, used_table[i].length, used_table[i].flag ); break; default: printf ( "
"
); }/*case*/ }/*while*/ return 1; }/* */

단락 식 저장 관리
3. 한 단락 의 페이지 식 저장 관리 주소 변환 시 뮬 레이 션 프로그램 을 설계 하고 디 버 깅 합 니 다.요구 ∶ 1) 설계 단계 표, 페이지 표.
#include 
#include 

#define n 4 //     
//  
struct Parag
{
    int state;//    
    int length;//    ,      ,            
    int PTID;//    
}parag[4];

//  
struct Page
{
    int state;//  
    int MMID;//    
}page[100];

void print(int did, int ptid)
{
    int i;
    printf("     :
"
); printf(" \t| \t| \t| |
"
); for(i=0; i < n; i++) printf("%d\t|%d\t|%d\t\t|%d\t|
"
, i, parag[i].state, parag[i].length, parag[i].PTID); printf(" :
"
); printf(" \t| \t| |
"
); for(i = ptid; i<ptid+parag[did].length; i++) printf("%d\t|%d\t|%d\t|
"
, i-ptid, page[i].state, page[i].MMID); } void Init() { int i, d=0; // for(i=0; i < n; i++) { parag[i].length=i+4;// 4 5 6 7 parag[i].state=1; parag[i].PTID=d; d+=parag[i].length; } // for(i = 0; i < d; i++) { page[i].state=1; page[i].MMID=(i+7)%d;// } } void Transform(int DID, int PID, int Address) { if(DID >= n) { printf(" !
"
); return; } if(parag[DID].length <= PID) { printf("
"
); return; } int ptid = parag[DID].PTID; int ptid2 = ptid+PID; int mmid = page[ptid2].MMID; int newAddress = 1024*mmid+Address; printf(" : :%d, :%d, :%d
"
,DID, PID, Address); print(DID,ptid);// printf(" :%d", newAddress); } int main() { int DID, PID, Address; Init();// printf(" :
"
); printf(" :
"
); scanf("%d",&DID); printf(" :
"
); scanf("%d",&PID); printf(" :
"
); scanf("%d", &Address); Transform(DID, PID, Address); return 0; }

좋은 웹페이지 즐겨찾기