프로그램, 프로세스와 스레드
프로그램
우리의 컴퓨터에는 다양한 프로그램이 존재한다. 그렇다면 프로그램이란 뭘까?
프로그램을 더블 클릭하면 프로그램이 실행된다.
프로그램은 결국 어떠한 목적을 가진 명령어들의 집합이다.
프로그램을 실행하면, 이 명령어들이 작동하면서 목적에 맞는 서비스를 제공한다.
프로세스
프로세스는 현재 컴퓨터에 있는 프로그램이 실제로 실행했을 경우를 의미한다.
프로그램을 실행하면, 프로세스가 되고, 프로세스는 독립된 메모리 공간을 할당 받는다. 이 메모리 공간에 명령어와 데이터들이 존재한다.
CPU
명령어를 실행하는 연산 장치이다.
메인메모리
프로세스가 CPU에서 실행되기 위해 대기하는 곳이다.
I/O
파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는것을 의미한다.
또는 수많은 입출력 장치(마우스, 키보드, 프린터등과 같은)와 데이터를 주거나 받는 것을 의미한다.
컴퓨터의 모든 작업은 결국은 I/O작업을 하는 것이라고 해도 무방할 정도이다.
CPU바운드 vs I/O바운드
단일 프로세스 시스템
한번에 하나의 프로그램만 실행된다. 또다른 프로그램을 실행하려면 이미 동작되고 있는 프로그램을 종료하고 실행해야한다. 그렇기 때문에 단일 프로세스는 CPU사용률이 좋지않다.
실행중에 있는 프로세스가 I/O작업을 하는 동안에는 CPU는 아무것도 하지 않고 가만히 쉬고 있다.
이런 문제를 해결하고자 등장한 것이 여러개의 프로그램을 메모리에 올려놓고 동시에 실행시키자는 아이디어이다.
I/O작업이 발생하면 다른 프로세스가 CPU에서 실행되게 된다.
이런 종류의 시스템을 멀티프로그래밍이라고 한다.
멀티프로그래밍
CPU 사용률을 극대화 시키는데 목적이 있다.
한 프로세스의 CPU사용시간이 길어지면 다른 프로세스는 계속 대기해야 한다는 단점이 있다.
단점을 해결하고자 프로세스는 한번에 CPU를 사용할때 아주 짧은 시간(quantum)만 CPU에서 실행되도록 하자는 아이디어가 나온다.
이런 종류의 시스템을 멀티테스킹이라고 한다.
멀티테스킹
멀티태스킹
멀티프로그래밍과 유사한 개념이지만 해당 개념에 CPU 타임을 짧게 쪼개서 서로 번갈아가면서 실행되게 한다는 개념을 추가했다.
프로세스의 응답 시간을 최소환 시키는데 목적이 있다.
일반사용자들에게는 마치 동시에 프로그램을 실행되는 것처럼 느껴지게 한다.
타임시간을 짥게 쪼개서 그 안에서 프로세스들이 번갈아가면서 실행되게 되면서 즉각적인 반응을 주는 개념이다.
하지만 여러 프로세스가 동시에 실행되는 것은 지원을 하지만, 하나의 프로세스가 동시에 여러작업을 수행하지는 못한다.
하나의 프로세스에 대한 똑같은 프로세스를 만들어서 실행시킬 수 있지만, 프로세스의 컨텍스트 스위칭은 무거운 작업이다.
그리고 프로세스는 독립적인 메모리 공간을 가지기 때문에 프로세스끼리는 데이터 공유가 까다롭다.
스레드
해결책으로 나온것이 스레드(Thread)이다.
기본적으로 프로세는 하나의 스레드를 가진다.
한 프로세스에서 여러 작업을 하기 위해서 등장했기 때문에 프로세스는 한개 이상의 스레드를 가질 수 있다.
과거에는 Process가 CPU의 실행되는 단위였지만, 현재는 Thread가 CPU의 실행단위가 되었다.
같은 프로세스의 스레드들끼리는 컨텍스트 스위칭이 가볍다.
하나의 프로세스에서 다른 프로세스로 교체되는 것이 무거웠는데, 이제는 같은 프로세스의 스레들끼리는 컨텍스트 스위칭이 가벼워 졌다.
스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유한다.
같은 프로세스에 속해있는 스레드끼리는 데이터 공유가 쉽다.
stack은 공유하지 않으나 heap영역은 공유한다.
멀티스레딩
하나의 프로세스가 동시에 여러작업을 실행하는데 목적이 있다.
여러작업은 Thread을 통해서 작업한다.
확장된 멀티태스킹 개념
여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 CPU time을 나눠 갖는 것을 의미한다.
멀티프로세싱
두개 이상의 프로세서나 코어를 활용한 시스템을 의미한다.