프로세스(process)란?
프로세스는 운영체제로부터 자원을 할당 받은 작업의 단위입니다.
프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성됩니다.
스레드(thread)란?
스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위입니다.
일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있고 이러한 실행 방식을 멀티스레드라고 합니다.
프로그램 → 프로세스 → 스레드
프로그램이란?
파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 말합니다.
즉, 프로그램이라는 단어는 아직 실행되지 않은 파일 그 자체를 가리키는 말입니다.
프로그램 → 프로세스
프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적인 상태라고 하며 이 상태의 프로그램을 프로세스라고 합니다.
요약: 프로그램은 코드 덩어리 파일이며 그 프로그램을 실행한 것이 프로세스
프로세스 → 스레드
과거에는 프로그램을 실행할 때 프로세스 하나만을 사용해서 진행했다고 하는데, 시간이 흐를수록 프로그램이 복잡해지고 프로세스 하나만을 사용해서 프로그램을 실행하기 벅차게 되었습니다.
"한 프로그램을 처리하기 위한 프로세스를 여러개 만들면 되지 않을까?"라는 생각이 들지만, 불가능한 일이었습니다.
운영체제는 안전성을 위해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고 있고, 이를 벗어나는 정보에 접근하려면 오류가 발생하기 때문입니다.
그래서 프로세스와는 다른 더 작은 실행 단위 개념이 필요하게 되었고, 스레드가 등장하게 된 것입니다.
스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동합니다. 스레드끼리 프로세스의 자원을 공유하며 프로세스 실행 흐름의 일부가 되는 것입니다. 코드에 비유하자면, 스레드는 코드 내에 선언된 함수들이라고 볼 수 있습니다.
요약: 스레드는 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로
프로세스와 스레드의 작동 방식에 대한 더 자세한 설명
운영체제는 프로세스가 메모리에 올라갈 때, 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해줍니다. 각각의 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없습니다.
이와 다르게 스레드는 같은 프로세스 내의 메모리를 서로 공유할 수 있습니다.
프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역을 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유합니다.
따라서 각각의 스레드는 별도의 stack을 가지고있지만, Heap 메모리는 서로 읽고 쓸 수 있게 됩니다.
[요약] 프로세스와 스레드의 차이
프로세스는 프로그램을 실행하는 순간 해당 파일이 컴퓨터 메모리에 올라가게 되고, 이 동적인 상태의 프로그램을 프로세스라고 합니다. 그리고 스레드는 프로세스를 구성하는 더 작은 실행 단위의 개념입니다.
프로세스는 메모리에 올라갈 때 운영체제로부터 독자적인 시스템 자원을 할당 받는 반면,
스레드는 프로세스 내부에서 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유합니다.
싱글 스레드와 멀티 스레드
싱글 스레드
- 하나의 프로세스에서 하나의 스레드 실행
- 하나의 레지스터와 스택으로 표현
싱글 스레드의 장점
- 자원 접근에 대한 동기화를 신경쓰지 않아도 됩니다.
- 여러개의 스레드가 공유된 자원을 사용할 경우, 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근이 통제되어야 하며, 이 작업은 프로그래머에게 많은 노력을 요구하고 많은 비용을 발생시킵니다. 단일 스레드 모델에서는 이러한 작업이 필요하지 않습니다.
- 싱글 스레드는 작업전환 작업을 요구하지 않습니다. 작업전환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 합니다.
싱글 스레드의 단점
- 여러 개의 CPU를 활용하지 못한다. 프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나, 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 합니다.
- 두 개의 작업을 하나의 스레드로 처리하는 경우와, 두 개의 스레드로 처리하는 경우를 가정했을 때, 후자의 경우는 짧은 시간 동안 2개의 스레드가 번갈아가면서 작업을 수행합니다. 그래서 동시에 두 작업이 처리되는 것과 같이 느끼게 됩니다.
→ 하지만 오히려 두 개의 스레드로 작업한 시간이 싱글스레드로 작업한 시간보다 더 걸릴 수도 있는데, 그 이유는 스레드 간의 작업전환(context switching)에 시간이 걸리기 때문입니다. 따라서 단순히 CPU만을 사용하는 계산작업이라면, 오히려 멀티스레드보다 싱글스레드로 프로그래밍하는 것이 더 효율적입니다.
멀티 스레드
- 프로그램을 다수의 실행 단위로 나누어 실행
- 프로세스 내에서 자원을 공유하여 자원 생성과 관리의 중복을 최소화
- 서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공
- 각각의 스레드가 고유의 레지스터와 스택으로 표현됨
멀티 스레드의 장점
- 새로운 프로세스를 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠릅니다.
- 프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능합니다.
- 프로세스의 작업전환보다 스레드의 작업전환이 더 빠릅니다.
멀티 스레드의 단점
- 하나의 스레드만 실행중일 때는 실행시간이 오히려 지연될 수 있습니다.
- 멀티 스레딩을 위해 운영체제의 지원이 필요합니다.
- 스레드 스케쥴링을 신경써야 합니다.
출처
[OS] 프로세스와 스레드의 차이 - Heee's Development Blog (gmlwjd9405.github.io)
'IT 지식 > CS' 카테고리의 다른 글
[Network] TCP의 3-way handshake / 4-Way Handshake (0) | 2023.01.12 |
---|---|
[Data Structure] ADT(추상적 자료형): 큐와 스택 (0) | 2023.01.10 |
시간 복잡도와 공간 복잡도 (0) | 2023.01.09 |
[Network] TCP vs UDP (0) | 2022.12.16 |
[Network] HTTP vs HTTPS (1) | 2022.10.19 |