오버헤드


오버헤드는 특정 작업을 수행하기 위해 간접 혹은 추가적으로 필요한 작업이나 비용을 의미한다. 여기서 비용은 컴퓨터의 처리 시간, 메모리 등을 말한다. 예를 들어 처리시간 10초가 필요한 A 기능에 안전성을 위한 부가기능 B를 추가한 결과 총 15초가 소요됐다면, 오버헤드는 5초가 된다.

오버헤드는 현실 세계에서 마트에 장보러 가는 것에 비유하면 더 쉽게 이해할 수 있다. 10만 원어치 물건을 구매하기(메인 작업 A) 위해 마트까지 가는 일(부가 작업 B)은 장보기에서 큰 부분을 차지하지 않는다.

하지만 껌 하나만 사기 위해(작업 A) 마트까지 간다면, 마트까지 이동하는 일(부가 작업 B)은 장보기에서 상대적으로 큰 부분을 차지한다. 이때 껌을 사기 위해 마트까지 가는 건 오버헤드가 너무 크다고 말할 수 있다.

프로그래밍 세계에선 함수 호출, 네트워크 데이터 전송 등 다양한 상황에서 오버헤드가 발생한다.

  1. 함수 호출 : 호출 스택 생성, 파라미터 복사, 지역변수 할당 등
  2. 데이터 전송 : 데이터를 패킷으로 분리, 패킷 헤더 추가 등
  3. 프로세스 : 실행 스레드(Thread)보다 더 많은 정보를 관리하므로 오버헤드가 크다고 표현

프로세스와 스레드


<aside> 💡 TL;DR

프로세스는 운영체제로부터 시스템 자원을 할당받는 작업의 단위로, 메모리에 적재되어 현재 실행중인 프로그램의 독립적인 인스턴스다. 대표적인 시스템 자원엔 아래 종류가 있다.

  1. CPU Time : 프로세스가 CPU를 사용한 시간
  2. 독립된 메모리 영역: Code, Data, Stack, Heap 구조
  3. 파일 : 파일에 접근해서 읽기 / 쓰기
  4. 입출력(I/O) 장치 : 키보드, 모니터, 프린터 등

스레드는 프로세스가 할당 받은 자원을 이용하는 실행 단위다. 각 스레드는 Register / Stack만 할당받고, Code / Data 같은 영역은 공유한다. 1개 프로세스에 여러 스레드가 존재할 수 있으며, 각각 독립적으로 작동한다. 스레드가 실행되면 CPU는 레지스터에 저장된 값을 사용하여 연산을 수행한다.

레지스터는 CPU 내부에 있는 고속 메모리로 명령어를 실행하는데 필요한 데이터와 연산 결과를 일시적으로 저장한다. 속도가 빠른 레지스터에 스레드가 자주 사용하는 데이터를 저장함으로써 CPU가 액세스하는 속도와 스레드간 전환이 빠르게 이뤄질 수 있는 것.