프로세스 & 스레드
프로세스 : 메모리 상에서 실행 중인 프로그램
스레드 : 프로세스 안에서 실행되는 여러 흐름 단위
기본적으로 프로세스마다 최소 1개의 스레드 소유(메인 스레드 포함)
프로세스는 각각 별도의 주소공간 할당(독립적)
- Code : 코드 자체를 구성하는 메모리 영역(프로그램 명령)
- Data : 전역 변수, 정적 변수, 배열 등
- 초기화된 데이터는 Data 영역에 저장
- 초기화 되지 않은 데이터는 bss 영역에 저장
- Heap : 동적 할당 시 사용(new(), malloc() 등)
- Stack : 지역 변수, 매개 변수, 리턴 값(임시 메모리 영역)
→ 스레드는 Stack 영역만 할당 받고 나머지 영역은 서로 공유
프로세스는 자신만의 고유 공간과 자원을 할당받아 사용하는데 반해, 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용하는 차이가 존재함
프로세스의 상태
: 프로세스는 상태가 변경되며 수행된다
- Running : CPU를 잡고 instruction을 수행중인 상태
- Ready : CPU를 기다리는 상태
- Blocked :
CPU를 주어도 당장 instruction을 수행할 수 없는 상태
Process에 자신이 요청한 event가 즉시 만족되지 않아 이를 기다리는 상태
- New : 디스크에서 메모리로 프로그램이 올라가 실행 준비
- Terminated : 수행이 끝난 상태
PCB(Process Control Block)
: 운영 체제가 프로세스를 표현한 자료구조. 특정 프로세스에 대한 정보를 가짐. 각 프로세스 생성 시 고유의 PCB 생성, 프로세스 완료 시 PCB 제거
프로세스 간 문맥 교환
-> 프로세스는 진행하던 작업들을 PCB에 저장
-> 이후 자신의 순서가 왔을 때 이어서 처리
- OS가 관리상 사용하는 정보
- Process state, Process ID
- Scheduling information, priority
- CPU 수행 관련 하드웨어 값
- Program counter, register
- 메모리 관련
- Code, Data, Stack, Heap
- 파일 관련
- open file descriptors
멀티 프로세스
: 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것
- 장점 : 안정성(메모리 침범 문제를 OS 차원에서 해결)
- 단점
-
각각 독립된 메모리 영역을 갖고 있어, 작업량이 많을수록 오버헤드 발생
-
Context Switching으로 인한 성능 저하
Context Switching?
: 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정
하나의 프로세스가 이미 CPU 를 사용중인 상태에서 다른 프로세스가 CPU 를 사용하기 위해 이전 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 적재하는 것.
→ 프로세스는 각 독립된 메모리 영역을 할당받아 사용하므로 캐시 메모리 초기화와 같은 무거운 작업이 진행되었을 때 오버헤드(문맥 교환에 필요한 시간, 메모리)가 발생할 문제
멀티 스레드
: 하나의 응용 프로그램에서 여러 스레드를 구성하여 각 스레드가 하나의 작업을 처리하는 것
스레드들이 공유 메모리를 통해 다수의 작업을 동시에 처리하게 해줌
- 장점
- 독립적인 프로세스에 비해 공유 메모리만큼의 시간, 자원 손실이 감소
- 전역 변수와 정적 변수에 대한 자료 공유 가능
- 단점 : 안정성 문제. 하나의 스레드가 데이터 공간을 망가뜨리면, 모든 스레드가 작동 불능
→ 이 단점은 Critical Section 기법으로 대비
→ 하나의 스레드가 공유 데이터 값을 변경하는 시점에 다른 스레드가 그 값을 읽으려 할 때 발생하는 문제를 해결하기 위한 동기화 과정 ( 상호 배제, 진행, 한정된 대기를 충족해야 함)