OS
- os = opearting system의 약자
- hardware를 관리하고, application과 hardware 사이에서 interface 역할을 하며 시스템의 resource와 동작을 관리하는 시스템 소프트웨어
주된 기능들
process management
- CPU가 프로세스가 여러개일 때, CPU 스케줄링을 통해 관리하는 것.
- CPU가 process들에게 잘 할당되어 있는지 확인.
- process들이 공유자원에 접근하는 것 또는 통신하는 것을 관리.
process & thread
- process
- memory에 올라가서 실행이 되는 프로그램
- 기본적으로 thread하나 이상.
- process끼리는 독립적임.
- thread
- process안에서 실행되는 흐름의 단위
- 즉, CPU 입장에서 최소 작업 단위
- thread별로 stack만 할당받고 나머지는 공유한다.
process의 주소 공간
- 데이터를 최대한 공유해서 메모리 사용량을 줄여주기 위함
- code: 코드가 저장되어 있는 부분
- data: 전역변수, 정적변수, 배열등
- heap: 동적할당을 했을 경우 저장되는 곳
- stack: 지역변수, 파라미터, return 값을 저장하는 부분.
multi-process
- 하나의 application을 여러개의 process로 구성하여 다수의 CPU가 각 프로세스를 병렬적으로 처리하는 것.
- 장점
- memory 침범문제를 os차원에서 해결
- 하나의 process가 죽어도 다른 process에 영향을 끼치지 않아 작업이 종료되지 않는다.
- 단점
- process별로 독립된 메모리를 갖고 있어서, 작업량이 많으면 overhead 발생. context switching으로 인한 성능저하.
- context switching: 동작중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던 프로세스 상태를 복구하는 과정.
- process는 각 독립된 메모리 영역을 사용하므로, 캐시 메모리 초기화와 같은 무거운 작업이 진행되었을 때 overhead가 발생할 문제가 존재.
multi-thread
- 하나의 process에서 여러 thread를 구성해 각 thread가 하나의 작업을 처리하는 것.
- 장점
- 공유 메모리 만큼의 시간, 리소스 손실이 감소된다.
- 단점
- 하나의 thread가 망가지면 모든 thread가 망가진다.
- 단점은 critical section을 통해 대비함.
multi-programming
- 하나의 processor가 하나의 process를 수행하는 동안 다른 process에 접근할수 있도록 하는 방법
- 초기 컴퓨터는 하나의 processor가 하나의 process만 처리할 수 있도록 설계돼서 하나의 프로세스를 처리하는 과정에서 프로세서의 처리 속도와 입출력 속도 간의 차이로 인해 입출력 처리가 완료될때까지 기다려야 했음
- multi programming은 입출력이 완료될 때까지 기다리는 시간을 버리지 않고 다른 프로세스를 처리할 수 있도록 해준다.
multi-tasking
- 다수의 task를 os의 스케줄링에 의해 번갈아가면서 수행하도록 해주는 것을 의미
- processor는 한번에 하나의 작업만 수행할 수 있음에도 불구하고 우리가 여러 프로그램을 동시에 실행할 수 있는건, os가 다수의 작업을 스케줄링하여 우리가 작업이 동시에 수행되는 것처럼 느끼게 해주기 때문.
- multi-tasking의 스케줄링 방식은 아래 방식들을 사용하여 수행된다.
- multi-programming
- time-sharing (시분할 방식)
- CPU의 전체 사용 시간을 작은 작업 시간량으로 분할하여 그 시간량 동안 작업에게 번갈아가며 CPU를 할당해주는 방식
- real-time (실시간 시스템 방식)
PCB & TCB
- PCB = process control block
- process metadata들을 저장해 놓는 곳, 한 PCB안에는 한 process의 정보가 담김.
- CPU에서 프로세스의 상태에 따라 교체작업이 이루어질때, 앞으로 다시 수행할 대기중인 process에 관한 저장값을 PCB에 저장해 두는 것.
- Linked List 방식으로 관리된다.
- process 완료시 linked list에서 제거된다.
- TCB = thread control block
- process내부의 thread의 정보를 저장하기 위함
- PC, register set(CPU정보), PCB 포인터 저장.
- context switching의 기본단위.
Context Switching
- CPU가 이전의 process 상태를 PCB에 보관하고, 또 다른 process의 정보를 PCB에 읽어 register에 적재하는 과정.
- 인터럽트가 발생하고나, 실행중인 CPU 사용 허가시간을 모두 소모하거나, 입출력을 위해 대기해야 하는 경우에 발생.
- context switching overhead는 context switching을 하기 위해 들어가는 간접적인 처리 시간과 메모리를 의미한다.
- CPU가 쉬지않고 process를 수행시키도록 하기 위해서 context switching overhead를 감수해야 한다.
IPC - Inter process communication
- 독립적으로 실행되는 프로세스 간의 통신을 가능하게 해주는 것.
- process는 kernel에서 제공하는 IPC 설비를 이용해 통신을 한다.
- kernel: os의 핵심이 되는 프로그램으로, 시스템의 모든 것(보안, 자원관리, 추상화)을 통제한다.
DeadLock
- process가 자원을 얻지 못해서 다음 처리를 하지 못하는 상태를 의미한다.
- 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생한다.
발생하는 경우
- 멀티 프로그래밍 환경에서 한정된 자원을 얻기 위해 서로 경쟁하는 상황 발생했을 때
- 한 process가 자원을 요청했을 때, 동시에 그 자원을 사용할 수 없는 상황이 발생하고 process가 대기상태에 들어감
- 대기 상태로 들어간 process들이 실행 상태로 변경될 수 없을때 deadlock 발생
발생 조건
아래 네가지 조건을 모두 만족해야 함.
- Mutual exclusion - 상호배제
- Hold and wait - 점유 대기
- 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재해야 함.
- No preemption - 비선점
- 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없음
- Circular wait - 순환대기
- 각 프로세스는 순환적으로 다른 프로세스가 요구하는 자원을 갖고 있다.
처리방법
- prevention - 예방
- 교착 상태 발생 조건 중 하나를 제거한다. -> 자원낭비 심함
- 상호배제 부정: 여러 프로세스가 공유자원 사용
- 점유대기 부정: 프로세스 실행 전 모든 자원 할당
- 비선점 부정: 자원 점유중인 프로세스가 다른 자원 원할경우 빼았을 수 있음.
- 순환대기 부정: 자원이 고유한 번호를 갖고 있고 필요한 자원을 번호가 작은 것부터 순서대로 사용하도록 함.
- avoidance - 회피
- 은행원 알고리즘(banker's algorithm)
- 프로세스가 자원을 요구할 때, 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지 사전에 검사함.
- 안정 상태면 자원을 할당하고, 아니면 다른 프로세스들이 자원을 해지할때까지 대기함으로써 deadlock 방지
- deadlock 탐지 및 회복
- 교착 상태가 되도록 허용한 다음에 회복시키는 방법
- Detection - 탐지
- 자원 할당 그래프를 통해 교착 상태를 탐지함.
- 자원 요청 시, 탐지 알고리즘을 실행시켜 그에 대한 오버헤드 발생.
- Recovery - 회복
- 교착 상태를 일으킨 프로세스를 종료하거나, 할당된 자원을 해제시켜 회복시킴
- 프로세스 종료 방법
- 교착 상태의 프로세스를 모두 중지
- 교착 상태가 제거될 때까지 하나씩 중지
- 자원 선점 방법
- 교착 상태의 프로세스가 점유하고 있는 자원을 선점해 다른 프로세스에게 할당(해당 프로세스 일시 정지)
- 우선 순위가 낮은 프로세스나 수행 횟수가 적은 프로세스 위주로 선점.
Race condition - 경쟁상태
공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 결과값에 영향을 줄 수 있는 상태를 race condition이라 한다.
발생 조건
- 커널 작업을 수행하는 중에 interrupt 발생할 때
- 커널모드에서 데이터를 로드하여 작업을 수행하다가 interrupt가 발생하여 같은 데이터를 조작하는 경우
- 커널모드에서 작업을 수행하는 동안, interrupt를 disable하게 하면 방지할 수 있다.
- 프로세스가 system call을 하여 커널 모드로 진입하여 작업을 수행하는 도중 context switch가 발생할 때
- 프로세스1이 커널모드에서 데이터 작업을 하던중, 소모시간이 끝네 프로세스2로 넘어가고 이게 또 같은 데이터를 조작하는 경우
- 프로세스가 커널모드에서 작업할 때, 시간 제한을 두지 않으면 방지할 수 있음
- 멀티 프로세서 환경에서 공유 메모리 내의 커널 데이터에 접근할 때
- 멀티 프로세서 환경에서 2개의 CPU가 동일한 커널 내부의 공유 데이터에 접근하여 조작할 경우
- 커널 내부에 있는 공유 데이터에 접근할 때마다, 해당 데이터에 lock/unlock을 걸면 방지할 수 있다.
semaphore
- 공유 자원에 여러 thread가 접근하는 것을 막는 것.
- count변수를 통해 공유자원에 접근하는 thread의 수를 제한.
- count값에 따라 여러 thread가 공유자원에 접근할수도 있음.
- 최초 S값은 1이고, critical section을 수행할 process가 A, B가 있음
- 먼저 도착한 A가 S를 0으로 만들고 critical section에 들어감
- 그 뒤에 도착한 B가 critical section에 들어가려 하지만 S가 0이므로 대기
- A가 critical section 끝나면 빠져나오고 S는 1이됨.
- B는 S가 1이 되었으니 critical section으로 들어감.
critical section
- multi-thread 환경에서, thread가 공유 데이터에 접근하는 코드 부분.
- 공유 데이터에 여러 thread가 동시에 접근하면 잘못된 결과를 만들 수 있기 때문에, 한 thread가 critical section을 수행할 때 다른 thread는 접근할 수 없어야 함.
- 해결 방안
- mutual exclusion
- 하나의 thread가 critical section에서 수행되고 있다면, 다른 thread는 critical section에서 실행될 수 없다.
- progress
- critical section을 실행되고 있는 thread가 없을 경우, 들어갈 thread를 적절히 선택해줘야 한다.
- bounded waiting
- process starvation을 방지하기 위해, 한번 critical section에서 실행된 thread는 우선순위가 떨어진다.
mutex
- critical section을 가진 thread들의 실행시간이 서로 겹치지 않고 단독으로 실행되게 하는 기술
- 오직 한개의 thread만이 공유자원에 접근할 수 있음
- mutual exclusion의 약자를 따서 mutex라고 지칭
- lock, unlock을 통해 통제
- lock: critical section에 들어갈 권한을 얻음
- unlock: critical section에서 빠져 나옴을 알림.
semaphore mutex 모두 multi-process 또는 multi-thread 환경에서 공유자원에 대한 deadlock을 막기위한 방법.