본문 바로가기

컴퓨터구조, 운영체제

프로세스와 스레드

728x90
반응형
SMALL

프로세스 개요

프로그램이 메모리에 적재되고 실행되는 순간, 프로그램은 프로세스가 됩니다.

 

Mac용 활성 상태 보기 앱을 통해서 확인이 가능하고 맥 또한 유닉스 기반으로 한 운영체제이기 때문에, 터미널에서 ps -e명령으를 통해서도 가능합니다 :)

 

프로세스에 따라 사용자가 보는 앞에서 실행되면 포어그라운드 프로세스, 그렇지 않으면 백그라운드 프로세스라 부르며, 사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스를 데몬이라 합니다.

 

프로세스 제어블록

프로세스 제어 블록(Process Control Block, PCB)은 운영체제가 각 프로세스를 관리하기 위해 유지하는 정보의 모음입니다. PCB는 각 프로세스에 대한 정보를 저장하고, 프로세스 스케줄링, 메모리 관리, 입출력 등의 작업을 수행할 때 사용됩니다.

PCB에는 다음과 같은 정보가 저장됩니다.

  1. 프로세스 식별자(Process ID, PID): 프로세스를 구분하기 위한 고유 식별자입니다.
  2. 프로세스 상태: 프로세스가 현재 실행 중인지, 대기 중인지, 중단되었는지 등의 상태를 나타냅니다.
  3. 프로그램 카운터(Program Counter, PC): 현재 실행 중인 명령어의 주소를 저장합니다.
  4. 레지스터: 프로세스의 레지스터 값들을 저장합니다.
  5. 프로세스 우선순위: 프로세스의 우선순위 값을 저장합니다.
  6. 입출력 상태 정보: 프로세스가 입출력 작업을 수행하고 있는 경우, 해당 작업의 상태 정보를 저장합니다.
  7. 메모리 관리 정보: 프로세스가 사용 중인 메모리 영역의 정보를 저장합니다.

문맥교환

기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로 부터 복구하여 새로운 프로세스를 실행하는 것

*문맥: 하나의 프로세스가 수행을 재개하기 위해 기억해야 할 정보

 

프로세스 메모리 영역

프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됩니다. 

 

코드 영역(Code Segment):

  • 프로그램 실행 코드가 저장되는 영역입니다.
  • CPU는 코드 영역에 저장된 명령어를 읽어와 실행합니다.
  • 코드 영역은 읽기 전용(Read-Only) 메모리로, 프로그램 실행 도중 수정이 불가능합니다.

데이터 영역(Data Segment):

  • 전역 변수(Global Variable)와 정적 변수(Static Variable)가 저장되는 영역입니다.
  • 프로그램 실행 이전에 초기화된 데이터가 저장되며, 프로그램 실행 도중에도 데이터를 읽고 수정할 수 있습니다.
  • 데이터 영역은 읽기 쓰기(Read-Write) 메모리입니다.

힙 영역(Heap Segment):

  • 동적으로 할당된 메모리가 저장되는 영역입니다.
  • 프로그램 실행 도중에 동적으로 메모리를 할당하거나 해제할 수 있습니다.
  • 힙 영역은 읽기 쓰기(Read-Write) 메모리입니다.

스택 영역(Stack Segment):

  • 함수 호출 시 사용되는 지역 변수(Local Variable)와 매개변수(Parameter)가 저장되는 영역입니다.
  • 함수가 호출될 때마다 스택 프레임(Stack Frame)이 생성되며, 스택 프레임에는 지역 변수와 매개변수 등의 정보가 저장됩니다.
  • 함수 호출이 끝나면 해당 스택 프레임이 제거됩니다.
  • 스택 영역은 후입선출(Last-In-First-Out) 구조를 가진 메모리입니다.

 

프로세스 상태와 계층 구조

프로세스 상태

  • 생성 상태 (Created state)
    프로세스나 스레드가 생성되었지만 아직 실행되지 않은 상태입니다. 이 상태에서는 프로세스나 스레드가 필요한 자원을 할당 받기 위해 대기하고 있습니다.
  • 준비 상태 (Ready state)
    프로세스나 스레드가 실행을 준비하고, 할당 받은 자원을 모두 준비한 상태입니다. 이 상태에서는 CPU가 할당되기를 기다리고 있습니다.
  • 실행 상태 (Running state)
    준비 상태에서 CPU를 할당받아 실제로 실행되는 상태입니다.
  • 대기 상태 (Waiting state)
    실행 상태에서 입출력 등의 작업으로 인해 자원을 요청하여 대기 중인 상태입니다. 이 상태에서는 CPU를 반납하고 해당 자원을 기다리는 상태입니다.
  • 종료 상태 (Terminated state)
    프로세스나 스레드의 실행이 완료된 상태입니다. 이 상태에서는 할당 받은 자원을 반납하고, 운영체제에 의해 제거됩니다.

프로세스 계층 구조

