[OS] Process & Thread

Process & Thread

  • Program : 특정 작업을 위해 실행할 수 있는 파일

  • Process : 연속적으로 실행되고 있는 프로그램

    • 컴퓨터 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)입니다.

    • 운영체제로부터 시스템 자원을 할당받는 작업의 단위이기도 합니다.

    • 할당받는 시스템자원 : CPU, Code/Data/Stack/Heap 구조로 되어있는 독립된 메모리영역

    • 각 프로세스는 별도의 주소 공간에서 실행되며, 서로 다른 프로세스의 데이터에 접근할 수 없습니다.

      서로 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 합니다.

      Ex) 파이프, 파일, 소켓 등을 이용한 통신 방법이 있습니다.

  • Thread : 프로세스 내에서 실행되는 여러 흐름의 단위

    • 프로세스가 할당받은 자원을 이용해서 실행하는 단위입니다.

    • 기본적으로 프로세스당 최소 1개의 메인스레드를 가지고 있습니다.

    • 스레드는 프로세스 내에서 별도의 레지스터와 Stack를 할당받되, Code / Data / Heap 영역은 공유합니다.

Multi Process & Multi Thread

https://eun-jeong.tistory.com/20 를 참고하여 작성하였습니다.

멀티 프로세스 : 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것입니다.

  • 장점 : 프로그램에 구성된 여러 프로세스 중 하나에 문제가 발생하면 다른 프로세스에는 영향이 없습니다.
  • 단점
    • 여러 프로세스 간에 Context Switching 에서의 오버헤드가 발생합니다. (캐시메모리 초기화 등에 소요되는 시간)
    • 공유 자원을 대체할 프로세스 사이의 어렵고 복잡한 통신 기법(IPC)

멀티 스레드 : 하나의 응용프로그램을 여러 개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리하는 것입니다.

윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있고, 웹 서버 또한 대표적인 멀티 스레드 응용 프로그램입니다.

  • 장점
    • 시스템 자원 소모가 줄어들고(자원의 효율성 증대) 시스템 처리 비용이 감소됩니다.(시스템 처리량이 증가)
      • 프로세스 생성 시 자원을 할당하는 과정의 시스템 콜이 감소되기 때문.
      • 공유 자원을 효율적으로 사용하게 되면 스레드 간에 데이터를 주고 받는 것이 간단해지기 때문.
    • 스레드 사이의 작업량이 작아 Context Switching이 빠릅니다. (Stack 영역만 처리해주면 되기 때문)
    • 간단한 통신 방법으로 프로그램 응답 시간이 단축됩니다.
  • 단점
    • 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받습니다.
    • 디버깅이 까다롭고 주의 깊은 설계가 필요합니다.
      • 자원 공유에서 동기화의 문제가 발생할 수 있기 때문
    • 단일 프로세스 시스템의 경우 효과를 기대하기 어렵습니다. 왜?
    • 프로세스 밖에서 스레드 각각을 제어할 수 없습니다. 즉, 다른 프로세스는 각자의 스레드만을 제어할 수 있습니다.

멀티 프로세스 대신 멀티 스레드를 사용하는 이유?

멀티 프로세스 대신 멀티 스레드를 사용하는 것을 쉽게 생각하면 프로그램을 여러 개 키지 않고 하나의 프로그램에서 여러 작업을 하는 것입니다.

멀티 스레드는 멀티 프로세스의 단점을 해결해주는 장점이 있기 때문에 효율적입니다. 다만 스레드 간의 자원 공유는 전역 변수(데이터 세그먼트)를 이용하기 때문에 동시에 접근하려 하면 충돌이 발생할 수 있습니다. 이 문제가 발생하지 않도록 Thread Safe 을 충족시킬 수 있도록 설계해주어야 합니다.

단, 멀티스레드를 사용하게 되면 프로세스 하나가 중단되면 프로그램 전체가 마비되는 현상이 발생할 수 있다. 멀티프로세스를 사용하면 이런 현상을 방지할 수 있다.

(예를 들어, 웹 탭들을 멀티스레드로 관리하면 한 탭에서 오류가 생기면 전체 웹서비스에 영향을 준다. 멀티스레드로 관리했다면 한 탭에서 오류가 생겨도 다른 탭은 영향받지 않을 수 있다.)

