해결된 질문
작성
·
200
·
수정됨
1
안녕하세요. 감자선생님!
메모리(+가상메모리)관련 질문있습니다.
Q1.메모리 할당방식 0:10 ~ 0:30
1) "당장 실행시켜야할 부분"이라면, Code영역 Data영역 데이터들로 추측되는데 대략적으로 맞을까요?
2) 해당 예시는 총 메모리보다 프로그램 크기가 큰 경우, 메모리오버레이 적용으로 이해했습니다.
그 반대의 상황 메모리(2GB) 게임(1GB)에서도 오버레이 적용 되는지 궁금합니다.
예상으로는 반대상황에서도 게임 실행 시, 1GB가아닌 훨씬 작은 메모리만 사용할것으로 추측중입니다.
Q2.가상메모리개요 1:45
1) 보라색 캐릭터(프로세스)의 데이터(Code,Data,Stack,Heap)들은
실제 형태는 RAM or ROM-스왑영역에 올라가 있는 상황으로 이해했습니다. 맞는지 궁금합니다.
Q3.디멘드페이징 0:25
메모리 Code 영역에는 작성한 코드가 기계어로 들어가있습니다.
1)저가 만약 5만줄의 코드를 작성하면, 5만줄에 해당하는 기계어 전체가 다 들어가있는 건지 궁금합니다.
2)Code영역에 비즈니스로직(프로그램의 시작과 끝 로직)도 '
Ram과 Rom으로 나뉘어져 실행되는 구조인지 궁금합니다.
ex)비즈니스로직에서
- A번쨰 줄 로직 : int 변수에 5를 더하기
- 그다음 줄 로직 : 위 변수 출력
이렇게 있는 상황에서 A번쨰줄 로직은 Ram에서 실행되고있고, 그 다음줄 로직은
Rom에 있으면 안될것같은 느낌이 확 들어 질문드립니다.(그 다음줄을 Rom에서 불러올 방법이 없습니다)
그렇게 되야 모든 로직이 실행되며 필요한 데이터는 Rom에서 불러오고 종료되고 할것같습니다.
이상입니다. 연휴잘보내세요!
답변 1
1
안녕하세요 전우형님!
바로 답변드리겠습니다.
Q1.메모리 할당방식 0:10 ~ 0:30
1) 당장실행시켜야할 부분이라면, Code영역 Data영역 데이터들로 추측되는데 대략적으로 맞을까요?
Code 영역, Data영역 뿐만 아니라 스택과 힙영역도 포함됩니다.
2) 해당 예시는 총 메모리보다 프로그램 크기가 큰 경우, 메모리오버레이 적용으로 이해했습니다.
그 반대의 상황 메모리(2GB) 게임(1GB)에서도 오버레이 적용 되는지 궁금합니다.
예상으로는 반대상황에서도 게임 실행 시, 1GB가아닌 훨씬 작은 메모리만 사용할것으로 추측중입니다.
실행시키는 프로그램(게임)의 크기가 작은 상황에서도 적용할 수 있습니다.
이때 얻을 수 있는 점은 일부만 메모리에 로드하기 때문에 속도가 빠르다는 것입니다!
Q2.가상메모리개요 1:45
1) 보라색 캐릭터(프로세스)의 경우 실제 데이터(Code,Data,Stack,Heap)들은
실제 형태는 RAM or ROM-스왑영역에 올라가 있는 상황으로 이해했습니다. 맞는지 궁금합니다.
RAM or 보조 저장장치(HDD, SSD)내 스왑영역에 저장됩니다. :)
Q3.디멘드페이징 0:25
메모리 Code 영역에는 작성한 코드가 기계어로 들어가있습니다.
1)저가 만약 5만줄의 코드를 작성하면, 5만줄에 해당하는 기계어 전체가 다 들어가있는 건지 궁금합니다.
디맨드 페이징에서 필요한 데이터뿐만 아니라 Code 영역도 필요한 부분만 올라오는지, 다 올라오는지가 궁금
하신 거라고 이해했습니다.
Code 영역도 전체가 올라오는 것이 아니라 일부만 올라옵니다.
2)Code영역 데이터에 비즈니스로직도 Ram과 Rom으로 나뉘어져 실행되는 구조인지 궁금합니다.
ex)비즈니스로직에서
- A번쨰 줄 로직 : int 변수에 5를 더하기
- 그다음 줄 로직 : 위 변수 출력
이렇게 있는 상황에서 A번쨰줄 로직은 Ram에서 실행되고있고, 그 다음줄 로직은
Rom에 있으면 안될것같은 느낌이 확 들어 질문드립니다.
그렇게 되야 모든 로직이 실행되며 필요한 데이터는 Rom에서 불러오고 종료되고 할것같습니다.
만약 int 변수가 A 번째 줄 다음 줄에서 실행될 때 보조저장장치(HDD, SSD)에 저장되어 있다면 메인메모리로 가져오는 데 시간이 오래 걸릴 겁니다.
다만 적절한 페이지교체 알고리즘으로 이미 메모리 올라와 있다면 속도가 조금 더 빠르겠죠?
만약 캐시에 저장되었다면 가져오는 속도는 더 빠를겁니다.
이런 이유로 페이지교체 알고리즘이 중요하다는 느낌이 확 오지 않나요? :)
우형님도 즐거운 연휴보내시길 바랍니다.
메리크리스마스~😊
와우! 선생님 답변감사합니다 ㅎㅎ
맨 마지막 질문(메모리 Code영역에 비즈니스 로직 관련) 한번만 더 드리고 싶습니다ㅠㅠ
저가 궁금한부분은 Code영역도 전체가아니라 일부가 올라오는것이라면
이런일은 발생 안하겠지만,
ex)
100번쨰 줄 : int a = 5;
101번쨰 줄: printf(a); //문법은 안맞추었습니다.
이렇게 텍스트 에디터에 작성하고, 컴파일을하면
기계어 파일에 줄 개념이 있는지는 모르겠지만, 순서대로 명령문들이 저장되고, 프로그램 실행시 처음 기계어 부터 실행되면서 순차적으로 다음 다음 기계어 연산하면서 흔히 프로그램이 동작한다(실행)가 되는것으로 이해하고있습니다.
위 상황을 기계어 조합으로 2 동작으로 묶어보았습니다.
1) a에 변수 5를 대입!
2)a를 출력!
이떄
1) 묶음 명령들이 Ram에서 실행
2) 만약에 2번 묶음의 기계어(출력!)들이 Rom에있다면 Ram에서는 1) 묶음을 다 연산하고
더 할게없으니 2)묶음은 실행안되야 되는게 맞는거 아닌지 궁금합니다.(출력이 안되는상황)
재정리: 100번째 줄 실행 후 [101번째 줄 통쨰 - a 를 출력!]도 결국 기계어로 어딘가 있을건데,
101번쨰 줄 통쨰로 다 Rom에 있으면 Ram에서 100번째 줄까지 연산하고
더 연산할게없는 상황(다음 명령문 기계어가없음)이지 않을까? 하는 질문입니다.