본문 바로가기
컴퓨터 과학/운영체제

[운영체제] 프로세스와 메모리 구조(3): 프로세스와 스레드

by webcodur 2024. 4. 27.
728x90

목차

     

    하드웨어 및 운영 체제와 밀접하게 상호 작용하는 소프트웨어 개발을 시스템 프로그래밍이라 한다. 시스템 프로그래밍의 핵심 목표 중 하나는 시스템의 효율성과 성능을 최적화하는 것이다.

    프로세스와 메모리는 이런 시스템 프로그래밍을 이해하기 위한 기초적인 개념이다. 이 두 요소는 컴퓨터 시스템의 효율적인 운영과 시스템 프로그래밍에 필수적이다.

    1. 프로세스와 스레드

    1-1. 프로세스

    프로세스는 실행 중인 프로그램의 인스턴스로, 운영 체제로부터 메모리, CPU 시간, 디스크 공간 등의 자원을 할당받는다. 프로세스는 각각 독립된 메모리 공간을 가지며 독립적인 실행 단위로 간주된다.

    1-2. 스레드

    프로세스 내에서 실행되는 하나의 실행 단위. 모든 프로세스는 최소 하나의 스레드를 가지며, 멀티스레딩을 통해 한 프로세스 내에서 여러 작업을 동시에 처리할 수 있다. 스레드는 프로세스 내에서 코드 실행, 메모리 할당 등을 공유한다.

    1-3. 프로세스의 생명 주기와 상태 전이

    +------+       +-------+
    | New  | ----> | Ready |
    +------+       +-------+
        ^              |
        |              v
    +------+       +-------+
    | Exit | <---- | Wait  |
    +------+       +-------+

     

    프로세스의 생명 주기에는 다음 네 가지 상태가 있으며 각 단계를 성공적으로 마치면 종료된다.

    • 생성: 프로세스가 생성되는 초기 단계
    • 실행: 프로세스가 명령어를 수행하는 단계
    • 대기: 프로세스가 이벤트나 자원을 기다리는 단계
    • 종료: 프로세스의 실행이 완료되고 자원이 회수되는 단계

    2. 프로세스의 메모리 구조

    2-1. 기본 메모리 구조

    +----------------------------------------------------------------+
    |                           User Space                           |
    |  +----------------+   +----------------+   +----------------+  |
    |  |  Process A     |   |  Process B     |   |  Process C     |  |
    |  |                |   |                |   |                |  |
    |  | +------------+ |   | +------------+ |   | +------------+ |  |
    |  | | Code       | |   | | Code       | |   | | Code       | |  |
    |  | +------------+ |   | +------------+ |   | +------------+ |  |
    |  | | Data       | |   | | Data       | |   | | Data       | |  |
    |  | +------------+ |   | +------------+ |   | +------------+ |  |
    |  | | Heap       | |   | | Heap       | |   | | Heap       | |  |
    |  | +------------+ |   | +------------+ |   | +------------+ |  |
    |  | | Stack      | |   | | Stack      | |   | | Stack      | |  |
    |  | +------------+ |   | +------------+ |   | +------------+ |  |
    |  +----------------+   +----------------+   +----------------+  |
    +----------------------------------------------------------------+

     

    다음은 각 프로세스가 가지는 메모리 영역이다. 각 프로세스는 기본적으로 메모리 공간 내에서 힙(Heap), 스택(Stack), 코드(Code), 데이터(Data) 섹션을 지닌다.

     

    • 코드(Code) 영역
      • 모든 스레드가 공유하는 영역
      • 프로세스를 실행하는 데 필요한 실행 파일의 기계어 코드가 저장된다.
      • 이 코드는 프로세스 실행 동안 변경되지 않는다.
    • 데이터(Data) 영역
      • 전역 변수와 정적 변수가 저장되는 영역
      • 프로그램 실행 중에 변경될 수 있다.
      • 이 영역 역시 프로세스 내 모든 스레드에 의해 공유된다.
    • 힙(Heap) 영역
      • 동적 메모리 할당이 이루어지는 영역
      • 모든 스레드가 접근할 수 있다.
      • 프로그램 실행 중 메모리 공간의 할당과 해제가 자유롭게 수행된다.
    • 스택(Stack) 영역
      • 각 스레드별로 독립적인 스택이 존재한다.
      • 이 영역은 함수 호출과 관련된 지역 변수, 매개변수 등을 저장하며, 함수의 호출과 반환에 따라 데이터가 추가되고 제거된다.

     

    2-2. 상세 메모리 구조

    다음은 상세 메모리 구조이다. 스레드는 멀티스레딩 환경에서 각각의 독립된 스택을 가지는데, 각 스레드는 독립적으로 함수를 호출하고, 자신의 지역 변수를 관리할 수 있다. 스택 내에는 한 개 이상의 스레드가 포함된다.

    +-------------------------+
    |     Process Memory      |
    |                         |
    | +---------------------+ |
    | | Code                | | <- Shared by all threads
    | +---------------------+ |
    | | Data                | | <- Shared by all threads
    | +---------------------+ |
    | | Heap                | | <- Shared by all threads
    | +---------------------+ |
    | | Shared Memory       | | <- Explicitly shared between processes
    | +---------------------+ |
    | | Stack for Thread 1  | | <- Independent for each thread
    | +---------------------+ |
    | | Stack for Thread 2  | | <- Independent for each thread
    | +---------------------+ |
    | | Stack for Thread 3  | | <- Independent for each thread
    | +---------------------+ |
    |                         |
    +-------------------------+

     

    2-3. 공유 메모리 상세 구조

    또한 프로세스에는 공유 메모리를 설정할 수 있다. 공유 메모리 영역은 두 개 이상의 프로세스가 명시적으로 접근할 수 있는 메모리 영역을 지칭한다. 이는 특별히 설정된 메모리 영역으로, IPC(Inter-Process Communication) 기법 중의 하나로 사용된다. 이 때 공유 메모리는 힙 영역에 설정하거나 별도 영역으로 구성할 수 있다.

    1. 힙 영역에 설정
    // 힙 영역에 설정
    +-------------------------+     +-------------------------+
    |      Process 1          |     |      Process 2          |
    |                         |     |                         |
    | +---------------------+ |     | +---------------------+ |
    | | Code                | |     | | Code                | |
    | +---------------------+ |     | +---------------------+ |
    | | Data                | |     | | Data                | |
    | +---------------------+ |     | +---------------------+ |
    | | Heap                | |     | | Heap                | |
    | |                     | |     | |                     | |
    | | +-----------------+ | |     | | +-----------------+ | |
    | | | Shared Memory   | <====+====> | Shared Memory   | | |
    | | +-----------------+ | |     | | +-----------------+ | |
    | +---------------------+ |     | +---------------------+ |
    | | Stack               | |     | | Stack               | |
    | +---------------------+ |     | +---------------------+ |
    |                         |     |                         |
    +-------------------------+     +-------------------------+
    1. 별도 공간에 메모리 매핑을 통해 구성
    // 별도 공간에 메모리 매핑을 통해 구성
    +-------------------------+     +-------------------------+
    |      Process 1          |     |      Process 2          |
    |                         |     |                         |
    | +---------------------+ |     | +---------------------+ |
    | | Code                | |     | | Code                | |
    | +---------------------+ |     | +---------------------+ |
    | | Data                | |     | | Data                | |
    | +---------------------+ |     | +---------------------+ |
    | | Heap                | |     | | Heap                | |
    | +---------------------+ |     | +---------------------+ |
    | | Shared Memory       | |<===>| | Shared Memory       | |
    | +---------------------+ |     | +---------------------+ |
    | | Stack               | |     | | Stack               | |
    | +---------------------+ |     | +---------------------+ |
    |                         |     |                         |
    +-------------------------+     +-------------------------+