Context Switching

CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정에서 현재 진행중인 Task(Process, Thread)의 상태를 저장하고 다음 Task의 상태 값을 읽어 적용하는 과정입니다.

구체적으로, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말합니다.

Context Switching의 과정

  1. 현재 실행중인 Task의 PCB 정보를 저장합니다. (Process Stack, Ready Queue)

    PCB (Process Controll Block) : Task의 정보를 관리하는 Register 블락입니다.

    Process State : 프로세스의 상태, Process Counter : 다음 실행할 명령어의 주소 값, CPU Registers 등으로 구성되어 있습니다.

  2. 다음 Task의 PCB 정보를 읽어 Register에 적재하고 다음 실행을 이어갑니다.

Context Switching Cost (Process vs Thread)

  • Process Context Switching 비용 > Thread Context Switching 비용
  • 프로세스 간의 Context Switching시 단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐쉬 메모리에 대한 데이터까지 초기화되므로 오버헤드가 크기 때문입니다. 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어, Context Switching가 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 합니다.
  • Thread는 Stack 영역을 제외한 모든 메모리를 공유하므로 Context Switching 수행 시 Stack 영역만 변경하면 되기 때문에 비용이 적게 듭니다.

프로세스 제어 블록(Process Control Block, PCB)

개념

  • 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조
  • 운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB 생성

프로세스 전환

  • 프로세스는 CPU를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU를 반환해야 하는데, 이 때 작업의 진행 상황을 모두 PCB에 저장한다.
  • 이후 다시 CPU를 할당받게 되면 PCB에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행한다.

PCB에 저장되는 정보

  • 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
  • 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태 저장
  • 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
  • CPU 레지스터
  • CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
  • 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
  • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
  • 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등

Thread Safe

WIKI : 스레드 안전 을 바탕으로 작성하였습니다.

멀티스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 상태를 의미합니다.

Thread Safe 여부를 판단하는 방법

  • 여러 스레드에서 동시에 접근 가능한 전역변수, 힙, 파일 등을 사용하는지 여부

  • Handle과 포인터를 통한 데이터의 간접 접근 여부

    Handle : 자원(Resource)에 대한 추상적인 참조입니다. 응용소프트웨어가 DB나 OS 같은 다른 시스템에서 관리되는 메모리 블록들이나 객체들을 참조하는데 사용됩니다. 파일서술자, 네트워크 소켓, DB 연결, 프로세스식별자(PID) 등이 있습니다. 외부적으로 관리되는 참조를 추상화한 것입니다.

    포인터 : 참조하는 대상의 주소를 갖습니다.

  • 부수 효과를 가져오는 코드가 있는지 여부

    부수효과 : call by reference / call by name 메모리 공유를 하는 부분에서 발생하는 이슈입니다. OS 개념에서 보면 세마포어/뮤텍스를 통해 예방할 수 있습니다.

Thread Safe 구현

  • 재진입성 : 함수가 한 스레드에서 호출되었을 때, 다른 스레드가 동일한 함수를 호출해도 결과가 각각 올바로 주어지도록 설계할 수 있습니다.

  • 상호배제 : 공유 자원을 반드시 사용해야만 하는 경우, 세마포어 등의 락으로 통제할 수 있습니다.

  • 스레드 지역 저장소 : 공유 자원의 사용을 최대한 줄여 각 스레드에서 접근 가능한 저장소들을 따로 사용하여 동시 접근을 막을 수 있습니다.

  • 원자 연산 : 공유 자원에 접근할 때 원자 연산을 이용하거나 원자적 으로 정의된 접근 방법을 사용하여 상호배제 를 구현할 수 있습니다.

    연산을 수행하면서 방해받지 않고 단 하나의 연산만 하는 것을 의미합니다. 여러 스레드가 하나의 공유변수를 사용할 때, 각 스레드들이 마치 하나인 것처럼 설계하는 것을 의미합니다.

'SW > Computer Science' 카테고리의 다른 글

[WEB] 웹서비스  (0) 2021.06.15
[WEB] 쿠키와 세션  (0) 2021.06.01
[WEB] HTTP의 GET과 POST  (0) 2021.05.30
[OS] Mutex & Semaphore  (0) 2021.05.27