먼저 프로그램의 실행이란 프로그램을 구성하는 코드를 순서대로 cpu 에서 연산(실행) 하는 일이다.
cpu 코어는 하나라고 가정할때 cpu 코어 하나는 하나의 프로그램 코드만 실행 가능하다.
예를들어 음악프로그램을 실행과 동시에 롤을 한다고 가정하자. 프로그램을 순차적으로 실행을 한다고 가정 음악을 다 듣고 롤을 할 수 있을 것이지만 이렇게 된다면 사용자는 매우 답답할 것이다.
-> 이를 해결하기 위해 하나의 cpu 코어로 여러 프로그램을 동시에 실행하는 멀티태스킹 기술이 등장했다.
순서대로 촬영한 연속된 사진을 교차에서 매우 빠르게 보여줄 경우 사람은 이를 움직이는 영상으로 인지를 한다.
현재 cpu 초당 수십억 번 이상의 연산을 수행한다.
만약 cpu 가 매우 빠르게 두 프로그램의 코드를 번갈아 수행한다면 , 사람이 느낄 때 두 프로그램이 동시에 실행되는 것처럼 느껴질 것이다.( 약 0.01 초 단위로 돌아가며 실행된다.)


이 방식은 cpu 코어가 프로그램A의 코드를 0.01초 수행하다가 잠시 멈추고, 프로그램B의 코드를 0.01 초 정도 수행한다. 그리고 다시 프로그램A 의 이전에 실행중인 코드로 돌아가서 다시 0.01 초 정도 코드를 수행하는 방식으로 반복 동작한다.
이렇게 각 프로그램의 실행 시간을 분할해서 마치 동시에 실행되는 것처럼 하는 기법을 시분할(Time Sharing)
CPU 에 어떤 프로그램이 얼마만큼 실행될지는 운영체제가 결정하는데 이것을 스케줄링이라고한다.
단순한게 시간으로만 작업을 분해하는것이 아니라 , CPU 를 최대한 활용할 수 있는 다양한 우선순위와 최적화 기법을 사용한다.
CPU 코어가 둘 이상이면 어떻게 될까?
참고로 CPU 안에는 실제 연산을 처리할 수 잇는 코어라는 것이 존재하다. 과거에는 하나의 CPU 안에 보통의 하나의 코어만 들어있었다. 그래서 CPU 와 코어를 따로 분리해서 이야기하지 않았다. 최근에는 하나의 CPU 에 보통 2개 이상의 코어가 존재한다.
코어가 2개 있다고 가정하면 물리적으로 2개의 프로그램을 실행시킬수 있다. 물론 여기 안에서도 여러 프로그래램(스레드)를 번갈아가며 실행한다. -> 컨텍스트 스위칭


코어가 2개라서 2개의 프로그램만 실행되는것이 아니라 cpu 코어 2개를 가지고 3개의 프로그램을 번가라 가면서 수행한다고 생각하면된다.
즉 , 멀티프로세싱이란 : 컴퓨터 시스템에서 둘이상의 프로세서(CPU코어)를 사용하여 여러 작업을 동시에 처리하는 기술을 의미한다. 멀티프로세싱 시스템은 하나의 CPU 코어만 사용하는 시스템보다 동시에 더 많은 작업을 처리할 수 있다.
멀티프로세싱 VS 멀티태스킹
멀티프로세싱은 하드웨어 장비의 관점, 멀티태스킹은 운영체제 소프트웨어의 관점이다.
멀티프로세싱
멀티태스킹
참고로 위에 있는 그림은 멀티프로세싱이자, 멀티태스킹이다. 왜냐하면 여러 cpu 코어가 물리적으로 여러 프로그램을 실행하면서, 코어들이 여러 프로그램을 작업을 분할하면서 돌아가면서 수행하기 때문이다.

