학부 내용 정리/[ 2-1 ] 운영체제

[ OS ] Address Spaces

haena02 2022. 4. 18. 01:58
반응형

1. Address Spaces

 

1.1 Multiprogramming and Time Sharing

 

Multiplrogramming - 여러개의 프로세스들이 동시에 메모리에 적제되어 실행되는 프로그램

 

하나 끝나고 하나 실행 시키려면 메모리를 넘겨주기 전에 실행중인 프로세스의 메모리를 저장하고 넘겨줘야한다. 이는 속도 저하를 일으킨다. 하지만 Multiplrogramming을 하면 context swich 를 할 필요가 없다.

하지만 마냥 위 방법이 효율적인 것은 아니다. 크기가 다 똑같게 지정되어있어 모자를 때도 남을 때도 있다. 또, 이는 프로세스 간의 메모리 접근을 막아야한다.

 

1.1 Address space

 

우리가 주소 공간을 정의하여 가상주소를 사용하면 메모리 추상화가 쉽고, 프로그램 입장에서 어느 곳에 적재되던지 0 KB에서부터 64KB 에 접근할 수 있고 그 외의 영역에는 접근할수 없다. 이는 편리성을 높이고 Protection 도 해준다.

 

1.2 Virtual Memory

실행중인 프로그램은 매우 큰 주소 공간을 가지고 있다고 생각한다. 프로그램은 마치 전용 물리 메모리를 가지고 있는것 처럼 동작한다. 그렇다고 프로그램을 너무 느리게 실행하거나 가상화에 큰 메모리를 쓰지도 않는다. 또 가상 메모리를 사용하면 프로세스끼리 접근도 안되기에 안전하다.

 

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
	printf("location of code : %p\n", (void *) main);
	printf("location of heap : %p\n", (void *) malloc(1));
	int x = 3;
	printf("location of stack : %p\n", (void *) &x);
	return x;
}

//location of code : 0x1095afe50  제일 낮은 주소
//location of heap : 0x1096008c0  그 다음
//location of stack : 0x7fff691aea64 그 다음

 

1.3 Common Errors

 

1) 포인터 함수를 초기화 하지 않았을 때

2) 문자열에서 "\n" 를 위한 +1을 안해줬을 때

3) 사용중인데 FREE 해줘을 때

4) 사용 가능한 메모리를 사용 안함 (메모리 누수)

5) free 여러번 했을 때 (Double free)

6) 잘못 된 주소를 free 했을 때 (Invalid free)

Fetch, Load, Store

 

1.3 Address Translation

 

가상주소를 실제주소로 변경

 

void func() {
int x = 3000;
x = x + 3;

//메모리에서 x를 레지스터에 넣고 (Fetch, load)
// 레지스터에서 3 더하고 (Fetch,)
// 다시 레지스터에서 메모리로 넣는다 (Fetch, store)
}

 

모든 메모리 참조에서 주소변환은 하드웨어에 의해 수행된다. 하지만 하드웨어만으로는 메모리를 가상화할 수 없고 OS 가 관여해야한다. 이때 OS는 메모리를 원하는 방식으로 사용할 수 있고 자신의 메모리만 접근할 수 있도록 관리해줘야한다.

 

1.4 Memory Relocation

 

이해를 위해 3가지 가정을 하고 진행한다

1. 사용자의 주소공간은 실제 메모리에 연속적으로 배치해야한다

2. 주소공간은 너무 크지 않다 (물리 메모리보다 작다)

3. 각 주소 공간은 정확히 같은 크기이다

 

 

가상메모리가 시작하는 물리메모리 주소를 base 레지스터라고 하고 가상메모리가 끝나는 물리메모리의 주소를 bounds 레지스터라고 한다. 

 

물리주소 = base + 가상주소(off set)

 

접근하려는 주소가 bound 주소보다 크면 보안 측면에서 막는다.

 

 

1.5 Hardware Support

 

1) 권한 모드 - 사용자모드 프로세스가 권한 있는 작업을 실행하지 못하도록 방지해야함

2) base/bounds registers - 주소 변환 및 경계 검사를 지원하기 위해 CPU 당 레지스터 쌍 필요

3) 가상주소를 변환하고 범위 내인지 확인하는 기능 - 변환을 수행하고 경계를 확인

4) base/bounds를 업데이트 하는 기능 - 사용자가 프로그램을 실행하기 전에 OS가 먼저 설정

5) 예외 핸들러 등록권한 - 예외가 있을 경우 OS가 하드웨어에 실행할 코드를 알려줄 수 있어야함

6) 예외 발생시키기 - 프로세스가 권한있는 명령이나 범위를 벗어난 메모리를 액세스 하려고할 때

 

 

1.6 Hardware Support

 

1) 메모리 관리 - 새 프로세스를 위한 메모리 할당 필요, 종료된 프로세스 메모리 회수, 사용가능한 목록으로 메모리 관리

2) base/bounds 관리 - 컨텍스트 스위치 혹은 프로세스 주소 이동시 base/bounds 올바르게 설정

3) 예외처리 - 예외가 발생할 때 실행할 코드, 위반 프로세스 종료하는 작업 진행

 

반응형

'학부 내용 정리 > [ 2-1 ] 운영체제' 카테고리의 다른 글

[ OS ] Paging  (0) 2022.04.18
[ OS ] Segmentation  (0) 2022.04.18
[ OS ] Multiprocessor Scheduling  (1) 2022.04.17
[ OS ] Multi-Level Feedback Queue  (0) 2022.04.17
[ OS ] 3. CPU Scheduling  (0) 2022.04.17