[ 1. 프로세스 컴파일 ]
- 프로그램(Program)
⇒ HDD/SDD 등의 디스크에 존재하는 실행 가능한 파일 (코드)
- 프로세스(Process)
= CPU 스케쥴링의 대상 = Task⇒ 메모리로 프로그램을 가져와 실행 중인 상태
컴파일 : 고수준언어(친-인간)를 저수준언어(친-기계)로 변환 하는 작업
- 전처리 과정 (Pre-processing)
- 주석 제거
- 헤더 병합
- 컴파일 과정 (Compliation) : 전처리된 소스코드를 어셈블리어로 바꾸는 과정
- 언어의 문법 검사
- Static 영역의 메모리 할당
- 어셈블리 과정 (Assembly) : 어셈블리 코드를 오브젝트 파일(순수 기계어)로 변경
- 링킹 과정 (Linking) : 현재 코드의 오브젝트 파일과, 필요한 라이브러리 파일을 링크 하여 최종 실행 파일 생성
[ 2. 프로세스 상태 ]
- 활동 상태 (Create → Ready → Running or Blocked → Terminated)
- Created (생성) : PCB가 만들어져 프로세스가 만들어진 상태 (exec or fork[상속])
- → Ready : 메모리 공간을 검사 및 공간 할당
- → Suspended Ready : 공간이 없으면 보류 준비
- Ready (준비) → 책에서는 대기
⇒ CPU만 할당 되면 바로 실행
- → Running (Dispatch) : CPU를 할당 받고 실행
- → Suspended Ready : CPU가 할당되지 못해 주어진 메모리를 뺏긴 상태
- Running (실행) : CPU를 할당 받아 실행 중인 상태
- → Ready (Timeout) : 시간 할당량을 소진하여 CPU를 뺏긴 상태
- → Blocked : 입출력 처리가 필요해 호출 하고 결과를 기다리는 상태
- CPU는 바로 다음 준비 상태 프로세스 실행
- Blocked (대기) → 책에서는 중단
⇒ 입출력 처리, 자원 요구 등으로 인해 CPU를 양도하고 대기
- → Ready : 조건이 충족되어 CPU 할당을 기다리는 상태
- → Suspended Blocked : 메모리를 뺏겨 보류 대기
- Terminated (종료)
- 모든 자원이 회수 및 PCB 삭제
- Created (생성) : PCB가 만들어져 프로세스가 만들어진 상태 (exec or fork[상속])
중단 상태 (Suspended Ready & Suspended Block)
- Suspended Ready : 바로 메모리를 받지 못할 때
- 준비 또는 실행 상태에서 메모리를 잃게 될 때
- Suspended Blocked : 대기 상태일 때 메모리 공간을 잃은 상태
- 입출력을 대기 할 때
- 필요한 자원을 기다릴 때
→ Suspended Ready는 메모리 할당만
→ Suspended Blocked는 필요한 작업 + 메모리 할당을 모두 완료 해야 복구
[ 3. 메모리 할당 및 PCB ]
동적 영역 : Stack & Heap (in Runtime)
정적 영역 : Data & Code (in Compile)
- 데이터 영역 : BSS segment & Data segment👉데이터 영역은 둘 다 전역 변수, static, const 등을 저장하지만,
→ BSS에는 0 또는 초기화되지 않은 값을static int x;
,int y;
→ Data에는 0이 아닌 초기값이 있어야 저장static int x = 10;
- 코드 영역 : Code segment
PCB(Process Control Block) : 프로세스의 상태 정보를 저장하는 자료구조
- 메타데이터 : 어떠한 정보를 설명하는 데이터 정보
- 파일에서의 이름, 크기, 생성/수정 날짜 등…
- PCB는 그 자체로 프로세스를 설명하는 메타 데이터 정보
컨텍스트 스위칭 (Context Swtiching)
⇒ 인터럽트나 시스템 호출 등으로 실행 중인 프로세스의 제어를 다른 프로세스에 넘겨주는 것
트리거
- 주어진 Time Slice(Time Quantum)를 전부 소비
- I/O 작업
- 다른 리소스 대기
- 인터럽트(Interrupt)
Dispatcher Latency (with cache miss)
⇒ P1에서 P2로 컨텍스트 스위칭이 발생할 때, P1 상태는 PCB1에 저장해야하고, P2의 상태를 PCB2에서 불러와야하기 때문에 발생하는 latency
[ 3. 멀티 프로세스 및 멀티 스레드 ]
멀티 프로세싱 : 프로세스의 병렬처리
- IPC(Inter Process Communication) : 프로세스간 통신 메커니즘
⇒ Process는 독립된 실행 객체이므로 서로 통신 하기 위해서는 다른 설비가 필요
(for 데이터 통신 및 공유 데이터 관리)
- 공유 메모리 : 메모리 접근 권한을 공유
- 소켓 : 네트워크를 이용한 프로세스간 통신 데이터 (TCP/UDP)
- Unnamed Pipe : Half-Duplex 반 이중 통신
⇒ 두 개의 프로세스를 연결하되 한쪽은 쓰기만, 한쪽은 읽기만 가능
- 같은 PPID(부모)를 가지는 프로세스끼리만 통신 가능
- Named Pipe : Half-Duplex 반 이중 통신
⇒ 서로 다른 모든 프로세스 사이에서의 통신이 가능하나, 단방형성
멀티 스레딩 : 프로세스 내 작업을 여러 스레드로
- 스레드(Thread) : 프로세스의 가장 작은 실행 단위
- 멀티 스레드들은 다른 모든 영역을 공유하되, Stack 영역은 각자 가짐
- 임계 영역 (Critical Section)
⇒ 둘 이상의 프로세스나, 스레드가 동시 접근 할 때, 실행 순서 등에 따라 결과가 바뀔 여지가 있는 영역
- Mutex (Lock을 관리하는 객체) Lock/Unlock - 잠금 메커니즘
- Semaphore (일반화된 Mutex) INT+Wait/signal (P/V) - 신호 메커니즘 👉Mutex는 스레드에 Lock/Unlock 권한이 있음 : 본인이 들어가서 잠구고 작업이 끝나면 해제하는 방식
Semaphore는 메커니즘에 제한이 있음 : 정해진 인원 제한이 있고, 새 인원이 들어오기 전에 현재 몇 명이 들어 있는지를 확인, 제한 인원 보다 낮으면 출입 가능
wait(S) {
while (S <=0 ); /* busy waiting*/
S--;
}
signal(S) {
S++;
}
struct semaphore {
int value;
Queue list;
};
wait(S):
S->value--;
if (S->value < 0) {
add this process to S->list;
sleep();
}
signal(S):
S->value++;
if (S->value <= 0) {
remove a process P from S->list;
wakeup(P);
}
- 교착 상태 (DeadLock)
둘 이상의 프로세스가 각자 자원을 점유했지만 작업을 위해서 해당 자원 모두가 필요해, 무한정 기다리는 상황
- 상호 배제 : 한 프로세스의 자원 독점
- 점유와 대기 : 점유한 자원을 다른 프로세스가 요청
- 비선점 : 강제로 가져오기 불가
- 순환대기 : 서로가 서로에게 자원 요청
은행원 알고리즘 : DeadLock 회피 방법
- 자원을 일부 분배
- 남은 자원의 일부를 이용해서 가능성에 추가 분배
- 예시로 B에 1달러 부여
- B가 완료 → 은행에 5달러
- 남은 자원으로 C에 3달러 더 해서 총 6달러 부여 = 은행에 2달러
- …
교착 상태 해결
- 3, 3, 3.5를 분배 = 은행에 0.5달러
- 0.5달러로는 어느 한 개의 프로세스도 만족 시킬 수 없음
교착 상태
(Ex P1→P4→P3→P2)
- Allocated : 각 프로세스가 현재 소유하고 있는 자원의 수
Maximum : 프로세스가 정상 작동하기 위해 필요한 자원의 수
Available : 시스템이 소유한 남은 자원 (A,B,C)의 각 수 : p1과는 무관
- Tip1 : Maximum - Allocated > Available이면 은행이 줄 수 있는 자원으로 해당 프로세스를 작동시킬 수 없음 ⇒ Fail
- Tip2 : 해당 프로세스가 완료되면 사용 완료된 자원이 모두 Available로 변한다.
https://baebalja.tistory.com/340