본문 바로가기
개발 공부 일지/CS

프로세스(with 메모리 구조), 스레드

by yelimu 2024. 9. 2.

프로세스

프로세스는 OS에 의해 관리되는 실행중인 프로그램을 의미하며, 실행에 필요한 자원(메모리, CPU 시간, 파일 핸들 등)을 포함한다.

여러 프로세스가 동시에 실행될 수 있으며, 각 프로세스는 독립적인 실행 공간(메모리)을 갖는다.

= 운영체제는 프로세스 간의 자원 접근을 분리합니다.

= 하나의 프로세스가 실패해도 다른 프로세스에는 영향을 미치지 않습니다.

 

프로그램과 프로세스의 차이

  • 프로그램: 디스크에 저장된 정적인 코드입니다. 프로그램은 실행되지 않는 상태에서는 단순히 명령어와 데이터의 집합에 불과합니다.
  • 프로세스: 프로그램이 실행되면서 운영 체제에 의해 생성되는 동적인 개체입니다. 프로그램의 코드가 실행되어 메모리에서 실행 상태를 가지게 되면 프로세스가 됩니다.

스레드

스레드는 프로세스 내 가장 작은 실행 단위를 의미합니다.

하나의 프로세스는 최소 하나의 스레드를 갖고, 여러 스레드, 멀티스레드로 존재 가능하며 메모리와 자원을 공유합니다.

( 스레드들은 같은 프로세스 내의 메모리 공간을 공유합니다. 즉, 스택(Stack)을 제외한 **코드 영역(Code), 데이터 영역(Data), 힙 영역(Heap)**을 공유합니다. ) 

 

이를 통해 스레드 간의 통신(컨텍스트 스위칭)이 빠르고 효율적이지만, 하나의 스레드가 문제를 일으킬 경우 같은 프로세스 내의 다른 스레드에도 영향을 미칠 수 있습니다.

 

 

프로세스는 자원(메모리와 CPU)을 프로세스마다 할당받아서 사용하는데

스레드는 프로세스 안에서 다른 스레드와 자원(메모리와 CPU)을 공유해서 사용합니다.


프로세스의 메모리 구조 : 코드/ 데이터/ 힙/ 스택

프로세스의 메모리 구조는 프로세스가 실행될 때 운영 체제가 프로세스에 할당하는 메모리 공간을 어떻게 구성하는지를 나타냅니다. 일반적으로, 프로세스의 메모리 구조는 다음과 같은 네 가지 주요 영역으로 나눌 수 있습니다.

 

1. 코드(Code) 영역

설명: 코드 영역은 프로그램의 **실행 코드(명령어)**가 저장되는 영역입니다. 이 영역에는 프로세스가 실행할 기계어 코드가 포함되며, 주로 읽기 전용입니다. 이는 코드가 변경되지 않도록 보호하기 위한 것입니다.

특징

프로그램의 함수나 메서드의 기계어 명령어가 포함됩니다.

다수의 프로세스가 동일한 프로그램을 실행할 때, 이 영역은 공유될 수 있습니다.

더보기

여러 프로세스가 같은 프로그램을 실행할 때, 프로그램의 코드 영역(실행할 명령어들이 저장된 부분)은 여러 프로세스 사이에서 공유될 수 있습니다. 예를 들어, 우리가 여러 개의 웹 브라우저 창을 동시에 연다고 가정해봅시다. 각 창은 독립적인 프로세스입니다. 하지만, 각각의 웹 브라우저는 동일한 프로그램(예: Chrome, Firefox)을 실행하고 있습니다. 이 경우, 모든 프로세스는 동일한 코드(웹 브라우저의 실행 코드)를 사용하게 되는데, 이 코드가 바로 코드 영역에 있습니다.

이 코드 영역은 읽기 전용으로 설정되어 있고, 프로그램의 명령어들이 들어 있으므로, 이를 여러 프로세스가 공유할 수 있는 것입니다. 즉, 여러 프로세스가 같은 프로그램을 실행한다고 해도, 각 프로세스가 동일한 코드 영역을 사용하기 때문에 메모리 사용을 절약할 수 있고, 코드의 일관성을 유지할 수 있습니다.

이러한 공유 덕분에, 메모리를 효율적으로 사용할 수 있고 시스템의 성능도 향상됩니다. 프로세스는 각자의 데이터 영역(프로세스마다 고유의 데이터나 스택을 저장하는 공간)을 가지지만, 동일한 코드를 실행할 때는 코드 영역을 공유하므로 메모리 낭비가 줄어듭니다.

 

2. 데이터(Data) 영역

설명: 데이터 영역에는 프로그램이 실행 중에 **전역 변수(global variables), 정적 변수(static variables)**와 같이 프로그램 시작과 함께 할당되고, 종료 시 해제되는 데이터가 저장됩니다. = 정적 메모리 할당

특징

초기화된 데이터와 초기화되지 않은 데이터로 나뉩니다.

int globalVar = 10;와 같은 전역 변수가 이 영역에 위치합니다.

정적 변수는 프로그램이 종료될 때까지 메모리를 차지합니다.

 

3. 힙(Heap) 영역

설명: 힙 영역은 동적 메모리 할당이 이루어지는 공간입니다. 프로그램 실행 중 필요에 따라 메모리를 할당하고 해제할 수 있습니다.

특징

C와 C++에서 malloc, free와 같은 함수로 관리되고, 자바에서는 new 키워드로 객체를 생성할 때 이 영역을 사용합니다.

힙 영역은 사용자가 명시적으로 메모리를 해제해야 합니다(C, C++의 경우).

관리가 복잡하여 잘못된 사용으로 인해 메모리 누수(memory leak)가 발생할 수 있습니다.

 

4. 스택(Stack) 영역

설명: 스택 영역은 함수 호출과 관련된 **지역 변수(local variables)**와 함수 호출 정보를 저장하는 공간입니다. 함수가 호출될 때마다 해당 함수의 스택 프레임이 이 영역에 쌓이고, 함수가 종료되면 이 스택 프레임이 제거됩니다.

특징

자동으로 관리되는 메모리 영역으로, 함수가 끝나면 스택에서 해당 메모리가 자동으로 해제됩니다.

스택 프레임에는 함수의 매개변수, 반환 주소, 지역 변수 등이 포함됩니다.

스택 오버플로(stack overflow)가 발생할 수 있습니다. 이는 너무 많은 함수 호출이나 너무 큰 지역 변수를 사용할 때 발생합니다.

'개발 공부 일지 > CS' 카테고리의 다른 글

그래프, 트리  (0) 2024.09.03
라이브러리, 프레임워크  (4) 2024.09.03
오버로딩, 오버라이딩  (0) 2024.09.02
쿠키, 로컬, 세션 스토리지  (0) 2024.09.02
브라우저 렌더링 과정  (0) 2024.09.02