[운영체제] 프로세스와 스레드

xoey·2024년 10월 23일

운영체제

목록 보기
2/15
post-thumbnail

서문

컴퓨터의 성능이 향상되고, 애플리케이션이 더욱 복잡해짐에 따라 프로세스와 스레드의 개념을 이해하는 것은 필수적이다. 특히 멀티태스킹이 일상화된 현대의 컴퓨팅 환경에서는 프로세스와 스레드의 차이점, 각각의 장단점, 그리고 그들이 운영체제에서 어떻게 동작하는지에 대한 이해가 필요하다.

이 글에서는 프로세스와 스레드의 기본 개념을 설명하고, 멀티 프로세스와 멀티 스레드의 차이점까지 정리해 볼 것이다. 이를 통해 프로세스와 스레드에 대한 보다 명확한 이해를 돕고, 이를 기반으로 실제 시스템에서 이들이 어떻게 사용되는지 이해하는 데 도움이 되길 바란다.

1. 프로세스와 스레드

1.1. 프로세스(Process)

프로그램(어떤 작업을 위해 실행할 수 있는 파일 .exe)이 메모리에 올라와 운영체제로부터 CPU를 할당받고 프로그램이 연속적으로 실행되고 있는 상태(일을 처리하는 일련의 과정)

e.g. 치킨을 먹기 위해 BBQ에 방문했다고 가정해 보자.

치킨을 주문하면 BBQ의 레시피를 주는 게 아니라, BBQ만의 특별 레시피를 가지고 치킨을 만들어 준다.
여기서 레시피가 코드 파일(프로그램)이고, 치킨은 프로그램이 실행되어 우리가 사용할 수 있는 프로세스이다.

레시피를 통해 치킨을 만들듯, 코드 파일(프로그램)을 실행시켜 “프로세스”가 되어 사용할 수 있게 되는 것이다.

1.1.1. 특징

  • 기본적으로 프로세스 당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
    즉, 프로세스를 생성하면 반드시 하나 이상의 스레드가 생긴다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 프로세스끼리는 자원을 공유하지 않는다.
    • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
    • e.g. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용

1.1.2. 프로그램이 프로세스 될 때 발생하는 일

  1. 프로세스가 필요로 하는 재료들이 메모리에 올라간다.

    • 이 재료들은 총 4가지로 구성되어 있고, 메모리 공간을 확보한다.

      SectionDescription
      Code실행 명령을 포함하는 코드들
      DataStatic 변수 또는 Global 변수
      Heap동적 메모리 영역
      Stack지역변수, 매개변수, 반환 값 등등 일시적인 데이터
  2. 해당 프로세스에 대한 정보를 가지고 있는 PCB 블록이 생성된다.

    • PCB(Program Control Block): 운영체제에서 프로그램에 대한 중요한 정보를 저장하는 데이터 구조
    • 운영체제는 여러 프로세스를 동시에 관리해야 한다.
    • 각 프로세스는 CPU, 메모리, 입출력 장치 등의 시스템 자원을 요청하고 사용하게 되는데, 이를 관리하기 위해 각 프로세스의 상태와 관련된 정보를 저장해야 한다.
    • PCB를 사용하여 프로세스의 상태를 관리하고, 문맥 전환(context switch)을 수행할 때 필요한 정보를 저장하고 복원한다.

1.2. Context Switching

코딩 공부를 하고 있는 상황을 생각해 보자.
카카오톡, 구글 크롬, VS code 프로그램들을 사용해 총 3개의 프로세스를 사용하고 있다.

이처럼 보통 컴퓨터로 어떤 일을 할 때 하나의 프로세스만 이용하는 게 아니라 여러 프로세스를 이용한다.
한 프로세스가 CPU를 다 점유하고 있다면 다른 프로세스는 실행될 수 없다.

