1) 프로세스와 컴파일과정
2) 프로세스의 상태
3) 프로세스의 메모리구조
4) PCB
5) 멀티프로세싱
6) 스레드와 멀티스레딩
7) 공유자원과 임계영역
8) 교착상태
프로세스: 컴퓨터에서 실행되고 있는 프로그램을 말하며 CPU 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰입니다.
프로세스 컴파일 과정

컴파일 과정은 4가지 단계 전처리과정 -> 컴파일 과정 -> 어셈블리 과정 -> 랭킹 과정으로 나누어진다.
전처리 과정: 전처리기를 통해 소스 코드 파일(.c)을 전처리된 소스 코드파일(.i)로 변환하는 과정이다.
이때 대표적으로 주석제거,헤더 파일 삽입,매크로 치환 및 적용 작업을 수행한다.
컴파일과정: 컴파일러를 통해 전처리된 소스코드 파일을 어셈블리어 파일로 변환하는 과정이다.
이 과정에서 언어의 문법 검사가 이루어지고 static한 영역(Data,BSS영역)들의 메모리 할당을 수행한다.
어셈블리 과정: 어셈블러를 통해 어셈블리어(.s)을 오브젝트 파일(.o)로 변환하는 과정이다.
여기서 오브젝트 파일이란 어셈블리 코드는 이제 더 이상 사람이 알아볼 수 없는 기계어로 변환되는데 이를 오브젝트 코드라 부른다. 오브젝트 코드로 구성된 파일을 오브젝트 파일이라 부르며 이 오브젝트 파일은 특정한 파일 포맷을 가진다.
링킹과정: 링킹과정은 링커를 통해 오브젝트 파일들을 묶어 실행파일로 만드는 과정이다. 이 과정에서 오브젝트 파일들고 ㅏ프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행 파일을 만든다.
링커의 역할은 크게 심볼 해석과 재배치로 나뉜다.
심볼해석
각 오브젝트 파일에 있는 심볼 참조를 어떤 심볼 정의에 연관시킬지 결정화는 과정이다.
재배치
재배치는 오브젝트 파일에 있는 데이터의 주소나 코드의 메모리 참조 주소를 알맞게 배치하는 과정이다.


생성(create)
: 프로세스의 생성, fork(),exec() 함수를 통해 생성
준비(ready)
: 프로세스가 cpu를 사용하고 있지 않지만 언제든지 사용할수 있는 상태, 우선순위 가 높은 프로세스 부터 실행
실행(running)
: 프로세스가 cpu를 차지하여 명령어들 실행되는 상태
중단(block)
: 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태 또는 I/O 디바이스에 의한 인터럽트로 이런 현상 발생
대기(waiting)
: 보류라고도 부름, 입출력 완료,시그널 수신 등 어떤 사건을 기다리고 있는 상태.
준비 -> 실행 (Dispatch)
: 준비 큐 맨앞에 있는 프로세스가 프로세스를 점유하는 것을 디스패치라고함.
실행 -> 준비(Timeout)
: 운영체제는 프로세스의 독점을 방지하기 위해 인터럽트 클록을 두어 일정 시간만 점유하도록 제한 한다. (할당된 시간 만료)
실행 -> 대기(Block)
: 할당된 시간 이전에 실행 상태의 프로세스에 입출력 연산 또는 자원 요청 등의 문제로 프로세스를 스스로 넘기는 경우
대기 -> 준비(Wakeup)
: 입출력 작업이 끝나거나 문제가 해결된다면 대기 상태에서 준비 상태가 된다.
동적영역: 스택,힙
정적영역: 데이터영역,코드영역
스택: 지역변수,매개변수, 실행되는 함수에 의해 늘어들거나 줄어드는 메모리 영역. 함수가 호출될 때마다 호출될 때의 환경 등 특정 정보가 스택에 계속해서 저장됩니다.
힙: 힙은 동적으로 할당되는 변수들을 담고 malloc(),free() 함수를 통해 관리할수 있으며 동적으로 관리되는 자료 구조의 경우 힙 영역을 사용한다.
데이터 영역: BSS 세그먼트, Data 세그먼트 ,code/test 세그먼트로 나뉘어서 저장된다.
: PCB는 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터를 말한다. 여기서 메타데이는 데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터이다. 프로세스가 생성되면 운영체제는 해당 PCB를 생성한다.
프로세스 제어블록 (PCB) 내용
문맥교환(Context switching)
:운영체제는 현재 실행중인 프로세스 외의 프로세스를 실행하기 위해 메모리 적재된 pcb를 교체하는데 이를 문맥교환, 컨텍스트 스위칭이라고 한다.

