Computer Science/Operating System

[OS] 프로세스(Process) & 스레드(Thread)

dbssk 2023. 5. 21. 06:09

프로세스 (Process)

  • 메모리에 올려져서 실행 중인 프로그램
  • 각각의 프로세스는 독립된 메모리 공간, 자원, 상태 등을 갖는다.
  • 독립된 메모리 공간에는 Text(Code), Data, Stack, Heap을 할당 받는다.
  • 프로세스는 실행 중인 프로그램의 인스턴스로, 별도의 메모리 영역을 할당받고, 자체적으로 제어 블록인 PCB(Process Control Block)을 갖는다. PCB에는 id, register, PC 등이 있다.
  • 응용 프로그램 ≠ 프로세스
    • 응용 프로그램은 여러 프로세스로 구성 가능

 

프로세스 스테이트(Process State)

프로세스가 운영체제에 의해 관리되는 동안 어떤 상태에 있는지를 나타낸다. 프로세스의 상태는 다양한 상태 전이(Transition)에 따라 변경될 수 있다. 

  • new : 프로세스가 생성된 상태
  • ready : 프로세스가 CPU를 할당받을 준비가 된 상태
  • running : 프로세스가 현재 CPU를 점유하고 실행되고 있는 상태
  • waiting : 프로세스가 입출력(IO) 완료를 기다리거나 특정 이벤트 발생을 기다리는 상태
    예를 들어, 데이터를 디스크에서 읽어오는 동안 프로세스는 입출력 완료를 기다리는 대기 중인 상태이다. 이벤트가 발생하거나 입출력 작업이 완료되면 ready 상태로 전환된다.
  • terminated : 프로세스의 실행이 완료되어 종료된 상태
    운영체제는 프로세스의 자원을 해제하고 PCB를 제거하여 메모리 공간을 회수한다.

 

프로세스 주소 공간

각각의 프로세스는 독립된 메모리 공간을 할당 받는데 4가지 부분으로 나눌 수 있다.

  • Text(Code) : 프로세스의 실행 가능한 코드가 저장되는 영역
    즉, 프로그램의 명령어들이 위치하며, CPU에 의해 실행되는 명령어들이 저장되어 있다.

  • Data : 전역 변수, 정적 변수, 상수 등 초기화된 데이터가 저장되는 영역
    프로세스의 실행 도중에 값이 변경될 수 있다.

  • Heap : 프로그램 실행 중에 동적으로 할당된 메모리를 관리하는 영역
    주로 동적으로 생성된 데이터 구조나 객체가 저장된다.

  • Stack : 지역 변수, 함수 호출 정보, 임시 데이터 등이 저장되는 영역
    함수 호출 시 매개변수, 복귀 주소, 지역 변수 등이 스택에 쌓이고 해제된다.

 

스레드(Thread)

  • 프로세스 내에서 실행되는 작업의 단위 (하나의 프로세스는 여러 개의 스레드를 가질 수 있다.)

  • 프로세스 내의 코드 흐름을 나타낸다.

  • 스레드는 프로세스의 자원을 공유하면서 실행된다. 같은 프로세스 내의 스레드들은 주소 공간, 파일, 자원 등을 공유하며, 이를 통해 데이터의 공유와 효율적인 작업을 가능하게 한다.

  • 각각의 스레드는 독립적으로 실행될 수 있다.

  • 프로세스의 주소 공간을 공유하므로, 스레드 간의 통신은 간단하게 이루어진다. 하지만, 이로 인해 스레드 간의 동기화 문제나 경쟁 상태 등을 고려해야 한다.

  • 위에서 주소 공간을 공유한다고 했지만 모두 공유하는 것은 아니고, text(code), data, heap을 공유한다. stack의 경우 스레드마다 별도로  할당을 받는다. 왜냐하면, 각 스레드마다 실행하는 흐름이 다르므로 복귀 주소, 매개변수, 지역 변수를 저장할 공간이 각각 존재해야 하기 때문이다.

 

프로세스와 스레드의 차이

  • 프로세스 : 각 프로세스는 독립된 주소 공간과 자원을 가지고 있어 다른 프로세스의 변수나 자료에 접근할 수 없다. 따라서, 다른 프로세스가 오류로 인해 종료되더라도 영향을 받지 않는다.
    + 프로세스간의 통신을 위해서는 IPC(Inter-Process Communication)를 사용

  • 스레드 : 스레드는 동일한 프로세스 내에서 text(code), data, heap 형식으로 할당된 메모리 영역을 공유하기 때문에 각각의 스레드는 별도의 stack을 가지고 있지만 힙 메모리는 서로 공유할 수 있다. 따라서, 한 프로세스 내에서 스레드 하나가 오류로 인해 종료되면 다른 스레드도 영향을 받아 종료된다.

 

멀티 프로세스

  • 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것
  • 한 번에 많은 서로 다른 작업을 처리할 때 사용한다. ex) 웹 서버에서 여러 요청을 동시에 처리할 때

  • 단점

    1. Context Switching이 발생하면 캐시에 존재하는 모든 데이터를 리셋 하고 다시 캐시 정보를 불러와야한다. 즉 Context Switching의 오버헤드(overhead)가 커서 비용이 크다.
    2. 프로세스 간의 통신에 복잡한 IPC를 사용하여 통신해야 한다.

  • 장점

    1. 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 해당 프로세스만 작동을 중지하고 다른 프로세스는 영향을 받지 않는다.

 

멀티 스레드

  • 하나의 프로세스 안에서 여러 개의 스레드가 동시에 실행되는 것
  • 멀티스레드에서 각 스레드는 자신만의 작업 흐름을 가지게 되고, 이를 통해 하나의 프로세스에서 다수의 작업을 동시에 처리할 수 있다.
  • 한 번에 많은 비슷한 작업을 처리할 때 사용한다. ex) 게입, 웹 서버

  • 장점

    1. 여러 개의 스레드가 동시에 실행되므로 처리 속도가 빨라진다.
    2. 스레드 간의 데이터 공유가 용이하기 때문에, 작업 처리가 더욱 효율적이고 빠르다.
    3. 시스템 자원 소모가 감소한다. 프로세스를 생성하는 system call이 줄어들어 자원을 효율적으로 관리할 수 있다.

  • 단점

    1. 스레드 간의 경쟁 상황이 발생할 수 있다. 즉, 동시에 여러 개의 스레드가 하나의 자원에 동시에 접근하면서, 서로의 작업을 간섭하게 될 수 있다. 즉, 동기화 문제(Synchronize problem)가 발생할 수 있다.
    2. 스레드의 생성과 관리가 복잡해질 수 있으며, 여러 개의 스레드가 동시에 실행되기 때문에 프로그램의 안정성에 영향을 미칠 수 있다.
    3. 하나의 스레드에 문제가 발생하면 전체 프로세스에 영향을 준다.
    4. 디버깅이 까다롭다.