[OS] Process VS Thread
프로세스(Process)
- 운영체제(OS)로부터 자원을 할당 받는 작업의 단위
- Code, Data, Stack, Heap의 구조로 되어있는 독립된 메모리 영역을 할당 받음
- 리소스(Resource)와 쓰레드(Thread)로 구성
- 모든 프로세스는 하나 이상의 쓰레드(메인 쓰레드)를 가지고 있음
- 프로세스 상태
- 생성(Create) : 프로세스가 생성되는 중
- 실행(Running) : 프로세스가 CPU를 차지하여 명령어들이 실행되고 있음
- 준비(Ready) : 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태, CPU가 할당되기를 기다리고 있음 일반적으로 준비 상태의 프로세스 중 우선순우가 높은 프로세스가 CPU를 할당 받음
- 대기(Waiting) : 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태
- 종료(Terminated) : 프로세스의 실행 종료
- 멀티 프로세스(프로세스가 독립적으로 처리해야 할 작업의 수만큼 프로세스를 만드는 방법)의 단점
: 프로세스가 많이 생성 될수록 메모리 사용량이 증가하고 스케줄링 횟수도 많아져 프로그램 성능이 떨어짐. 프로세스들 사이에 데이터를 공유하기 불편함. 공유하려면 운영체제의 도움을 받아 프로세스간 통신(IPC: Inter Process Communication)을 해야한다.Code 영역(Text 영역) : 프로그램의 기계어 명령이 들어있음, 읽기만 가능메모리의 낮은 주소Data 영역 : 초기화된 전역 변수와 정적 변수가 저장됨- BSS(Block started symbol Segment) : 초기화 되지 않은 전역 변수와 정적 변수가 저장됨
Thread(스레드)
- 프로세스가 할당받은 자원을 이용하는 실행의 단위
- 프로세스 내의 주소 공간이나 자원들(Code, Data, Heap)을 대부분 공유하면서 실행, 별도의 Stack만 가짐
- Context Switching시 Stack영역만 switching하므로 프로세스 switching보다 빠름
- 쓰레드 간 자원 공유가 가능하여 편리하지만 자원 동기화의 문제가 있음
- 시스템의 자원 소모가 줄어듬
- 프로세스간 통신 방법에 비해 쓰레드 간의 통신 방법이 훨씬 간단함
- 프로그램 디버깅이 어려움(여러 개의 쓰레드를 이용할 때 주의 깊게 설계해야함. 공유자원이 충돌날 수 있고, 동기화 문제도 발생할 수 있음)
- 단일 프로세서 시스템에서는 효과를 기대하기 어려움
사용자 수준의 쓰레드(User Level Thread) [쓰레드를 생성해 주는 대상이 유저 레벨일 경우]
커널에 의존적이지 않은 형태로 쓰레드의 기능을 제공하는 라이브러리 활용, 유저 영역에서 쓰레드 관리가 이루어짐
- 장점
커널의 쓰레드 존재를 모르기 때문에, 유저 모드 -> 커널 모드 전환이 필요 없음.(성능이 좋음) - 단점
운영체제는 쓰레드의 존재를 모름(프로세스 존재만 앎), 프로세스 내의 쓰레드의 문제가 생기지 않게 해야하기 때문에 프로그래밍이 어렵고 커널 레벨 쓰레드에 비해 결과 예측이 어려움
커널 수준의 쓰레드(Kernel Level Thread) [쓰레드를 생성해 주는 대상이 커널 레벨일 경우]
운영체제가 제공하는 시스템 함수 호출을 통해서 쓰레드 생성을 요구해야 함, 운영체제가 해당 쓰레드의 생성 및 관리를 함, 쓰레드 생성 및 스케줄링하는 주체가 커널임
- 장점
: 커널에서 직접 제공하기 때문에 안정성과 다양한 기능성을 제공 - 단점
: 커널에서 제공해 주는 기능이기 때문에 유저 모드에서 커널 모드의 전환이 빈번하게 일어남(성능 저하로 이어짐)
Reference
'Programming > Operating System' 카테고리의 다른 글
[OS] DeadLock (3) | 2018.11.14 |
---|