거의 OS의 최종장이라고 할 수 있을지는 모르겠으나 내 나름의 커리큘럼에서는 최종장까지 왔다. 내가 느낀 OS의 장점은 보안 관련도 있겠지만, 어떻게 자원을 효율적으로 관리하느냐? 이다. 앞서 내가 작성한 내용들은 Process나 Thread가 처리 되기위한 CPU 관리 측면에서 많이 공부한 것 같다.
2024.01.09 - [Computer Science/Operation System] - [OS] CPU Scheduling(CPU 스케듈링)
2024.01.10 - [Computer Science/Operation System] - [OS] IPC(Inter Process Comunication) - 프로세스간 통신
공부를 하면서 너무나 신나게 했던거 같다. 뭔가 논리적인 것들을 풀어서 설명하는 작업, 비슷한 예를 리얼 월드에서 고민해보는 것들이 매우 뜻깊고 머리속에 깊이 새길 수 있었다. (물론 인터뷰 전에는 다시 복습을 해야겠지만!)
그래서 본론으로 가기전 메모리(RAM)이 무엇인지 알아보고 넘어가자.
# 메모리(RAM)?
메모리? RAM? HDD? 메모리를 검색하다보면 여러가지 자료들이 나온다. 우리가 PC를 맞추다보면 RAM 16GB 맞췄어요~ 이런식으로 이야기하기도 하며, RAM 용량이 딸려서 실행이 너무 늦는다라는 이야기를 많이한다.
메모리 관리 전략에서 메모리는 RAM 메모리도 뜻하는데 그렇다면 RAM은 무엇일까?
RAM(Random Access Memory)는 PC에서 받아오는 데이터를 일시적으로 저장하는 공간이다. DRAM, SRAM등등 뭐 많은 용어들이 있지만, 컴퓨터의 주기억장치 중 하나이다. RAM의 특징중 하나는 컴퓨터의 전원이 Off 되면 휘발성이여서 데이터가 날라간다. 또한, 앞으로 이야기해야할 프로그램이나 프로세스에 필요한 메모리 공간을 할당하게 된다.
# Physical Address(물리 주소) & Logical Address (논리 주소, Virtual Memory)
먼저 메모리 전략을 이해하기전에 메모리의 주소 공간을 알고 넘어가야한다. 우리가 Semaphore를 알기 전에 Deadlock과 Critical Section을 알아야하는것 처럼 말이다.
먼저 주소 공간(Address Space)의 Logical Address(논리 주소, 가상메모리), Physcial Address(물리 주소)에 대해서 알아보겠다.
Logical Address (논리주소, 가상 메모리)라고 부른다. 실제로 존재하는 것은 아니다. CPU에서 자체적으로 프로그램중에 생성하게 된다. 실제 메모리에 바인딩 되는 것이 아닌, CPU입장에서 Memory Address이다. 크기는 Process의 사이즈로 결정되며 언제든지 변경될 수 있다. 그리고 자체적으로 만드는 주소 체계이기 때문에 0부터 시작하게 된다. 이는 불연속적 메모리 관리 차원에서 접근할 수 있는 물리 주소공간보다 한 단계 높은 차원이다.
그리고, 진짜 메모리에 값이 매겨져있는 Physcial Address (물리 주소)가 있다. 해당 주소 공간이 메모리 입장에서 바라보는 주소이다. 메모리는 사실 엄청나게 큰 구조의 배열로 저장되어 있으며 메모리에 매겨져있는 인덱스 값이라고 생각하면 좋다.
이렇게 주소 공간은 두개로 나눠져 있다. 그렇다면 CPU입장에서 바라보는 논리 주소가 리얼 월드에 물리 주소로 맵핑이 되려면 어떻게 해야할까? Memory Management Unit이 담당한다. MMU는 PC의 하드웨어로 구현되어있어서, 빈번하게 일어나는 Mapping에 대응 할 수 있다.
CPU(logical) ------- MMU ------ Memory(physcial)
어쨋든 메모리관리 전략에서는 주소공간과 관련된 내용을 미약하게 남아 살펴보았다. MMU가 어떻게 동작하는지도 알고 있어야하지만, 글이 길어지는 걸 방지하기위해 차후에 깊이있게 들어가보도록 하겠다.
# 메모리 관리 전략
가상 메모리, 물리주소, 메인 메모리도 알아보았으니 오늘의 포스팅 주제인 메모리 관리 전략를 알아보자.
위에 설명은 어쨌든 메모리 관리 전략을 쉽게 이해하기 위해 설명한 내용이었고 아래의 그림을 보면서 다시 설명을 해보겠다.
우리가 이야기하는건 "주기억장치(Main Memory)" 이다. 주기억 장치는 프로세서(CPU)에서 프로그램 정보를 저장하고 있다가 Ready Queue에 들어가고 나서 프로세서의 자원을 사용하기 위해 메모리에서 불러오기 위함이다. 간단한 시퀀스는 이렇지만 여러자원을 사용하게 되면 복잡하다. 그렇다면 이 메모리를 잘 사용해야지 더 많은 양의 프로그램들을 저장하고 CPU에서 불러올 수 있을 것이다. 앞서 공부한 내용이랑 관계가 있기 때문에 꼭 기억해야한다.
결국엔 Muti-Programing에서 대게 많이 사용이 된다. 서로 다른 프로세스로 메모리를 세분화 하는 작업을 메모리 관리 라고하며 이를 전략을 세워서 진행이 된다. 메모리 관리 전략의 목적을 살펴보겠다. 성능을 향상 시키기 위해 Main Memory에 여러 개의 Process가 올라와서 Main Memory를 공유해야한다. 이렇게 된다면 Main Memory의 Utilization은 많아지겠고 시간이 지날수록 Program의 크기가 증가하고 있기 때문에 Main Memory는 항상 finite이게 된다. 그렇기 때문에 Physcial Memory를 효율적으로 사용하기 위해 Memory 참조 방식을 제공하기 위한 Stragy(전략)인것 이다. 즉, 하나의 자원을 여러 작업을 효율적으로 하기 위함이다.
- Process 전후로 Memory를 할당/해제
- Process들에 의해서 Memory 사용된 공간을 추적유지
- Fragmentation 이슈를 최소화
- Main memory 사용량을 적절히 분배
- Process 실행동안 Data 일관성 보장
OS가 관리를 하는 이유는 OS 자체의 보호받는 Kernel 영역이 있고 User영역이 있는데 오로지, OS만이 두개의 영역을 넘나들 수 있다.
※ Static VS. Dynacmic
Static | Dynamic | |
Loading | 고정된 메모리 주소값에 적재하여 더 많은 메모리 공간을 요함 | 전체 프로그램과 프로세스의 모든 데이터가 물리적 주소에 존재 해야하며 프로그램에 필요한 루틴/데이터만 적재, 효율적인 메모리 관리 가능 |
Linking | 걍 무식하게 모든 프로그램 모듈을 단일 실행단위로 결함해버림 | 동적으로 코드를 실행시키며 필요한 루틴이 이미 메모리에 있는지 확인 |
결론적으로 Statci은 무식한 방법이다. 닥치고 모든 메모리에 다 적재하고 연결하게 된다. 그게 필요한지 불필요한지 확인도 안하고, 하지만 Dynamic은 다 확인하고 메모리에 적재시키거나 연결시키게 된다. 이는 메모리 관리 전략도 있지만 넓은 범주내에서 프로그램 실행 및 로딩에 조금 더 특화된 부분에 속하게 된다.
그렇다면 하나씩 뜯어보면서 진행 해보겠다. 그리고 많은 레퍼런스에서 Fragmentaion을 메모리 관리전략에 포함시키는 경우도 있지만 Fragmentaion는 문제점이지 메모리 관리 전략(나누어서 공부할 필요가 있다.)에 포함되지 않는다. Fragmentaion를 해소하기 위해서 메모리 관리전략을 하는거라고 생각하면 된다.
또한, Cognitious Memory 할당, Non- Cognitious Memory 할당으로 나누는 경우도 있지만 위에 트리를 짰지만 Physcial, Virtual로 나누는게 쉬울거 같았다. 쉽게 생각하면 Cognitious Memory 할당 - 메모리할당 기법, Non- Cognitious Memory 할당 - 가상 메모리 이다.
# Swapping(스와핑)
먼저, 메모리 관리 전략중 하나이긴 하지만 차후에 나올 것들이랑은 조금 성격이 다른것 같다고 생각한다. Swapping은 보조기억장치(HDD, SDD)로 주 기억장치에서 사용하지 않는 데이터를 잠깐 옮겼다가 가져오는 것이다. 보조기억 장치로 보내는 것을 Swapped-out, 보조기억장치에서 가져오는것을 Swapped-in이라고 부른다. 사실 어려운 내용은 없다. 그냥 잠깐 보냈다가 다시 가져오는데 워낙 보조기억장치의 I/O 속도가 느려서 완전한 해결책은 아니깐. 조금 구식이지 않을까 싶다.(swapping 개념은 사실 개발자라면 알아야한다고 생각한다.)
# Memory Allocation(메모리 할당 기법) - Congnitious Memory 전략
메모리 할당 기법에는 Fixed Partitiong(고정할당), Dynamic Partitiong(동적할당), Segmentation(분할할당)이 있다. (한글 번역마다 차이가 있는거 같은데 할당기법이기떄문에 할당이라고 하겠음) 이는 Cognitious Memory 할당이다. 먼저 Cognitious Memory 할당 부터 이야기를 해보자면 이는 초기에 나온 메모리 관리 전략중하나이다. 단순하게 메모리를 다 연속적으로 배치해서 접근을 더 쉽게 했다는 것에 있지만 차후에 나올 Fragmentaion(단편화)의 문제점을 야기한다.
먼저, 비유적인 표현을 위해서 주차장을 메모리라고 가정하며 차를 프로세스라고 가정하고 작성해보겠다.
- 고정 할당(Fixed Partitioning)
- 주차장(Memory)에 미리 정해진 크기의 주차칸(Partitioning)을 그려둔다. 그리고 주차(load)를 시킨다.
- 차(Process)는 중형세단, 경차, 트럭 등등 차의 모양이 다양하다. 그렇다면 트럭자리(큰 Partioning)에 경차(작은 Process)가 주차된다면 빈공간(Hole)이 생기게 되는데 우리는 주차공간(Internal Fragmentation)을 낭비하게 되는 것이다 ➡️ 내부 단편화 발생
- 동적 할당(Dynamic Partitioning)
- 주자창( Memory )에 칸을 그려넣지 않고 차(Process)가 들어올때마다 공간을 주는 경우이다.
- 최초 적합(First Fit): 들어오자 보이는 주차장에 차(Process)를 넣음
➡️ 무작위로 주차및 출차를 진행하기에 시간이 지날수록 외부 단편화(External Fragmention) 초래 - 최적 적합 (Best Fit) : 주차장(Memory)을 한번 둘러보고 제일 적합한 자리에 주차
➡️ 메모리전체를 검색하기 때문에 속도 저하 - 최악 적합 (Worst Fit) : 걍 편하게 주차하기 위해 제일 큰 자리에 차를 넣음
➡️ 큰 메모리 블록부터 주차함으로 큰 메모리 블록이 줄어든다.
- 최초 적합(First Fit): 들어오자 보이는 주차장에 차(Process)를 넣음
- 주자창( Memory )에 칸을 그려넣지 않고 차(Process)가 들어올때마다 공간을 주는 경우이다.
- 분할 할당(Segmentaion) ➡️ 가상메모리를 사용하는 세그먼테이션이랑은 다른 개념
- 소형차 주차장, 중형차 주차장, 대형차 주차장이 물리적 공간에 나눠져있다고 가정
- 소형차는 소형차 연속으로, 중형차는 중형차가 연속으로, 대형차는 대형차가 연속으로 주차되게된다.
- 위와 마찬가지로 연속성있게 메모리에 저장되게 된다.
위에 External Fragmention은 압축(Compaction)을 통해서 해결할 수 있다. 사용 중인 메모리 영역을 한쪽으로 몰아 Hole들을 만들어내는것이다. 하지만 이는 CPU 자원을 잡아먹어야하고 Compaction중에는 시스템 전체가 다운되어야한다는 안타까운 상황이 벌어진다.
사실 이런 문제를 해결하기 위해서 가상메모리-불연속적 할당 전략을 내놓은 것이다.
# Virtual Memory(가상 메모리) - Non Cognitious Memory 전략
위에서 단편화를 해결하기 위해서 Compaction도 했지만 사실은 문제를 해결할 수 있지는 않다. Virtual Memory 전략의 Paging과 Segmentaion으로 어떤 방식으로 해결했는지 알아본다. (메모리 할당 기법의 Segmentaion과 비교도 같이 진행하겠음)
- Paging(페이징 기법)
- Physcial Memory와 동일한 크기의 블으로 나누고, 프로그램의 Logical Memory도 동일한 크기의 Page로 나누는 기법
- 굳이 예시를 찾자면 시리즈 물의 책을 생각해보면 쉬울 것이다. 우리는 해리포터 시리즈를 다른 책들과 가나다 순으로 보관하기 위해서 책꽂이에 다른 책들과 가나다 순으로 정리 해두었고, 이를 따로 명세서를 관리해서 보관한다.
- 위에서 시리즈 물의 책(Process), 해리포터 책(Page), 책꽂이 명세서(Page Table)로 볼 수 있다.
(뭐 적절한 예시인지는 모르겠다....) - Paging은 따로 알고리즘이 있기때문에 다시 한번 다루는 걸로 하겠다.
- Segmentaion
- 일단 위의 Paging하고 다른 점은 Segmenataion은 크기가 정해져 있지 않다는 것이다. Physcial Memory에 다른 위치에 저장될 수 있다.
- 이것도 굳이... 이해를 하기위해서 예시를 찾아보면 우리가 교보문고를 가서 다양한 장르의 책을 본다고 가정한다면 이 장르는 다 각자 섹션이 지정되어있고 우리는 이를 서점 지도를 보고 찾아간다. 위의 시리즈물과 다른점은 무엇이냐면 장르마다 책의 수가 다를것이다.
- 위에서 교보문고(프로세스), 장르로 묶인 책들(Segmentaion), 섹션의 저장 위치를 보는 지도(Segmentation Table)이 될수 있다.
(뭐 더 좋은 예시가 있다면 피드백 부탁....)
※ Memory Alloctcation Segmentaion VS. Virtual Memory Segmentaion 우리는 메모리 할당 차원의 분할과 가상 메모리에서의 분할을 모두 살펴보았다. 용어는 같지만 두가지는 완전히 다르게 돌아간다. 메모리 할당에서 분할은 물리적 주소 공간에 직접 사상하여 저장된다. 그렇기 때문에 데이터들이 연속적으로 저장될 수 밖에 없지만, 가상 메모리에서는 마치 표를 나눠주는것처럼 CPU입장에서는 연속적으로 주소값을 매겨서 물리 주소에 불연속적으로 저장하게 된다. 용어가 같다고 다른것이 아니다. |
일단, 연속적 메모리 관리 전략, 불연속적 메모리 관리 전략을 살펴 보았다. Paging과 Segmentaion에 대해서는 Semaphore처럼 따로 공부를 하면서 진행을 해야할것같다. Page교체 알고리즘 등 Virtual Memory를 사용하기 때문에 여러 알고리즘이 사용되는 것 같다.
사실 결론은 연속전 메모리 관리 전략은 구닥다리이다. 내부 단편화와 외부 단편화를 야기하기 때문에 메모리 효율성이 떨어지게 된다. 이를 해결하기 위해 불연속적 메모리 관리 전략이 나온 것이다. 사실 공부하면서도 어려운 점들이 용어들이 었지만, 단순하게 이야기해서 Virtual은 물리적 공간이 아니라 사실 CPU 입장에서 Index를 주고 하드웨어적 장치인 MMU를 활용해서 Mapping하게 된다는 것이다. 영화관과 똑같다. 표를 주고 우리가 자리를 예매하는 것이 아닌가 표를 보고 자리를 찾아가는 사람들.
# 결론
Semaphore, Mutex부터 쉽지가 않다..... 여러 레퍼런스를 뒤지면서 이해할려고 노력했고 사실 이해하는데 크게 어렵지는 않았다. CPU 스케듈링을 하고 스케듈링 관련해서 문제를 풀어보았는데 이렇게 이론을 공부하는거랑 문제를 푸는 것은 또 다른 느낌이었다. 항상 문제를 손으로 문제를 풀어보는 습관을 가져야겠다. 아래는 문제를 참고하겠다. 여러 스케듈링 문제가 있으니 풀어보는것도 좋을거 같다.
그리고 차후에 작성해야할 Paging과 MMU의 동작원리는 두가지를 한번에 정리해서 작성토록 하겠다.
https://cafe.daum.net/kgnkisa/VhaJ/9
'Computer Science > Operation System' 카테고리의 다른 글
[OS] Virtual Memory와 Paging기법 (0) | 2024.01.15 |
---|---|
[OS] Semaphore(세마포어) & Mutex(뮤텍스, Mutulal Exclusion) (0) | 2024.01.11 |
[OS] IPC(Inter Process Comunication) - 프로세스간 통신 (0) | 2024.01.10 |
[OS] SystemCall (시스템 콜) (0) | 2024.01.10 |
[OS] CPU Scheduling(CPU 스케듈링) (1) | 2024.01.09 |