본문 바로가기

별걸다하는 IT/운영체제 OS

[운영체제]Process Address Space 메모리내 프로세스 구조 (Code segment, static data 등)

반응형

운영체제 목차


이전 포스팅에서 프로세스와 프로그램의 차이를 알아봤어요! 


프로세스와 프로그램 차이 요약


다시 정리하면 프로그램은 실행 파일로, 파일 시스템으로 존재하는 것이 실행파일이고,

실행을 해서 실행되고 있는 주체를 프로세스라고 했습니다.

즉 실행중인 프로그램의 하나의 인스턴스라고 생각하면 된다고 했습니다.

결국 수행과 스케줄링의 가장 기본적인 단위인 것이죠!


Process ID를 PID라고 줄여서 이야기를 하고, Windows에서도 ctrl+alt+delete를 누르면 작업관리자가 뜨면서 실행중인 프로세스들을 확인할 수 있고 세부정보에 들어가면 PID를 볼 수 있습니다.



작업관리자 



PID는 다 숫자로 나옵니다@


Process Address Space 프로세스 메모리 구조


프로그램이 실행이 되어야 프로세스가 수행된다고 했었잖아요. 

자, 프로그램은 파일 시스템에 있는 거고 그 프로그램이 메모리로 올라가서 메모리를 차지하고 있는 상태에서 실행이 되어야 하겠죠? 

이 메모리 주소에 저장된 프로세스 형태는 이와 같습니다.

제일 밑에 부분이 Code Segment, 

그 위에가 Data Segment, 

그 위에가 Heap! 

위에서부터 밑으로 stack의 형태로 이루어집니다. (힙과 stack은 많이 들어보셨죠?)


Code Segment와 Static Data

이 중에 code segment 하고 data segment 요 부문은 실행 파일에 들어가 있는거예요. 

확장자가 .exe인 파일 안에요!


여러분이 C나 C++로 프로그래밍 한 것이 컴파일 되면 기계어 코드로 작성이 되잖아요 

실행파일을 누르면 기계어 코드가 이 부문에 올라갑니다.


쉽게 메이플 스토리 실행파일 MapleStory.exe를 더블 클릭하면 

이 실행파일이 가지고 있는 컴파일된 코드들이 메모리의 Code segment하고 data segment 부문에 실리는 것! 


CODE SEGMENT에는 코드 데이터가 들어가요. 

그럼 static data(=데이터 영역) 부분에는 뭐가 저장될까요?


외에 여러분들이 전역변수를 만들거나 static 변수를 만들었을 그것이 초기값을 가질 수도 있고 가지지 않을 수도 있는데 초기값을 가지지 않을 때는 0으로 초기화 되죠. 

전역변수 또는 static data들은 프로그램이 실행이 항상 메모리 공간을 가지고 있어야 해요. 그래야지 function 아무데서나  접근 있고 static 변수 같은 경우에 function 갔다 다시 들어와도 옛날의 값을 유지할 있겠죠!


즉 코드영역은 코드가 저장되고,

데이터 영역은 전역변수나 스태틱변수가 저장되며

이 코드 영역, 데이터 영역은 실행파일에 존재합니다.

이 영역은 프로그램 시작시 RAM에 올라가면서 할당됩니다.


Heap & Stack (힙과 스택)

여러분들이 프로그램 실행하면 실행파일에 있는 내용을 가지고 Code segment와 Static data 부문을 채우고, Heap과 Stack 부분들은 프로그램을 실행하면서 생겨졌다 없어졌다 하면서 메모리를 사용을 하는거예요


heap라고 하는 것은 동적할당(dynamic memory allocation) 의해서 생기는 그런 공간을 heap이라고 얘기를 합니다. data structure(자료 구조) 시간에서 배웠던 heap sort라는 것과는 다른거라는 거 명심~!


언어를 좀 공부한 사람들은 동적할당 할 때 Heap이라는 것을 좀 들어봤을 텐데 예를들면

C++의 경우 new 키워드를 사용해서 동적으로 메모리를 할당하고 delete를 해제하는 경우

C언어의 경우 malloc이라는 라이브러리 함수로 할당하고 free로 반환하는 이 때 할당되는 부분이 바로 HEAP 공간입니다!


Stack이라는건 자료구조 시간에 배웠어요 (기억이 안나는 사람은 자료구조의 stack부문 다시 공부하고 오기)

push 되고 pop되고 push되면 stack 저장공간이 늘어나고 pop되면 다시 줄어들겠죠 

대표적인 예로 함수를 호출할 때 Stack에 매개변수로 데이터가 push되죠 

그리고 function을 호출 후 다시 돌아가기 위해 필요한 return address 또한 Stack을 통해서 저장이 되었다가 없어졌다 합니다.

프로그래밍 할 적에 지역변수 또한 Stack의 영향이죠. 어떤 함수 안에 어떤 변수를 여러분이 선언을 하면 함수를 수행할 동안 잠시 저장공간이 생겼다가 함수가 끝나고 나면 없어지고 이유는 스택이 잠시 생겼다가 없어지고 생겼다가 없어지고 하기 때문입니다. stack은 컴파일 타임에 크기가 결정돼요.


즉 힙은 프로세스가 돌아가는 런타임에 크기를 알려줌으로써 영역을 확보하는 공간이고,

스택은 컴파일 타임에 지역변수나 매개변수가 차지하는 공간을 의미합니다.


이렇게 Process Address Space의 구조에 대해 살펴봤습니다.

도움이 되셨다면 공감 좋아요 :) 오늘도 감사합니다.

반응형