[OS/운영체제] 프로세스(Process)와 스레드(Thread) - 정의, 특징, 비교

·2021년 7월 22일
0

OS

목록 보기
2/11

프로세스(Process)와 스레드(Thread)

프로세스(Process)란?

정의

컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램

  • 프로그램 : 일반적으로 하드 디스크 등에 저장되어 있는 실행코드
  • 프로세스 : 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위

특징

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load) 되어야 한다. 또한 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다. 따라서 위의 그림과 같이 하나의 프로세스는 운영체제로부터 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다. 따라서 한 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.

  • Code : 실행할 프로그램의 코드가 저장되는 영역. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
  • Data : 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
  • Heap : 동적 할당 시 사용 (new(), malloc() 등). 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
  • Stack : 함수의 호출과 관계되는 지역 변수와 매개변수, 리턴값이 저장되는 영역. 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

❓ 프로세스에서 주소 공간을 나눈 이유

최대한 데이터를 공유함으로써 메모리 사용량을 줄이기 위해서!

  • 같은 프로그램의 프로세스들은 Code 영역을 공유한다.


스레드 (Thread)란?

정의

어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위


특징

쓰레드는 프로세스 내에서 동작되는 흐름이므로, 프로세스 내에서 각각 stack만 따로 할당받고, 프로세스 내의 쓰레드끼리 부모 프로세스의 Code, Data, Heap 영역은 공유한다.

즉, 프로세스 내에서 쓰레드들은 서로 주소 공간이나 자원들을 공유하며 실행할 수 있다. 각각의 쓰레드는 별도의 레지스터와 스택을 가지고 있지만, 힙 메모리를 서로 읽고 쓸 수 있다.


❓ 스택을 스레드마다 독립적으로 할당하는 이유

스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것과 같다.

즉, 이는 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.


프로세스 vs 스레드

  • 프로세스는 자신만의 고유 공간과 자원을 할당받아 사용하는데 반해,
  • 스레드는 다른 스레드와 공간, 자원을 공유한다.



멀티프로세스(Multi-Process)와 멀티스레드(Multi-Thread)

멀티프로세스(Multi-Process)

두개 이상의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)을 동시에 처리하는 것 (병렬처리)

여러 개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다. 프로세스 관리는 운영 체제의 중요한 부분이다.

  • 장점 : 안전성 (메모리 침범 문제를 OS 차원에서 해결)
  • 단점 : 독립된 메모리 영역이기 때문에 오버헤드가 발생하여 성능저하가 발생 할 수 있다.(Context Switching으로 인한 성능 저하)

    Context Switching 이란?
    • 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정
    • 즉, 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던 프로세스 상태를 복구하는 과정을 말함

멀티 스레드(Multi-Thread)

하나의 프로세스를 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것

일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.

스레드들은 공유 메모리를 통해 다수의 작업(Task)을 동시에 처리하도록 해준다.

  • 장점
    1. 자원의 효율성 증대
    2. 시스템 처리율 향상 (처리비용 감소)
    3. 프로그램 응답시간 단축 (스레드는 메모리 영역을 공유하기 때문)

  • 단점
    1. 동기화 문제 (병목현상, 데드락 등)
    2. 안정성 문제 (하나의 스레드에 문제가 생기면 전체 프로세스에 영향)

    • Critical Section : 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원을 접근하는 코드의 일부.

출처

https://velog.io/@jsj3282/thread-%EC%99%80-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%8A%94
https://wooody92.github.io/os/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C/

profile
당근먹고 자라나는 개발자

0개의 댓글