작성
·
518
0
포인터 변수는 가상 메모리 주소를 갖고 있다고 알고 있습니다. c에서 스택에 쌓이는 포인터 변수와 힙에 쌓이는 포인터 변수를 선언하고 주소값을 찍어보면 스택영역의 포인터 변수는 높은 주솟값이 나오고 힙영역에 존재하는 포인터 변수는 낮은 주솟값이 나오는데 그 차이가 제법 크다고 느껴집니다.
실제 메모리에서는 해당 변수가 근접해있는데 가상 메모리에서 보았을 때 갖는 주솟값은 멀리 떨어진 것으로 잡히는 건가요? 실제 메모리 공간에서는 프로그램 마다 특정 영역을 정해서 존재한다고 알고 있어서 이 개념이 헷갈리네요..ㅠㅠ
답변 13
4
안녕하세요?
예전에 남겼던 답변인데
https://www.inflearn.com/questions/36795
를 참고하세요.
이것을 알고 괜히 기뻐했던 때가 생각나네요.
모르는 용어는 translation in computer architecture, page table in computer architecture 등으로 검색하시면 될겁니다.
더 공부하고 싶으시면 David A Patterson, Computer Organization and Design 5th ed. 을 참고하세요.
나머지는 '동작을 하려면 무조건 RAM에 올라와 있어야 하지 않나요?' 가 걸리는데 전체가 올라가 있을 필요는 없습니다. 이해하시려면 Memory Hierarchy에 대해서도 조금 알고 계셔야할 것 같네요.
joy님 화이팅! ^^
1
1
안녕하세요?
Physical memory 상에서는 붙어서 존재하는가? 에 대해서는 상황에 따라 달라집니다.
적으려다보니 이 부분은 아무래도 paging에 대해서 직접 공부하시는 것이 좋겠다. 라는 생각이 드네요.
어디를 모르고 어디를 알고 계신지 파악할 수가 없는 어려움이 있습니다. 앞서 정의를 찾아보며 공부해보시라는 말도 이런 이유 때문입니다.
간단하게 말할 수 있는 부분은 멀리 떨어져 있더라도(두 page가 모두 RAM에 올라와있는 경우를 가정할 때) virtual memory 에서의 차이만큼은 아닙니다. 이 부분은 직접 계산을 해보시길 권장합니다. 사용하고 계신 RAM의 크기와 비교해보세요. 이도 역시 paging과 관련 내용을 공부하시면 받아들일 수 있습니다.
공부하시다 보면 일반적인 내용임을 알 수 있을텐데, 특정 시스템에서는 적용하려면 세부적인 것들에 대해서는 공부를 더 하셔야합니다.
1
Hello Yeo님, 답변 감사드립니다
남기신 답변 찾아가서 보았는데, 제가 궁금했던 점은 그 부분까지는 이해한 후 였습니다.
제가 몰라서 질문을 남긴 글은 'Virtual memory 공간 상에 형성되어 있는 stack/heap영역의 변수(찍어보면 주소가 떨어져 존재함)가 physical memory(RAM)에는 붙어서 존재하는가' 였습니다. 답변 주신 해당 글에는 이에 대한 답을 찾을 수는 없는 것 같습니다.
단순히 코딩을 하는 입장에서는 중요하지 않는 부분일 수도 있는데 제가 공부하고 있는 쪽이 임베디드 시스템이어서 관련 내용을 공부하다가 의문점이 생겨 도움을 얻을 수 있을까하여 관련 영상에 남겨보았었습니다.
혹시나 해당 질문에 대한 답을 주실 수 있다면 정말 감사하겠습니다.
1
1
아하 맞네요 그렇겠네요 흠.. 실행했을 때 보여지는 주소값들이 가상 메모리에서의 주소인지, 그렇다면 실제 메모리에 적재되었을 때의 모습은 어떨지, 어떤 차이가 있는지에 대해 궁금증을 가지고 계신 것이겠군요.
제가 운영체제에 대한 지식이 얕아서 이 부분은 도움 드리기가 힘들 것 같네요
혹시 이유를 알게 되신다면 저에게도 답변 부탁드립니다.ㅜㅜ
1
1
실제 메모리 공간 상이든 가상 메모리 상이든 물리적으로 두 데이터(x와 malloc으로 생성한 공간)가 붙어있지는 않겠습니다. 스택 영역과 힙 영역으로 구분지어져 있으니까요!
https://hyunalee.tistory.com/108
찾아보니 메모리 구조라고 설명해주신 스택영역/힙영역/데이타영역 등등 프로그램에서 쓰이는 전체적인 메모리 자체가 가상메모리인가봐요.
1
안녕하세요.
테스트 해주신 코드도 저한테 주시면 제가 답변드리는데 도움이 될 것 같습니다.
이렇게 스택 영역 주소값(=ptr_stack) 과, 힙 영역의 주소값 (=ptr_heap)이 차이가 나는 이유에 대해 말씀하시는 것이 맞을까요?
- 스택 영역에 자리잡고 있는 변수 (a) 와 힙 영역에 자리 잡고 있는 공간 (new int로 생성한)은 실제 메모리 내에서 서로 다른 영역에 자리잡고 있기 때문에 주소값에서 큰 차이를 보입니다. 스택 영역과 힙 영역은 메모리 내에서 구분지어 실제로도 떨어져있으니까요. 그래서 각각 이들의 주소를 담고 있는 ptr_stack 과 ptr_heap 값은 큰 차이를 보이는 것입니다. 차이가 나는 이유는 포인터가 어디에 자리잡느냐의 문제가 아닌 포인터가 참조하는 그 값이 서로 다른 영역에 있기 때문인 것이에요.
이번엔 포인터 그 자체의 주소값을 확인해보겠습니다. 말그대로 포인터변수 자체인 ptr_stack 과 ptr_heap 이 자리 잡는 모양이요! 주소값이 별 차이가 없는 것을 확인할 수 있겠습니다. 이땐 ptr_stack와 ptr_heap이 근접해서 자리 잡고 있다고 볼 수 있겠네요. ptr_stack, ptr_heap 포인터변수 자체는 둘 다 스택메모리 영역에 자리 잡습니다.
a, ptr_stack, ptr_heap 👉 스택 메모리
new int 로 생성된 힙 공간 (ptr_heap이 가리키는) 👉 힙 메모리
가상 메모리를 사용해서 물리적인, 실제 메모리에 어떻게 자리 잡히고 표현되는 것인지에 대한 것은 운영체제 영역인지라 제가 도움 드리기 어려울 것 같습니다 ㅠ 하드 디스크를 실제 메모리인 것처럼 일부 가져다 쓰는게 가상메모리이니 스택이나 힙에 가상메모리가 사용되는 경우라면.. 물리적으론 떨어져 있지만 같다고 표현될 수도 있지 않을까싶네요. 저도 깊게는 모르지만요!
0
0
0
네 mapping될 때 프로그램이 묶어서 올라가게 되는 것으로 알고 있는데 그러면 가상 메모리 공간에서의 스택영역/힙영역 등등은 실제 메모리 공간에는 존재하지 않는 게 아닌가 싶어서요
그렇다면 또 가상 메모리 공간에서의 힙영역과 스택영역의 변수는 실제 메모리 공간 상에서는 붙어서 존재하지 않을까 하는 생각으로 이어졌습니다.
0
저는 이렇게 스택영역 변수(a)와 힙영역 변수(b)가 주솟값 차이가 크게 나는데 이게 실제 메모리에 저렇게 자리를 잡고 있다는 것인지, 아니면 가상 메모리 상에 저렇게 떨어져 자리 잡는 것으로 취급하지만 실제 메모리 공간 상에서는 거의 붙어있는 것인지가 궁금했던 것 입니다.
찾아봐도 명확히 나오지 않아서 어렵네요ㅠㅠ 제가 더 찾아보고 공부해보겠습니다.