들어가기에 앞서
- 프로그램이란?
파일이 저장 장치에 저장되어 있지만 메모리에 올라와 있지 않는 정적인 상태
(실행시킬 수 있는 파일)
1. 프로세스
- 운영체제로부터 시스템 자원을 할당받는 작업의 단위
- 실행 중인 프로그램
- 위 그림은 프로세스가 실행될 때, 메모리에 생기는 주소 공간이다.
Text 영역
- 사용자가 작성한 코드가 기계어 명령 형태로 변경되어 저장되는 공간.
Data 영역
- Static 변수 or Global 변수를 저장하는 공간.
Heap 영역
- 동적 메모리 영역 (런타임 동안 늘어나기도 하고 줄어들기도 한다)
Stack 영역
- 함수 복귀주소, 지역변수, 매개변수, 반환 값 등 일시적인 데이터를 저장하는 공간. (컴파일 타임에 크기가 결정)
메모리 영역을 나누는 이유
우리가 어떠한 프로그램을 구현할 때, 각각의 변수, 함수, 클래스 등이 호출되고 해제되는 시기가 다르기 때문이다.
ex) 어떠한 함수 내에서 한 번 사용되는 변수가 프로그램의 처음부터 끝까지 메모리에 남아있다면 메모리가 낭비된다.
결국 유사한 성향의 데이터를 묶어서 저장하면 관리가 용이해지고 접근속도가 향상되기 때문에 메모리 영역을 나누는 것이다.
- 위 그림과 같이 해당 프로세스에 대한 정보를 가지고 있는 PCB블록이 프로세스 생성과 동시에 만들어진다.
2. 스레드
한 프로세스 내에도 여러 갈래의 작업들이 동시에 진행될 필요가 있다. ex) 웹 서버의 동시 요청 처리
- 프로세스가 할당받은 자원을 이용하는 실행의 단위
- 프로세스 내에서 실제로 작업을 수행하는 주체
- 프로세스는 1개 이상의 스레드를 가질 수 있다.
- cpu에서 실행되는 단위(unit of execution)
- Heap, Data, Code영역을 공유하고 별도의 Stack 영역을 가진다.
- 같은 프로세스의 스레들끼리 context-switching은 가볍다.
3. 멀티프로그래밍
cf.) 등장배경 : 단일 프로세스 시스템에서는 한 번에 하나의 프로그램만 실행할 수 있어서 cpu 사용률이 좋지 않았다. 그래서 여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자는 멀티프로그래밍 아이디어가 나옴.
- 단일 프로세서 상에서 여러 프로그램을 메모리에 동시에 올려서 수행하는 것
- 프로세서가 IO 작업의 종료를 기다리는 동안 다른 프로그램을 수행할 수 있도록 하는 것
- CPU 사용률을 극대화 시킨다
- 단점: CPU 사용 시간이 길어지면 다른 프로세스는 계속 대기
4. 멀티태스킹
cf.) 등장배경 : 멀티프로그래밍의 단점을 보완하고자 프로세스(혹은 스레드)는 한 번 CPU를 사용할 때 아주 짧은 시간(=quantum)만 CPU에서 실행되도록 하자는 멀티태스킹 개념이 나옴.
- 멀티 태스킹은 시분할 시스템에서 사용되며, 사용자에게 다수의 작업이 동시에 처리되는 것처럼 느끼게 할 수 있다.
- 프로세스(혹은 스레드)의 응답 시간을 최소화시킨다
- 단점: 하나의 프로세스가 동시에 여러 작업 수행을 하지는 못한다.
3. 멀티 프로세싱
- 두 개 이상 다수의 프로세서(CPU)가 협력적으로 1개 이상의 작업(Task)을 동시에 처리하는 것
- 부모 프로세스가 fork()를 하여 자식 프로세스를 여러 개 만들어 작업을 처리한다.
- 프로세스간 메모리 공유는안되기 때문에, IPC를 이용해 소통한다.
- 하나의 프로세스에서 문제가 생겨도 다른 프로세스는 계속 진행할 수 있다.
- 단점: 컨텍스트 스위칭 비용이 높다
4. 멀티 스레딩
- 하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것.
- 단일 프로세스 내에서 여러 쓰레드로 나누어 동시에 실행
- 컨텍스트 스위칭 비용이 거의 없음
- 스택을 제외한 데이터,코드,힙 영역을 공유하기 때문에 공유하는데 편리함
- 단점
1. 스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있다.
2. 자원을 공유하므로 동기화 문제가 발생한다.
Reference