프로세스, 스레드


운영체제의 지원 여부에 따라 단일 쓰레드, 다중 쓰레드로 나뉠 수 있다.

프로세스

프로세스는 컴퓨터에서 실행되고 있는 프로그램이라고 생각하면 된다.

메모리에 올라와 실행되고 있는 프로그램의 인스턴스로, 운영체제한테 시스템 자원을 할당받는 작업의 단위다.

쓰레드

쓰레드는 프로세스 내에서 실행되는 여러 흐름의 단위이다.

이 흐름이라는 것은 프로세스의 특정한 수행 경로를 의미하고, 프로세스가 할당받은 자원을 이용하는 실행의 단위이다. 프로세스가 자원을 할당받는 것 자체에 대한 단위였다면 쓰레드는 그 자원을 이용하는 단위라고 생각하면 된다.

특징

프로세스는 실행될 때 운영체제로부터 독립된 메모리 영역(heap, data, stack, code)를 할당받는다. 기본적으로 하나의 프로세스가 생성되면 하나의 쓰레드가 같이 생성된다. 이를 메인 쓰레드라 하며, 쓰레드를 추가하지 않는 한 모든 프로그램 코드는 메인 쓰레드에서 실행된다.

프로세스들은 별도의 주소 공간에서 실행되고 한 프로세스는 다른 프로세스의 변수나 자료 구조에 접근할 수 없다. 다른 프로세스의 자원에 접근하려면 프로세스간 통신(IPC, inter process communication)을 사용해야 한다. 파이프, 파일, 소켓이 여기에 해당된다.

차이점

그렇다면 쓰레드와 프로세스의 차이는 무엇일까?

위에서 프로세스는 실행될 때 운영체제한테 독립된 메모리 영역(heap, data, stack, code)를 받는다 했다. 프로세스는 독립적이어서 다른 프로세스와 메모리 영역을 공유하지 않지만, 쓰레드는 해당 쓰레드를 위한 스택을 생성할 뿐 그 외의 code, data, heap 영역을 공유한다.

  • 데이터 : 전역 변수 저장
  • 힙 : 메모리 관리, 동적 메모리 할당(syscall로 관리)
  • 스택 : 임시 데이터 저장 - local 변수, return address

스택을 독립적으로 할당하는 이유?

쓰레드는 하나의 프로세스내에서 여러 실행 흐름을 구분하기 위한 단위라고 했다. 이 실행 흐름을 구분하려면 되돌아갈 주소나 각각 함수에서 선언하는 변수에 대한 내용을 저장을 독립적으로 해야 한다. 스택은 함수 호출시 전달되는 인자, 되돌아갈 주소와 함수 내에서 선언되는 변수들을 저장하기 위해 사용하는 메모리 공간이었다. 따라서 이를 독립적으로 두면 독립적인 함수 호출이 가능해져 독립적인 실행 흐름이 만들어지는 것이다.

코드, 데이터, 힙 영역을 공유한다

프로세스는 독립적이기 때문에 다른 프로세스의 code 영역에 있는 함수를 호출할 수 없지만, 쓰레드는 이를 공유해서 code 영역 안에 있는 함수를 호출할 수 있다.

전역 변수와 동적 할당된 메모리 공간을 공유할 수 있고, 이 때문에 쓰레드간 통신할 수 있지만 동시에 메모리에 접근하기 떄문에 주의해야 한다.

멀티 프로세스의 문제점

프로세스는 완전히 독립된 두 개의 프로그램이고, 하나를 실행하다가 다른 하나를 실행시키려면 문맥교환이 발생한다.(프로세스의 상태 정보를 저장하고 복원하는 과정). 이때문에 성능저하가 발생한다.

그에 반해 쓰레드는 완전히 독립적인 구조가 아니고 공유하는 요소가 있기 때문에 컨텍스트 스위칭에 걸리는 시간이 프로세스보다 짧다.

sp, fp, pc

  • sp(stack pointer)
  • fp(frame pointer)
  • pc(program counter) : 실행할 명령어 위치를 가리키는 레지스터

쓰레드별로 main 함수를 독립적으로 가지고 있고, 함수 호출도 독립적으로 진행되어 쓰레드별로 pc 값은 다르다. 또한 쓰레드는 독립적인 스택을 가지기 때문에 sp와 fp는 공유되지 않는다.

캐시 메모리

캐시 메모리는 CPU에서 한 번 이상 읽은 메인 메모리의 데이터를 저장하고 있다가 CPU가 그 메모리르 다시 요구할 때 메모리를 거치지 않고 바로 값을 전달하는 용도로 쓴다.

프로세스는 서로 공유하는 메모리가 없기 때문에 문맥교환이 발생하면 캐시를 모두 리셋해야 하지만, 쓰레드는 그럴 필요가 없기 ㄸ문에 속도차이는 이떄 발생한다.

단일 쓰레드와 멀티 쓰레드

단일 쓰레드

장점

  1. 자원 접근을 쓰레드 하나만 하기 때문에 동기화를 신경쓰지 않아도 된다.
  2. 문맥 교환 작업을 요구하지 않는다.

단점

  1. 여러개의 CPU를 활용하지 못한다.

멀티 쓰레드

장점

  1. 새로운 프로세스 생성보다 새로운 스레드 생성이 빠르다.
  2. 멀티 쓰레드는 프로세스의 자원과 메모리를 공유한다.
  3. 쓰레드의 문맥교환이 프로세스의 것보다 빠르다.
  4. 멀티 프로세서 구조에서는 각각의 쓰레드가 다른 프로세서에서 병렬로 수행될 수 있다.
  5. 프로그램의 일부분(쓰레드)가 중단되거나 긴 작업을 수행해도 프로그램의 수행이 계속된다.

단점

  1. 쓰레드 스케줄링
  2. 자원 공유 문제(동기화)문제가 발생한다. 데이터와 힙 영역을 공유하기 떄문
  3. 하나의 쓰레드가 전체 프로세스에 영향을 끼친다.
  4. 구현, 디버깅이 어렵
  5. 교착상태에 빠지지 않게 주의