운영체제(Operating System)
시스템의 자원과 동작을 관리하는 소프트웨어로 사용자가 컴퓨터를 사용하기 위해 필요한 소프트웨어
일반적으로 사용하는 실행 프로그램들은 모두 운영체제에서 관리하고 제어
목적
- 컴퓨터 시스템의 계산 활동을 관리해 컴퓨터 시스템이 제대로 작동하게 함
- 프로그램 개발 및 실행을 위한 환경 제공
프로세스
- 메모리에 적재되어 CPU에서 실행 중인 프로그램
- OS로부터 시스템 자원을 할당받는 작업의 단위
- 할당받는 시스템 자원 : CPU 시간, 운영되기 위해 필요한 주소 공간, Code/Data/Stack/Heap으로 구성된 독립된 메모리 영역
CPU
컴퓨터에서 기억, 해석, 연산, 제어의 기능을 실행하는 중앙처리장치
프로그램과 프로세스
보조기억장치에 저장되어 실행되기를 기다리는 명령어와 정적 데이터의 묶음인 프로그램을 실행시켜 명령어와 정적 데이터가 메모리에 적재되어 생명이 있는 프로세스가 됨
HOW 프로세스 동시 실행됨?
하나의 CPU는 하나의 프로세스만 실행할 수 있지만, 동시에 실행되는 이유는 OS의 눈속임
사람이 인지할 수 없는 속도로 빠르게 CPU가 실행할 프로세스를 교체하여 동시에 실행되는 것처럼 보임
특징
- 각각 독립된 메모리 영역을 할당 받음
- 기본적으로 프로세스당 최소 1개의 스레드를 가짐
- 각 프로세스는 별도의 주소 공간에서 실행되며 다른 프로세스의 변수나 자료구조에 접근 불가
- 만약, 다른 프로세스에 접근하려면 IPC(프로세스 간 통신)을 사용해야 함 ex) 파이프 파일, 소켓 등을 이용한 통신
PCB(Process Control Block)
OS가 프로세스를 제어하기 위해 정보를 저장해 두는 곳으로 프로세스 상태 정보 저장하는 자료구조
프로세스 생성 시 함께 생성되며, 주기억장치에 유지됨
- PID : 프로세스의 고유 번호
- 프로세스 상태 : 프로세스의 상태
- 프로그램 카운터 : 프로세스 수행을 위한 다음 명령의 주소
- CPU 스케쥴링 정보 : 우선순위, 최종 실행 시각, CPU 점유시간 등
- 권한 : 프로세스가 접근할 수 있는 자원 결정하는 정보
- 프로세스 부모와 자식 : init프로세스를 제외하고는 부모 프로세스를 복제해 생성하고 트리 구성해 각 프로세스는 부모, 자식 프로세스 정보를 가짐
- 실행 문맥 : 프로세스가 마지막으로 실행한 프로세스의 레지스터 정보를 담음
- 포인터 : 부모프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 할당된 자원에 대한 포인터 등
프로세스 상태
- 생성(new) : 프로세스가 생성
- 준비(ready) : 프로세스가 설정되어 대기 중으로 CPU가 할당되기를 기다리고 있는 상태
- 실행(running) : 프로세스가 CPU를 차지하여 명령어들이 실행되는 중
- 대기(waiting) : 보류(blocked)라고도 하는데, 프로세스가 입출력이나 이벤트 발생을 기다리는 상태
- 종료(terminated) : 프로세스가 실행을 종료
문맥 교환(Context Switch)
- 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해 이전의 프로세스 상태(문맥)를 PCB에 보관하고 새로운 프로세스 상태를 적재하는 작업
- 현재 CPU를 사용중인 프로세스의 CPU 제어권을 다른 프로세스에게 이양하는 과정
- 멀티태스킹(=멀티프로세싱)이 가능하도록 해줌
- 하나의 CPU에서 여러 프로세스가 동시에 수행되는 것처럼 보이는 이유는 문맥 교환이 빠르게 일어나고 있기 때문
- 오버헤드 : 문맥 교환 중 다른 작업을 실행할 수 없기 때문에 오버헤드가 발생한다고 함
- 해결 방안
- 문맥교환이 자주 발생하지 않도록 다중 프로그래밍 정도를 낮춤
- 스레드를 이용해 문맥 교환 부하를 최소화시킴
- 스택 중심의 장비에서는 Stack 포인터 레지스터를 변경해 프로세스 간 문맥 교환 수행
- 해결 방안
- 일어나는 시점
- 멀티태스킹 : 멀티태스킹 환경에서 프로세스 전환 과정에서 일어남
- 인터럽트 처리 : 인터럽트가 발생할 때 일어남
- 사용자 및 커널 모드 전환 : OS에서 사용자 모드와 커널 모드 사이의 전환이 필요할 때 일어남
문맥(Context)
프로세스의 상태 정보
멀티태스킹
다수의 프로세스가 하나의 CPU 자원을 나눠 사용하는 것
프로세스 스케쥴링
CPU를 사용하려고 하는 프로세스들 사이의 우선순위를 관리하는 일
처리율과 CPU이용률을 증가시키고 오버헤드, 응답 시간, 반환시간, 대기시간을 최소화시키기 위한 기법
- 결정 시점 : 프로세스의 상태변화가 있을 때 결정함
- 실행(Running) → 대기(Waiting) (비선점, 선점)
- 실행(Running) → 준비(Ready) (비선점)
- 대기(Waiting) → 준비(Ready) (비선점)
- 실행(Running) → 종료(terminated) (비선점, 선점)
- 효용성 평가 기준
- CPU 이용률 : CPU를 얼마나 바쁘게 하는지 (높을수록 좋음)
- 처리율 : 단위 시간당 얼마나 많은 프로세스들이 완료되는지 (높을수록 좋음)
- 소요시간 : 프로세스가 요청된 후 완료되기까지 얼마나 걸리는지 (짧을수록 좋음)
- 대기시간 : 프로세스가 대기 큐에서 기다리는 시간의 합 (짧을수록 좋음)
- 반응시간 : 프로세스가 요청된 후 첫 번째 응답을 받기까지 걸리는 시간 (짧을수록 좋음)
- 단위에 따라
- 단기(Short-term Scheduling)
- 어떤 프로세스에게 CPU를 할당할 것인가
- 프로세스가 실행되기 위해 CPU를 할당받는 시기와 특정 프로세스를 지정하는 작업
- 프로세서 스케쥴링, 하위 스케줄링 이라고도 함
- 프로세서 스케줄링 및 문맥 교환은 프로세서 스케줄러에 의해 수행
- 자주 수행되고 빠름
- 중기(Middle-term Scheduling)
- 어떤 프로세스에게 메모리를 할당할 것인가
- 어떤 프로세스들이 CPU를 할당받을 것인지 결정하는 작업을 의미
- CPU를 할당받으려는 프로세스가 많을 경우 프로세스를 일시 대기시킨 후 활성화해 일시적으로 부하 조절
- 메모리 부족시 Swap Out, 메모리 남을 시 Swap In 하는 과정을 결정
- 장기(Long-term Scheduling)
- 어떤 프로세스를 커널에 등록할 것인가
- 어떤 프로세스가 시스템 자원을 차지할 수 있도록 할 것인가를 결정해 아래 준비 상태 큐로 보내는 작업
- 상위 스케줄링이라고 하며 작업 스케줄러에 의해 수행
- 수행 빈도 적고, 느림
- 단기(Short-term Scheduling)
- 적용 시점에 따라
- 선점형 스케줄링 : 강력한 권한으로 줄을 서지 않고 가장 먼저 선점할 수 있음
- 어떤 프로세스가 CPU를 할당받아 실행 중에 있어도 중지시킨 후 CPU를 강제로 선점할 수 있음
- 빠른 응답시간을 요하는 대화식 시스템에 적합
- OS가 프로세서 자원 선점하고 있다가 각 프로세스 요청이 있을 때 특정 요건들을 기준으로 자원 배분하는 형식
- 비선점형 스케줄링 : 권한이 없기 때문에 차례가 올 때까지 대기한 후 실행할 수 있음
- 프로세스가 종료되거나 입출력 요구가 발생해 자발적으로 중지될 때까지 실행되도록 보장
- 응답 시간을 예측할 수 있으며 선점 방식보다 스케줄러 호출 빈도가 작고 문맥 교환에 의한 오버헤드가 작음
- 일괄처리 시스템에 적합
- CPU 사용시간이 긴 하나의 프로세스가 CPU 사용시간이 짧은 여러 프로세스를 오랫동안 대기시킬 수 있어 처리율이 떨어짐
- 선점형 스케줄링 : 강력한 권한으로 줄을 서지 않고 가장 먼저 선점할 수 있음
- 우선순위 변동 여부에 따라
- 정적 스케줄링 : 프로세스에 부여된 우선순위가 변하지 않음 (=고정 우선순위 스케줄링)
- 동적 스케줄링 : 스케줄링 과정에서 프로세스 우선순위를 변동시킴(=유동 우선순위 스케줄링)
- 스케줄링 알고리즘
- 선점형
- SRT(Shortest Remaining Time) : SJF기법을 선점형태로 변경한 기법으로 CPU 점유 시간이 가장 짧은 프로세스에 CPU먼저 할당하는 방식
- 선점형으로 바뀌어 중요한 프로세스가 있으면 점유시간이 길어도 먼저 실행시킬 수 있는 권한이 있음
- RR(Round Robin) : 우선순위를 두지 않고 순서대로 시간 단위로 CPU 할당하는 방식
- 문맥 교환의 오버헤드가 큰 반면, 응답 시간이 짧아지는 실시간 시스템에 유리
- 할당하는 시간이 클 경우 비선점 FIFO 기법과 같아지게 됨
- MLQ(Multi-Level Queue, 다단계 큐) : 특정 그룹으로 분류할 수 있을 경우 그룹에 따라 각기 다른 준비 큐를 갖는 방식
- 특정 그룹의 준비 상태 큐에 들어갈 경우 다른 준비상태 큐로 이동할 수 없음
- 하위 준비상태 큐에 있는 프로세스를 실행하는 도중이라도 상위 준비 상태 큐에 프로세스가 들어오면 상위 프로세스에게 CPU를 할당해야 함
- 각 준비상태 큐에서는 RR기법이 적용됨
- MFQ(Multi-Level Feedback Queue, 다단계 피드백 큐) : 다단계 큐 기법을 보완해 다른 준비 상태 큐로 이동할 수 있도록 개선한 기법
- SRT(Shortest Remaining Time) : SJF기법을 선점형태로 변경한 기법으로 CPU 점유 시간이 가장 짧은 프로세스에 CPU먼저 할당하는 방식
- 비선점형
- FIFO(First In First Out) : 선입선출의 방식으로 먼저 들어온 작업이 끝나기 전까진 실행될 수 없는 비효율적인 방식
- SJF(Shortest Job First) : 평균 대기시간 최소화하기 위해 CPU 점유시간이 가장 짧은 프로세스에 CPU먼저 할당하는 방식
- 실행시간이 긴 프로세스는 실행시간이 짧은 프로세스에게 할당 순위가 밀려 무기한 연기 상태에 빠질 수 있음
- HRN(Highest Response-ratio Next) : 실행시간이 긴 프로세스에 불리한 SJF기법을 보완하기 위해 대기시간과 서비스 시간을 이용하는 방식
- 우선순위 = (대기시간 + 서비스 시간) / 서비스 시간의 에이징 기법을 통해 우선순위가 높은 순으로 실행
- 선점형
에이징 기법
프로세스 자원을 기다리고 있는 시간에 비례해 우선순위를 부여함으로써 무기한 연기의 문제를 방지하는 기법
멀티 프로세스
하나의 컴퓨터에 여러 CPU를 장착하여 하나 이상의 프로세스들을 동시에 처리하는 방식
프로세스는 독립적인 공간이 할당되기 때문에 서로의 자원에 대해 공유하지 않음
- 장점 : 안정성 (메모리 침범 문제를 OS차원에서 해결)
- 단점 : 각각의 독립된 메모리 영역을 가지므로 작업량이 많을수록 문맥 교환으로 인해 Overhead 발생 가능성이 큼
스레드
- 프로세스 내에서 동시에 실행되는 독립적인 실행 단위
- 프로세스가 할당받은 자원을 이용하는 실행 단위
Java 스레드
Java에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케줄 되는 실행 단위 블록
장점
- 프로세스 내에서 각각 Stack영역만 따로 할당받고, Code, Data, Heap영역은 공유
- 자원을 공유하기 때문에 효율적으로 작업 처리할 수 있음
- 한 스레드가 프로세스 자원을 변경하면 다른 스레드도 그 변경 결과를 즉시 볼 수 있음
단점
- 교착상태에 빠질 위험이 있음
왜 Stack만 분리?
코드와 데이터, 힙 영역을 공유하는 것은 큰 문제가 없지만, 스택 영역은 스택이 쌓이면 후입 선출의 특징으로 위에서부터 프로세스가 섞인 상태로 나오게 되므로 더 복잡해지기 때문에 원활한 실행 흐름을 위해 독립적으로 할당
구현
운영체제에 따라 세 가지 형태로 구현
- 커널 수준 스레드
- 커널 영역에서 스레드 연산을 수행하기 때문에 커널에 종속적
- 한 프로세스에서 다수의 스레드가 프로세스를 할당받아 병행으로 수행
- 커널이 개입하므로 사용자 영역에서 커널 영역으로의 전환이 필요
- 커널이 각 스레드를 개별적으로 관리 (1:1 매핑)
- 장점
- 커널이 직접 스레드를 제공해주기 때문에 안정성과 다양한 기능이 제공됨
- 각 커널이 스레드를 개별 관리해 병행처리 가능
- 단점
- 스케줄링, 동기화를 위해 커널을 호출하는데 무겁고 오래 걸림
- 사용자 모드에서 커널 모드로의 전환이 빈번하게 이뤄져 성능 저하 발생
- 사용자 수준 스레드
- 사용자 영역의 스레드 라이브러리로 구현
- 단일 프로세스에서 작동
- 스레드와 관련된 모든 행위를 사용자 영역에서 하므로 커널이 스레드의 존재를 모름
- 다수의 사용자 레벨 스레드가 커널 수준 스레드 한 개에 매핑 (N:1 매핑)
- 장점
- 이식성이 높음 : 커널에 독립적으로 스케줄링할 수 있어 모든 OS에 적용 가능
- 오버헤드 적음 : 스케줄링, 동기화할 때 커널을 호출하지 않으므로 커널 영역으로 전환하는 오버헤드 적음
- 유연한 스케줄링 가능 : 스레드 라이브러리에서 스케줄링을 제어하므로 응용프로그램에 맞게 스케줄링함
- 단점
- 시스템 동시성 지원 X : 스레드가 아닌 프로세스 단위로 프로세스를 할당해 다중처리환경을 갖춰도 스레드 단위로 다중처리 불가능
- 확장에 제약 : 여러 스레드에 프로세스를 동시에 할당할 수 없어 다중처리 시스템에서 규모 확장이 어려움
- 스레드 간 보호 불가능 : 스레드 라이브러리에서 스레드 간 보호를 해야 프로세스 수준에서 보호 가능
- 혼합형 스레드
- 커널 수준 스레드와 사용자 수준 스레드를 혼합하여 사용하는 방식
- N:M 매핑
멀티스레드
하나의 프로세스 내에서 여러 스레드를 구성해 하나의 작업을 처리하는 방식
이때 스레드들은 서로의 자원을 공유
프로세스와 스레드 차이
- 프로세스 내에서 실행되는 세부 작업 단위로 여러 개의 스레드가 하나의 프로세스를 이룸
- 프로세스마다 최소 1개의 스레드를 소유
- 프로세스는 각각의 별도의 주소 공간을 할당받는 반면, 스레드는 stack만 따로 할당을 받고 나머지 영역은 서로 공유
멀티 프로세스 대신 멀티스레드를 사용하는 이유
단순하게, 프로그램을 여러 개 키는 것 보다 하나의 프로그램 안에서 여러 작업을 해결하는 것
- 자원의 효율성 증대
- 프로세스를 생성하여 자원을 할당하는 과정이 줄어듦
- 스레드는 프로세스 내의 메모리를 공유하기 때문에 스레드 간 데이터 주고받는 것이 간단하고 자원 소모가 줄어듦
- 처리 비용 감소 및 응답 시간 단축
- 프로세스 간 통신보다 스레드 간 통신의 비용이 적으므로 비용 감소
- 프로세스 간 전환 속도보다 스레드 간 전환 속도가 빠름
- 문맥 교환 시 스레드는 Stack영역만 처리하면 되기 때문
- 주의점
- 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있음
- 멀티스레드의 경우 자원 공유의 문제가 발생(동기화 문제)
- 디버깅이 어려움
스레드 동기화 방법
목적 : 여러 개의 스레드가 같은 프로세스 내의 자원을 공유하면서 작업하는 경우 서로의 작업이 다른 작업에 영향을 주기 때문에 동기화를 해줘야 함
용어
- 크리티컬 섹션(임계 영역) : 공유 자원에 대해 하나의 스레드만 접근 가능한 영역
- 락(Lock) : 공유 객체에 여러 스레드가 동시에 접근하지 못하도록 하기 위한 것으로 모든 객체가 힙 영역에 생성될 때 자동으로 만들어짐
뮤텍스(Mutex)
- 상호 배제라고도 함
- 임계 영역을 가진 스레드들을 실행 시간이 서로 겹치지 않게 각각 단독으로 실행하게 하는 것
- 뮤텍스 객체를 두 스레드가 동시에 이용할 수없음
세마포어(Semaphore)
- 자원의 상태를 나타내는 간단한 카운터
- 공유된 자원의 데이터를 여러 프로세스에서 접근하는 것을 막는 것
뮤텍스와 세마포어 차이점
- 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없음
- 세마포어는 소유할 수 없지만, 뮤텍스는 소유가 가능하며 소유주가 책임을 가짐
- 뮤텍스는 뮤텍스를 소유하고 있는 스레드(락을 획득한 프로세스)가 뮤텍스를 해제할 수 있지만, 세마포어는 세마포어를 소유하지 않는 스레드가 세마포어를 해제할 수 있음
- 세마포어는 시스템 범위를 가지고 파일 시스템상의 파일 형태로 존재하고, 뮤텍스는 프로세스 범위를 가지며 프로세스가 종료될 때 자동으로 Clean Up 됨
- 뮤텍스는 동기화 대상이 오직 하나뿐일 때 사용하고, 세마포어는 동기화 대상이 하나 이상일 때 사용
인터럽트(Interrupt)
- 프로세스가 실행 중이다가 예기치 못한 상황이 발생해 실행 중이던 프로세스를 더 이상 실행하기 힘들거나 먼저 처리해야 할 급한 일이 생긴 경우
- 실행 중이던 프로세스가 CPU 사용을 멈추고 인터럽트 처리가 된 후에 다시 CPU 점유하게 됨
커널
OS의 핵심 부분으로 HW와 응용프로그램 사이에서 인터페이스를 제공해 응용프로그램이 HW 자원을 관리하고 사용할 수 있게 하는 것
PCB가 저장되는 커널 영역
실제 메모리 중 OS와 관련된 부분이 적재되는 영역
- 코드 영역 : OS가 잘 수행되어야 할 명령들의 코드들이 저장되어있음
- 데이터 영역 : OS가 다룰 HW/SW의 자료구조들이 저장되어 있음 이 중 SW를 다룰 자료구조가 PCB
- 스택 영역 : 프로세스별 커널 스택이 있는데 이 곳에 프로세스가 OS에게 부탁한 함수의 리턴 값이나 주소가 저장됨
데드락(교착상태)과 기아상태
데드락
두 개 이상의 작업이 상대방의 작업이 끝나기만을 기다리면서 대기하는 것 결국 아무것도 완료되지 못하는 상태로
둘 이상의 프로세스들이 자원을 점유한 상태에서 다른 프로세스가 점유하고 있는 자원을 요구하며 무한 대기하는 상태
- 발생 조건 : 4가지 조건을 모두 만족해야 함
- 비선점(Nonpreemptive) : 다른 프로세스의 자원을 뺏을 수 없는 상황
- 순환 대기(Circular Wait) : 둘 이상의 프로세스가 자원 접근을 기다릴 때, 순환적 구조의 단계로 돌고 도는 상황
- 점유 대기(Hold & Wait) : 공유 자원을 점유한 상태로 다른 자원에 대한 접근 권한을 요구하여 대기하는 상황
- 상호 배제(Mutual Exclusion) : 한 번에 한 프로세스만 공유 자원에 접근 가능해 동시에 사용할 수 없는 상황
데드락 해결방안
- 예방(prevention) : 교착 상태 발생 조건 중 하나를 제거하는 방식
- 비선점 부정 : 자원 점유하고 있는 프로세스가 다른 자원을 요구할 때 자원 반납하고, 요구한 자원 사용하기 위해 기다리게 함
- 순환 대기 부정 : 자원에 고유한 번호를 할당하고, 번호 순서대로 자원을 요구하게 함
- 점유 대기 부정 : 프로세스가 실행되기 전 필요한 모든 자원을 할당
- 상호 배제 부정 : 여러 개의 프로세스가 공유자원을 사용할 수 있도록 함 (동기화 문제 재발생 우려)
- 회피(avoidance) : 교착상태가 발생할 가능성을 배제하지 않고 교착상태가 발생하면 적절히 피해 가는 방법
- Banker's Algorithm : 최소한 하나의 프로세스가 일을 수행할 수 있는 경우에만 요청을 허락하여 자원 할당
- 탐지 및 회복(detection & recovery) : 자원 할당 그래프를 통해 데드락을 감지하며 감지할 경우 이전 상태로 회복
- 무시(ignore) : 데드락 발생을 무시하고 지나가는 방법
기아상태
- 프로세스의 우선순위가 낮아서 원하는 자원을 결코 할당받지 못해 영원히 기다리는 상태
- 기다리는 결과를 예방하기 위해 자원을 할당할 때 발생하는 결과
References
'Study > Tech Interview' 카테고리의 다른 글
| 기타 면접 (0) | 2021.05.31 |
|---|---|
| OS 면접 #2 (0) | 2021.05.30 |
| Java 면접 (0) | 2021.05.28 |
| Data Structure 면접 (0) | 2021.05.24 |
| Algorithm - 진수 변환, 거듭 제곱, 에라토스테네스의 체 (0) | 2021.05.23 |
댓글