[OS] Process와 Thread의 차이

BaeRonui·2022년 2월 10일
0

OS

목록 보기
1/14
post-custom-banner

Process

Program

Process는 실행중인 프로그램을 의미한다. 그렇기에, Process를 알기 위해서는 프로그램이 무엇인지 이해를 해야한다. 프로그램의 사전적 의미는 실행가능한 명령어의 집합을 의미하는 정적인 개념이다. 즉, 프로그램은 executable binary file 라고 생가할 수 있습니다.

Process

Process는 메모리에 적재되고, CPU의 자원을 할당받아 실행되고있는 프로그램으로, 동적인 의미를 담고있다. OS는 각각의 process를 PCB(Process Control Block)이라는 자료구조로 다룬다.
Xcode Instruction으로 본 Process list

짧게나마, Syscall

새로운 Process는 어떻게 실행이 될까?를 이해하기 위해서는 System call에 대한 이해가 필요하다. System Call에 관한 글이 아니므로, 간단히 집고 넘어가자. System Call(== syscall)은 Application이 OS의 Kernel이 수행하는 작업을 활용하기 위한 Interface라고 할 수 있다. 이런 Syscall 중에는 fork() 라는 명령과, exec()라는 명령이 존재하는데, 이를 이용하여 새로운 Process를 만든다.

fork(), exec(), process tree

#include <unistd.h>

fork()는 현재 실행중인 process가 메모리를 할당하고 code 부터 program counter까지 완전하게 동일한 process를 복사하고, 실행한다. parent proess에서는 process의 PID, child process에서는 0을 return한다.
그에 반해, exec()는 새로운 process를 실행하는 것은 아니지만, 실행중이던 process의 내용이 exec()로 실행되는 process로 덮여쓰인다.

새로운 Process는 fork()를 하고 PID가 0인지를 확인하여 0이면 exec()를 실행하는 방식을 통해 새로운 proces를 생성을 한다.

이러한 fork() -> exec()로 생성하는 방식 때문에 (기존 process)-(새로운 process)의 관계는 부모-자식 관계가 된다. 전체 process는 tree 형태를 띄게 되고, 이것을 Process Tree라고 한다.
process tree

Process : Ram에 적재되고, CPU의 자원을 할당받아 실행되고 있는 프로그램.

Thread

Thread는 process 내에서 실행되는 흐름의 단위를 말한다. 하나의 process에는 여러개의 Thread가 존재할 수 있고, 하나의 process에 속해있는 여러개의 Thread는 PCB의 code나 bss, data와 같은 자원을 공유하며, 공유 메모리를 통해 통신할 수 있다. OS는 각각의 thread를 TCB(Thread Control Block)이라는 자료구조로 관리를 한다.

스레드.. 어디서 들어본 적이 있는 것 같다..
여기였던거 같다

CPU thread?

크게 다른 내용은 아니다. CPU에서 말하는 thread는 CPU가 처리할 수 있는 작업의 단위이다. 인텔 사의 하이퍼스레드 등의 방식을 통해 1개의 코어가 여러개의 코어로 인식하게 하여 여러개의 OS의 thread를 할당받아 실행할 수 있도록 한다.

Process

  • Ram에 적재되고, CPU의 자원을 할당받아 1개 이상의 thread로 실행되고 있는 프로그램
  • OS로부터 자원을 할당받는 작업의 단위

Thread

  • Process가 할당받은 단위를 이용하는 실행의 단위

Multi-process / thread

Multi-process

하나의 프로그램을 여러 프로세스로 병렬적으로 수행하는 것을 말한다.

pros

  • 각각의 process는 독립된 메모리 영역을 유지해 나가므로 서로의 메모리를 침범할 일도 없고, 하나의 프로세스에 문제가 생기더라도 다른 프로세스에 영향을 미치지 않기 때문에, 안정적이다.

cons

  • 각각의 process는 자신만의 메모리 영역을 보유하고 있기 때문에, multi-threading에 비해 메모리를 많이 차지한다.
  • process간 통신을 위해서는 IPC(Inter-Process Communication)을 요구한다. (pipe, Semaphore, 공유메모리, etc..) 이는 multi-threading에서 thread 간의 통신보다 많은 자원을 필요로 한다.

Multi-thread

하나의 프로그램을 여러개의 스레드로 처리하는 것을 말한다.

pros

  • thread는 code, heap, data를 공유하므로, thread간의 통신을 할 때 이들을 이용할 수 있다. 이는 비교적 간단하고, 시스템 자원의 효율성이 높다.
  • code, heap, data를 공유하므로, 메모리 공간의 효율성이 높다.
  • program counter, thread-stack만 교체하면 되므로, context-switching시 비용이 비교적 적다.

cons

  • 서로의 자원에 접근해야 될 경우, 간섭의 여지가 있기에 동기화를 필요로 한다.
  • 동기화의 과정에서 병목현상이 일어날 수 있고, multi-thread로 얻는 이득보다 병목현상의 손해가 더 클 수 있으므로, 신중한 설계가 필요하다.
  • 하나의 스레드가 문제가 생기면 전체가 문제가 생긴다.
profile
iOS / Swift 였던것 이젠 BE
post-custom-banner

0개의 댓글