프로세스 vs 스레드 차이점
프로세스 vs 스레드
프로세스
프로세스는 실행 중인 프로그램으로 디스크로부터 메모리에 적재되어 CPU 의 할당을 받을 수 있는 것을 말합니다.
운영체제로부터 주소 공간, 파일, 메모리 등을 할당받으며 이것들을 총칭하여 프로세스라고 합니다.
구체적으로 알아본다면 프로세스는 함수의 매개변수, 복귀 주소와 로컬 변수와 같은 임시 자료를 갖는 프로세스 스택과 전역 변수들을 수록하는 데이터 섹션을 포함한다.
또한 프로세스는 프로세스 실행 중에 동적으로 할당되는 메모리인 힙을 포함한다.
PCB(Process Control Block)
PCB 는 특정 프로세스에 대한 중요한 정보를 저장 하고 있는 운영체제의 자료구조입니다.
우리의 운영체제는 프로세스들을 관리하기 위해 프로세스의 생성과 동시에 프로세스 고유의 PCB 를 생성합니다.
프로세스는 CPU 를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 중지하고 저장, CPU 를 반환해야합니다.
이때 작업의 진행상황을 저장해야하는데 이것을 PCB 에 저장합니다.
그리고 다시 CPU를 할당 받게 될때 PCB에 있는 내용을 불러와 이전의 종료시점부터 다시 작업을 하게됩니다.
PCB(Process Control Block) 에 저장되는 정보
프로세스 식별자(PID, Process ID)
프로세스 상태: new, ready, running, waiting, terminated 등의 상태를 저장
프로그램 카운터(PC): 프로그램이 다음에 실행해야 할 명령어의 주소
CPU Register
CPU 스케줄링 정보: 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
메모리 관리 정보: 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보
입출력 상태 정보: 프로세스에 할당된 입출력 장치들과 열린 파일 목록
어카운팅 정보: 사용된 CPU 시간, 시간 제한, 계정 번호 등
스레드
스레드는 프로세스의 실행 단위입니다. 한 프로세스 내에서 동작하는 여러 실행의 흐름으로,
프로세스 내의 주소공간이나 자원을 공유할수있습니다.
스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택 으로 구성됩니다.
하나의 프로세스를 다수의 실행단위로 구분하여 자원을 공유하고 생성과 관리의 중복성을 최소화하여
수행 능력을 비약적으로 향상시키는것을 멀티스레딩 이라고합니다.
이때 스레드는 각각 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC레지스터 값을 가지고있습니다.
멀티스레드
프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우에 메모리 공간과 자원의 소모가 줄어들게됩니다.
또한 스레드간 통신이 필요할때에도 전역변수의 공간 또는 동적 할당 공간인 Heap 영역을 사용하여 데이터를 주고받을수있다.
심지어 스레드의 Context switch 는 프로세스와 달리 캐시 메모리를 비울 필요가 없기때문에 속도도 더 빠르다.
자원의 소모가 줄어들며 응답 시간이 단축됩니다.
이러한 장점때문에 여러 프로세스로 할수있는 작업을 하나의 프로세스에서 스레드로 나누어 수행하는 것입니다.
문제점
프로세스와 달리 스레드는 스레드끼리 동일한 자원을 동시에 접근하는 일이 있을수있기때문에 어떤 스레드에서 사용중인 변수나 자료구조에 잘못접근하여,
엉뚱한 값을 읽어오거나 수정할수있습니다.
그렇기때문에 멀티 스레딩 환경에선 동기화 작업이 필요합니다, 동기화로 통해 처리순서를 컨트롤하고 공유 자원에대한 접근을 컨트롤합니다.
이로 인해 병목현상이 발생하여 성능이 저하될 가능성이 높습니다 그렇기 때문에 과도한 Lock 으로 생기는 병목현상을 줄여야 합니다.
멀티프로세스 vs 멀티스레드
둘다 여러흐름이 동시에 실행된다는 공통점이 있습니다.
하지만 멀티프로세스에서 각 프로세스는 독립적으로 실행되며 별개의 메모리들을 차지하고있는것과는 달리
멀리스레드는 공유자원을 사용합니다. 또한 프로세스간의 전환속도보다 스레드간의 전환속도가 더 빠릅니다.
프로세스는 OS 로 부터 자원을 할당 받으며 스레드는 프로세스 내에서 실행되는 실행단위이기 때문에 프로세스 내부 자원을 스레드 끼리 서로 공유하며 사용합니다.
그리고 멀티스레드에는 치명적인 단점이있습니다.
멀티 프로세스에서는 한 프로세스가 비정상적으로 종료되더라도 나머지 프로세스에 영향을 끼지지않고 정상적으로 수행되지만,
멀티 스레드 방식에서는 하나의 스레드가 종료된다면 나머지 전체의 스레드도 종료될수 있다는 점 입니다.
그렇기 때문에 우리는 대상 시스템의 목적이나 특징에 따라 적합한 동작 방식을 선택하고 적용해야 할것입니다.