문제:
1. 프로세스(Process)와 스레드(Thread)를 정의하시오.
2. 여러 개의 스레드가 동일한 코드 부분을 병렬로 실행하더라도 모든 스레드가 각자의 고유한 계산 값을 유지할 수 있는 이유를 설명하시오.
답변:
(1) 프로세스 (Process)
프로세스는 실행 중인 프로그램의 인스턴스를 의미하며, CPU에서 작업을 수행할 수 있는 독립적인 단위입니다. 운영체제는 각 프로세스를 위해 독립된 메모리 공간(주소 공간)을 할당하여 프로세스의 데이터, 코드, 스택을 분리합니다. 프로세스는 다른 프로세스와 메모리를 공유하지 않기 때문에 독립적인 실행 환경을 유지할 수 있습니다.
운영체제의 관점에서 프로세스는 다음과 같은 주요 속성을 가집니다:
• 독립된 주소 공간: 각 프로세스는 고유의 메모리 공간을 할당받습니다.
• 고유한 PCB(Process Control Block): 운영체제는 각 프로세스를 관리하기 위해 프로세스 제어 블록(PCB)에 프로세스 상태, 프로그램 카운터, 레지스터 값, 메모리 할당 정보를 저장합니다.
• 비동기적 실행: 프로세스는 다른 프로세스와 독립적으로 실행되며, CPU 스케줄링 정책에 따라 작업이 진행됩니다.
(2) 스레드 (Thread)
스레드는 프로세스 내에서 실행되는 최소 실행 단위입니다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이 스레드들은 동일한 메모리 공간을 공유하면서 개별적으로 실행됩니다. 스레드들은 프로세스의 자원을 공유하며, 각 스레드는 독립적인 실행 흐름을 유지합니다.
스레드는 다음과 같은 특성을 가집니다:
• 공유 메모리: 같은 프로세스 내에서 생성된 여러 스레드는 메모리 공간(코드, 데이터, 힙 영역)을 공유합니다. 이를 통해 스레드 간의 통신 비용이 줄어듭니다.
• 독립적인 실행 흐름: 각 스레드는 고유한 스택과 프로그램 카운터를 가지며, 개별적인 작업을 수행할 수 있습니다.
• 빠른 생성과 종료: 프로세스를 생성하는 것보다 스레드를 생성하는 것이 더 적은 자원을 필요로 하며, 종료 시에도 동일합니다.
여러 스레드가 동일한 코드 부분을 병렬로 실행하더라도 각 스레드가 고유한 계산 값을 유지할 수 있는 이유는 스레드의 스택 영역이 독립적이기 때문입니다. 이를 구체적으로 설명하면 다음과 같습니다.
• 스택 영역의 독립성: 각 스레드는 프로세스 내에서 개별 스택(Stack) 영역을 갖습니다. 스택은 함수 호출 시의 지역 변수, 매개 변수, 반환 주소 등의 데이터를 저장하는 메모리 영역입니다. 따라서 여러 스레드가 동일한 함수를 호출하더라도 스택에 저장된 변수는 각 스레드에서 독립적으로 유지됩니다. 이는 각 스레드가 다른 스레드의 스택을 참조하지 않으므로 고유한 계산 값을 유지할 수 있게 합니다.
• 레지스터 독립성: 각 스레드는 CPU 레지스터의 값을 개별적으로 관리합니다. 레지스터는 프로그램의 실행 상태를 기록하며, 각 스레드는 레지스터의 값을 저장하고 복구할 수 있는 고유한 컨텍스트(Context)를 갖습니다. 스레드가 병렬로 실행될 때, CPU는 각 스레드의 컨텍스트를 개별적으로 관리하며, 다른 스레드의 계산에 영향을 미치지 않습니다.
• 전역 변수와 동기화 문제: 스레드가 전역 변수나 힙에 할당된 데이터를 사용할 경우, 해당 데이터를 공유하게 되므로 동기화(Synchronization)가 필요합니다. 그러나 스레드가 지역 변수만을 사용하여 계산을 수행하는 경우, 스택을 통해 독립적인 계산이 가능하므로 동기화 문제 없이 각자의 값을 유지할 수 있습니다.
따라서 스레드가 동일한 코드의 일부를 병렬로 실행하더라도, 스택에 할당된 지역 변수와 개별적인 레지스터 값 덕분에 각 스레드는 고유한 계산 값을 유지할 수 있습니다.