소프트웨어 엔지니어/일반

[소프트웨어 엔지니어] 프로그램 메모리 구조

shroomie 2024. 9. 13. 11:44

프로그램 메모리구조 5가지만 기억하면 돼.
코드, 데이터, BSS, 힙, 스택


요약
실행파일 (.exe) 는 코드 영역과 데이터 영역으로 구성되는거고 (물론 bss, 힙, 스택 영역, 크기를 같이 가지고 있지 스케에에에엥터..) 
이게 실행될때, 코드 데이터영역은 하드디스크에서 메모리영역으로 카피되고, 카피된 코드가 실행되면서 메모리영역에서 BSS, 힙 스택이 생겨난다. 

코드는 말그래도 코드야. 프로그램을 코딩하면 그게 코드고 프로그램 메모리영역의 코드영역으로 들어가는거야.
이말은? 변하지 않는 영역인거고, 프로그램을 컴파일하고 나면 나오는 실행파일에 (쉽게 .exe)포함되어 있는거지. 

그 다음은 데이터(Data),  BSS
초기화된 전역변수 , 스태틱변수는 Data 영역으로.
초기화되지 않은 전역변수, 스태택변수는 BSS 영역으로.
그럼 궁금해야해. 왜 그냥 하나로 영역을 만들면 되지 굳이 초기화된거, 초기화되지 않은거로 구분할까. 
왜? 실행파일때문에 그런거지. 
초기화된 변수들은 실행파일 어딘가에 공간이 있고 값이 저장되어야 하기때문인거고 (Data segment)
초기화되지않은 변수는 실행타임에 ( .exe 를 누르고 나서) 나타나면 되는거니까 둘을 구분해 놓은거지.  => 실행파일 사이즈 절약!!!!!
(즉 쉽게말하면 초기화된 변수는 어떤값 (예를들어 3, 4,5 등등) 을 가지고 있어야 하니까 실행파일에 기록 되어 있어야 하는거고, 
    초기화안된건 어차피 다 0 인거라, 값 저장 필요없이 공간만 잡아놓으면 되는거지. )  

그 다음이 이제 프로그램이 실행될때 필요한 힙하고 스택인건데
스택은 보통 함수콜 (스택 프레임, 뭐..... 지역변수 이런것들) 에 쓰이게 되는거고, 
힙은 동적으로 메모리 ( C 같은 경우는 말록함수로 할당할때) 를 할당할때 쓰는거다 이렇게 알면 쉽지?

 

그럼 여기서 질문. 

c 의 경우 함수 안에서 static 키워드로 잡아놓은 변수는 어느영역에 할당될까? (뎃글로 부탁해요)