메모리 상에서 실행되고 있는 프로그램 단위를 프로세스라고 합니다.
Task 또는 Job과도 혼용하여 사용합니다.
윈도우에서 프로그램을 실행할 수 있는 .exe 파일을 실행하면 메모리 상에 프로그램이 올라가게 되며 그것은 프로세스라고 부릅니다.
OS마다 제어프로그램을 들어가면 활성화 되어 있는 프로세스를 확인 할 수 있습니다.

프로세스의 구조는 크게 4가지로 구성되어 있습니다.

Code에서 함수 또는 명령을 실행하고 실행명령은 Stack에 쌓이게 되고, Stack에 쌓여있는 명령들을 순차적으로 실행가게 됩니다.
프로세스는 여러개가 실행되고 있습니다.
하지만 어떤 순서로, 또 단일 CPU에서 어떻게 동시에 사용이 가능할까요?
스케쥴링 알고리즘을 통해 프로세스의 실행순서를 관리하고 실행하도록 해줍니다.
기본적인 시스템 알고리즘으로 FIFO로 실행순서를 주어 순차적으로 실행하게 합니다.
프로세스1 -> 프로세스2 -> 프로세스3
하지만 배치시스템은 실행이 완료되어야 다음 프로세스를 실행시키며, 프로세스1에 실행이 오래걸린다면 프로세스2를 실행하지 못하는 문제점을 가지고 있습니다.
시분할 시스템은 다중사용자를 목적을 가지고 있으며, CPU를 점유하는 시간을 잘게 쪼개어 실행하도록한 시스템입니다.
프로세스1(1/10) -> 프로세스2(1/10) -> 프로세스1(2/10) -> 프로세스2(2/10)
최초로 멀티 프로세스가 적용된 OS는 Unix로, 비슷한 기능을 하는 무료 배포판 OS로 Linux가 있습니다.
시분할 시스템과 동작하는 알고리즘은 똑같으나, 시스템의 목적이 다릅니다.
멀티 태스킹은 여러 프로그램을 동시에 실행하는것처럼 보이도록 합니다.
문맥 교환이라고 부르며 실행할 프로세스를 교체하는 기술입니다.
멀티 스케쥴링 알고리즘을 통해 프로세스를 변경해주는 기술이며, 사람이 인식하지 못할 속도로 프로세스를 교체해주며 동시에 실행하는것과 같이 보여줍니다.
하지만 프로세스가 교체되었을 경우 처음부터 다시 시작하며, 어디까지를 실행시켰고 어디서부터 다시 실행해야하는지에 대해서는 알수가 없습니다.
코드는 주소값을 가지고 있으며 이것을 PCB라는 곳에 저장합니다.
컨텍스트 스위칭은 빈번하게 일어나며 어셈블리어로 되어있습니다.
PCB(Process Control Block)는 프로세스 제어 블록으로 실행중인 프로세스를 구조화하여 저장합니다.
구조

출처 : https://binaryterms.com/process-control-block-pcb.html
컨텍스트 스위칭이 될 때 PID와 Register(PC, SP)를 PCB에 저장하고 메인메모리에 저장합니다.
만약 다시 실행 순서가 돌아왔을 경우 메인메모리에서 PCB 정보를 가져와 전에 실행했던 부분부터 다시 실행하도록 해줍니다.
프로세스에서 동작하고 있는 흐름의 단위를 스레드라고 합니다.
스레드는 프로세스에서 동작하는 흐름의 단위입니다.
만약 단일 스레드로 구성된 프로세스에서는 스레드가 끝나기 전까지 다른 동작을 할 수가 없게 됩니다.
단일 스레드로도도 개인프로젝트나, 동작시간이 길지 않고 사용자가 많지 않다면 충분히 지연없이 사용할 수 있습니다.
하지만 현업에서 프로젝트를 하게 된다면 많은 트래픽과 많은량의 코드를 접할 수 있습니다.
이러한 환경에서는 멀티스레드는 선택이 아닌 필수입니다.
멀티 스레드는 단일 스레드와 달리 조심해야 하는 부분이 있는데 바로 동기화 입니다.
멀티 프로세스같은 경우 단일 프로세스로 각자의 메모리를 사용합니다.
하지만 멀티 스레드는 하나의 프로세스를 여러 스레드가 사용하기에 메모리를 공유하게 됩니다.
만약 하나의 변수의 데이터를 동시에 수정하게 되었을시에 문제가 발생하게됩니다.
스레드의 동기화는 코드로서 해결이 가능하고 각 언어들은 라이브러리를 제공합니다.
다른 스레드가 동작하고 있을때 다른 쓰레드가 동작하지 못하도록 합니다.
스레드의 숫자를 제한 할 수 있습니다.
만약 하나의 스레드로 제한을 하게되면 Mutual excusion와 동일한 기능을 하게됩니다.
스레드의 제한을 주었을 경우 발생할 수 있는 문제입니다
멀티프로세스와 멀티스레드는 둘다 동시성을 가지고 동작된다는 공통점이 있습니다.
하지만 멀티프로세스는 메모리 공유가 되지 않으며 IPC를 통해 공유할 수 있고,
몰타스레드는 하나의 프로세스에서 동작하며 메모리를 공유한다는 차이점을 가지고 있습니다.
또 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠릅니다.
스레드는 프로세스에서 동작하는 단위다라고만 알고 있었는데 동기화와 같이 어려운 부분들이 많이 나온거 같습니다. 프로그래밍과 연관된 부분이 많오는거 같아 나중에 다시 한번 정리해야겠습니다