[스레드 , 프로세스] 개념,차이점

박재용·2021년 1월 12일
0
post-custom-banner

Thread와 Process의 차이를 설명해주세요.
프로세스

프로세스: 프로세스는 메모리에 적재(load)되어 실행되고 있는 프로그램을 말한다.

유저가 사용하는 메모리 공간 상의 프로세스 정보는 다음 4가지 분류로 다시 나뉜다.

Code(text): 프로그램의 실제 코드를 저장
Data: 프로세스가 실행될 때 정의된 전역 변수, Static 변수들을 저장
Heap: 프로세스 런타임 중 동적으로 할당되는 변수들을 저장(함수 내에서 할당되는 변수 등)
Stack: 함수에서 다른 함수를 실행하는 등의 서브루틴들의 정보를 저장(재귀와 스택이 관련 있는 이유)
운영체제는 각각의 프로세스는 독립적으로 관리하기 때문에 서로 다른 프로세스가 겹칠 일이 없고, 또 사용 자원 영역 등이 겹치는 일이 발생해서도 안 된다. 가령 한 프로세스가 다른 프로세스의 정보 한 부분을 변경하면 그 프로세스에 치명적인 오류가 날지도 모르는 일이기 때문이다.

▷ Multitasking과 Context switch
이전에는 여러 프로세스가 동시에 존재할 수 없었기 때문에 만약에 뭔가를 다운로드 받는다면 그 동안에는 다른 일을 할 수가 없었다. 하지만 Multitasking이 가능해지면서 여러 개의 프로그램을 함께 사용할 수 있게 되었다.(ex. 게임을 다운로드 받으면서 노래를 듣거나 메신저를 사용)

하지만 사용자가 느끼는 것처럼 프로세스들은 동시에 진행되고 있지 않다. Time sharing이라는 기법 안에서 여러 프로세스들은 “동시”라고 느껴질만큼 매우 짧은 순간 동안 작업하고(CPU를 점유하고) 다른 프로세스에 CPU 자원을 양보하는 것이다.

이렇게 프로세스가 전환될때 PCB(Process Control Block)에 저장해두었던 작업 중인 프로세스에 대한 정보 즉, Context를 전환하는 것을 Context Switch라고 한다. 작업 중이던 Context를 저장하고 새로운 Context를 로드하면서 CPU 레지스터 상태 변환, 스택 포인터 추적, 명령어를 추적하는 Program Counter 등에 대한 작업을 처리하기 때문에 오버헤드가 발생한다.

스레드
스레드: 프로세스 내에서 실행되는 흐름

프로세스는 자원들을 각자 개별적으로 가지지만 만약 코드 영역에 여러개의 코드 흐름이 존재한다면 그에 따른 stack만 분리되면 되겠다는 생각에서 스레드가 등장했다.


위와 같이 stack이 분리되지 않았을때를 생각해보면, 함수의 호출에 따라서 흐름 B의 함수가 끝났을 때 해당 함수의 위에 있는 흐름 A의 함수를 모두 꺼냈다가 다시 넣어야하는 비효울적인 상황이 발생한다.

일반적으로 하나의 프로세스는 하나의 스레드로 시작되며 이를 메인 스레드라고 한다. 스레드를 추가로 생성하지 않는 한 모든 프로그램은 메인 스레드에서 실행된다.

세상에는 이렇게 모든 작업이 선형적으로 연결되어 실행되지 않아도 되는 경우도 있다. 한 프로세스 내에서 서로 순서상 의존하지 않는 작업이 다른 작업의 종료를 기다릴 이유가 없는 것이다. 이때 실행되는 흐름, 스레드를 여러 개 두면 병목현상에 걸리지 않고 전체 작업시간을 줄일 수 있다. 하지만 여러 스레드를 이용하는 프로그램을 작성하는 경우에는 미묘한 시간 차나 잘못된 변수를 공유함하거나 같은 자원에 스레드가 동시에 접근하면서 문제가 발생할 수 있다.

프로세스와 스레드의 차이
프로세스와 스레드의 근본적인 차이는 프로세스는 운영체제로부터 독립된 시간, 공간 자원을 할당 받아 실행된다는 점이고, 스레드는 한 프로세스 내에서 많은 자원을 공유하면서 병렬적으로(Concurrently) 실행된다는 것이다.

차이 프로세스 스레드
자원 할당 여부 실행 시마다 새로운 자원을 할당 자신을 실행한 프로세스의 자원을 공유
자원 공유 여부 일반적으로 자원을 공유하지 않는다. 같은 프로그램의 프로세스일 경우 코드를 공유하기는 한다. 같은 프로세스 내 스레드들은 스택을 제외한 나머지 세 영역을 공유한다.
독립성 여부 일반적으로 독립적 일반적으로 프로세스의 하위 집합
주소 소유 여부 별개의 주소 공간을 갖는다 주소 공간을 공유한다.
통신 여부 오직 시스템이 제공하는 IPC 방법으로만 통신 공유 변수 수정 등 자유롭게 다른 스레드와 소통
Context Switch 일반적으로 프로세스보다 스레드의 Context Switching이 더 빠를 수 있다. 하지만 상황에 따라 그렇지 않을 수도 있다.
먼저 프로세스는 보다 독립적이다. 서로 구분되는 자원을 할당 받아 정말 필요한 경우가 아니면 다른 프로세스에 영향을 미치지 않고 실행된다. 반면 스레드는 프로세스의 하위 집합으로 여러 스레드가 같은 프로세스 자원을 공유하기 때문에 독립적이지 않다. 같은 의미로 프로세스는 보유한 자원에 대한 별개의 주소 공간을 갖지만 스레드는 이 주소 공간을 공유한다.

프로세스간 통신은 스레드간 통신보다 어렵다. 프로세스는 오직 시스템이 제공하는 IPC 메커니즘을 통해서만 통신할 수 있고 시스템에 의해 관리되기 때문에 상대적으로 안전하다. 반면에 스레드는 단순히 공유 변수 수정만으로도 스레드간 통신을 구현할 수 있어 통신이 매우 용이하지만, 안전한 프로그램을 만들기 위해서는 신중해야 한다.

Context Switch에 있어서도 프로세스보다 스레드가 “일반적으로” 더 빠르고 자원소모가 적다. 프로세스는 Switch될 때의 Context를 PCB 등에 저장하는 등 오버헤드가 발생하는데 스레드는 그런 부하가 적다. 근데 이 부분은 조금 조심해야 한다. 압도적으로 스레드 Switching이 더 저렴하다는 의견이 있는 반면 운영체제나 배포판에 따라, 프로세스의 환경에 따라 거의 차이가 없을 수도 있다는 의견 등이 분분하다.

+) 그럼 쓰레드가 프로세스보다 좋은 것인가?

그렇지 않다. 멀티 프로세스가 필요한 부분이 있고 멀티 스레드가 필요한 부분이 있기 때문에 사용하는 경우가 다를 뿐이다.

출처 - https://velog.io/@langssi/%EB%A9%B4%EC%A0%91%EC%8A%A4%ED%84%B0%EB%94%94

profile
박재용이란 사람이 복습을 하기위해 만든 벨로그 입니다 . 잘부탁드려요
post-custom-banner

0개의 댓글