인프런 커뮤니티 질문&답변

전우형님의 프로필 이미지
전우형

작성한 질문수

그림으로 쉽게 배우는 운영체제

메모리관련 질문

해결된 질문

작성

·

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번째 줄까지 연산하고

더 연산할게없는 상황(다음 명령문 기계어가없음)이지 않을까? 하는 질문입니다.

감자님의 프로필 이미지
감자
지식공유자

실행할 데이터가 스왑영역에 있다면 필요할 때는 어쨋든 메인메모리로 올라와야합니다.
코드와 데이터들은 모듈 단위로 가져오기 때문에 라인별로 떨어져 있지 않겠지만 만약 101번째 줄만 스왑영역에 있다면 해당 코드는 메인메모리로 불러와서 실행해야겠죠? ㅎㅎ

전우형님의 프로필 이미지
전우형
질문자

답변 감사합니다. 선생님!

문득 떠오른게 있어 새질문으로 등록하겠습니다.

전우형님의 프로필 이미지
전우형

작성한 질문수

질문하기