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

풀어갈 나의 이야기·2021년 12월 4일
0

Operation System

목록 보기
1/2
post-thumbnail

프로세스는 운영체제로 부터 자원을 할당받는 작업의 단위
스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위

프로세스 (Process)

1. 사전적 의미

컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
병행 실행을 원할하게 하기 위해 등장

  • 프로그램과 비교해보면 이해하기 쉬움
    • 컴퓨터에 프로그램이 설치되어 있고, 하드디스크에 설치된 프로그램을 메모리상에서 실행중인 작업이 존재함
    • 과거 DOS 는 한가지밖에 할수 없었지만, 요즘 운영체제 들은 여러작업을 동시에 진행할 수 있게 되었다.
      • 이렇게 운영체제에서 여러개의 프로세스를 동시에 실행 하는 것을 멀티 태스킹이라 부르고,
      • 어떤 작업을 하나이상의 프로세스에서 병렬로 처리하는 것을 멀티 프로세싱이라 부른다.
즉, 프로그램이 실행중 이라는 것은, 디스크에 있던 프로그램을 메모리에 적재하여, 운영체제의 제어를 받는 상태가 되었다. 라는뜻
  • 프로세스가 할당을 받고, 자신만의 메모리 영역이 있음을 의미한다.

2. 프로세스 특징 및 멀티 프로세싱의 단점

  • 프로세스는 프로그램 실행시 CODE, DATA, Stack, Heap의 구조로 되어있는 독립된 메모리 영역을 할당 받는다.
  • 이러한 구조의 특징은 멀티 프로세싱 방식에서 단점을 가질수 밖에 없다.
1. 동작중인 프로세스가 대기를 하면서, 해당 프로세스의 상태 (Context)를 보관
2. 대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태(Context) 를 복구

위와 같은 일련의 과정을 Context Switching 이라한다.
  • 프로세스는 각각 독립된 메모리 영역이다 보니, 캐시메모리 초기화 등 꽤나 무거운 작업이 진행되고, 오버헤드가 발생하게 된다.

스레드 (Thread)

1. 사전적 의미

프로세스 내에서 실행되는 여러 흐름의 단위

  • 말그대로 스레드는 프로세스에서 동작하는 여러 실행의 흐름
  • 기본적으로 프로세스 당 최소 1개의 스레드를 가지고 있고, 그것을 메인 스레드라고 한다.
    • 바꿔말하면 1개 이상의 스레드도 가질수 있고, 멀티스레드라고 부른다 (너무당연;;)
    • 위에서 설명한 Context Switching은 사실 프로세스가 가지고 있는 스레드를 처리하는 과정이다.
스레드는 공통적인 제어흐름을 가지지 않으면서, 한 프로세스 내에서 동작하는 여러 실행 흐름, 프로세스 내의 자원들을 서로 공유(스택 공간만 제외) 

2. 스레드의 특징 및 멀티스레드의 장단점

  • 스레드는 프로세스 내에서 각각 Stack 만 따로 할당을 받고, Code, Data, Heap 영역을 공유한다.

2.1 장점

  • 시스템의 처리량이 향상된다.
  • 메모리를 공유하다 보니, 독립적인 프로세스와는 달리 스레드간 데이터를 주고받는게 간단해짐
  • 시스템자원 소모가 줄어듬
  • 프로세스간 네트워크 통신비용보단 스레드간의 비용이 더 적어, 응답시간 또한 단축
  • 멀티프로세스의 단점인 Context Switching 의 오버헤드에 대한 부분도 해결이 됨
    • 프로세스와 달리 Code, Data, Heap 영역을 공유하므로, Stack 영역만 처리하면 되고 그 결과 처리비용이 감소하게 된다.
    • 추가로 프로세스 Context Switching 의 경우 캐시메모리를 초기화 하게 되지만, 스레드는 메모리를 공유하므로 꽤 큰 처리비용인 초기화를 할 필요가 없다.

2.2 단점

  • 여러 스레드가 동시에 작업을 하다보면, 공유된 데이터를 서로 사용하다가 충돌이 일어날 가능성이 크다.
  • 개발시 디버깅이 까다로움, 버그가 생기기도 함

결론(Goal)

  • 본 Task 는 운영체제가 시스템의 자원을 어떤 단위로 할당하고, 프로세스와 스레드는 이 자원을 어떻게 사용하는지에 대해 아는게 목표
  • 그렇다면 왜 여러 프로세스(멀티 프로세스)로 할수 있는 작업들을 굳이 하나의 프로세스에서 스레드로 나누어 가면서 하는가?
    • 운영체제는 시스템 자원을 효율적으로 관리하기 위해 스레드를 사용하는것
    • 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
    • 뿐만 아니라, 프로세스간 통신보다 스레드간의 통신비용이 적으므로, 작업들간 통신 부담이 줄어든다.
  • 스레드를 활용하면, 자원의 효율성이 증가하기도 하지만 스레드간 자원 공유는 전역변수를 이용하므로, 동기화 문제에 신경을 써야 하고 , 주의를 요한다.
따라서, 프로세스를 여러 개 생성하여 Multi Programming System이나 Time Sharing System을 구현하는 것보다 
프로세스 내 스레드를 여러 개 생성하여 구현하는 것이 훨씬 경제적이라 할 수 있다.

reference
https://www.crocus.co.kr/1403

profile
깨끗한 스케치북 일수록 우아한 그림이 그려지법, 읽기 쉽고, 짧은 코드가 더 아름다운 법.. 또한 프로그래머의 개발은 구현할 프로그래밍이 아닌, 풀어갈 이야기로 써내려가는것.

0개의 댓글