프로그램은 실제 실행하기 전까지는 단순한 파일에 불과하다.
프로그램을 실행하면 프로세스가 만들어지고 프로그램이 실행된다.
이렇게 운영체제 안에서 실해중인 프로그램을 프로세스라고 한다.
프로세스는 실행 중이 프로그램의 인스턴스이다.
자바 언어로 비유를 하자면 클래스는 프로그램이고, 인스턴스는 프로세스이다.
위에 그림에서 보는것처럼 프로세스는 서로 간섭을 받지 않는다. 서로의 메모리에 접근할 수 없고 격리되어 있다.
이렇게 격리가 되어있기 때문에 하나의 프로세스가 충돌이 발생해도 다른 프로세스에게 영향을 미치지 않는다.
프로세스는 하나 이상의 스레드를 반드시 포함한다.
스레드는 프로세스 내에서 실행되는 작업의 단위이다. 한 프로세스 내에서 여러 스레드가 존재할 수 있으며 , 이들은 프로세스가 제공하는 동일한 메모리 공간을 공유한다.
메모리 구성
프로그램이 실행된다는 것은 어떤 의미일까?
프로그램을 실행하면 운영체제는 먼저 디스크에 있는 파일 덩어리인 프로그램을 메모리로 불러오면서 프로세스를 만든다. 그럼 만들어진 프로세스를 어떻게 실행할까?
프로그램이 실행된다는 것은 사실 프로세스 안에 있는 코드가 한 줄씩 실행되는 것이다.
코드는 보통 main() 부터 시작해서 하나씩 순서대로 내려가면서 실행된다.
public class Operator {
public static void main(String[] args) {
int sum1 = 1;
int sum2 = sum1 + 1;
System.out.println("sum1 = " + sum1);
System.out.println("sum2 = " + sum2);
}
}
생각해보면 어떤 무언가가 코드를 하나씩 순서대로 실행하기 때문에 프로그램이 작동하고 계산도 하고 , 출력도 할 수 있다. 이 코드를 실행하면서 내려가는 것의 정체가 바로 스레드 이다.
비유를 하자면 마치 실(Thread) 같은 것이 코드를 위에서 아래로 하나씩 꿰면서 하나씩 내려가는 것 같다.
이렇듯 프로세스의 코드를 실행하는 흐름을 스레드(thread) 라 한다. 스레드는 번역하면 "실" "실을 꿰다"라는 뜻이다.
하나의 프로세스 안에는 최소 하나의 스레드가 존재한다. 그래야 프로그램이 실행될 수 있다.
참고로 우리가 지금까지 작성한 자바 코드들은 모두 한 프로세스 내에서 하나의 스레드만 사용하는 단일 스레드였다.
정리하면 프로세스는 실행 환경과 자원을 제공하는 컨테이너 역할을 하고, 스레드는 CPU를 사용해서 코드를 하나하나 실행한다.
멀티스레드가 필요한 이유
하나의 프로그램도 그 안에서 동시에 여러 작업이 필요하다.
워드 프로그램으로 문서를 편집하면서, 문서가 자동으로 저장되고, 맞춤법 검사도 함께 수행된다.
유튜브는 영상을 보는 동안, 댓글도 달 수 있다.
앞서 멀티태스킹에서 설명한 운영체제의 스케쥴링 과정을 저 자세하게 알아보자.
아까는 cpu 코어가 실행하는것이 프로그램이라고 말했지만 자세히 말하면
프로세스 내부에 존재하는 스레드를 CPU 코어하나에 할당을 해서 실행하는것이다.



운영체제가 스레드를 어떻게 스케줄링 하는지 , 스케줄링 관점에서 알아보자.
운영체제는 내부에 스케줄링 큐를 가지고 있고, 각각의 스레드는 스케줄링 큐에서 대기한다.


CPU 코어가 2개 이상이면 한 번에 많은 스레드를 물리적으로 진짜 동시에 실행이 가능하다.
프로세스, 스레드와 스케줄링 - 정리
멀티태스킹과 스케줄링
프로세스와 스레드
프로세스의 역할