개발자

운영체제 - 가상 메모리 최대 크기 관련 질문!

2023년 03월 02일조회 723

운영체제 관련 공부 중에 궁금한 점이 생겨 질문 올립니다. 32비트 시절에는 가상메모리 최대 크기가 4gb였는데요, 이 때 4기가 이상의 메모리가 필요한 프로세스를 돌리기 위해 어떤 방법을 사용했나요? 간단하게만 말씀해 주시면 제가 더 찾아보겠습니다! 감사합니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

인기 답변

김대현님의 프로필 사진

호오, 흥미로운 질문이네요. 저도 답을 보고 학습하고 싶은 주제입니다. 답을 찾으면, 제게도 공유해주세요. 잘 모르는 내용입니다만, 생각하는대로 적어봅니다. 공부하신대로, 32비트 환경에서 가상메모리 크기가 최대 4G인 이유는, 메모리 주소를 표현하는 값을 32비트(4바이트)로 썼기 때문입니다. OS들이 보통, 프로세스당 가상 메모리 영역을 별도로 할당해 주고 관리하기 때문에 (가상메모리 주소 테이블을 따로 두는 방식), 각각의 프로세스가 최대 4G를 주소 공간으로 쓸 수 있게되고, 멀티 프로세스가 뜨면서, 시스템의 메모리를 다 활용하는 방식이 되겠습니다. 시스템의 메모리를 초과하면 디스크에 있는 스왑 메모리도 활용해갈 테고요. 32비트 환경은, CPU등의 장비가 한번에 처리하는 기본 단위가 32비트였다는 건데, 굳이 노력을 한다면, 32비트 두 개씩 메모리 주소 공간에 할당해서 64비트 메모리 공간을 활용하는 방법도 있겠습니다. 그러면 최대 현대의 머신처럼 64비트 메모리 공간을 프로세스마다 활용할 수 있겠죠. CPU가 32비트라고 해서, 꼭 32비트만 다룰 수 있는 건 아니죠. 여러번에 나눠 처리하면 되니까요. 지금도, 어마무지 큰 수는 64비트를 넘지만, 어떻게든 여러 번에 쪼개서 처리하잖아요? RSA 암복호화할 때도, 막 2048비트씩 다루고 있잖아요. 하지만, 당대의 CPU가 32비트가 기본이었다는 거는, 그만큼 당시 하드웨어 수준이나, 소프트웨어에 기대하는 요구 수준이 32비트 수준이었다는 점일 테고요. 애써 두 단위씩 나눠 처리하면서 64비트 공간을 쓰면서 시간/공간 낭비할 필요가 없다는 점일 수도 있겠습니다. 글쎄요, 특별한 용례를 위해, 64비트 주소공간을 쓸 수 있게 해주는 OS구현체가 있었는지도 모르겠지만, 흔한 일은 아니었을 것 같습니다. 64비트 주소공간을 쓰느니, 32비트를 쓰고 빠른 처리를 하는 게 더 중요했던 시절인 거죠. 저는 오래전 32비트 환경 리눅스에서 자바프로세스로 나름 대용량 트래픽을 처리해보았는데요, 당시 자바 프로세스들은, 최대 약 2.6G메모리 정도 쓰고 나면 OOM으로 죽었습니다. 나머지 1.4G정도는 실제 프로세스에 할당되지는 않아요. 프로세스에 할당한 32비트 메모리 공간중, 1.4G정도가 OS기본영역이나, 각종 통신 장치등을 위한 주소공간으로 할당되어있고, 나머지 2.5G 남짓의 영역을 순수히 자바 프로세스가 활용할 수 있었습니다. 굳이 한 머신에서 더 큰 메모리 영역을 쓰고 싶다면, 프로세스를 여러 대 띄우고 활용했었습니다. 장비에 32G메모리가 있는데, 자바프로세스 하나 띄워서 2~3G밖에 못쓰는 상황에서, 메모리를 더 써서 이득을 볼 상황이라면, 자바 프로세스를 서너개 띄우고, 그 앞단에서 로드밸런서 역할을 해주는 프로세스를 별도로 두는 식이었죠. 암튼, 이론적으로는 32비트 CPU라고 하더라도, 64비트 주소공간을 쓰게끔 OS를 구현하면 된다는 얘기인데, 그런 사례가 있었는지, 어떤 키워드로 학습하면 되는지는 저도 관심있게 지켜보겠습니다. 아! IPv4랑 IPv6 생각해 보면 더 이해가 쉬울 것 같기도 해요. 지금 세상은 IP주소를 4바이트(마침 똑같이 32비트네요!)로 표현하기에는 턱없이 부족한 세상이 되어서, IPv6를 쓰고 있잖아요? 하지만, IPv4환경에서도, 사설 네트워크 주소를 각자 네트워크 환경 안에서 (예를 들면, 우리들 집 안에 있는 공유기 안에서) 다 따로 쓰면서, 밖에 있는 네트워크와 통신할 때는 NAT를 거치는 식으로도 쓰고 있죠. 4바이트 IP주소 체계에서도, 그 영역 크기를 훨씬 넓혀 쓰고 있는 셈이죠. 마찬가지로, 4G메모리 영역 내에서도, 특별한 영역은 별도 페이징 레이어를 더 두고 처리하는 방식을 쓰는 것도 가능은 하겠습니다. 다시, 적자면, 그런 구현체가 있었는지는 모르겠구요. (IP레이어를 한번에 다 6바이트 주소 체계로 갈아없는 것은 전세계의 장비를 다 엎어야해서 시간이 오래 걸리는 일이고, 장비 한 대 한 대를 각각 32비트에서 64비트로 새로 출시하는 거는 상대적으로 매우 쉬운 일이기 때문에, 지금은 손에 들고다니는 폰조차도 64비트 편하게 쓰고 있는 거죠.) 요약: 1) 메모리 주소 체계를 64비트로 다루되, CPU입장에서는 여러 싸이클에 처리하면 된다. 2) 32비트로 다루되 일부 영역에 대해, 페이징 레이어를 하나 더 두면 된다. 이론적으로 위 방식이 가능하다 봅니다만, 더 잘 아시는 분들의 답변을 기다리겠습니다. 1번은 성능 페널티가 너무 크기에 그런 구현체는 없었을 것 같고, 2번은 있었을 것 같기도 합니다. 이래저래 뭐 힘들게 하느니, 그냥 64비트 CPU체계로 넘어가는 게 훨씬 나았을 테고요. 이거 챗GPT한테 물어보면 저보다 훨씬 잘 답해줄 것 같은데, 정말 그럴까봐 무서워서 못 물어보겠습니다. ㅋㅋㅋ

