작성
·
109
1
잘 이해가 가지 않습니다...ㅠㅠ 그냥 외우고 넘어가야 하나 싶네요...그냥 리터럴 상수들은 다 read only memory에 들어간다는 것인지 궁금하기도 합니다.
답변 1
1
안녕하세요? 질문&답변 도우미 Soobak 입니다.
우선, read only Data segment
와 TEXT segment
는 다른 영역입니다.
TEXT segemnt
는 프로그램의 코드(명령어)가 저장되는 메모리 영역입니다.
Data Segment
는 Read-Write Data segment
와 Read-Only Data segement
로 나뉘며,Read-Write Data segment
에는 프로그램 실행 중에 변경될 수 있는 변수들 중, '초기화된 전역 변수' 와 '초기화된 정적 변수' 처럼 프로그램이 종료될 때까지 유지되고 변경될 수 있는 데이터를 저장합니다.
Read-Only Data segment
에는 프로그램 실행 중 변경되지 않는 데이터, 즉 상수 데이터와 문자열 리터럴 데이터가 저장됩니다.
개인적으로, 단순히 암기를 하시는 것도 좋은 학습 방법 중 하나가 될 수 있겠지만,
"무슨 이유 때문에 이렇게 메모리 레이아웃을 구분할까?" 라는 호기심과,
각각의 메모리 레이아웃 영역에 들어가는 데이터의 특징 등을 생각해보시며 메모리 영역의 구분과 각 영역에 들어가는 데이터의 특징을 이해하시는 것이 더 좋은 학습방법이라고 생각합니다.
예를 들어, 데이터의 수명 관점에서, 프로그램 시작 전/후 언제부터 데이터의 값을 알 수 있고, 언제까지 필요한 데이터인지, 프로그램이 시작되고 종료되는 동안 변경되어도 문제가 없는 데이터인지, 아니면 문제가 발생할 수 있는 데이터인지. (ex. 코드 그 자체는 프로그램 실행 동안 변경되면 안되는 데이터이므로, '읽기 전용' 이어야 하겠지요.),
어떻게 하면 메모리를 효율적으로 사용할 수 있는지 (ex. 프로그램 전체에서 접근이 가능한 전역 변수, 특정 함수 또는 파일 내에서 접근 가능한 정적 변수는, 지역 변수와는 다른 곳에 저장되는 것이 보다 관리에 효율적이겠지요.)
등등을 이해하시는 것을 통해 학습을 진행하시는 것이 더 효율적인 방법인 것 같습니다.
물론, 각자의 상황과 개개인에 맞는 학습 방법 또한 존재하므로, 질문자님에게 적절한 학습 방법을 찾아내실 수 있길 바래봅니다.
개인적으로, 해당 강의에서 교수님께서 설명해주시는 내용 또한, 위와 같은 맥락에서 각 메모리 영역의 특징과 위치하는 데이터의 특징 등의 이해를 위한 내용들을 설명해주신다고 생각합니다.
처음에는 용어에 익숙해지는 것에 초점을 맞추시어 한 번 훑어 보시고, 지금처럼 조금 궁금증이 생기셨을 때 다시 한 번 복습을 해보시면, 처음엔 용어가 낯설어서 이유와 정확한 내용에 대해서는 생각하지 못했던 부분들이 조금씩 이해되고 원리를 이해하실 수 있을 것 같습니다.
그렇다면 문자열 포인터가 가르키는 것은 data segment의 읽기 전용 메모리 공간에서의 문자열 리터럴의 대표주소라는 것이고, 이 읽기 전용 메모리에 들어있기 때문에 포인터로 간접접근해 문자열의 변경을 시도하면 OS가 막는다고 이해하면 맞는건가요??