들어가기전, OS의 어느 부분을 배우고 있는지 확인하기.
process와 thread의 세부적인 개념을 공부하기 전, OS가 어떤 서비스를 우리에게 제공하는지 전체적인 그림을 보고 가면 좋을 것 같아서 아래 콜 아웃 페이지를 만들게 되었다.
프로세스 관리
프로세스와 스레드, 프로세스 동기화, 교착 상태 해결
자원 접근 및 할당
CPU 스케줄링, 메모리 페이징, 스와핑, 입출력장치 인터럽트 서비스 루틴
파일 시스템 관리
관련 정보를 묶어 파일 단위와 파일을 묶어 폴더(디렉터리) 단위로 저장 장치에 보관
이번 포스팅에서는 OS가 제공하는 핵심 서비스인 프로세스 관리에서 프로세스와 스레드에 대한 개념을 공부해 보았다.
두 개념을 같이 공부하는 이유는 개념적으로 유사하고 딱 잘라서 구분하기에는 모호한 부분이 있어 헷갈리기 때문인 것 같다. 그런 이유에서 인지, 제대로 공부하지 않으면 헷갈릴 수 있는 두 단어의 차이점을 묻는 질문이 주요 면접 질문이다. (예를들면, 멀티 프로세스와 멀티 스레드의 차이점은?)
공부한 후 이 질문을 다시 보았을 때 나라도 면접에서 이 두 개념을 동시에 물을 것 같아, 이 질문에 대한 답을 제대로 공부하는 것을 목표로 해당 주제를 포스팅하였다.
두 개념을 쉽게 구분하는 생각은 바로 CPU 자원을 공유하느냐 하지않느냐이다.
아래 그림을 보면 이해가 쉬워진다.
그림에서와 같이 프로세스는 각자의 메모리 자원을 가지고 독립적으로 동작하는 반면, 스레드는 같은 메모리 자원을 공유하며 동작한다. (정확히 말하면 Multi process와 Multi thread의 차이.)
그럼 두 개념의 이론적인 내용을 살펴보자.
실행 중인 프로그램
실행 중인 프로그램(process)를 구성하는 실행 흐름의 단위 (프로세스의 자원을 공유하면서 실행됨)
먼저, thread는 procee를 구성하는 단위임을 기억하면 앞으로의 내용을 이해하기가 편하다.
메모리는 커널 영역과 사용자 영역으로 나누어 진다.
프로세스는 이 두 영역을 모두 사용하는데, 커널 영역에는 PCB(프로세스 제어 블록, 프로세스 자료 구조)를 저장하고 사용자 영역에는 코드(텍스트) 영역, 데이터 영역, 힙 영역, 스택 영역들을 저장한다.
스레드는 프로세스 실행에 필요한 최소한의 정보를 수택 영역이나 코드 영역 등에 저장한다. (process를 구성하는 실행 흐름의 단위이니 당연히 프로세스와 같은 영역에 정보를 저장하게 된다.)
위에서 언급한 내용만 잘 알고 있으면 아래 부가적인 내용들은 쉽게 이해할 수 있다.
포그라운드 프로세스
사용자가 볼 수 있는 공간에서 실행
백그라운드 프로세스
사용자가 볼 수 없는 공간에서 실행
프로세스 ID (PID)
특정 프로세스 식별 고유 번호
레지스터 값
프로세스가 CPU를 다시 할당받을 때 필요한 작업 정보 보관 장소
프로세스 상태 (state)
프로세스 상태 다이어그램
CPU 스케줄링 정보
프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
메모리 정보
프로세스가 어느 메모리 주소에 저장되어 있는지에 대한 정보 (페이지 테이블 정보)
사용 중인 파일과 입출력장치 정보
데이터가 일시적으로 저장되는 공간 (ex. 매개 변수, 지역 변수)
부모 프로세스
새 프로세스를 생성한 프로세스
→ fork 시스템 호출로 자신의 복사본을 자식 프로세스로 생성 (부모 프로세스의 자원 상속)
자식 프로세스
부모 프로세스에 의해 생성된 프로세스
→ exec 시스템 호출로 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰기
이제 아래 질문에 대한 답변을 직접 해보자. (수정하며 공부하기)
= 단일 스레드 프로세스를 여러 개 실행하는 것 vs. 하나의 프로세스를 여러 스레드로 실행하는 것
→ 멀티 프로세스의 경우 같은 프로세스의 자원을 공유하지 않고 독립적으로 실행되지만, 멀티 스레드의 경우 같은 프로세스의 자원을 공유하며 동시에 혹은 독립적으로 실행됩니다.
(이때 스레드가 공유하는 자원은 커널 메모리 부분의 PCB입니다. 서로 공유하지 않는 자원은 사용자 메모리 부분(pc 및 레지스터, 스택, 힙 등)입니다.)
→ 이러한 멀티 스레드의 특징은 Context switching이 자주 일어고 데이터 공유가 빈번한 경우, 그리고 적은 메모리를 사용해야 되는 경우에 유리합니다. 하지만 multi thread는 동기화 문제와 하나의 thread 장애로 전체 thread가 종료될 위험이 있습니다. 이에 반해 multi process는 하나의 process가 죽더라도 다른 process에 영향을 주지 않아 안정성이 높습니다.
사진 출처 : 혼자 공부하는 컴퓨터 구조와 운영 체제