[출처] 김영한 자바-고급 1편 멀티스레드와 동시성
프로그램의 실행이란 프로그램을 구성하는 코드 순서대로 CPU에서 연산하는 일이다.
초창기의 컴퓨터는 한 번에 하나의 프로그램만 실행했다.
이를 해결하기 위한 CPU코어로 여러 프로그램을 동시에 실행하는 기술
즉 하나의 컴퓨터 시스템이 동시에 여러 작업을 수행하는 능력을 멀티태스킹이라 한다.
- CPU에 어떤 프로그램이 얼마만큼 실행될지는 운영체제가 결정하는데
이것을 스케줄링(scheduling)이라 하고 이때 단순히 시간으로만 작업을 분할하지는 않고,CPU를 최대한 활용할 수 있는 다양한 우선순위와 최적화 기법을 사용한다.
컴퓨터 시스템에서 둘 이상의 프로세서(CPU 코어)를 사용하여 여러 작업을 동시에 처리하는 기술을 의미한다. 멀티프로세싱 시스템은 하나의 CPU코어만 사용하는 시스템보다 동시에 더 많은 작업을 처리할 수 있다.

프로세스는 실행 중인 프로그램의 인스턴스이다.
각 프로세스는 독립적인 메모리 공간을 갖고 있으며, 운영체제에서 별도의 작업 단위로 분리해서 관리된다.
프로세스는 각각 별도의 메모리 공간을 갖고 있기 때문에 서로 간섭하지 않으며 서로가 서로의 메모리에 접근할 수도 없다.
따라서 특정 프로세스에 오류가 발생 했을때 해당 프로세스만 종료되는 이유는 이러한 이유이기 때문이다.
프로세스는 하나 이상의 스레드를 반드시 포함한다.
스레드는 프로레스 내에서 실행되는 작업의 단위이다. 한 프로세스 내에서 여러 스레드가 존재할 수 있으며,이들은 프로세스가 제공하는 동일한 메모리 공간을 공유한다. 스레드는 프로세스보다 단순하므로 생성 및 관리가 단순하고 가볍다.
스레드는 프로세스 내에서 실행되는 작업의 단위이다. 프로세스 안에는 하나의 스레드가 존재할 수도 있고, 여러 스레드가 존재할 수도 있다. 그리고 프로세스가 제공하는 동일한 메모리 공간을 스레드는 공유한다. 이를 공유 메모리 라고 한다.
운영체제는 내부에 스케줄링 큐를 가지고 있다. 각각의 스레드는 스케줄링 큐에서 대기한다.
예) 단일 코어 스케줄링
스레드A를 멈추는 시점에 CPU에 사용하던 값들을 메모리에 저장해두어야 한다.
이후 스레드A를 다시 실행할 때 이 값들을 불러와야 한다.
이러한 과정을 컨텍스트 스위칭이라고 한다.