: 멀티 프로세싱은 다수의 프로세서가 협력적으로 일을 처리하는 것을 의미한다. 프로세스는 실행되는 프로그램이고 프로세서는 cpu를 의미한다.
즉 여러개의 cpu가 여러 프로그램을 처리하고 있다고 말할수 있다.

멀티프로세스는 IPC 가 가능하다.
IPC(Inter Process Communication )
: IPC는 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘을 뜻한다.(ex. 서버와 클라이언트가 요청하고 응답하는 것)
IPC종류
공유메모리: 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신 할 수 있도록 공유 메모리를 생성해서 통신하는 것(하드웨어적인 면에서 RAM을 나타냄)
파일: 파일은 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터를 말한다
소켓: 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미하며 TCP와 UDP가 있다.
익명파이프: 프로세스 간에 FIFO 방식으로 읽히는 임시공간인 파이를 기반으로 데이터를 주고받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식을 말한다.
명명파이프: 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 양방향 파이프를 말한다.
메세지큐: 메시지를 큐 데이터 구조 형태로 관리하는 것을 의미한다.
스레드: 프로세스의 실행 가능한 가장 작은 단위.
스레드는 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 heap,data,code 영역을 공유한다.
멀티 스레딩: 멀티 스레딩은 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법이며 스레드끼리 서로 자원을 공유 하기 때문에 효율성이 높다.
멀티스레드의 장점
단점
공유자원: 공유자원은 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터,프린터,메모리,파일, 데이터 등의 자원이나 변수 등을 의미한다.
경쟁상태: 이 공유 자원을 두개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁상태라고 한다. (ex. 공유 데이터 접근, 자원 예약, 상태업데이트)
임계영역: 공유자원에 접근할 때 순서 등의 이유로 결과가 달라지는 영역을 임계영역이라고 한다. 공유자원을 여러 프로세스가 동시에 접근할 때, 잘못된 결과를 만들 수 있기 때문에, 한 프로세스가 임계구역을 수행할 때는 다른 프로세스가 접근하지 못하도록 해야한다.
이러한 경쟁상태와 임계영역은 동기화 메컨니즘을 사용하여 해결할수 있다.
locking(잠금)
-임계구역을 말 그대로 잠그는 메커니즘이다. 하나의 프로세스, 쓰레드가 임게구역을 사용하고 있으면 문을 잠궈서 다른 프로세스, 쓰레드가 들어오지 못하게 한다. 사용중인 프로세스,쓰레드가 사용을 완료하면 다음 프로세스, 쓰레드가 들어갈수 있는 방식이다.
mutex(상호 배제)
-상호배제의 약자로 뮤텍스는 공유자원을 사용하기 전에 설정하고 사용한 후에 해제하는 잠금이다. 잠금이 설정되면 다른 프로세스, 쓰레드는 잠긴 코드 영역에 접근할수 없다. 또한 뮤텍스는 하나의 상태만 (잠금,잠금해제) 가진다.
3.semaphore(세마포어)
-세마포어는 일반화된 뮤텍스이다. 간단한 정수 값과 두가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리한다.
프로세스가 공유자원에 접근하면 세마포어에서 wait() 작업을 수행하고 프로세스가 공유자원을 해제하면 세마포어에서 signal() 작업을 수행한다. 세마포어에서는 조건 변수가 없고 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없다.
교착상태: 일련의 프로세스들이 서로가 가진 자원을 기다리며 block 되어 더이상 진행이 될수 없는 상태이다.
교착상태는 시스템 자원에 대한 요구가 엉킨 상태로, 두 프로세스가 사용하는 자원을 서로 기다리고 있을 때 발생한다.
교착상태 발생 4가지 조건

교착상태 해결 방법