프로세스 : 컴퓨터에서 실행되고 있는 프로그램
CPU 스케줄링의 대상이 되는 작업이라는 용어와 거의 같은 의미로 쓰인다.
스레드 : 프로세스 내 작업의 흐름

프로그램이 메모리에 올라가면 인스턴스화된 것이 프로세스이다.
운영체제의 CPU 스케줄러에 따라 CPU가 프로세스를 실행한다.
컴파일(Compile) : 소스코드를 컴퓨터가 이해할 수 있는 기계어로 번역하여 실행할 수 있는 파일을 만드는 작업

위는 프로그램 컴파일 과정 사진이다.
전처리
컴파일러
어셈블러
링커

프로세스가 생성된 상태를 의미하며, fork() 또는 exec() 함수를 통해 생성 -> 이 때 PCB가 할당된다.
PCB(Process Control Block)?
- 프로세스의 메타데이터들이 저장되어 관리되는 영역
- 프로세스의 중요한 정보를 포함하고 있기 때문에 일반 사용자가 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리됨
- 프로세스 스케줄링 상태, 프로세스 ID 정보등을 관리
PCB에 대해서는 아래에서 더 다룰 것이다.
메모리 공간이 충분하면 메모리를 할당 받고, 아니면 아닌 상태로 대기하고 있으며 CPU 스케줄러부터 CPU 소유권이 넘어오기를 기다리는 상태
메모리 부족으로 일시 중단된 상태
CPU 소유권과 메모리를 할당받고 인스트럭션을 수행 중인 상태
어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
ex) 프린트 인쇄 버튼을 눌렀을 때 프로세스가 잠깐 멈추는 현상
중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태
메모리와 CPU 소유권을 모두 놓고 종료되는 상태

프로세스의 메모리 구조 사진이다.
스택과 힙은 동적 할당이 되며, 동적 할당이란 런타임 단계에서 메모리를 할당받는 것을 말한다.
스택 : 지역 변수, 매개 변수, 실행되는 함수에 의해 늘거나 줄어드는 메모리 영역이다. 함수가 호출될 때마다 호출될 때의 환경 등 특정 정보가 스택에 게속해서 저장된다.
힙 : 동적으로 할당되는 변수들을 담는다. 동적으로 관리되는 자료 구조의 경우 힙 영역을 사용한다. 예를 들어 vector는 내부적으로 힙 영역을 사용한다.
데이터 영역과 코드 영역은 정적 할당되는 영역이다.
정적 할당 은 컴파일 단계에서 메모리를 할당하는 것을 말한다. 여기서 데이터 영역은 BBS segment와 Data segment, code/text segment로 나뉘어서 저장하게 된다.
BBS segment 는 전역 변수 또는 static, const로 선언되어 있고, 0으로 초기화 또는 초기화가 어떤 값으로도 되어 있지 않은 변수들이 이 메모리 영역에 할당된다.
Data segment 는 전역 변수 또는 static, const로 선언되어 있고 0이 아닌 값으로 초기화된 변수를 이 메모리에 할당한다.
code segment 는 프로그램의 코드가 들어간다.
위에서 일부 작성했던 PCB에 대해서 더 다뤄보자.
PCB(Process Control Block)?
- 프로세스의 메타데이터들이 저장되어 관리되는 영역
- 프로세스의 중요한 정보를 포함하고 있기 때문에 일반 사용자가 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리됨
- 프로세스 스케줄링 상태, 프로세스 ID 정보등을 관리
PCB를 기반으로 프로세스의 상태를 저장하고 로드시키는 과정으로, PCB를 교환하는 과정이라고 보면 된다.
한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생한다.
컴퓨터는 여러 프로그램을 동시에 실행하는 것이 아니라 단 한 개만을 실행하고 있다.
싱글코어라고 생각하고 보자.
싱글코어일 때도 우리가 여러 개가 동시에 돌아간다고 생각하고 있는 이유는 이 컨텍스트 스위칭이 매우 빠르게 실행되고 있기 때문이다.