이때문에 다수의 프로세스를 동시 실행하기 위해 여러 개의 프로세스를 짧은 텀을 반복하며 전환해 실행시키도록 한다. 이를 Context Switching이라고 한다.

  • 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고 대기하고 있다가 다시 실행시켜 복구하는 비용(시간)
  • 즉, PCB-1과 PCB-2가 서로 대기와 준비를 번갈아가며 하는 것이다.

    두 프로세스 P0P_0P1P_1이 있다고 가정하자. 현재 P0P_0는 실행 중(Running)이고, P1P_1은 대기 중(Ready) 상태다. 이때 인터럽트나 시스템 호출이 발생하면, P0P_0는 실행 상태에서 대기 상태로 전환된다. 이 과정에서 P0P_0의 정보는 PCB(프로세스 제어 블록)에 저장되어, 추후 복원될 수 있도록 한다. 이어서 P1P_1은 이전에 저장된 PCB 정보를 통해 대기 상태에서 실행 상태로 전환되어 작업을 이어간다. P1P_1도 일정 시점에 다시 대기 상태가 되면, PCB에 상태 정보를 저장하고, P0P_0가 PCB로부터 복원되어 작업을 계속하게 된다.
    이렇게 두 프로세스는 실행과 대기를 반복하며 서로 교대로 CPU를 사용하게 된다.

  • 실제 우리가 사용하는 컴퓨터에서는 굉장히 많은 프로세스가 실행되는데, 이렇게 많은 프로세스에서 Context Switching이 일어나면 굉장히 비효율적일 것으로 보인다.
  • 실제로 Context Switching이 너무 잦으면 오버헤드가 발생하여 (비용이 높아) 성능이 떨어진다는 단점을 갖는다.

1.3. 스레드(Thread)

프로세스 내에서 실행되는 흐름의 단위
프로세스 하나에 자원을 공유하면서 일련의 여러 개의 과정을 동시에 실행시킬 수 있는 것이다.(경량화된 프로세스)
즉, 실행 - 대기 상태를 반복할 필요가 없어 효율적이다.

e.g. 햄버거라는 프로세스 안에 패티를 굽는 스레드, 빵을 굽는 스레드가 있다.
(애플리케이션 하나가 프로세스이고, 그 안에서의 서비스들이 스레드가 되는 셈)

1.3.1. 특징

  • 프로세스 내에서 여러 개 생길 수 있다.
  • 각 스레드는 Code, Data, Heap을 공유하여 공통된 자원을 사용하고 Stack 부분만 따로 가지고 있다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

1.4. 정리

프로세스는 자원을 공유하지 않지만, 스레드는 자원을 공유한다.

  • 프로세스
    • 자체 메모리 공간이 있는 독립 엔티티로 애플리케이션에 대한 격리 및 보안을 제공한다.
    • 즉, 프로그램의 실행 중인 인스턴스이다.
    • 키워드: Isolation(격리)
    • e.g. 첫 손님이 PC방에서 게임을 하고 나갈 때 게임에 필요한 키보드, 모니터, 마우스, 본체 등을 들고 나가고 다음 손님은 게임에 필요한 키보드, 모니터, 마우스, 본체 등을 챙겨와 게임을 해야한다.
  • 스레드
    • 프로세스 내의 더 가벼운 공유 메모리 단위로, 작업의 효율적인 병렬 실행을 가능하게 한다.
    • 프로세스의 하위 집합이며 경량 프로세스라고도 한다.
    • 프로세스에는 둘 이상의 스레드가 있을 수 있으며 이러한 스레드는 스케줄러에 의해 독립적으로 관리된다.
    • 키워드: Concurrency(동시성)
    • e.g. 첫 손님이 PC방에서 게임을 하고 나가면 다음 손님은 준비물 없이 그대로 와서 게임을 즐길 수 있다.

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

2.1. 멀티 프로세스(Multi Process)

하나의 프로세스는 하나의 작업만 처리할 수 있기 때문에 여러 작업을 동시에 처리할 수 없다.

이때문에 부모 프로세스를 fork해서 자식 프로세스를 만들어 여러 개의 프로세스를 구성해 하나의 애플리케이션을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것이다.

이때, 자식 프로세스는 부모와 별개의 메모리 영역을 확보한다.

2.1.1. 장점

  • 여러 개의 자식 프로세스 중 하나에 문제가 발생해도, 다른 자식 프로세스에 영향이 확산되지 않는다.
    • 즉, 하나의 프로세스가 잘못 되어도 프로그램은 동작한다.
  • 구현이 간단하고, 각 프로세스들이 독립적으로 동작하며, 자원이 서로 다르게 할당되어 안정적이다.

