본문 바로가기
CS 공부/운영체제

프로세스 vs 스레드

by 횰쓰 2022. 6. 12.

프로그램(Program) 이란?

 

사전적 의미

1. “어떤 작업을 위해 실행할 수 있는 파일” (실행파일)
2. 단순히 명령어 리스트를 포함하는 파일

 

프로세스(Process) 란?

 

사전적 의미

1. “컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램”
2. 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
3. 운영체제로부터 시스템 자원을 할당받는 작업의 단위
4. 즉, 동적인 개념으로는 실행된 프로그램을 의미한다. 

=> 실행파일 형태로 존재하던 프로그램이 메모리에 적재되어 CPU에 의해 실행되는 것

※ 메모리란? CPU가 직접 접근할 수 있는 컴퓨터 내부의 기억장치이고,
프로그램이 CPU에서 실행되려면 해당 내용이 메모리에 적재된 상태여야만 한다.

 

특징

 

  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다. 
    • Code : 실행한 프로그램의 코드가 저장되는 메모리 영역 (프로그램 명령)
    • Data : 프로그램의 전역 변수와 static 변수가 저장되는 메모리 영역
    • Heap : 프로그래머가 직접 공간을 할당(malloc)/해제(free)하는 메모리 영역 (동적 할당)
    • Stack : 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 임시 메모리 영역

 

 

  • 기본적으로 프로세스마다 최소 1개의 스레드(메인 스레드)를 가지고 있다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, Inter-Process Communication)을 사용해야 한다.
    • Ex. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용

 

 

IPC(Inter Process Communication)

프로세스는 독립적으로 실행된다. 즉, 독립 되어있다는 것은 다른 프로세스에게 영향을 받지 않는다고 말할 수 있다. (스레드는 프로세스 안에서 자원을 공유하므로 영향을 받는다) 이런 독립적

hyolls100.tistory.com

 

 

 

Q) 프로그램 코드는 어떻게 실행되는가?

 

프로그램의 코드를 토대로 CPU가 실제로 연산을 해야만 프로그램이 실행된다고 볼 수 있다. 그럼 어떤 코드를 읽어야 하는가를 정하는 것은 무엇일까?

 

어떤 코드를 읽어야 하는 것은 CPU 내부에 있는 PC(Program counter) register에 저장되어 있다. PC register에는 다음에 실행될 코드(명령어, instruction)의 주소값이 저장되어 있다. 즉, 메모리에 적재되어있는 프로세스 code영역의 명령어중 다음번 연산에서 읽어야할 명령어의 주소값을 PC register가 순차적으로 가리키게 되고, 해당 명령어를 읽어와서 CPU가 연산을 하게 되면 process가 실행이 되는 것이다. 

 

 

 


 

스레드(Thread) 란?

 

사전적 의미

1. "프로세스 내에서 실행되는 여러 흐름의 단위"
2. 프로세스의 특정한 수행 경로
3. 프로세스가 할당받은 자원을 이용하는 실행의 단위

 

특징

 

  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
  • 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

 

Q) 스택을 스레드마다 독립적으로 할당해야하는 이유는?

스택은 함수 호출시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다. 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출 가능하다는 것이고 이는 독립적인 기능을 실행한다는 것이다. 따라서 스레드 정의에 따라 독립적인 동작을 실행하기 위해서는 각 스레드의 스택 메모리 영역은 독립적이여야 한다.

 

 


정리

 

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고,

스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.

 

 

프로세스는 프로그램이 메모리에 적재되어 CPU를 할당받아 실행되는 것이고,

스레드한 프로세스 내에서 실행되는 동작의 단위이다.

 

 

프로세스는 각 프로레스마다 메모리 공간에 code, data,heap, stack영역이 있어 자신만의 고유 공간과 자원을 독립적으로 할당받아 사용하는데 반해, 

스레드는 프로세스 내에서 stack영역을 제외한 나머지(code, data, heap)영역을 공유하여 다른 스레드와 공간, 자원을 공유한다는 차이가 존재한다. 

댓글