IT Technology/System

프로그램, 바이너리, 프로세스, 스레드란?

by빵수 2023. 3. 8. 16:08
728x90
반응형

프로그램, 바이너리, 프로세스, 스레드에 대해서 알아보자.

 

 

1. 프로그램(program)

 

 

  • 프로그램(program)은 실행 가능한 명령어(instruction)의 집합
  • 프로그램은 하드디스크와 같은 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 의미
  • 프로그램은 보통 디스크에 저장되어 컴파일된 바이너리 이미지 형태일 수도 있고, 파이썬 스크립트 같이 해석되는(interpret) 고급어 형태일 수도 있다.
  • 프로그램으로 정의되는 범위는 넓은데, 내 컴퓨터에 설치된 파워포인트 파일도 프로그램이고, 내가 짠 “hello world” 출력하는 파이썬 스크립트도 프로그램이다.
  • 이때 중요한 것은 디스크에 저장된 실행 가능한 명령어의 집합인지 아닌지의 여부.

 

 

 

 

2. 바이너리(binary)

  • 바이너리(binary)는 디스크와 같은 저장장치에 기록되어 있는 프로그램을 의미.
  • 바이너리는 특정 운영체제 및 아키텍처에서 접근할 수 있는 형식으로 컴파일되어 실행할 준비가 되었지만, 아직 실행되지는 않은 프로그램을 의미.
  • 컴파일 되었다는 것은 고급 언어를 기계어로 변환했다는 의미.
  • 바이너리는 흔히 프로그램을 지칭하며 때로는 애플리케이션을 의미.

 

3. 프로세스(process)

  • 프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되는데, 프로세스(process)란 메모리에 적재(load)되어 실행되고 있는 프로그램을 의미. 
  • 프로그램이 정적인 것과는 달리 프로세스는 메모리에 올라서 실제 실행 중인 프로그램을 일컫기 때문에 동적이라고 표현하기도 한다.

 

 

  • 프로세스를 ‘프로그램의 인스턴스’라고 표현하기도 하는데 실제 객체 지향에서 사용하는 개념인 클래스와 인스턴스를 비교해 보자.
  • ‘프로그램:프로세스’의 관계와 ‘클래스:인스턴스’ 관계의 공통점은 한 클래스가 여러 인스턴스를 생성할 수 있는 것처럼 하나의 프로그램에서 생성되는 여러 프로세스가 동시에 존재할 수 있다는 것이다.
  • 예를 들어, 메모장을 두 번 실행하고 파일 이름을 각각 1.txt, 2.txt라고 지으면 메모장이라는 하나의 프로그램에서 1.txt, 2.txt라는 두 개의 인스턴스가 생성되는 것을 볼 수 있다.

 

 

  • 반대로 차이점은 프로그램은 클래스처럼 다른 프로그램을 상속하지는 않는다는 것이다.
  • 프로세스는 커널에 의해 직접 관리되는데, 커널 메모리 안에는 관리하고 있는 프로세스에 대한 데이터들이 존재한다.
  • 이 정보는 Process Control Block(PCB)라고 하는 자료구조 안에 포함되는데, 커널 프로세스를 제어하는데 필요한 정보들이 담겨 있다.
  • PCB는 실행 가능 기계어 이미지, 실행 프로세스 메모리 주소 등과 같은 정보를 포함한다.

 

 

 

  • 앞서 커널 메모리 안에서 PCB 정보를 관리한다고 했는데, 이때 커널 메모리 말고, 유저가 사용하는 메모리 공간 상의 프로세스 정보는 다음 4가지 분류로 나뉜다.
  • (1) code: 프로그램의 실제 코드 저장
  • (2) data: 전역변수, 정적 변수 저장
  • (3) heap: 동적 변수(함수 내 변수 등) 저장, 동적 할당 시(new(), mallock() 등)
  • (4) stack: 임시 메모리 영역(지역 변수, 매개변수, 리턴값)
  • 정리하면 프로세스는 실행 중인 프로그램이며, 메모리에 적재되고 가상화된 메모리와 열린 파일 디스크립터, 연관된 커널 리소스 등을 포함해 일컫는 말이다.

 


4. 스레드(thread)

 

  • 스레드는 영어로 thread라고 쓰며 thread를 영어 사전에서 검색하면 ‘실’이라는 뜻이 나온다.
  • 실제로 스레드를 그림으로 나타낼 때 실처럼 표현하기도 한다.
  • 스레드(thread)는 프로세스 내에서 실행되는 흐름, 프로세스 내 실행단위를 의미한다.
  • 예를 들어, 파이썬 스크립트에서 한 줄 한줄 실행되는 흐름이 곧 스레드라고 할 수 있다.
  • 일반적으로 하나의 프로세스는 하나의 스레드로 시작되며 이를 메인스레드라고 한다.
  • 스레드를 추가로 생성하지 않는 한 모든 프로그램은 메인 스레드에서 실행된다.
  • 코드에 비유하면 스레드는 코드 내 선언된 함수들이 되고, 메인 함수 또한 일종의 스레드라고 볼 수 있는 것이다.
  • 스레드는 프로세스 내 실행단위
  • 프로세스는 스레드의 컨테이너
  • 프로세스는 스레드의 정보를 담고 있는 것에 불과한다.

 

 

  • 스레드는 운영체제의 프로세스 스케줄러에 의해 스케줄링될 수 있는 최소한의 실행단위
  • 각각의 스레드는 저마다의 가상화된 프로세서, 스택 등을 포함
  • 참고로 가상 프로세서는 스레드와 관련 있으며 프로세스와는 무관

 

 

5. 프로세스와 스레드의 관계

  • 하나의 프로세스는 스레드를 하나 이상 포함한다.
  • 싱글 스레드란 프로세스의 스레드가 1개이며, 해당 프로세스는 단일 실행단위를 가지며 한 번에 하나만 한다는 뜻
  • 따라서 싱글 스레드 프로세스에서는 프로세스가 곧 스레드가 된다.
  • 프로세스는 운영체제로부터 독립된 시간, 공간 자원을 할당받아 실행되는 반면, 스레드는 한 프로세스 내에서 자원을 공유하면서 병렬적으로 실행된다.
  • 참고로 프로세스 간 통신은 스레드 간 통신보다 어렵다.

 

 

 

 

출처

https://losskatsu.github.io/os-kernel/process-thread/#1-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8program

 

프로그램, 바이너리, 프로세스, 스레드의 개념

프로그램, 바이너리, 프로세스, 스레드의 개념

losskatsu.github.io

 

반응형