[인프런 워밍업 클럽 3기] CS - 2주차 미션
운영체제
FIFO 스케줄링의 장단점이 뭔가요?
장점: 구현이 간단, 공정한 실행 순서, 기아 현상 없음
단점: 평균 대기 시간이 길어질 수 있음, 짧은 프로세스가 긴 프로세스 뒤에서 대기
SJF를 사용하기 여러운 이유가 뭔가요?
프로세스의 실행 시간을 미리 정확히 예측하기 어려움
예측 오류로 최적화 효과 감소
기아 현상 발생 가능성
RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?
문맥 교환(context switch) 오버헤드 증가
CPU 효율성 저하
프로세스 실행보다 스케줄링에 더 많은 시간 소비
운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?
운영체제는 프로세스가 얼마나 오랫동안 CPU를 사용하는지를 기반으로 CPU Bound와 I/O Bound 프로세스를 구분하고, I/O Bound 프로세스는 상위 우선순위로, CPU Bound 프로세스는 하위 우선순위로 배치
공유자원이란무엇인가요?
여러 프로세스나 스레드가 동시에 접근하여 사용할 수 있는 자원
메모리, 파일, 데이터베이스, 입출력 장치 등
교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?
상호 배제: 자원을 한 번에 한 프로세스만 점유.
점유 및 대기: 자원을 점유한 상태에서 다른 자원을 기다림.
비선점: 자원을 강제로 빼앗을 수 없음.
순환 대기: 프로세스들이 자원을 순환적으로 기다림.
자료구조와 알고리즘
재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?
0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.
function sumOdd(n){
// 재귀 로직
}
console.log(sumOdd(10)) // 25
1 ) 무한 재귀 호출이 발생하여 스택 메모리가 넘쳐서 Stack Overflow 에러가 발생할 수 있습니다. 재귀 함수가 종료되지 않고 계속해서 자신을 호출하는 문제가 생깁니다.
2)
function sumOdd(n) {
if (n <= 0) return 0; // 기저조건: 0 이하일 경우 합이 0
if (n % 2 !== 0) return n + sumOdd(n - 1); // 홀수일 경우 더하고 다음 재귀 호출
return sumOdd(n - 1); // 짝수일 경우 다음 재귀 호출
}
console.log(sumOdd(10)); // 25
다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다. 다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.
변경 이전
const fs = require("fs"); // 파일을 이용하는 모듈
const path = require("path"); // 폴더와 파일의 경로를 지정해주는 모듈
function traverseDirectory1(directory){
const stack = [directory]; // 순회해야 할 디렉토리를 저장할 스택
while (stack.length > 0) { // 스택이 빌 때까지 반복
const currentDir = stack.pop(); // 현재 디렉토리
const files = fs.readdirSync(currentDir); // 인자로 주어진 경로의 디렉토리에 있는 파일or디렉토리들
for (const file of files) { // 현재 디렉토리의 모든 파일or디렉토리 순회
const filePath = path.join(currentDir, file); //directory와 file을 하나의 경로로 합쳐줌
const fileStatus= fs.statSync(filePath); // 파일정보 얻기
if (fileStatus.isDirectory()) { // 해당 파일이 디렉토리라면
console.log('디렉토리:', filePath);
stack.push(filePath);
} else { // 해당 파일이 파일이라면
console.log('파일:', filePath);
}
}
}
}
traverseDirectory1("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력
변경 이후
function traverseDirectory(directory) {
const files = fs.readdirSync(directory); // 인자로 주어진 경로의 디렉토리에 있는 파일or디렉토리들
for (const file of files) {
const filePath = path.join(directory, file); //directory와 file을 하나의 경로로 합쳐줌
const fileStatus = fs.statSync(filePath); // 파일정보 얻기
if (fileStatus.isDirectory()) { // 디렉토리라면
console.log('디렉토리:', filePath);
traverseDirectory(filePath); // 재귀 호출로 하위 디렉토리 순회
} else { // 파일이라면
console.log('파일:', filePath);
}
}
}
traverseDirectory("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력
댓글을 작성해보세요.