REF
아래 블로그 질문과 답을 참고하였고,
제 나름대로 핵심을 담고, 말을 다듬는 수정하는 과정을 거쳤습니다.
너무 많은 도움이 되어 감사합니다.
Q. OS(운영체제)가 무엇인지 설명해주실 수 있나요?
A: 운영체제(OS, Operating System)는 컴퓨터 하드웨어와 사용자 간의 중재자 역할을 하는 소프트웨어입니다. 즉, 사용자가 컴퓨터를 효율적으로 사용할 수 있도록 컴퓨터의 자원(하드웨어)을 관리하고, 다양한 응용 프로그램이 하드웨어와 상호 작용할 수 있도록 지원하는 중요한 시스템 소프트웨어입니다.
+ 운영체제의 기능
1. 프로세스 관리 : CPU 스케줄링을 통해 어떤 프로세스가 언제 실행될지를 결정하고, 생성, 실행, 중단 종료를 제어한다.
2. 메모리 관리 : 각 프로그램이 사용하는 메모리 공간 할당하고, 가상메모리도 지원한다.
3. 파일 시스템 관리 : 다양한 파일 시스템 구조(ex. NTFS, FAT, ext4 등)를 제공한다.
4. 입출력 관리 : 키볻, 마우스,디스크,프린터 등 다양한 입출력 장치와 상호작용을 관리한다. => 프로그램이 하드웨어에 직접 접근X
5. 저장 장치 관리 : 하드디스크나 SSD 저장 공간을 최적화하고 데이터 접근 속도를 높인다.
6. 보안 및 접근 제어 : 사용자 인증 및 권한 관리 제공
7. 네트워크 관리 : 여러 시스템 간의 데이터 전송, 통신 프로토콜 관리 처리해서 네트워크 연결 지원
8. 인터페이스 제공 : CLI(Command Line Interface)와 GUI(Graphical User Interface) 를 제공해서 사용자에게 편리한 인터페이스 제공
Q.커널이 무엇인지 설명하실 수 있나요?
A: 기본적으로 프로그램이 실행되기 위해서는 주기억장치에 적재된 상태여야 합니다.
운영체제 역시 프로그램이기 때문에 메인 메모리에 적재가 되어야 하나, 운영체제의 크기가 너무 커서 전체를 다 메인 메모리에 올리게 된다면 비효율적입니다. (메모리 공간의 낭비)
따라서 커널(kernel)이라고 하는 항상 필요한 운영체제의 핵심 부분만을 메인 메모리에 적재하여 운영체제를 사용하게끔 합니다.
즉, 커널은 메모리에 상주하는 운영체제의 핵심 부분이라고 할 수 있습니다.
Q. 메모리의 구조를 영역에 따라서 설명해줄 수 있나요?
1) 코드 영역 (Text Segment)
: 프로그램의 코드가 저장되는 영역입니다. 즉 컴파일된 기계어 코드(명령어)가 위치하는 공간입니다.
특징) - 실행 중 변경되지 않으며, 읽기 전용으로 동작한다. - 메모리 절약을 위해 여러 프로세스가 같은 프로그램을 실행할 경우, 이 코드 영역을 공유할 수 있다.
- CPU가 프로그램을 실행할 때, 이 영역에 저장된 명령어를 가져와 처리한다.
2) 데이터 영역 (Data Segment)
: 프로그램이 사용하는 전역 변수(global variables)나 static 변수(static variables) 가 저장되는 공간입니다.
데이터 영역은 다시 두 부분으로 나뉜다.
- 초기화된 데이터 영역 (Initialized Data Segment): 초기화된 전역 변수와 static 변수가 저장되는 영역.
- 초기화되지 않은 데이터 영역 (Uninitialized Data Segment, BSS): 초기화되지 않은 전역 변수와 static 변수가 저장되는 영역으로, 프로그램 시작 시 0으로 초기화된다.
특징)
- 프로그램 시작시 할당되며, 프로그램이 종료되면 소멸합니다.
- 전역 변수는 프로그램의 어디서든 접근 가능
3) 힙 영역 (Heap Segment)
: 사용자가 직접 관리하는 영역이며 메모리 공간이 동적으로 할당 및 해제된다. 프로그램이 실행 중에 malloc(), calloc(), new와 같은 함수나 연산자를 통해 메모리를 할당받는 영역이다.
특징) - 메모리가 동적으로 할당되며, 사용 후에는 명시적으로 해제(free()나 delete)해야 한다. - 메모리 할당 및 해제의 시점과 크기를 개발자가 직접 관리한다.- 힙은 일반적으로 스택과 반대로 하향식으로 확장된다.
4) 스택 영역 (Stack Segment)
: 스택 영역은 함수 호출과 관련된 지역 변수(local variables), 함수 인자(parameter), 리턴 주소 등이 저장되는 공간입니다. 함수가 호출될 때마다 스택 프레임이 쌓이고, 함수가 종료되면 스택 프레임이 제거됩니다.
특징)
- LIFO(Last In First Out) 방식으로 작동하여 가장 최근에 추가된 데이터가 가장 먼저 제거됩니다.-
- 함수가 호출될 때마다 스택에 새로운 공간이 할당되고, 함수가 종료되면 해당 공간이 자동으로 해제됩니다.
- 스택의 크기는 보통 고정되어 있으며, 스택 오버플로우(Stack Overflow)가 발생할 수 있습니다.
+
- 힙과 스택은 서로 반대 방향으로 확장됩니다. 힙은 낮은 주소에서 높은 주소로 확장되고, 스택은 높은 주소에서 낮은 주소로 확장됩니다. 힙과 스택이 서로 만나면 메모리 부족 현상(충돌)이 발생할 수 있습니다.
- 각 영역이 적절히 관리되지 않으면 메모리 누수(heap 영역에서 동적 할당된 메모리가 해제되지 않음)나 스택 오버플로우와 같은 문제들이 발생할 수 있습니다. 특히, 동적 메모리를 사용하는 힙 영역의 관리는 개발자가 신중하게 해줘야 합니다.
Q. 메모리의 힙 영역과 스택 영역의 차이에 대해 설명해주세요.
스택 영역의 저장하는 데이터는 지역변수,함수인자,리턴 주소등이 있고요, 힙 영역의 저장하는 데이터는 new 연산자와 같은 동적으로 생성된 변수입니다.
스택영역은 컴파일 타임에 힙 영역은 런타임에 크기가 결정됩니다.
스택영역은 크기가 제한되어있지만, 힙영역은 동적입니다.
스택영역의 주소 할당 방향은 높은 주소에서 낮은 주소이지만, 힙 영역은 낮은 주소에서 높은 주소입니다.
마지막으로, 스택 영역이 힙에 비해 빠르고, 함수 종료에 따라 소멸되므로 별다른 관리가 필요 없지만, 힙 영역은 직접 관리가 필요합니다.
Q. 메모리의 힙 영역을 너무 크게 잡으면 어떤 일이 생길까요?
힙 영역은 스택 영역과 다르게 생성된 변수는 자동으로 소멸되지 않으므로, 메모리 관리를 위해 Garbage Collection이 필요합니다. GC는 참조되지 않는 객체를 찾아 제거함으로써 메모리를 확보하는 작업입니다.
힙 영역이 너무 크면, GC가 동작할 때 모든 변수를 검사해야 하기 때문에 GC의 수행 시간이 길어집니다. 이로인해 애플리케이션 성능이 저하될 수 있습니다.
JAVA의 JVM(java virtual machine)은 처음부터 힙 영역을 크게 할당하지 않고, 필요할 때 힙 영역을 확장합니다. 힙이 꽉차면 GC를 활용하여 불필요한 객체를 제거하고, 그래도 부족하면 힙 크기를 늘립니다.
Q. 프로세스와 쓰레드에 대해 설명하고, 둘의 차이에 대해 설명해주세요
1. 프로세스
- 실행 중인 프로그램으로, 독립적인 메모리 영역(코드,데이터,힙,스택)을 가집니다.
- 컨텍스트 스위칭 비용이 크고, 각 프로세스는 독립적이므로 다른 프로세스에 영향을 주지 않습니다. (동기화 작업 필요 X)
- 프로세스 생성 기간이 스레드보다 더 오래 걸립니다.
2. 스레드
- 프로세스 내에서 실행되는 작업 단위입니다.
- 스택을 제외한 메모리(코드, 데이터, 힙)를 프로세스 내 다른 스레드와 공유합니다. (공유 자원 접근시 동기화 작업 필요 O)
- 하나의 스레드 오류는 같은 프로세스 내 다른 스레드에 영향을 줄 수 있습니다
- 컨텍스트 스위칭 비용이 적고, 스레드 생성 기간이 짧습니다.
Q. 컨텍스트 스위칭에 대해서 설명하고, 왜 컨텍스트 스위칭이 필요한지 설명해주세요
컨텍스트 스위칭은 CPU가 실행중인 프로세스를 다른 프로세스로 전환하기 위해 현재 프로세스의 상태(프로그램 카운터, 레지스터)를 PCB에 저장하고, 다음 프로세스 상태값을 읽어 복원하는 작업입니다.
컨텍스트 스위칭이 필요한 이유는 멀티태스킹을 지원하기 위해서입니다. 여러 프로세스를 번갈아 실행함으로써 CPU 자원을 효율적으로 활용하고, 사용자에게 프로그램이 동시에 실행되는 것처럼 보이게 합니다.
+
예를 들어, CPU Cycle의 속도는 I/O 작업에 비해 굉장히 빠릅니다.
I/O 작업이 실행되고 Blocking 된다면, CPU는 아무런 일을 하지 않고 오랜 기간동안 쉬게 됩니다.
컨텍스트 스위칭을 통해 다른 프로세스나 쓰레드의 작업으로 전환한다면, CPU의 사용률을 높일 수 있습니다.
컨텍스트 스위칭을 진행하는 동안 다른 작업을 할 수 없는데(오버헤드), 보통 이 시간보다 I/O 작업이 더 오래 걸리기 때문에 컨텍스트 스위칭을 하는 것이 효율적입니다. 또한 컨텍스트 스위칭이 있기 때문에 여러 프로세스를 처리할 수 있습니다.
1) CPU가 다른 프로세스로 전환하면 시스템은 프로세스의 상태를 PCB에 저장합니다
2) 대기열에서 다음 프로세스를 선택하고 해당 프로세스의 PCB를 복원합니다.
3) PCB의 프로그램 카운터(레지스터 중 하나)가 로드되어 이전까지 작업한 곳의 지점으로 돌아가 선택한 프로세스의 작업을 이어서 합니다.
Q.프로세스 제어 블록에 대해 더 자세히 설명해주세요
- 프로세스 제어 블록(Process Control Block)은 프로세스의 상태와 실행을 관리하기 위한 정보 입니다.
- OS는 프로세스의 생성과 동시에 고유한 PCB를 생성합니다.
- PCB가 프로세스의 중요한 정보를 포함하므로, 일반 사용자가 접근하지 못하도록 커널의 보호된 메모리 영역 안에 위치합니다.
- PCB에 저장되는 정보
1) 프로세스 식별자 (PID, Process id): 프로세스 식별 번호
2) 프로세스 상태 : new(프로세스가 생성됨), ready실행 준비됨), running(실행 중), waiting(입출력 대기 중), terminated (실행 완료됨)등의 상태를 저장
3) 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
4) CPU 레지스터 : cpu 내부에서 데이터를 임시로 저장하고 처리하는 고속 저장 공간임. 레지스터는 매우 작고, cpu 내부에서 가장 빠르게 접근할 수 있는 메모리다. 프로세스가 실행될 때 연산에 필요한 데이터를 일시적으로 저장하고 처리하는 데 사용된다.
5) CPU 스케줄링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인트 등
6) 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
7) 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
8) 어카운팅 정보 : cpu 사용시간, 할당된 시간제한, 프로세스를 실행한 사용자 계정번호 등
+ 프로세스는 수행할 차례가 되면 CPU를 할당받아 작업을 처리합니다.
작업을 처리하던 중 프로세스의 시간이 모두 경과되거나 인터럽트가 발생하는 등 프로세스 전환이 발생하면,
진행하던 작업을 저장하고 CPU를 반환합니다.
이때, 수행하던 프로세스 관련 데이터들을 PCB에 저장합니다.
그리고 다시 프로세스의 수행 차례가 와서 CPU를 할당받게 되면,
PCB에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행합니다.
이렇게 사용하던 프로세스의 데이터를 PCB에 저장하고, 실행할 프로세스의 데이터를 PCB에서 불러오는 과정을 Context Swithing이라고 합니다.
Q. 크롬 브라우저에서 한 탭에 오류가 생기더라도, 다른 탭에 영향을 끼치지 않습니다. 그렇다면 각각의 크롬 탭은 프로세스일까요? 쓰레드일까요?
크롭 탭은 다른 탭에 영향을 끼치지 않는 다는 특성에 의해 프로세스 입니다.
쓰레드라면, 다른 크롬 탭도 오류가 생길 수 있습니다.
Q. 멀티 쓰레드와 멀티 프로세스를 비교해주세요.
1. 멀티 쓰레드
: 멀티 쓰레드는 하나의 프로세스 내에서 여러 쓰레드가 동시에 실행되는 방식입니다.
쓰레드들은 메모리 공간을 공유하기 때문에 적은 메모리 공간을 차지하고,
빠르게 데이터를 주고받으며, Context Switching이 빠른 장점(스택 영역만 초기화하면 됨)이 있습니다.
하지만, 공유 자원에 대한 동기화 문제가 발생할 수 있습니다.
2. 멀티 프로세스
: 멀티 프로세스는 여러 개의 프로세스가 독립적으로(병렬적으로) 실행되는 방식입니다.
각 프로세스는 별도의 메모리 공간을 가지고 있기 때문에 안정적이지만,
많은 메모리 공간을 차지하며, 프로세스 간 데이터 교환은 더 복잡하고 비용이 많이 듭니다.
3. 왜 멀티 쓰레드를 더 많이 사용하는가?
: 멀티 쓰레드는 메모리 공유 덕분에 자원 소모가 적고, (자원 할당하는 콜이 줄어들음)
통신이 빠르기 때문에 자주 사용됩니다.
특히 cpu 바운드 작업보다는 i/o 바운드 작업에서 더 효율적입니다.
하지만 동기화 문제를 해결하기 위한 락(lock)관리가 필요할 수 있습니다.
4. Python에서의 멀티 프로세스
: Python의 글로벌 인터프리터 락(GIL, Global Interpreter Lock) 정책을 사용합니다.
하나의 프로세스 안에 모든 자원의 Lock을 글로벌하게 관리함으로써 한번에 하나의 쓰레드만 자원을 컨트롤 해 동작하도록 합니다.
GIL 덕분에 자원 관리를 더 쉽게 구현할 수 있습니다.
I/O 동작이 많은 프로그램에서는 멀티 쓰레드만으로 큰 효과를 얻을 수 있으나,
CPU 작업이 많은 경우에는 멀티 쓰레드를 사용하더라도 속도 개선을 느끼지 못할 수 있습니다.
따라서, CPU 바운드 작업에 대해 멀티 프로세스를 더 많이 사용합니다.
multiprocessing 모듈을 사용하면 각 프로세스가 독립적으로 실행되며, 병렬 처리가 가능합니다.
Q. 쓰레드마다 독립적으로 할당하는 2가지에 대해 설명해주세요.
스택영역과 프로그램 카운터(PC Register)입니다.
이들은 쓰레드의 독립적인 실행과 문맥 전환 과정에서 중요한 역할을 합니다.
1) 스택 영역
역할: 함수호출, 지역변수, 반환 주소 등을 저장하는 메모리 공간
독립적인 할당 이유 : 각 쓰레드는 프로세스 내에서 독립적인 실행 흐름을 가지기 때문에,
서로 다른 함수 호출과 실행 상태를 관리할 필요가 있습니다.
따라서 쓰레드마다 독립된 스택 영역을 할당받아야 합니다.
이는 각 쓰레드가 자신의 함수 호출을 독립적으로 관리하고, 다른 쓰레드와 간섭 없이 실행될 수 있도록 보장합니다.
2) 프로그램 카운터(PC Register)
역할: PC Register 는 쓰레드가 어디까지 명령어를 실행했는지를 기록하는 레지스터입니다.
독립적인 할당 이유 : 쓰레드는 cpu를 할당받아 명령어를 실행하다가,
스켈줄러에 의해 다른 쓰레도 교체될 수 있습니다. (문맥 전환)
이때 쓰레드가 마지막으로 실행한 명령어 위치를 기억해야,
나중에 다시 cpu를 할당받았을 때 중단된 지점부터 실행을 재개할 수 있습니다.
따라서 쓰레드마다 고유한 PC Register 값이 필요합니다.
결론:
쓰레드마다 독립적으로 스택과 PC Register를 할당받는 이유는, 각 쓰레드가 독립적인 실행 흐름을 유지하고, 문맥 전환 시에도 중단된 위치에서 실행을 재개할 수 있도록 보장하기 위함입니다.
Q. 멀티 쓰레드 환경에서의 주의해야 할 점에 대해 설명할 수 있나요?
멀티 쓰레드 환경에서는 한 프로세스 내의 자원을 여러 쓰레드가 공유하기 때문에, 자원 동기화가 중요합니다.
동기화가 제대로 이루어지지 않으면 경쟁 상태, 데드락, 데이터 불일치 등의 문제가 발생할 수 있습니다.
+
1) 경쟁 상태(Race Condition)
여러 쓰레드가 동시에 동일한 자원에 접근하고,
그 결과가 쓰레드의 실행 순서에 따라 달라지는 현상입니다.
이러한 문제를 방지하려면 뮤텍스(Mutex), 세마포어(Semaphore) 등의 동기화 메커니즘을 사용하여 쓰레드 간의 자원 접근을 제어해야 합니다.
2) 데드락(Deadlock)
두 개 이상의 쓰레드가 서로 상대방이 소유한 자원의 해제를 기다리면서 영원히 멈추는 상태입니다.
데드락을 방지하기 위해서는 자원 획득 순서를 정하거나, 타임아웃 설정 등을 고려할 수 있습니다.
3) 데이터 불일치
자원에 대한 동기화가 없을 경우, 여러 쓰레드가 동시에 데이터를 읽고 쓰는 과정에서 데이터가 일관되지 않게 될 수 있습니다. 이를 방지하려면 **임계 구역(Critical Section)**을 설정하여 한 번에 하나의 쓰레드만 해당 자원에 접근할 수 있도록 해야 합니다.
Q. 동기와 비동기의 차이에 대해 설명해주세요.
동기: 요청을 보낸후,
그 작업이 완료될 때까지 기다린 후 다음 작업을 진행합니다.
즉, 순차적으로 실행됩니다.
비동기: 요청을 보낸 후,
작업 완료를 기다리지 않고 다음 작업을 바로 진행합니다.
작업이 완료되면 콜백이나 이벤트를 통해 결과를 처리합니다.
즉, 병렬적으로 실행됩니다.
+
- 동기(Sync): 함수가 호출되면, 호출한 함수가 결과를 직접 처리해야 합니다.
- 비동기(Async): 함수가 호출되면, 작업 완료 여부는 콜백이나 이벤트에 의해 나중에 처리됩니다.
Q. Blocking과 Non-Blocking 에 대해 설명해주세요.
Blocking과 Non-Blocking의 차이는 작업이 완료될 때까지 대기 여부에 있습니다.
- Blocking: 작업을 요청한 후,
작업이 완료될 때까지 대기하며 다른 작업을 진행하지 못합니다.
자원을 점유하고,
해당 작업이 끝나야 다음 작업으로 넘어갑니다.
- Non-Blocking: 작업을 요청한 후,
작업 완료를 기다리지 않고 즉시 다른 작업을 수행할 수 있습니다.
요청이 바로 처리되지 않더라도
시스템은 계속해서 다른 작업을 처리합니다.
+
Blocking:
A 함수가 B 함수를 호출하면, B 함수가 완료될 때까지 A 함수는 제어권을 잃고 아무 작업도 할 수 없습니다.
B 함수가 끝난 후에야 A 함수는 다시 실행을 이어나갑니다.
Non-Blocking:
A 함수가 B 함수를 호출하면, B 함수는 바로 A 함수에게 제어권을 반환하고, A 함수는 B 함수가 끝나지 않아도 다른 작업을 수행할 수 있습니다.
+
Blocking/Non-Blocking은 함수 호출 시, 함수가 완료될 때까지 기다리느냐 아니냐(제어권의 문제).
동기/비동기는 함수 호출 시, 결과를 어떻게 처리하느냐(직접 처리 vs 나중에 처리).
Q. 프로세스의 종류는 무엇이 있는지 설명해주세요.
1. 자식 프로세스 (Child Process)
: fork로 부모 프로세스에서 생성된 프로세스 입니다.
부모의 데이터, 힙, 스택, PCB가 복사됩니다.
2. 데몬 프로세스 (Deamon Process)
: 백그라운드에서 동작하며,
특정 서비스를 제공하는 프로세스 입니다.
주로 시스템 작업이나 서버와 관련된 작업을 수행합니다.
ex) 리눅스/유닉스 , 윈도우
3. 고아 프로세스 (Orphan Process)
: 부모 프로세스가 종료된 후에도 계속 실행되는 자식 프로세스 입니다.
이러한 프로세스는 보통 운영체제가 처리합니다.
4. 좀비 프로세스 (Zombie Process)
: 자식 프로세스가 종료되었지만,
부모 프로세스가 아직 해당 프로세스의 종료 상태를 읽지 않아서
프로세스 테이블에 남아있는 상태입니다.
Q. Race Condition과 Critical Section이 무엇이고, 경쟁상태를 막기 위해 어떤 방법을 사용하는지 설명해주세요.
Race Condion는 두 개 이상의 스레드가 공유 자원에 동시에 접근햐려고 서로 경쟁하는 것입니다.
이 공유자원이 존재하는 구간으로 Race Condition이 일어날 수 있는 영역을 'Critical Section(임계영역)'이라고 합니다.
이러한 임계영역에 대한 경쟁상태를 제거하기 위해서
한 공유자원에 대해 한 쓰레드에만 접근을 허락하도록 하는 '상호배제(Mutual Exclusion)'를 사용합니다.
+
Mutex ?
Semaphore ?
Q. DeadLock(교착 상태)에 대해 설명하고, 해결방법에 대해 설명해주세요.
DeadLock은 여러 프로세스나 스레드가 자원을 점유한 상태에서,
다른 자원이 필요한데 그 자원이 이미 다른 프로세스에 의해 점유되고 있는 상황입니다.
이때 자원을 기다리면서 무한히 대기하는 상태가 데드락입니다.
Deadlock의 4가지 필수 조건은.
1. 상호 배제(Mutual Exclusion): 한 자원에 하나의 프로세스만 사용할 수 있습니다.
2. 점유와 대기(Hold and Wait): 하나의 자원을 점유한 상태에서 다른 자원을 요청하고 대기합니다.
3. 비선점(Non-Preemption): 이미 점유한 자원은 해당 프로세스가 자발적으로 해제할 때까지 다른 프로세스가 강제로 빼앗을 수 없습니다.
4. 순환 대기(Circular Wait): 프로세스들이 자원을 기다리는 관계가 원형을 이루어 순환 대기를 형성하는 상태입니다.
입니다.
Deadlock의 해결방법은,
1. 교착 상태 예방(Prevention):
4가지 조건 중 하나가 성립하지 않도록 설계합니다.
2. 교착 상태 회피(Avoidance):
자원의 상태를 모니터링하여 교착 상태가 발생하지 않도록 자원을 할당합니다.
대표적인 알고리즘은 은행가 알고리즘 입니다.
3. 교착 상태 탐지(Detection) 및 회복(Recovery):
교착 상태가 발생했을 때 탐지하고 이를 해결하기 위한 방법입니다.
예를 들어, 교착 상태에 있는 프로세스를 종료하거나, 자원을 강제로 선점하여 해결합니다.
4. 무시(Ignorance):
대부분의 시스템은 교착 상태가 드물기 때문에 이를 특별히 처리하지 않고,
문제가 발생했을 때 수동으로 해결하는 방법을 사용하기도 합니다.
+ 은행가 알고리즘
- 프로세스가 자원을 요구할 때 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지를 사전에 검사하는 알고리즘이다.
- 발생하지 않으면 자원을 할당하고, 발생하면 다른 프로세스가 자원을 해체할 때까지 대기한다.
- 안전 상태: 시스템이 교착상태를 일으키지 않으면서 각 프로세스가 요구한 최대 요구량만큼 필요한 자원을 할당해줄 수 있는 상태
- 항상 안전 상태를 유지할 수 있다는 장점이 있으나 최대 자원 요구량을 미리 알아야 하고 항상 불안정 상태를 방지해야 하므로 자원 이용도가 낮다.
Q. 식사하는 철학자 문제에서, Deadlock이 어떨 때 발생하는지 설명하고, 이를 해결하기 위한 방법을 제시하세요.
식사하는 철학자 문제는 다섯 명의 철학자가 원탁에서 식사를 하는 상황을 묘사합니다.
각 철학자는 왼쪽과 오른쪽에 있는 젓가락 두 개를 잡아야만 식사를 할 수 있습니다.
이 문제에서 **Deadlock(교착 상태)**는 철학자들이 젓가락을 잡는 방식에서 발생할 수 있습니다.
Deadlock 발생 상황
1. 철학자들이 동시에 왼쪽 젓가락을 집습니다.
2. 모든 철학자는 왼쪽 젓가락을 들고 있으며, 오른쪽 젓가락을 기다리고 있습니다.
3. 그러나, 모든 철학자가 이미 오른쪽 젓가락을 서로 기다리기 때문에 젓가락을 사용할 수 없고, 계속 대기 상태에 빠지게 됩니다.
즉, 모든 철학자가 동시에 젓가락을 서로 독점하고, 다른 철학자가 가진 젓가락을 기다리는 상황이 만들어져
Deadlock이 발생합니다.
1) 각 포크에 대해 한 사람만 들 수 있음 '상호배제'
2) 5명 모두 자신의 왼쪽 포크를 점유하고, 오른쪽 포크를 기다리는 '점유대기'
3) 남의 포크를 빼앗을 수 없음 '비선점'
4) 서로 오른쪽 포크를 놓기만을 기다림 '순환 대기'
이 문제를 해결하기 위해서, 카운팅 세마포어를 사용합니다.
방에 대한 입장 정원을 카운팅 세마포어로 설계해,
최대 4명만 들어온다면 방 안의 모든 사람들이 왼쪽 포크를 들어도
Deadlock이 발생하지 않습니다.
Q. Mutex와 Semaphore에 대해 설명해주세요.
뮤텍스는 상호배제를 위한 동기화 도구로,
동시에 하나의 스레드(혹은 프로세스)만 자원에 접근할 수 있습니다.
Lock과 Unlock의 개념을 가지고 있으며,
자원을 사용한 스레드는 반드시 lock을 해제해야 합니다.
세마포어는 변수만큼의 스레드(혹은 프로세스)가 공유 자원에 접근할 수 있습니다.
카운터 값이 0이 되면 새로운 스레드는 대기 상태에 들어갑니다.
다른 프로세스가 세마포어를 해제할 수 있습니다.
Binary Semaphore는 카운터 값이 1인 Semaphore로,
Mutex와 유사하게 동작하지만, 소유권 개념이 없습니다.
Q. CPU Scheduling 이 무엇인지 설명하고, CPU 스케줄링의 종류에 대해 설명해주세요.
ready queue에 있는 프로세스 중에서 cpu를 할당할 프로세스를 선택하는 알고리즘입니다.
CPU 스케줄링 종류로는 ,
<비선점 스케줄링>
- FCFS (First Come First Served)
: 도착 순서대로 프로세스를 실행합니다.
단점으로, 오래 걸리는 프로세스가 먼저 들어오면 전체 대기 시간이 길어질 수 있습니다.
- SJF (Shortest Job First)
: cpu 사용 시간이 가장 짧은 프로세스에 우선적으로 cpu를 할당합니다.
기아 현상(starvation)이 발생할 수 있습니다.
- HRRN(Highest Response Ratio Next)
: 응답 비율이 가장 높은 프로세스에 우선적으로 CPU를 할당합니다
응답 비율 = (대기시간 + 서비스시간) / 서비스 시간
대기시간이 길수록 우선순위가 높아져 기아 문제를 완화할 수 있습니다.
<선점 스케줄링>
- RR(Round Robin)
: 각 프로세스에 일정한 시간 할당량을 주고, 할당 시간이 끝나면 다음 프로세스로 넘어갑니다.
공정성을 보장하지만, 효율성이 떨어질 수 있습니다.
- SRTF(Shortest Remaining Time First)
: 남은 cpu 시간 기준으로 가장 짧은 프로세스에 우선적으로 cpu를 할당합니다.
SJF의 선점형 버전이며, 기아 현상 발생이 가능합니다.
- Multilevel Feedback Queue(다중 레벨 피드백 큐)
: 여러 개의 큐를 사용하고, 각 큐마다 다른 시간 할당량을 설정합니다.
시간이 지날 수록 우선순위가 낮은 큐로 프로세스가 이동하며,
단계가 높아질수록(우선순위는 낮아짐) 시간 할당량이 커집니다.
=> 오버헤드를 줄이기 위함이다.
짧은 프로세스는 빠르게 처리하고, 긴 프로세스는 한번에 더 많은 CPU 시간을 주어서 효율적으로 처리하는 것이 목적입니다.
단계가 높아질수록 프로세스가 길어지는 경향이 있기 때문에
시간 할당량을 늘리는 것이 합리적입니다.
Q. CPU 성능 척도엔 무엇이 있는지 설명해주세요.
CPU Utilization (이용률)
: cpu가 실제로 작업을 수행한 시간 비율
Throughput (처리량)
: 단위 시간당 처리된 작업의 양
Turnaround Time (소요시간, 반환시간)
: 작업이 완료되는 데 걸린 총 시간 (cpu 사용 시간 + 대기 시간)
Waiting Time (대기시간)
: 프로세스가 Ready Queue에서 대기한 총 시간
Response Time (응답시간)
: 프로세스가 Ready Queue에 들어가서 처음으로 cpu를 할당받기까지의 시간
Q. 선점과 비선점이 무엇인지 설명해주세요.
선점은 cpu를 할당받은 프로세스가 강제로 cpu를 반환할 수 있는 스케줄링 방식입니다.
비선점은 프로세스가 자발적으로 cpu를 반환할때까지 cpu를 점유하는 스케줄링 방식입니다.
Q. 동시성과 병렬성이 어떻게 다른지 설명해주세요.
동시성은 멀티 프로그래밍에서 나온 개념입니다.
주기억장치에 여러 프로세스를 적재한 후,
Context Switching을 통해 마치 동시에 실행되는 것처럼 보이게 하는 것입니다.
실제로는 한번에 하나의 작업을 처리하며,
싱글코어에서 멀티스레드를 동작시키기 위한 방식입니다.
병렬성은 멀티 프로세싱에서 나온 개념입니다.
실제로 여러 프로세스를 동시에 실행하는 방식입니다.
병렬적으로 실행하기 위해서는 멀티코어 cpu가 필요합니다.
Q. Interrupt 에 대해 설명해주세요.
프로그램을 실행하고 있을 때, 입출력 혹은 예외상황을 처리하기 위해
실행하던 프로그램을 멈추고 cpu가 해당 작업을 처리하도록 하는 것을 의미합니다.
Q. 시스템 콜은 무엇인가요?
사용자 프로그램이 운영체제의 서비스를 요청할 때 사용하는 인터페이스입니다.
파일 관리, 프로세스 제어, 메모리 관리 등 하드웨어에 직접 접근하는 작업을 운영체제가 대신 처리해줍니다.
이를 통해 컴퓨터 자원을 보호하면서, 사용자나 응용프로그램에 서비스를 제공할 수 있습니다.
Q. 메모리의 종류에 대해 설명하고, 종류가 여러가지인 이유에 대해 설명해주세요.
CPU에 가까운 순서대로 레지스터, 캐시, 주기억장치(RAM), 보조기억장치(HDD/SSD)가 있습니다.
레지스터: CPU 내부에 있는 가장 빠른 메모리, 매우 용량이 적음.
캐시 메모리: CPU와 RAM 사이에서 데이터를 빠르게 전달. 용량은 제한적이만 속도가 빠름.
주기억장치(RAM): 현재 실행 중인 프로그램과 데이터를 저장. 속도는 빠르지만 휘발성.
보조기억장치(HDD/SSD): 데이터를 영구적으로 저장, 속도는 느리지만 용량이 큼.
각 메모리마다 속도나 용량이 달라 사용목적에 따라 효율적으로 사용하기 위함입니다
Q. OS가 메모리 관리를 해야 하는 이유에 대해 설명하고, 메모리 관리를 위해 어떤 전략을 사용하는지 설명하시오.
각 프로세스가 독립된 메모리 공간을 유지하여
서로의 메모리에 접근하지 못하게 하기 위해서입니다.
프로세스 간의 메모리 접근을 차단하여 안정성을 확보하고,
시스템 충돌을 방지합니다.
OS만이 시스템 전체의 메모리 공간을 직접 관리하고,
사용자와 커널 영역을 보호할 수 있습니다.
메모리 관리를 위한 주요 전략은 다음과 같습니다.
1. 가상 메모리
: 실제 메모리보다 더 많은 메모리를 사용하는 것처럼 처리하는 방식으로,
Swapping과 페이징을 사용하여 필요한 메모리만 물리 메모리에 적재합니다.
2. 페이징과 세그멘테이션
: 메모리를 고정 크기(페이지) 또는 가변 크기(세그먼트)로 나누어 관리하여,
메모리 단편화를 줄이고 효율성을 높입니다.
3. 고정 길이 할당 및 가변 길이 할당
프로세스에 고정된 크기나 가변 크기의 메로리를 할당하여 메로리 사용의 유연성을 제공합니다.
4. 압축 (Compaction)
메모리의 단편화를 줄이기 위해 사용되지 않는 공간을 재배치하여 메모리 효율을 최적화합니다.
'취준 > 기술면접' 카테고리의 다른 글
[JS 면접 총정리] 핵심 & 요약 (진행중) (7) | 2024.10.31 |
---|