프로세스와 스레드의 차이점
- 프로세스
- 실행 중인 프로그램의 인스턴스를 말한다
- 독립된 메모리 공간(코드, 데이터, 힙, 스택)을 가지고 있고 운영 체제에서 독립적으로 관리한다
- [[메모리 영역]]
- 프로세스 간 메모리 접근이 원칙적으로는 불가능해서 다른 프로세스의 메모리를 침범할 위험이 없다
- 그럼 침범하지 않는다는 원칙은 깰 수 있나?
- 특정 상황이나 방법을 통해서 다른 프로세스의 메모리에 접근할 수 있다..!
- 운영 체제를 이용한 방법
- 운영 체제는 일부 메모리 영역을 여러 프로세스가 공유할 수 있도록 허용한다
- 주로 [[프로세스 간 통신(IPC)]]을 위해서 사용하고 이 경우 프로세스는 특별히 할당된 공유 메모리 영역에 접근할 수 있다
- 이 경우는 하나의 프로세스가 다른 프로세스의 메모리를 침범하는 경우가 아니라 공통된 영역에 접근하는 거 같다
- 공유 메모리는 프로세스 간 데이터 교환이나 전송 등에 쓰인다
- 공유 공간이니까 동기화, 데이터 일관성 등 문제가 발생할 수 있다
- 루트 권한을 이용한 방법
- 관리자 권한을 가진 프로레스라면, 특정 시스템 호출이나 디버깅 도구를 통해 다른 프로세스의 메모리에 접근할 수 있다
- 예를 들면, 리눅스에서는 ptrace로 다른 프로세스의 메모리를 읽거나 쓸 수 있다
- 어떤 경우에 관리자 권한을 가진 프로세스가 다른 프로세스의 메모리를 볼까?
- 디버깅, 문제 해결 : 다른 프로그램의 실행 상태를 조사해야 할 때
- 시스템 모니터링 : 메모리 사용량을 보고 성능 최적화를 위해서 자원 할당을 조절해야 할 때
- 악성 코드를 탐지해야 할 때 등이 있다
- 그렇지만 모든 메모리에 접근이 가능한 건 아니다
- 프로세스 간 전환(컨텍스트 스위칭)은 비교적 무겁고 많은 비용을 소모한다
- 컨텍스트 스위칭
- CPU가 다른 프로세스로 전환될 때 발생하는 작업이다
- 멀티태스킹을 지원하기 위해서는 여러 프로세스를 번갈아 가며 실행해줘야 한다
- 이 과정에서 현재 실행 중인 프로세스의 상태를 저장하고, 실행할 프로세스의 상태를 로드한다
- 프로세스의 상태 정보는 Process Control Block(PCB)에 담긴다
- 왜 프로세스 컨텍스트 스위칭은 오래 걸리나?
- 복잡한 상태 저장 및 복원
- CPU의 모든 레지스터와 프로세스의 상태를 저장하고 복원하는데 오래 걸린다
- 메모리 관리 작업
- 프로세스는 독립된 메모리 공간을 가지므로, 전활 시 메모리 맵을 변경 해야 한다
- 페이지 테이블 등의 메모리 관리 구조를 새로 설정하는 작업이 필요하다
- 캐시 무효화
- 프로세스를 바꿀 때 남아있는 CPU 캐시를 없애고 재적재하는 작업이 필요하다
- 운영 체제의 오버헤드
- 컨텍스트 스위칭은 커널 모드에서 수행되므로, 사용자 모드에서 커널 모드로 전환 과정에서 오버헤드가 발생한다
- 스레드
- 프로세스 내에서 실행되는 작업 단위다
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있고 스레드들은 같은 메모리 공간을 공유한다
- 코드, 데이터, 힙은 공유하지만 스레드는 독립적인 스택 메모리 공간을 가진다
- 메모리를 공유하기 때문에 잘못된 메모리 접근으로 인한 오류가 발생할 수 있다
- 스레드 간 전환은 프로세스보다 비용도 적게 들고 빠르다!
- 왜 비용이 적게 들고 빠를까?
- 스레드 컨텍스트 스위칭 과정
- 현재 스레드 상태 저장
- 현재 CPU 레지스터 상태를 저장한다
- Thread Control Block(TCB)에 스레드 상태 정보를 저장한다
- 새로운 스레드 불러오기
- 스레드 vs 프로세스 컨텍스트 스위칭
- 저장/불러올 상태의 범위
- 프로세스는 모든 레지스터, 메모리 맵, 페이지 테이블, 프로레스 제어 블록을 저장 및 복원해야 한다
- 스레드는 메모리 맵과 페이지 테이블은 공유하므로 저장, 로드할 필요가 없고 레지스터 상태와 스택 포인터만 저장, 복원하면 된다
- 오버헤드
- 프로세스는 메모리 맵, 페이지 테이블을 다시 설정해야 하고 캐시 무효화 등 추가 작업이 필요하다
- 스레드는 위와 같은 게 필요 없어서 오버헤드가 적고 전환이 빠르다
- 하나의 프로세스 내에서 여러 작업을 동시에 수행할 수 있고 이는 CPU 사용률을 높이고, 응용 프로그램 성능을 향상한다
- IO 작업 같이 시간이 오래 걸리는 작업을 비동기적으로 처리해서 다른 작업을 중단하지 않고 처리할 수 있다