프로세스 계층 구조는 운영체제에서 프로세스 간 상속 관계를 정의하는 구조입니다. 일반적으로, 부모 프로세스는 자식 프로세스를 생성하고, 자식 프로세스는 부모 프로세스에서 상속 받은 속성과 권한을 유지합니다. 

 

*특징

  1. 단일 부모: 각 프로세스는 하나의 부모 프로세스에 의해 직접 생성됩니다.
  2. 상속: 부모 프로세스는 자식 프로세스에 대해 몇 가지 권한과 속성을 상속합니다. 예를 들어, 자식 프로세스는 부모 프로세스의 환경 변수, 현재 작업 디렉토리 등을 상속할 수 있습니다.
  3. 계층: 프로세스는 부모-자식 관계를 통해 계층적으로 구성됩니다. 각 프로세스는 자신의 자식 프로세스를 가질 수 있으며, 이러한 계층 구조를 통해 작업을 조직화하고 프로세스 간 통신을 촉진할 수 있습니다.
  4. 프로세스 그룹: 여러 개의 프로세스를 함께 그룹화할 수 있습니다. 그룹 내에서 프로세스는 서로 독립적으로 실행되지만, 그룹 내의 다른 프로세스와 통신할 수 있습니다.

프로세스 계층 구조는 운영체제에서 프로세스 관리와 프로세스 간 통신을 관리하는 데 중요한 역할을 합니다. 이러한 구조를 사용하여 프로세스 간의 상호작용을 조직화하고, 보안 및 권한 문제를 해결할 수 있습니다.

 

프로세스 생성 기법

Swift에서 각기 다른 작업을 하는 스레드를 생성하는 방법은 다양합니다.

 

1. Grand Central Dispatch(GCD)를 사용하여 스레드 생성

DispatchQueue.global(qos: .userInitiated).async {
    // 이곳에서 각기 다른 작업을 수행
}

 

2. Operation Queue를 사용하여 스레드 생성

let queue = OperationQueue()

queue.addOperation {
    // 이곳에서 각기 다른 작업을 수행
}

 

3. Thread 클래스를 직접 사용하여 스레드 생성

let thread = Thread {
    // 이곳에서 각기 다른 작업을 수행
}

thread.start()

이외에도 DispatchWorkItem, Operation 등을 사용하여 스레드를 생성할 수 있습니다.

 

스레드

스레드: 프로세스를  구성하는 실행의 흐름 단위

스레드 사용 이유

  • 프로그램의 응답성 향상: UI나 네트워크 처리와 같이 시간이 오래 걸리는 작업을 스레드에서 처리하면, 프로그램이 더 빠르게 응답할 수 있습니다.
  • 자원 공유: 여러 스레드가 프로세스의 메모리 공간과 자원을 공유하여 작업할 수 있습니다.
  • 멀티 태스킹: 여러 스레드가 동시에 실행되기 때문에 멀티 태스킹을 구현할 수 있습니다.

멀티 프로세스와 멀티 스레드

멀티 프로세스(Multi-Process):

  • 여러 개의 독립된 프로세스가 동시에 실행되는 것을 의미합니다.
  • 각 프로세스는 자신만의 고유한 주소 공간과 자원을 가지고 실행됩니다.
  • 프로세스 간의 통신은 IPC(Inter-Process Communication)을 통해 이루어집니다.
  • 각 프로세스는 서로 완전히 독립되어 있기 때문에 안정성이 높지만, 프로세스 간의 전환에 대한 오버헤드가 크고 자원 소모가 많습니다.

멀티 스레드(Multi-Thread):

  • 하나의 프로세스 내에서 여러 개의 스레드가 동시에 실행되는 것을 의미합니다.
  • 모든 스레드는 같은 주소 공간을 공유하고, 자원을 공유하여 실행됩니다.
  • 스레드 간의 통신은 메모리 공간을 공유하여 이루어집니다.
  • 스레드 간의 전환 오버헤드가 작고, 자원 소모도 적지만 스레드 간의 동기화 문제가 발생할 수 있습니다.

멀티 프로세스와 멀티 스레드는 각각 장단점이 있으며, 상황에 따라 적절한 방식을 선택하여 사용해야 합니다. 멀티 프로세스는 안정성과 격리성이 높지만 자원 소모가 많고, 멀티 스레드는 자원 소모가 적지만 동기화 문제가 발생할 수 있습니다.

*기본적으로 프로세스간 자원을 공유하지 않지만, 프로세스 간 자원을 공유하고 데이터를 주고 받는 것도 가능하며, 이를 프로세스 간 통신 IPC라고 합니다.

728x90
반응형
LIST

'컴퓨터구조, 운영체제' 카테고리의 다른 글

CPU 스케쥴링  (0) 2023.04.03
프로세스 동기화  (0) 2023.04.03
운영체제 시작하기  (0) 2023.03.30
입출력 장치  (0) 2023.03.27
보조기억장치  (0) 2023.03.27