스레드와 프로세스에 대해서 알아보기 전에, 멀티태스킹과 멀티프로세싱에 대해서 먼저 알아보고 들어가자~~
멀티태스킹에 대해서 설명하기 전에, 이가 왜 나왔는지부터 알아보자.

만약 위 사진과 같이, 프로그램을 2개 이상 동시에 실행한다고 했을 때, 연산을 처리할 수 있는 CPU코어가 1개만 있다고 가정해본다.


이렇게 했을경우, CPU코어가 하나로 가정하였기에, 한 번에 하나의 프로그램코드만 실행할 수있다. 초창기 위 사진과 같이, 하나의 프로그램 안에 있는 코드를 모두 실행한 후에야 다른 프로그램의 코드를 실행할 수 있었다. 예를 들면, 음악프로그램이 끝난 뒤에야 엑셀과 같은 다른 프로그램이 실행이 가능했다. 그렇기에 이를 해결하기 위해, 하나의 CPU 코어의 여러 프로그램을 동시에 실행하는 "멀티태스킹" 기술이 생겨났다.
하나의 컴퓨터 시스템이 동시에 여러 작업을 수행하는 능력을 의미.

위 사진과 같이, 하나의 CPU코어가 여러개의 프로그램들을 동시에 처리한다는 의미입니다. 처음엔 프로그램 A를 실행하고 그 다음은 프로그램 B를 실행하는 형태이다. 현대의 CPU는 초당 수십억 번 이상의 연산을 수행한다. 그렇기에 매우 빠르게 두 프로그램의 코드를 번갈아 수행하여, 사람이 느낄 때 두 프로그램이 동시에 실행되는 것처럼 보이게 하는 것이다.
컴퓨터 시스템에서 둘 이상의 CPU코어(프로세서)를 사용하여 여러 작업을 동시에 처리하는 기술. 멀티프로세싱 시스템은 하나의 CPU코어만을 사용하는 시스템보다 동시에 더 많은 작업을 처리할 수 있다.

위 사진과 같이, 여러 프로세서를 사용하여 프로그램의 여러 작업을 동시에 처리를 하는 것을 의미합니다.
멀티프로세싱은 하드웨어 장비의 관점, 멀티태스킹은 운영체제 소프트웨어 관점!
<멀티프로세싱>
- 여러 프로세서(CPU코어)를 사용하여 동시에 여러 작업을 수행하는 것을 의미한다.
- 하드웨어 기반으로 성능을 향상시킴.
<멀티태스킹>
- 단일 CPU가 여러 작업을 동시에 수행하는 것처럼 보이게 하는 것을 의미한다.
- 소프트웨어 기반으로 CPU시간을 분할하여 각 작업에 할당한다.

프로세스는 운영체제에서 프로그램을 실행하는 작업 단위를 의미함.
자바에서 예로 치면, 프로세스는 실행 중인 프로그램의 인스턴스라고 볼 수 있다. 프로그램은 클래스로 볼 수 있다. 각 프로세스는 독립적인 메모리 공간을 가지며, 운영체제에서 별도의 작업 단위로 분리해서 관리된다. 각 프로세스는 별도의 메모리 공간을 갖기에, 서로 간섭하지 않는다. 서로의 메모리에도 직접 접근할 수가 없다. 이렇듯 격리되어 관리되기에, 특정 프로세스에 심각한 문제가 발생해도 해당 프로세스만 종료되고, 다른 프로세스는 아무런 상관이 없다는 의미이다.
코드 섹션: 실행할 프로그램의 코드가 저장되는 부분
데이터 섹션: 전역 변수 및 정적 변수가 저장되는 부분
힙 (Heap): 동적으로 할당되는 메모리 영역
스택 (Stack): 메서드(함수) 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역(스레드에 포함)
스레드는 프로세스 내에서 실행되는 작업의 단위이다. 한 프로세스 내에서 여러 스레드가 존재 가능하며,이들은 프로세스가 제공하는 동일한 메모리 공간을 공유함. 프로세스는 하나 이상의 스레드를 반드시 가진다.
공유 메모리: 같은 프로세스의 코드 섹션, 데이터 섹션, 힙(메모리)은 프로세스 안의 모든 스레드가 공유한다.
개별 스택: 각 스레드는 자신의 스택을 갖고 있다.
프로그램이 실행된다는 의미는 운영체제가 디스크에 있는 파일 덩어리인 프로그램을 메모리로 불러오며, 프로세스를 만든다. 그 후 프로세스 안에있는 코드가 한 줄 한 줄 실행이된다. 이렇게 하나씩 실행하는 정체는 스레드이다. 하나의 프로세스 내 하나의 스레드가 존재할 수 있고, 여러개가 존재할 수 있다.
- 단일 스레드 : 한 프로세스 내 하나의 스레드만 존재
- 멀티 스레드 : 한 프로세스 내 여러 스레드가 존재
=> 프로세스는 실행 환경과 자원을 제공하는 컨테이너 역할을 하고, 스레드는 CPU를 사용해 코드를 하나하나 실행하는 것이다.
하나의 프로그램도 그 안에서 여러 작업이 필요하다.
예를 들자면, 유튜브를 보면서 댓글을 달 수 있어야한다.
1. 스레드 : 유튜브 재생
2. 스레드 : 댓글 작성
이렇듯 한 프로세스 내 두 개의 스레드로 동시에 여러 작업을 처리하기 위해 멀티 스레드가 필요하다.

그렇다면, 예를 들어 해당 프로세스가 여러개가 있고 해당 프로세스에 멀티스레드인 프로세스도 있으며, 코어는 단일 코어가 있다. 그랬을 경우, 위 사진과 같이 프로세스 A의 스레드를 처리하고 그 후, 프로세스B의 스레드B1을 처리하듯이 코드를 하나하나 실행해 반복을한다.
이번엔 운영체제가 어떻게 스레드를 스케줄링 하는지, 스케줄링 관점에서 보자. 운영체제는 내부에 스케줄링 큐를 가지고 있으며, 각각의 스레드는 스케줄링 큐에서 대기한다.

이런 형태로 쓰레드를 넣고 뺴고 하며 반복하여 실행을 한다.
만약, CPU 코어가 2개 이상이면 한 번에 더 많은 스레드를 물리적으로 동시에 실행할 수 있다.

멀티 태스킹은 동시에 여러 작업을 수행하는 것을 의미한다. 이를 위해 운영체제는 스케줄링 기법을 사용한다. 스케줄링은 CPU 시간을 여러 작업에 나누어 배분하는 방법이다.
- 프로세스는 실행 중인 프로그램의 인스턴스로, 각 프로세스는 독립적인 메모리 공간을 가지며 운영체제에서 독립된 실행 단위로 취급한다.
- 스레드는 프로세스 내에서 실행되는 작은 단위이다. 여러 스레드는 하나의 프로세스 내에서 자원을 공유하며, 프 로세스의 코드, 데이터, 시스템 자원등을 공유한다.
- 프로세스가 컨테이너 역할을 한다
- 로세스 자체는 운영체제의 스케줄러에 의해 직접 실행되지 않으며, 프로세스 내의 스레드가 실행된다. 스레드는 1개 이상으로 구성된다.
그렇다면? 멀티태스킹이 반드시 효율적인가? 다음 장에서 작성하겠습니다~~