C compiler & Program memory 구조
<Main Memory로의 적재>
D
HDD에 저장된, 프로그래머가 작성한 소스코드가
전용 컴파일러에 의해 기계어 코드로 변환된다.
이 실행파일이 생성이 되고 실행된다면
Process가 생성되고 Process가 가지는 opened_file은 이 실행파일일 것이다.
위 단계부터 Main memory (RAM) 에 여러 정보들이 적재되기 시작한다.
이 적재도 무작정 순차적으로 되는 것이 아니라
위와 같은 메모리 구조를 따라서 적재된다.
<Compile time & Run time>
변수 초기 데이터는 프로그래머가 지정한 초기값으로 초기화된 전역 변수로
main()함수가 실행되기 전 compile타임에 변수 초기 데이터가 복사되어 들어간다.
<선언과 할당>
만약 위 code에서 man이 선언된 후
man = {20, 'F', 'gordon'} 의 코드가 실행되면 이는 '선언'이 아니라 '할당'이다.
<Const>
const로 선언할 경우, 반드시 초기값이 존재해야한다.
선언 이후에 바뀔 수 없는 값이기 때문이다.
<정적 변수 할당 시점>
정적 변수는 프로그램이 실행되기 전까지 존재하지 않는다.
프로그램 실행 후 | 정적 변수 할당 | main function으로의 돌입
executable file 자체는 변수가 아니며, 프로그램 실행시
executable code와 함께 Main Memory에 적재되어야 하는 데이터다.
<Optimization>
프로그램이 특정 variable를 '절대' 참조하지 않거나,
Compiler에서 프로그램이 variable에 의존하지 않는다 판단할 경우
자체적으로 최적화 시킬 수 있다.
이는 compiler의 구현에 따라 다르며 일반적으로는 해당되지 않음.
<메인 메모리 구조>
코드 영역에는 일련의 명령어들이 텍스트 형태로 저장되어있다.
프로그램이 시작되고 종료될 때까지 MM에 남아있는다.
프로그램 시작시, 데이터 영역에는 전역 변수, 정적 변수가 저장된다.
프로그램 종료시 할당된 공간을 시스템에 반납하며 소멸.
프로그래머가 직접 코드를 통해 런타임 시에도 메모리를 할당하고 해제할 수 있다.
( '실제' 데이터의 주소를 할당하는 것은 OS가 제어한다. )런타임에 크기 결정.
낮은 주소 -> 높은 주소의 방향으로 할당한다.
프로그램에 작성된 함수 호출시 임시 메모리 영역. 컴파일 타임에 크기 결정.
해당 함수가 가지는 지역 변수, 해당 함수에 입력되는 매개변수가 저장되고
함수 종료시 시스템에 자원이 반납된다.
높은 주소 -> 낮은 주소의 방향으로 할당한다.
스택 구조 PUSH POP LIFO .
힙 주소 영역이 스택 주소 영역을 침범한 경우 = heap overflow
스택 주소 영역이 힙 주소 영역을 침범한 경우 = stack overflow
댓글
댓글 쓰기