[인프런 워밍업 클럽 2기 CS] 2주차 미션
운영체제 (Operating Systems)
1. FIFO 스케줄링의 장단점
FIFO (First-In, First-Out) 스케줄링은 먼저 도착한 프로세스를 먼저 실행하는 방식입니다.
장점:
단순함: 구현이 매우 간단하고 이해하기 쉽습니다.
공정성: 모든 프로세스가 도착한 순서대로 처리되어 순서에 대한 공정성을 보장합니다.
단점:
긴 대기 시간: 긴 실행 시간을 가진 프로세스가 먼저 도착하면, 뒤에 있는 짧은 프로세스들이 오랜 시간 대기해야 합니다.
비효율성: 응답 시간이 중요한 시스템에서는 비효율적일 수 있습니다.
2. SJF 사용의 어려움
SJF (Shortest Job First)는 실행 시간이 가장 짧은 작업을 먼저 처리하는 스케줄링 알고리즘입니다.
사용하기 어려운 이유:
실행 시간 예측의 어려움: 실제 환경에서는 프로세스의 정확한 실행 시간을 사전에 알기 어렵습니다.
스타베이션 문제: 긴 작업이 지속적으로 도착할 경우, 긴 작업들이 계속 뒤로 밀려 무기한 대기할 수 있습니다.
동적 변화 대응의 어려움: 시스템 부하나 프로세스 특성이 변할 때 유연하게 대응하기 어렵습니다.
3. RR 스케줄링에서 타임 슬라이스가 너무 작을 때 발생하는 문제
RR (Round Robin) 스케줄링은 각 프로세스에 고정된 시간 할당량을 부여하여 순환 방식으로 CPU를 할당하는 알고리즘입니다.
문제점:
오버헤드 증가: 프로세스 간의 컨텍스트 스위칭이 빈번하게 발생하여 시스템 오버헤드가 증가합니다.
실행 시간 비효율성: 짧은 타임 슬라이스로 인해 많은 스위칭이 필요하게 되어 실제 작업에 소요되는 시간이 늘어날 수 있습니다.
캐시 효율 저하: 잦은 컨텍스트 스위칭으로 인해 캐시 히트율이 떨어지고, 캐시 미스가 증가할 수 있습니다.
4. MLFQ에서 CPU Bound Process와 I/O Bound Process 구분 방법
MLFQ (Multi-Level Feedback Queue)는 여러 개의 우선순위 큐를 사용하여 프로세스의 특성에 따라 동적으로 우선순위를 조정하는 스케줄링 알고리즘입니다.
CPU Bound Process: 주로 CPU를 많이 사용하는 프로세스로, MLFQ에서는 장시간 CPU를 점유하는 경향이 있어 우선순위가 낮은 큐로 이동할 수 있습니다.
I/O Bound Process: 자주 I/O 작업을 수행하고 CPU 사용 시간이 짧은 프로세스로, I/O 요청 시 우선순위가 상승하여 높은 우선순위 큐로 이동합니다.
운영체제는 프로세스의 CPU 사용 패턴과 I/O 활동을 모니터링하여, 각 프로세스가 CPU Bound인지 I/O Bound인지를 판단하고 적절한 우선순위를 할당합니다.
5. 공유 자원이란?
공유 자원 (Shared Resource)은 여러 프로세스나 스레드가 동시에 접근하여 사용할 수 있는 자원을 말합니다. 예를 들어, 파일, 데이터베이스, 프린터, 메모리 공간 등이 있습니다.
특징:
동시 접근 가능성: 여러 프로세스가 동시에 접근할 수 있어 효율적인 자원 활용이 가능합니다.
경합 상태: 동시에 접근하면 상호 배제(Mutual Exclusion)나 일관성 유지 문제 등이 발생할 수 있습니다.
동기화 필요성: 공유 자원에 대한 올바른 접근을 보장하기 위해 동기화 메커니즘(예: 세마포어, 뮤텍스)을 사용해야 합니다.
6. 교착상태 발생 조건
교착상태 (Deadlock)는 두 개 이상의 프로세스가 서로가 점유하고 있는 자원을 기다리며 무한히 대기하는 상태를 말합니다. 교착상태가 발생하기 위해서는 다음 네 가지 조건이 모두 충족되어야 합니다:
상호 배제 (Mutual Exclusion): 자원은 동시에 하나의 프로세스만 사용 가능해야 합니다.
점유와 대기 (Hold and Wait): 한 프로세스가 자원을 점유하면서 추가적인 자원을 기다려야 합니다.
비선점 (No Preemption): 이미 할당된 자원을 선점할 수 없어야 합니다.
순환 대기 (Circular Wait): 프로세스들이 자원에 대해 순환적으로 대기하는 선형 경로가 존재해야 합니다.
이 조건들을 모두 만족하면 교착상태가 발생할 수 있으므로, 이를 방지하거나 해결하기 위해서는 이 조건들 중 하나 이상을 위반해야 합니다.
자료구조와 알고리즘 (Data Structures and Algorithms)
1. 재귀함수에서 기저조건 미설정 시 발생 문제
재귀 함수 (Recursive Function)에서 기저 조건 (Base Case)은 재귀 호출을 종료시키는 조건입니다. 기저 조건을 만들지 않거나 잘못 설정하면 다음과 같은 문제가 발생할 수 있습니다:
무한 재귀 호출 (Infinite Recursion): 기저 조건이 없으면 함수가 자기 자신을 계속해서 호출하게 되어 종료되지 않고 무한히 실행됩니다.
스택 오버플로우 (Stack Overflow): 재귀 호출이 계속해서 쌓이면서 호출 스택이 가득 차게 되어 프로그램이 충돌하거나 비정상 종료될 수 있습니다.
논리적 오류: 기저 조건이 잘못 설정되면 함수가 의도한 대로 동작하지 않아 잘못된 결과를 반환할 수 있습니다.
따라서 재귀함수를 구현할 때는 적절한 기저 조건을 설정하여 재귀 호출이 올바르게 종료되도록 해야 합니다.
2. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수 구현
function sumOdd(n) {
// 기저 조건: n이 0보다 작거나 같을 때
if (n <= 0) {
return 0;
}
// n이 홀수인 경우
if (n % 2 !== 0) {
return n + sumOdd(n - 1);
}
// n이 짝수인 경우
return sumOdd(n - 1);
}
console.log(sumOdd(10)); // 출력: 25
console.log(sumOdd(15)); // 출력: 64
기저 조건:
n
이 0보다 작거나 같을 때 0을 반환하여 재귀 호출을 종료합니다.홀수 처리:
n
이 홀수인 경우,n
을 더하고n - 1
을 인자로 재귀 호출합니다.짝수 처리:
n
이 짝수인 경우,n
을 더하지 않고n - 1
을 인자로 재귀 호출합니다.
예제 실행:
sumOdd(10)
은 1 + 3 + 5 + 7 + 9 = 25를 반환합니다.sumOdd(15)
는 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 = 64를 반환합니다.
댓글을 작성해보세요.