Mutex
Semaphore
앞선 포스팅에서 <일관성 문제>라고 설명했다.
A와 B가 각각 3만원,10만원을 입금했다고 가정했을 때 예상 금액은 5+3+10 = 18만원이 계좌에 있어야 맞다.
그러나 위와 같이 atomic operation을 수행하게 되면 최종적으로 계좌에 8만원이 있는 꽤나 위험한 상황이 발생할 수 있다.
[용어정리] - 논리적 주소(logical address)란?
process가 memory에 적재되기 위한 독자적인 주소 공간인 논리적 주소(logical address)가 생성됩니다. 논리적 주소는 각 process마다 독립적으로 할당되며, 0번지부터 시작됩니다.
[용어정리] - 물리적 주소(physical address)란?
물리적 주소(physical address)는 process가 실제로 메모리에 적재되는 위치를 말합니다.
[용어정리] - 주소 바인딩(address binding)이란?
CPU가 기계어 명령을 수행하기 위해 process의 논리적 주소가 실제 물리적 메모리의 어느 위치에 매핑되는지 확인하는 과정을 주소 바인딩(address binding)이라고 합니다.
RAM에서 메모리의 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 충분히 존재하지만 할당(사용)이 불가능한 상태
메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 상황
메모리가 할당되고 해제되는 작업이 반복될 때 작은 메모리가 중간중간 존재하게 된다. 이 때 중간중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황
이런 식으로 계속해서 빈 메모리가 쌓이는데 예를 들어서 빈 메모리의 공간중에 제일 큰 빈 메모리가 8mb라고 한다면 9mb짜리 프로세스를 할당을 해야할 때 마땅한 공간은 없지만 전체적으로 메모리 여유는 있을 때 외부단편화가 생겼다고 한다.
segmentation이란 process가 할당받은 메모리 공간을 논리적 의미 단위(segment)
로 나누어, 연속되지 않는 물리 메모리 공간에 할당될 수 있도록 하는 메모리 관리 기법입니다.
페이징 기법은 일정한 단위로 메모리를 나누었다면, 세그멘테이션은 의미 단위(code,data,heap,stack 등)로 나누기에 메모리의 크기가 제각각이다.
Segmentation 👉🏻 Paging
segmentation을 먼저 한 후, 각각을 일정한 단위로 나누는(paging) 방법
가상 메모리(virtual memory)란 process 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 하는 기법입니다. 가상 메모리 기법을 통해 사용자 프로그램이 물리적 메모리보다 커져도 실행이 가능하다는 장점이 있습니다.
가상 메모리에서 실제 사용하는 부분을 물리 메모리에 적재하고 당장 필요없는 부분을 디스크에 적재한다.
당장 사용될 주소 공간을 page 단위로 메모리에 적재하는 방법을 요구 페이징(demand paging)이라고 합니다.
가상 메모리에 요구하는 페이지가 없음을 의미
디스크에서 비존재 페이지를 가져와 물리적 메모리에 업데이팅 후 Page table의 페이지 비트를 valid로 변경
알고리즘 | 설명 |
---|---|
FIFO(First In First Out) | 메모리에 올라온지 가장 오래된 page를 교체한다. |
최적 페이지 교체 | 앞으로 가장 오랫동안 사용되지 않을 page를 찾아 교체한다. 실제구현은 어렵다 |
LRU(Least Recently Used) | 가장 오랫동안 사용되지 않은 page를 교체한다. |
LFU(Least Frequently Used) | 참조 횟수가 가장 적은 page를 교체한다. 비용대비 성능이 좋지 않아 잘 쓰이진 않는다. |