CS 면접 준비/OS
[OS] Process와 Thread
Everyday Growing Engineer
2022. 11. 11. 15:34
Process :
- 사전적 의미 :
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
- 운영체제로부터 시스템 자원을 할당받는 작업의 단위
- 실행된 프로그램을 의미한다.
- 특징:
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
- 프로세스(process)의 메모리 구조
- Code 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라갑니다.
(쉽게 말하면 소스코드가 올라간다고 생각하면 됨) - Data 영역 : 전역변수, static 변수의 할당.
- Heap 영역 : 동적할당을 위한 메모리 영역.
- Stack 영역 : 지역변수, 함수 호출시 전달되는 인자(파라미터)를 위한 메모리 영역.
- Code 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라갑니다.
Thread
- 사전적 의미
- 프로세스 내에서 실행되는 여러 흐름의 단위
프로세스의 특정한 수행 경로
프로세스가 할당받은 자원을 이용하는 실행의 단위
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 특징
- 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
- 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
- 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
- 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.
- 프로세스 구조
- Code 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라갑니다.
- Data 영역 : 전역변수, static 변수의 할당. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.
- Heap 영역 : 동적할당을 위한 메모리 영역. (자바 : new ~~)
- Stack 영역 :
- 지역변수, 함수의 파라미터를 위한 메모리 영역.
- 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.
- LIFO
- Code 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라갑니다.
Multi Thread VS Multi Process
- Multi Process : 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것이다.
- 장점 :
- 여러 개의 자식 프로세스 중 하나에 문제가 발생시 그 자식 프로세스만 죽는 것을 제외하고 다른 영향이 미치지 않는다.
- 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용한다.
- 단점:
- Context Switching에서의 오버헤드
- Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생하게 된다.
- 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어, Context Switching가 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 한다.
- Context Switching :
- CPU는 한번에 하나의 프로세스만 실행 가능하다. CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 Context Switching라 한다.
- 필요한 이유 : 만약 컴퓨터가 매번 하나의 Task만 처리할 수 있다면, 해당 Task가 끝날때까지 다음 Task는 기다릴 수 밖에 없다. 그래서CPU가 Task를 바꿔 가며 실행하기 위해 Context Switching이 필요하게 되었다. context switching를 사용하면 멀티 프로세싱, 멀티 스레딩을 통해 빠른 속도로 응답할 수 있다.
- 장점 :
- Multi Thread : 하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것이다.
- 장점 :
- 시스템 자원 소모 감소 (자원의 효율성 증대) :프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
- 시스템 처리량 증가 (처리 비용 감소) :
- 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.
- 스레드 사이의 작업량이 작아 Context Switching이 빠르다.
- 간단한 통신 방법으로 인한 프로그램 응답 시간 단축 : 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.
- 단점
- 자원을 공유하기에 동기화 문제가 발생할 수 있다. (병목현상, 데드락 등)
- 주의 깊은 설계가 필요하고 디버깅이 어렵다. (불필요 부분까지 동기화하면, 대기시간으로 인해 성능저하 발생)
- 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
- 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
- 장점 :