profile picture

익명

작성자

2023년 03월 07일

오 장문의 답변 감사합니다. 32비트라고 해서 굳이 32비트 체계를 고수할 필요는 없었겠네요. 챗GPT한테 물어보니 Physical Address Extension (PAE), Address Windowing Extensions (AWE), Memory-mapped files, Virtual Memory Compression 등을 사용할수있다고 알려주네요 ㅋㅋㅋ 그래도 어떤 키워드로 검색해야되는지 감을 잡은것 같아요. 감사합니다!

안이수 (Leesoo Ahn)님의 프로필 사진

4G를 전부 할당하지 않습니다. 프로세스 입장에선 전체 메모리가 올라온 것 처럼 보이겠지만 OS는 메모리를 효율적으로 관리하기 위해 페이지 단위로 프로세스에게 메모리를 할당하며 필요시에 부분부분 할당해서 실행하도록 조절합니다. 예를 들어 4G 크기의 프로세스가 현재 event loop 기반으로 idle이고 해당 로직을 수행하는데 필요한 메모리 크기가 1k라 가정하면 4k만 할당해줍니다.

profile picture

익명

작성자

2023년 03월 07일

아하 그렇군요. 답변 감사합니다. 찾아보니 말씀하신 부분을 MMU에서 처리하는걸로 이해했는데 좀 더 공부해보겠습니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!