프로세스(Process)와 스레드(Thread)는 모두 컴퓨터 시스템에서 실행되는 코드의 실행 단위를 의미합니다. 그러나 이 둘은 목적과 특성에서 차이가 있습니다.
- 프로세스(Process)는 실행 중인 프로그램을 의미하며, 코드, 데이터 및 실행 환경의 모든 요소를 포함합니다. 각 프로세스는 독립적인 메모리 공간과 시스템 리소스를 할당 받습니다. 이러한 이유로, 각 프로세스는 서로의 메모리에 직접적으로 접근할 수 없습니다. 프로세스는 하나 이상의 스레드를 가질 수 있습니다.
- 스레드(Thread)는 프로세스 내에서 실행되는 코드의 실행 단위를 의미합니다. 하나의 프로세스 내에서 여러 스레드가 생성될 수 있습니다. 스레드는 독립적인 메모리 공간을 갖지 않고, 부모 프로세스의 메모리 공간을 공유합니다. 이러한 이유로, 스레드는 같은 프로세스 내의 다른 스레드와 메모리를 공유할 수 있습니다.
- 프로세스는 독립적인 메모리 공간을 가지므로, 새로운 프로세스를 생성하면 새로운 메모리 공간이 할당됩니다. 이러한 이유로, 프로세스 생성 시간 및 메모리 사용량이 많아집니다.
- 스레드는 부모 프로세스의 메모리를 공유하므로, 스레드를 생성하는 데 많은 시간과 메모리를 사용하지 않습니다.
- 프로세스는 독립적인 메모리 공간을 가지므로, 서로 다른 프로세스 간에 데이터를 공유하려면 프로세스 간 통신(IPC, Inter-Process Communication)이 필요합니다.
- 스레드는 부모 프로세스의 메모리를 공유하므로, 스레드 간 데이터 공유가 용이합니다. 하지만 스레드 간 동기화 문제가 발생할 수 있습니다.
- 프로세스는 독립적인 메모리 공간을 갖고 있으므로, 다른 프로세스와 상호작용하는 데 시간이 더 걸릴 수 있습니다.
- 스레드는 부모 프로세스의 메모리를 공유하므로, 스레드 간의 통신과 데이터 공유가 빠릅니다. 또한, 스레드 간 컨텍스트 스위칭(context switching) 비용이 적어, 처리 속도가 더 빠를 수 있습니다.
- 프로세스는 독립적인 메모리 공간을 가지므로, 다른 프로세스에 영향을 받지 않습니다. 따라서, 한 프로세스가 비정상적으로 종료되어도 시스템 전체에 영향을 미치지 않습니다.
- 스레드는 부모 프로세스의 메모리를 공유하므로, 한 스레드가 비정상적으로 종료되면 해당 프로세스 전체가 영향을 받을 수 있습니다.
프로세스와 스레드는 모두 코드의 실행 단위를 의미하지만, 프로세스는 독립적인 메모리 공간과 시스템 리소스를 갖고, 스레드는 부모 프로세스의 메모리를 공유합니다. 프로세스는 다른 프로세스 간 통신(IPC)을 통해 데이터를 공유하고, 스레드는 부모 프로세스의 메모리를 공유하므로, 스레드 간 데이터 공유가 더 쉽습니다. 스레드는 프로세스보다 처리 속도가 빠를 수 있지만, 스레드 간 동기화 문제가 발생할 수 있으므로, 안정성이 중요한 경우에는 프로세스를 사용하는 것이 더 안전합니다.
멀티스레드 프로그래밍에서 여러 스레드가 공유하는 메모리 영역에서 발생하는 충돌 문제를 해결하는 방법으로는 다음과 같은 것들이 있습니다.
- 동기화(Synchronization)
- 동기화는 여러 스레드가 공유하는 자원을 동시에 접근하지 못하도록 막는 기술입니다.
- 자바에서는 synchronized 키워드나 Lock, Condition 등의 동기화 기법을 사용하여 스레드 간의 동기화를 처리합니다.
- 동기화를 사용하면, 여러 스레드가 동시에 접근하여 데이터를 변경하는 것을 막아, 데이터의 일관성과 안전성을 보장할 수 있습니다.
- 뮤텍스(Mutex)
- 뮤텍스는 여러 스레드가 공유하는 자원에 대한 접근 권한을 관리하는 기술입니다.
- 뮤텍스는 공유 자원에 대한 접근 권한을 가진 스레드가 해당 자원을 사용하고 있을 때, 다른 스레드는 대기 상태에 있게 됩니다.
- 뮤텍스를 사용하면, 공유 자원에 대한 접근 권한을 효율적으로 관리하여, 스레드 간의 충돌 문제를 해결할 수 있습니다.
- 세마포어(Semaphore)
- 세마포어는 여러 스레드가 공유하는 자원에 대한 접근 권한을 제한하는 기술입니다.
- 세마포어는 공유 자원의 사용 가능한 개수를 제한하고, 해당 자원에 대한 접근 권한을 가진 스레드만 자원을 사용할 수 있도록 합니다.
- 세마포어를 사용하면, 공유 자원에 대한 접근 권한을 효율적으로 관리하여, 스레드 간의 충돌 문제를 해결할 수 있습니다.
위와 같은 방법들을 사용하여 스레드 간의 충돌 문제를 해결할 수 있습니다. 하지만, 동기화나 뮤텍스, 세마포어 등의 기술은 오버헤드가 발생할 수 있으므로, 효율적인 관리와 최적화가 필요합니다. 또한, 잘못된 사용으로 인해 데드락(Deadlock)이나 스레드 간의 경쟁 상태(Race Condition) 등의 문제가 발생할 수 있으므로, 적절한 사용 방법과 주의가 필요합니다.
컨텍스트 스위칭(Context Switching)은 CPU가 여러 프로세스 또는 스레드를 번갈아 가며 실행하면서, 실행 중인 프로세스 또는 스레드의 상태(Context)를 저장하고, 다음 실행할 프로세스 또는 스레드의 상태를 읽어들이는 작업을 말합니다.
프로세스나 스레드가 CPU를 사용하다가, 입출력 작업 등으로 인해 실행을 멈추게 되면, CPU는 다음 실행할 프로세스나 스레드를 찾아 실행해야 합니다. 이때, 이전 실행 프로세스 또는 스레드의 상태를 저장하고, 다음 실행할 프로세스 또는 스레드의 상태를 읽어들여야 합니다. 이 과정을 컨텍스트 스위칭이라고 합니다.
컨텍스트 스위칭은 시스템 성능에 영향을 미치는 중요한 요소 중 하나입니다. 컨텍스트 스위칭이 자주 발생하면, CPU의 시간과 자원을 많이 소모하게 되어, 시스템 성능이 저하될 수 있습니다. 따라서, 컨텍스트 스위칭을 최소화하고, 효율적으로 관리하기 위해 다양한 기술과 알고리즘이 사용됩니다. 예를 들어, 우선순위 기반 스케줄링, 멀티코어 CPU, 캐시 메모리 등의 기술을 사용하여 컨텍스트 스위칭을 최적화하고 시스템 성능을 향상시킬 수 있습니다.
- Code 영역
- 프로세스와 스레드는 모두 Code 영역을 공유합니다. Code 영역은 실행 파일의 코드와 프로그램 실행에 필요한 라이브러리와 함수 등이 저장되는 메모리 영역입니다.
- Data 영역
- 프로세스는 독립적인 Data 영역을 가지며, 전역 변수, 정적 변수, 초기화된 데이터 등이 저장됩니다. 프로세스는 자신의 Data 영역에서만 데이터를 공유할 수 있습니다.
- 스레드는 부모 프로세스의 Data 영역을 공유합니다. 따라서, 스레드는 동일한 변수를 사용하여 데이터를 공유할 수 있습니다.
- Heap 영역
- 프로세스와 스레드는 모두 Heap 영역을 공유합니다. Heap 영역은 프로그램 실행 중에 동적으로 할당되는 메모리 영역입니다. malloc(), calloc(), realloc() 등의 함수를 사용하여 Heap 영역에서 메모리를 할당합니다.
- Stack 영역
- 프로세스는 독립적인 Stack 영역을 가지며, 함수 호출 시 사용되는 지역 변수, 매개 변수, 함수 호출 스택 등이 저장됩니다.
- 스레드는 각각의 스레드마다 별도의 Stack 영역을 가지며, 함수 호출 시 사용되는 지역 변수, 매개 변수, 함수 호출 스택 등이 저장됩니다. 스레드 간 Stack 영역은 서로 공유하지 않습니다.
- 프로세스
- 자바에서는 하나의 자바 프로그램이 하나의 프로세스를 갖습니다.
- 자바 프로그램이 실행되면, JVM(Java Virtual Machine)이 하나의 프로세스를 생성하고, 이 프로세스 내에서 자바 코드가 실행됩니다.
- 각각의 자바 프로그램은 독립적인 메모리 영역을 가지며, 서로 영향을 주지 않습니다.
- 스레드
- 자바에서는 하나의 프로세스 내에서 다수의 스레드를 생성할 수 있습니다.
- 자바에서 스레드를 생성하려면, Thread 클래스를 상속받거나 Runnable 인터페이스를 구현해야 합니다.
- 자바에서 스레드를 생성하면, 각 스레드는 자신만의 스택(Stack)을 가지고, 공통된 Heap 영역을 공유합니다.
- 자바에서 스레드 간의 동기화를 위해 synchronized 키워드나 Lock, Condition 등의 동기화 기법을 사용합니다. 따라서, 자바에서는 하나의 자바 프로그램이 하나의 프로세스를 갖고, 이 프로세스 내에서 다수의 스레드를 생성하여 코드를 실행합니다. 각각의 스레드는 자신만의 스택을 가지고, 공통된 Heap 영역을 공유하며, 동기화 기법을 사용하여 스레드 간의 상호작용을 처리합니다.