2.1.2. 단점

  • 많은 메모리 공간과 CPU 시간을 차지한다.
  • 작업량이 많을수록 오버헤드가 발생하고 Context Switching으로 인해 성능이 저하된다.
  • 프로세스는 각각의 독립된 영역을 할당받기 때문에, 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다.
    • 이때문에 프로세스 간 통신을 하기 위해 IPC를 사용한다.

2.2. 멀티 스레드(Multi Thread)

하나의 애플리케이션을 여러 개의 스레드로 구성하고 각 스레드가 독립적으로 작업을 처리하는 것

여러 개의 프로그램을 실행하는 멀티 프로세스와 달리, 하나의 프로그램 내에서 여러 작업을 동시에 수행하는 것을 목표로 한다.

2.2.1. 장점

  • 하나의 스레드가 작업을 할 때 다른 스레드가 별도의 작업을 할 수 있어 사용자와의 응답성이 좋다.
  • 스레드는 부모 프로세스의 자원과 메모리를 공유할 수 있어 스레드 간 자원 공유가 쉽다.
  • 프로세스를 할당하는 것 보다 스레드를 할당하는 것이 비용이 적다.
  • 멀티 프로세서 구조에서 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있다.
  • 스레드 사이의 작업량이 작아 Context Switching이 빠르다. (스레드는 Stack 영역만 처리하기 때문)
  • 스레드 간의 자원(Code, Data, Heap)을 공유하고 있어 통신의 부담이 적고 응답 시간이 빠르다.

2.2.2. 단점

  • 스레드 간의 데이터 공유 시 동기화 문제와 교착 상태가 발생하지 않도록 주의해야 한다. (공유 자원 관리의 필요성)
  • 개별 스레드가 유기적으로 움직이고 있기 때문에 구현 및 프로그램 테스트, 디버깅이 어렵다.
  • 하나의 스레드의 오류로 전체 프로세스에 영향을 줄 수 있다.
  • 너무 많은 스레드 사용으로 오버헤드가 발생할 수 있다.

2.3. 정리

2.3.1. 멀티 프로세스

  • 장점
    • 하나의 프로세스에 문제가 발생해도 다른 프로세스에 영향을 미치지 않는다.
  • 단점
    • 각 프로세스가 독립된 메모리 영역을 사용하므로, 작업량이 많아질수록 오버헤드가 발생하고, Context Switching으로 성능 저하가 발생할 수 있다.
    • 프로세스 간 통신이 복잡하며, IPC(Inter-Process Communication)를 사용해야 한다.
  • 예시
    • 구글 크롬: 여러 탭을 멀티 프로세스로 실행하여, 한 탭에서 문제가 생겨도 전체 브라우저에 영향을 주지 않는다.

2.3.2. 멀티 스레드

  • 장점
    • 프로세스의 응답 시간이 단축되고 시스템의 처리율이 향상된다.
    • 코드 영역과 데이터 영역을 공유하므로 자원 소모가 적다.
  • 단점
    • 프로그램 디버깅이 어렵고, 하나의 스레드에 문제가 발생하면 전체 프로세스에 영향을 줄 수 있다.
  • 예시
    • 인터넷 익스플로러: 여러 탭을 멀티 스레드로 실행하며, 하나의 탭에 문제가 생기면 전체 브라우저가 종료될 수 있다.

마치며

프로세스와 스레드, 그리고 프로그램의 개념은 한 번쯤 들어본 적이 있어도 명확하게 이해하고 설명하기에는 까다로운 부분이 많다. 이번 공부를 통해 프로세스와 프로그램의 차이를 명확히 구분하고, 스레드의 역할을 이해할 수 있었다. 비록 한 번 학습했다고 해서 바로 완벽히 설명하기는 어렵지만, 이런 개념들은 반복 학습을 통해 더 명확해질 것이라 생각한다.


Reference

profile
[Roman 8:18] consider that our present sufferings are not worth comparing with the glory that will be revealed in us.

0개의 댓글