해결된 질문
작성
·
216
1
메모리의 주소 수업을 하실 때,
논리주소(상대주소)는 항상 자신의 위치를 0x0번지라고 여긴다라고 하셨는데
세그멘테이션 수업에서
해당 CPU가 메모리관리자에게 전달해준 논리주소가 0x632라 하셨고,
메모리 관리자가 이 값을 Bound Address와 비교하여,
메모리 침범 여부를 확인한다는 사실로부터
0x0 을 시작으로 0x632에 걸쳐 인접하여있고, 총 크기가 632라고 이해하면 타당한가요??
답변 1
0
안녕하세요 김병수님!
사용자 입장에서는 0x0에서 0x632만큼 떨어진 거라고 볼 수 있습니다.
물리 주소로 변환할 때는 세그멘테이션 테이블의 Base Address와 0x632를 더해서 주소를 구합니다.
Base Address는 프로세스마다 다른 값을 가지고 있죠. (그래서 각 프로세스의 논리주소가 632로 같더라도 실제 주소는 다른 것입니다.)
Bound Address는 물리 주소로 변환할 때 메모리 관리자가 메모리 침범을 확인하기 위해서 사용됩니다.
따라서 0x632의 크기를 632라고 이해하는 건 오해입니다!
사용자와 프로세스 모두 논리주소를 바라볼 때 0x0이 시작주소인 것이 맞습니다!(1번 경우는 맞음!)
다만 실제로 사용하는 주소(물리 주소)로 변환할 때 프로세스마다 고유의 세그멘테이션 테이블이 있고,
세그멘테이션 테이블에는 Base Address가 있기 때문에 이 값에 논리 주소를 더하기 때문에 여러 프로세스의 주소가 겹치지 않는 것입니다.
만약 프로세스 A의 0x632와 프로세스 B의 0x632가 논리주소 관점(사용자, 프로세스)으로 본다면 동일한 주소라고 생각할 수 있지만
실제 주소(물리 주소)는 메모리 관리자가 계산합니다.
만약 프로세스 A의 세그멘테이션 테이블에서 0x632가 포함되는 2번 세그먼트이고, 2번 세그먼트의 Base Address가 5000이라면 프로세스 A의 논리주소 0x632의 실제 주소는 5632라고 볼 수 있고
프로세스 B의 세그멘테이션 테이블에서 0x632가 포함되는 2번 세그먼트이고, 2번 세그먼트의 Base Address가 20000이라면 프로세스 B의 논리주소 0x632의 실제 주소는 20632라고 볼 수 있습니다.
2번 경우를 오해하고 있는 것 같습니다 ㅎㅎ
쉽게 생각하려면 우리가 생각하는 모든 주소는 논리 주소라고 생각하시면 됩니다!
정리가 된 것 같아요. 친절한 답변 감사합니다!
강의 정말 잘 듣고있습니다. 엄청 많은 시간을 투자하셨을텐데 질 높은 강의 정말 감사드립니다.
'자료구조와 알고리즘'도 감자님과 함께!
각 프로세스의 논리주소가 632라는 부분이 이해가 잘 가지 않습니다 ㅠㅠ
각 프로세스는 논리주소가 모두 0x0이라는 생각에 제 이해가 강하게 묶인 것 같습니다.
이해에 대한 케이스를 좀 나누어 생각해보았습니다.
가령, 어떤 프로세스가 차지하는 메모리가 0~1000 칸이라고 하였을 때,
프로세스내 각 논리영역(CODE, DATA, HEAP, STACK) 들의 주소가
CODE 영역의 세그먼트는 0~200
DATA 영역의 세그먼트는 201 ~ 400
HEAP 영역의 세그먼트는 401 ~ 631
STACK 영역의 세그먼트는 632 ~ 1000
이라고 하면, 프로세스의 논리주소는 0x0 이고
프로세스내 STACK 세그먼트의 주소는 0x632 라고 이해할 수 있다.
즉, 프로세스의 주소는 0x0이지만,
프로세스 내의 특정 영역의 주소는 0x632번지가 될 수 있다고 이해하는 경우입니다.
두번째로, 사용자 입장을 프로세스의 입장의 상위 개념으로 보고,
사용자 입장에서 0 ~ 1000칸 이라고 했을 때,
프로세스 A, B, C, D 가 1000칸에 나누어져 들어가있고
프로세스 C의 주소가 632번지라고 이해하는 경우입니다.
사용자 입장의 주소와 프로세스의 입장에서 논리주소를 다르게 이해해야하는 걸까요?