서북 농 림 과학기술 대학 운영 체제 실험 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
독서 노트문제1: 한 파일에 10000000개의 기록이 포함되어 있으며, 각 기록의 내용은 7자리의 정수이다.기록은 중복되지 않는다.파일 내용을 읽는 프로그램이 필요하고, 이 기록을 정렬한 후 파일을 출력해야 하며, 메모리는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.