[OS] 메모리 영역 : 코드 영역, 데이터 영역, 힙 영역, 스택 영역 대해서(feat.스레드)

두지·2023년 3월 26일
0
post-thumbnail

우리가 프로그램을 실행시키면 주메모리에 로드되면서 실행 중인 프로세스가 된다. 이때 프로그램의 코드와 데이터는 코드영역과 데이터 영역에 저장된다. 그리고 프로그램이 실행되면서 필요한 메모리는 힙영역과 스택 영역으로 동적으로 할당된다.

프로그램이 실행되면,

먼저, CPU는 코드영역에 저장된 명령어를 하나씩 가져와 실행을 한다. 이때, 데이터 영역에 저장된 전역 변수와 정적 변수는 초기화된 값을 가지고 있으며, 이 값을 프로그램에서 사용할 수 있다.

만약, 프로그램이 함수를 호출하면, 스택 영역에 해당 함수를 지역 변수와 매개 변수가 저장되며, 함수 내에서 필요한 변수는 스택에 동적으로 할당이 되며, 함수가 반환되면 해당 변수들은 스택에서 pop되면서 제거가 된다.

프로그램이 실행되는 동안, 동적 할당을 위해서는 힙 영역에서 메모리를 할당 받아야하고 해제해야한다. 대표적으로 C/C++은 malloc과 free 함수를 사용하여 직접 메모리 할당과 해제를 해야하는 반면, Java는 자동적으로 힙메모리에 객체를 힙 메모리에 할당 하며 참조변수와 관계가 끊어질 시 GC(Garbage Collector)가 할당 받은 메모리를 해제 및 제거한다.

프로그램이 종료되면, 운영체제는 프로그램이 사용한 모든 메모리를 해제 후 해당 프로세스의 자원을 반환한다. 이렇게 프로그램이 실행되는 동안 메모리는 코드 영역, 데이터 영역, 힙영역, 스택 영역으로 나뉘어서 사용한다.

프로세스와 스레드를 비교해서 이야기하자면,

프로세스는 실행중인 프로그램의 인스턴스로, OS로부터 자원을 할당 받은 작업의 단위이다. 각 프로세스는 독립된 메모리 공간을 가지며, 이 공간은 위에서 설명한 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉜다. 따라서 각 프로세스는 할당 받은 각 자신만들의 메모리 공간을 가지며 서로에 메모리에 직접적으로는 접근할 수 없다.

스레드는 프로세스 내에서 실행되는 단위이며, 같은 프로세스 내에다른 스레드끼리 메모리를 공유한다. 프로세스가 실행되는 동안에는 여러개의 스레드가 동시에 실행 될수 있다. 각 스레드는 코드 영역, 데이터 영역, 힙 영역에 대해서는 독립적이지 않고 공유를 한다. 반면 스택은 독립적으로 사용한다. context switching이 일어날 때 공유되는 자원이 있기 때문에 효율적인 캐싱효과가 있어서 강한 이점이 있다.

만약, 위에서 말했듯 프로세스끼리는 독립된 메모리 공간을 가지기 때문에 서로의 메모리에 직접적으로 접근할 수없다고 했다. 하지만 공유해야할 상황이 있을 수 있지 않는가?

그럴때는 프로세스간 통신(Inter-Process Communication, IPC)를 사용해야한다. IPC는 여러가지 방법이 있지만 대표적으로는 파이프(pipe), 소켓(socket), 공유 메모리(shared memory), 메시지 큐(message queue), 세마포어(semaphore) 등의 기법이 있다. 이러한 IPC 기법을 사용하면 프로세스들이 서로 데이터를 주고 받을 수 있다.

예를 들어, 공유 메모리를 사용하는 경우에는 두개 이상의 프로세스가 같은 메모리 영역을 공유하면서 데이터를 주고 받을 수 있다. 공유 메모리는 일반적으로 시스템에서 제공하는 특별한 함수나 시스템 콜(call)을 사용하여 할당하고 접근한다. 따라서, 프로세스 간 통신을 위해 IPC 기법을 선택할 때는 사용할 기능과 환경에 맞게 선택 한다.

profile
인생은 끝이 없는 도전의 연속입니다. 저는 끝 없이 함께 새로운 도전을 합니다.

0개의 댓글