Shine's dev log

프로세스의 주소공간 (Address Space) 본문

운영체제

프로세스의 주소공간 (Address Space)

dong1 2020. 6. 11. 15:37

1. 프로세스와 메모리

 

어떤 프로그램을 실행시키려면, 개발자가 짠 코드가 메인 메모리(RAM)에 올라가야 한다. 그 메모리 속에서 변수도 잡히고, 명령어도 실행된다.

 

각 프로세스들은 자신만의 개별적이고 독립적인 address space가 필요하다.

 

만약 32비트 컴퓨터를 사용한다면, 프로세스들은 각각 2^32 = 4 * 2^30 = 4GB의 address space를 사용하고 있는 것이다.

 

하지만, 메모리 라는 컴퓨터 자원은 굉장히 비싼 자원이기 때문에 효율적으로 관리해야 할 필요가 있다. 그래서 운영체제는 프로세스에게 메모리를 독립적으로 할당해주거나, 캐싱을 지원해주거나, Fragmentation을 지원해주는 등의 서비스를 제공한다. 자세한건 추후에 하나씩 배워보자.

 

 

 

2. 주소 (Address)

 

컴퓨터에서 주소란 메모리의 특정 위치를 말한다.

 

같은 메모리 위치라도 부르는 방식에 따라 다르게 표현할 수 있는데, 대표적으로 두개의 관점이 있다.

 

1) Physical address vs Logical address

2) Absolute address vs Relative address

 

여기서 Physical address와 Logical address를 자세히 살펴보자면.

 

Physical address 는 실질적인 메모리의 좌표로서, 메모리 유닛의 실제 위치를 나타내는 주소이고,

Logical addressVirtual address라고도 불리우는데, CPU에 의해 만들어진 가상의 주소이다.

 

Memory Management Unit(MMU) 이라는 장치는 LA를 PA로 바꾸어주는 역할을 한다.

 

MMU

 

거의 모든 프로세스들은 CPU에서 만들어준 Logical Address를 사용한다. 필요에따라 직접 Physical Memory에 접근해야 하는 경우, MMU의 도움을 받는다.

 

 

 

3. PA에서 LA로 바꾸는 방법

 

1) Fixed partitions

 

 

fixed partition

PA를 일정한 크기의 chunk로 잘라놓고 각 프로세스에게 특정 chunk를 할당하는 방법.

 

즉, PA = base Address + LA이다.

 

이렇게 할 경우, 서로 다른 프로세스가 같은 LA를 사용해도 PA는 다른 부분을 가리킬 것이다. 또한, LA는 partition의 크기보다 크거나, 음수가 나오면 안된다.

 

mutiprocess degree = partition의 개수 이다.

 

fixed partition의 장점으로는 valid access를 확인하기 쉽고, context switch하기가 쉽다는 점이 있다. (base register값만 바꾸면 된다.)

 

fixed partition의 단점으로는 Internal Fragmentation이 발생한다는 점이 있다. Internal Fragmentation이란, 각 파티션의 남은 부분을 owner instance도 못쓰고, other instace도 못 쓰는 상태로 낭비되는 문제점이다.

 

 

2) Variable partition

 

variable partition

메모리를 많이 쓸 것 같은 프로세스에게 많은 양의 메모리를 할당하는 방식이다.

 

각각의 프로세스가 시작할 때 운영체제에게 "나 이정도 메모리 필요해" 이렇게 알려주면 운영체제가 그만큼 할당해주는 방식으로 동작한다.

 

PA = Base Address + LA이긴 한데, Limit register가 존재하여, PA가 Limit register 안쪽으로 떨어져야 유효하다.

 

variable partition의 장점으로는 Internal Fragmentation이 발생하지 않아 비교적 효율적인 메모리 사용이 가능하다는 점이 있다.

 

variable partition의 단점으로는 External Fragmentation 문제가 발생한다.

 

external fragmentation

 

external fragmentation이란 프로세스가 address space 를 쓰고 반환하면, hole이 생기는데, 각 hole들을 합쳐서다른 프로세스에게 할당해주기 어렵다는 문제이다.

 

external fragmentation의 해결법으로는

1) Compaction : 메모리 안쓰는 부분을 밀어버리는 것과

2) Paging : 애초에 할당할때부터 작은 크기로 쪼개서 쓰는 방식이 있다.

 

variable partition에서 고려할 이슈로는 "새로운 프로세스에게 메모리 공간을 할당해줄 때 어디에다가 할당해주어야 하는가?" 에 대한 이슈가 있다. 그 방법으로는 크게 세가지가 있다.

 

1) Best fit allocation : |hole| - |alloc| 의 크기가 제일 작은 hole에 할당하는 방식으로, 최대한 hole의 크기에 맞는 프로세스를 할당해주는 방식이다. 하지만, 이 경우 external fragmentation이 더 자주 발생한다는 문제점이 있다. (점점 chunk가 작게 쪼개지기 때문)

2) Worst fit allocation : |hole| - |alloc| 의 크기가 제일 큰 hole에 할당하는 방식으로, external fragmentation이 적게 발생한다는 장점이 있다.

3) first fit allocation : 가능한 hole중 제일 앞에 있는 놈에 할당.

 

 

3) Segmentation

 

segmentation

 

Segmentation은 Variable partition의 확장판으로 프로세스에 필요한 메모리 공간을 여러개의 segment로 쪼개고, 각 segment 는 logical entry에 대응시키는 방법이다.

 

이 때, variable partition 방식은, 초기에 쓸 메모리 양을 미리 정해놨다면, segmentation 방식은 초기에는 조금 잡아놓고 점점 늘려가는 방식으로 메모리를 사용한다.

 

각 segment마다 base가 달라질 것이고, 만약, segmentation의 limit보다 높은 값을 참조하면, segmentation fault가 발생할 것이다.

 

각각의 segment는 segment table을 가지므로, 이를 통해 PA에 매핑시킨다. table에는 DIR라는 값도 있는데, 이는 앞으로 segment가 늘어날 방향을 알려주는 값이다.

 

Segment ID는 explicit하게 표현하거나 implicit하게 표현할 수 있다.

- Explicit : <segment ID, offset>

  ex) <0x02, 0x2b42>

- Implicit : Use n-MSBs as segment ID

  ex) 0x022b42

 

Segmentation의 장점으로는, Prot 값을 통해 Segmentation을 보호하기 쉽다는점이 있다.

 

Segmentation의 단점으로는, External fragmentation이 여전히 발생하며, context switch 발생할 때, Segment table자체의 오버헤드가 있다는 점이 있다.

 

 

오늘 배운 내용을 정리해 보면,

 

1. 메모리는 굉장히 비싼 자원이라서 운영체제가 효율적으로 관리해 주어야 한다.

 

2. 메모리의 주소를 나타내는 방법은 PA와 LA가 있다.

 

3. PA를 LA로 바꾸는 방법으로는 Fixed partition, Variable partition, Segmentation 등이 있다.

 

본 내용은 공부하며 정리한 것으로, 오류가 있을 수 있습니다.