A프로세스가 실행하다 멈추고 A의 PCB를 저장하고 B프로세스를 로드하여 실행한다.
그리고 B PCB에 저장하고 A PCB를 다시 불러오는 방식이다.
이때 컨텍스트 스위칭이 일어날 때 대기하는 유효기간이 발생한다.
이뿐만 아니라 더 드는 비용이 있는데, 바로 캐시미스이다.
-> 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소 변환이 생기므로 캐시클리어 과정을 겪게 되는데, 이때 캐시미스 가 발생한다.
프로세스를 여러 개 수행하는 것
장점

프로세스끼리 데이터를 주고 받고, 공유 데이터를 관리하는 매커니즘
멀티프로세스는 IPC가 가능하다.
ex) 클라이언트와 서버
클라이언트 : 데이터를 요청
서버 : 클라이언트 요청에 응답
종류들에 대해서도 알아보자.
메모리를 완전히 공유하는 스레드보다는 속도가 떨어지는데 스레드에 대해서도 이후에 알아보자.

여러 프로세스가 동일한 메모리 블록에 대한 접근 권한이 부여돼 프로세스가 공유된 메모리에서 서로 통신하는 방식
장점
메모리 자체를 공유하기 때문에 불필요한 데이터 복사의 오버헤드가 발생하지 않아 가장 빠르다.
장점에 의한 고려사항
같은 메모리 영역을 공유하기 때문에 동기화 작업이 필요하다.
디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터를 말한다.
동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미한다.
예시로는 TCP, UDP가 있다.

프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고 받으며, 단방향 방식 의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식

파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 or 양방향 파이프
클라이언트/서버 통신을 위한 별도의 파이프를 제공하며, 여러 파이프를 동시에 사용할 수 있다.
이를 통해 컴퓨터의 프로세스끼리 또는 다른 네트워크 상의 컴퓨터와도 통신을 할 수 있다.

메시지를 큐에 형태로 관리하는 것을 의미한다.
커널의 전역변수 형태 등 커널에서 전역적으로 관리된다.
장점
프로세스의 실행 가능한 가장 작은 단위
프로세스는 여러 스레드를 가질 수 있다.

프로세스와 스레드의 차이점
프로세스는 코드, 데이터, 스택, 힙 영역을 각각 생성
스레드는 코드, 데이터 힙 영역을 서로 공유한다. 그 외의 영역은 각각 생성된다.
이는 프로세스 내 작업을 여러 개의 스레드, 멀티 스레드로 처리하는 기법을 말한다.
장점
단점
한 스레드가 문제가 생기면 다른 스레드도 영향을 끼친다는 단점이 있다.
동시성이란? : 서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것
시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수 등을 의미
이 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰이는 상황을 경쟁 상태 라고 한다.
이 때문에 접근의 타이밍이나 순서 등이 결과값에 영향을 준다.
예시 사진

둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
이를 해결하기 위해선 크게 뮤텍스, 세마포어, 모니터 세 가지가 있다.
이 방법 모두 상호 배제, 한정 대기, 융통성이라는 조건을 만족하며
위 3가지 방법에 토대가 되는 메커니즘은 잠금(lock) 이다.
ex) 화장실 사용 시 문 잠그고 사용한 뒤 나오면 다음 사람이 사용하는 것
프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금 해제하는 방식


일반화된 뮤텍스로, 간단한 정수 값과 두 가지 함수 wait 함수, signal 함수로 공유 자원에 대한 접근을 처리한다.
wait()는 자신의 차례가 올때까지 기다리는 함수이며, signal()은 다음 프로세스 순서로 넘겨주는 함수를 말한다.
공유 자원에 접근하려면, 세마포어에서 wait()를 수행하고 공유 자원을 해제하면 signal() 작업을 수행한다.
세마포어의 종류
바이너리 세미포어
0과 1의 두가지 값만 가질 수 있는 세마포어이다. 이는 신호 메커니즘으로 신호를 기반으로 일어난다.
카운팅 세마포어
이는 여러 개의 값을 가질 수 있는 세마포어이다. 여러 자원에 대한 접근을 제어하는데 사용된다.

둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유자원을 숨기고, 해당 접근에 대해 인터페이스만을 제공한다.
모니터와 세마포어의 차이점
교착 상태 : 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
은행원 알고리즘 을 쓴다.은행원 알고리즘
총 자원의 양과 현재 할당한 양을 기준으로 안정 또는 불안정 상태로 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