운영 체제 실험의 메 인 메모리 공간의 분배 와 회수
1. 실험 목적
좋 은 컴퓨터 시스템 은 충분 한 용량, 액세스 속도 가 높 고 안정 적 이 며 신뢰 할 수 있 는 메 인 메모리 가 있어 야 할 뿐만 아니 라 이러한 저장 공간 을 합 리 적 으로 분배 하고 사용 할 수 있어 야 한다.사용자 가 메모리 공간 을 신청 할 때 저장 관 리 는 반드시 신청자 의 요구 에 따라 일정한 전략 에 따라 메 인 저장 공간의 사용 상황 을 분석 하고 충분 한 여유 구역 을 찾 아 신청자 에 게 분배 해 야 한다.작업 이 철수 하거나 메 인 저장 자원 을 자발적으로 반환 할 때 저장 관 리 는 작업 이 차지 하 는 메 인 저장 공간 을 회수 하거나 일부 메 인 저장 공간 을 반환 해 야 한다.메 인 메모리 의 분배 와 회수 의 실현 은 메 인 메모리 의 관리 방식 과 관련 이 있 지만 이 실험 을 통 해 학생 들 이 서로 다른 저장 관리 방식 에서 메 인 메모리 공간의 분배 와 회 수 를 어떻게 실현 해 야 하 는 지 이해 하도록 도와 준다.
2. 실험 내용
이 실험 은 두 가지 저장 관리 방식 에서 의 메 인 저장 배분 과 회 수 를 모 의 한다.
3. 힌트 와 설명
이 실험 은 두 문제 가 있 는데, 학생 들 은 그 중의 한 문 제 를 선택 하여 실험 을 할 수 있다.
첫 번 째 문제: 가 변 구역 관리 방식 에서 가장 먼저 적응 하 는 알고리즘 을 사용 하여 메 인 저장 분 배 를 실현 하고 메 인 저장 회 수 를 실현 한다.
가 변 파 티 션 방식 은 작업 에 필요 한 메 인 저장 공간 크기 에 따라 파 티 션 을 나 누 는 것 이다.작업 을 불 러 올 때 작업 에 필요 한 주 저장량 에 따라 충분 한 여유 공간 이 있 는 지 확인 하고 있 으 면 수 요 량 에 따라 파 티 션 을 나 누 어 작업 에 할당 합 니 다.없 으 면 작업 을 불 러 올 수 없습니다.작업 의 불 러 오기, 철수 에 따라 메 인 저장 공간 은 여러 개의 구역 으로 나 뉘 고 어떤 구역 은 작업 에 의 해 점용 되 며 어떤 구역 은 비어 있다.예 를 들 면:
시스템
숙제
숙제
빈 공간
숙제
빈 공간
어떤 구역 이 비어 있 는 지 설명 하기 위해 서 는 새 작업 을 불 러 올 수 있 습 니 다. 빈 공간 설명 표 가 있어 야 합 니 다. 형식 은 다음 과 같 습 니 다.
주소
길이
상태.
제1 란
14 K
12 K
할당 되 지 않 음
제2 란
32 K
96 K
할당 되 지 않 음
빈 목록
빈 목록
그 중에서 시작 주소 - 빈 공간 에 있 는 메 인 저장 소 시작 주 소 를 알려 줍 니 다.
길이 - 시작 주소 부터 의 연속 적 인 남 은 길 이 를 알려 줍 니 다.
상태 - 두 가지 상태 가 있 는데 하 나 는 '미분 배' 상태 로 주소 가 가리 키 는 특정한 길이 의 구역 이 빈 구역 임 을 지적한다.다른 하 나 는 '빈 목록' 상태 로 표 에 대응 하 는 등록 항목 이 공백 (무효) 임 을 나타 내 며 새로운 빈 공간 을 등록 할 수 있 습 니 다 (예 를 들 어 작업 이 철수 한 후에 그 가 차지 하 는 구역 은 빈 공간 이 되 므 로 '빈 목록' 표시 줄 을 찾 아 반환 구역 의 주소 와 길 이 를 등록 하고 상 태 를 수정 해 야 합 니 다).구역 의 개수 가 정 해 지지 않 기 때문에 빈 구역 설명 표 에는 적당 한 상태 가 '빈 목록' 인 등록 항목 이 있어 야 한다. 그렇지 않 으 면 표 가 넘 쳐 등록 할 수 없다.
상술 한 이 설명 표 의 등록 상황 은 제시 (1) 중의 예 에 따라 불 러 온 세 개의 작업 이 차지 하 는 메 인 저장 구역 에 따라 작성 한 것 이다.
(2) 새 작업 이 메 인 저장 소 를 불 러 오 라 고 요구 할 때 빈 공간 설명 표를 찾 아 충분 한 빈 공간 을 찾 아야 한다.때때로 찾 은 빈 공간 은 작업 수 요 량 보다 많 을 수 있 습 니 다. 이 때 는 원래 의 빈 공간 을 두 부분 으로 바 꿔 야 합 니 다. 일 부 는 작업 에 나 누 어 사용 해 야 합 니 다.다른 부분 은 또 하나의 작은 빈 공간 이 되 었 다.분할 로 인 한 빈 공간 을 최소 화하 기 위해 서 는 높 은 주소 부분 에 비교적 큰 연속 빈 공간 을 저장 하여 대형 작업 의 불 러 오기 에 유리 하도록 한다.이 를 위해 빈 공간 설명 표 에서 모든 빈 공간 을 주소 순서대로 등록 합 니 다. 즉, 모든 후계 의 빈 공간 은 시작 주소 가 항상 전자 보다 큽 니 다.편리 하 게 찾기 위해 서 는 표 의 '긴축' 을 위해 항상 '빈 표 항목' 표시 줄 을 표 의 뒷부분 에 집중 시 킵 니 다.
(3) 가장 먼저 적응 하 는 알고리즘 (순서 분배 알고리즘) 을 사용 하여 메 인 저장 공간 을 분배 한다.
작업 의 수 요 량 에 따라 빈 공간 설명 표를 찾 고 순서대로 등록 란 을 살 펴 보고 요 구 를 만족 시 킬 수 있 는 첫 번 째 빈 공간 을 찾 습 니 다.빈 공간 이 수 요 량 보다 많 을 때 일 부 는 작업 을 불 러 오 는 데 사용 되 고 다른 일 부 는 빈 공간 설명 표 에 등 록 됩 니 다.
이 실험 은 메 인 저장 소의 분 배 를 모 의 하 는 것 이기 때문에 메 인 저장 소 를 작업 에 할당 한 후 불 러 오 는 프로그램 을 실제 시작 하지 않 고 출력 '분배 상황' 으로 대체 합 니 다.가장 먼저 분배 알고리즘 에 적응 하 는 것 은 그림 4 - 1 과 같다.
(4) 작업 수행 이 끝나 고 철수 할 때 작업 이 차지 하 는 구역 은 반환 해 야 한다. 반환 하 는 구역 이 다른 빈 공간 과 인접 하면 비교적 큰 빈 공간 을 합성 하여 빈 공간 설명 표 에 등록 해 야 한다.예 를 들 어 알림 (1) 에 열 거 된 상황 에서 작업 2 가 철수 하면 메 인 저장 구역 을 반환 할 때 상하 와 인접 한 빈 공간 과 함께 큰 빈 공간 을 합성 하여 빈 공간 설명 표 에 등록 해 야 한다.메 인 저장 소 를 반환 할 때의 회수 알고리즘 은 그림 4 - 2 와 같다.
(5) 가장 먼저 적응 하 는 알고리즘 에 따라 메모리 분배 와 회수 프로그램 을 설계 하 십시오.그 다음 에 (1) 에서 메 인 저장 소 에 세 개의 작업 을 불 러 왔 고 두 개의 빈 공간 을 형성 하여 빈 공간 설명 표 의 초기 값 을 확인한다 고 가정 합 니 다.현재 메 인 저장량 이 6K 인 작업 4 가 메 인 저장 소 를 불 러 오 기 를 신청 합 니 다.그리고 작업 3 철수;재 작업 2 철수.메 인 저장 소 를 할당 하고 회수 하 십시오. 빈 공간 설명 표 의 초기 값 과 매번 할당 하거나 회수 한 후의 변 화 를 표시 하거나 인쇄 하 십시오.
솔직히 나 는 이것 에 대해 매우 만 족 스 럽 지 못 하 다. 아마도 밤 을 새 우 는 데다 가 시간 이 촉박 해서 코드 를 아주 엉망 으로 썼 기 때 문 일 것 이다 (). 그래도 붙 여 놓 고 시간 이 있 으 면 직접 보고 고 쳐 라.
#include
#include
typedef struct task
{
int name; /* */
int add;
int length; /* , */
struct task *next;/* */
}
nodet;
typedef struct chart
{
int add;
int length;
int status;
struct chart *next;
}
nodec;
nodet* headt;
nodec* headc;
void init()
{
nodet* t;
nodec* c;
headt = (nodet*)malloc(sizeof(nodet));
headc = (nodec*)malloc(sizeof(nodec));
t = headt->next = (nodet*)malloc(sizeof(nodet));
c = headc->next = (nodec*)malloc(sizeof(nodec));
t->name = 1;
t->add = 5;
t->length = 5;
c->add = 14;
c->length = 12;
c->status = 0;
t = t->next = (nodet*)malloc(sizeof(nodet));
c = c->next = (nodec*)malloc(sizeof(nodec));
t->name = 3;
t->add = 10;
t->length = 4;
c->add = 32;
c->length = 96;
c->status = 0;
c->next = NULL;
t = t->next = (nodet*)malloc(sizeof(nodet));
t->name = 2;
t->add = 26;
t->length = 6;
t->next = NULL;
}
void printLink()
{
nodec* p;
p = headc->next;
printf(" ADD LENGTH
");
while(p)
{
printf(" %dK %dK
",p->add,p->length);
p=p->next;
}
}
int taskIn(int name,int length)
{
int done = 0,add;
nodec *b,*c;
c = headc->next;
if (!c)
{
return 0;
}
else
{
while(c)
{
if (c->length < length)
{
b = c;
c = c->next;
}
else if (c->length > length)
{
c->length = c->length - length;
//c->add = c->add - length;
add = c->add;
done = 1;
break;
}
else if (c->length == length)
{
if (headc->next == c)
{
add = c->add;
headc->next = c->next;
free(c);
}
else
{
add = c->add;
b->next = c->next;
free(c);
}
done = 1;
break;
}
}
if (done == 0)
{
return 0;
}
}
nodet* t;
t = headt->next;
if (t != NULL)
{
while(t->next)
{
t = t->next;
}
t->next = (nodet*)malloc(sizeof(nodet));
t = t->next;
t->name = name;
t->add = add;
t->length = length;
}
else
{
t = headt->next = (nodet*)malloc(sizeof(nodet));
t->name = name;
t->add = add;
t->length = length;
}
printLink();
return 1;
}
int taskOut(int name)
{
int add,length;
nodet *t,*k;
t = headt->next;
while (t)
{
if (t->name == name && headt->next == t)
{
add = t->add;
length = t->length;
headt->next = t->next;
free(t);
break;
}
else if (t->name != name)
{
k = t;
t = t->next;
}
else if (t->name == name && headt->next != t)
{
add = t->add;
length = t->length;
k->next = t->next;
free(t);
break;
}
}
nodec *c,*b;
c = headc->next;
if (c != NULL)
{
while(c)
{
if (c == headc->next && add < c->add)
{
if ((add + length) == c->add)
{
c->add = add;
c->length = c->length + length;
printLink();
return 1;
}
b = (nodec*)malloc(sizeof(nodec));
b->add = add;
b->length = length;
headc->next = b;
b->next = c;
printLink();
return 1;
}
else if (c != headc->next)
{
if ((b->add + b->length) != add && (add + length) != c->add)
{
b->next = (nodec*)malloc(sizeof(nodec));
b->next->next = c;
b->next->add = add;
b->next->length = length;
printLink();
return 1;
}
else if ((b->add + b->length) == add && (add + length) != c->add)
{
b->length = b->length + length;
printLink();
return 1;
}
else if ((b->add + b->length) != add && (add + length) == c->add)
{
c->add = add;
c->length = c->length + length;
printLink();
return 1;
}
else if ((b->add + b->length) == add && (add + length) == c->add)
{
b->length = b->length + length + c->length;
b->next = c->next;
free(c);
printLink();
return 1;
}
else
{
b = c;
c = c->next;
}
}
else if (c == headc->next && add < c->add)
{
if ((add + length) < c->add)
{
headc->next = (nodec*)malloc(sizeof(nodec));
headc->next->next = c;
c = headc->next;
c->add = add;
c->length = length;
printLink();
return 1;
}
else if ((add + length) == c->add)
{
c->add = add;
c->length = c->length + length;
printLink();
return 1;
}
}
else
{
b = c;
c = c->next;
}
}
}
}
int main(void)
{
init();
printLink();
taskIn(4,6);
taskOut(3);
taskOut(2);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Windows에서 Java 응용 프로그램의 메모리 측정Windows 환경에서 Java 응용 프로그램이 실제로 사용하는 메모리 양을 확인하려면 작업 관리자의 프로세스 탭에서 확인할 수 없습니다.작업 관리자에는 JVM의 전체 보존 메모리 크기가 표시됩니다. 이번에는 두 가...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.