💸딱 하루, 인프런 천원샵 오픈!

[워밍업 클럽 3기 - CS 전공 지식] - Day 9 미션 2

운영체제

  1. FIFO 스케줄링의 장단점이 뭔가요?

  • 장점

    • 단순하고 이해하기 쉽다

  • 단점

    • 실행 시간(burst time)이 짧은 프로세스는 실행 시간이 길더라도 일찍 도착한 프로세스의 완료를 기다려야한다

 

  1. SJF를 사용하기 여러운 이유가 뭔가요?

A. 프로세스의 실행시간을 예측하기 어렵다.

 

  1. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?

A. 컨텍스트 스위칭을 처리하는 비용이 증가한다.

 

  1. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?

A. CPU 사용시간에 따라 우선순위 큐에 다르게 배치하면서 구분한다. 예를 들어, CPU 바운드 작업은 타임 슬라이스를 I/O 바운드 작업보다 오래 점유해서 사용하기 때문에, 우선순위가 낮은 큐에 배치시키고, 더 짧게 사용하는 I/O 바운드 프로세스는 우선순위가 더 높은 큐에 배치시킨다. (타임 슬라이스를 사용하는 시간과 요청 빈도에 의한 피드백)

 

  1. 공유자원이란 무엇인가요?

A. 프로세스간 통신에서 공통으로 접근해서 이용하게 되는 데이터.

 

  1. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?

  • 상호 배제: 자원은 한번에 하나의 프로세스만 사용

  • 비선점: 이미 점유한 자원은 다른 프로세스가 뺏어갈 수 없다

  • 점유와 대기: 이미 자원을 점유한 프로세스가 추가적인 자원을 기다리는 상태

  • 원형 대기: 프로세스들이 서로가 가지고 있는 자원을 기다리며 대기하는 상태


자료구조와 알고리즘

  1. 재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?

A. 함수에서 탈출하지 못하기 때문에 무한하게 재귀를 호출하게 되면서 스택 오버플로우(StackOverflow)가 발생한다.

  1. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.

A.

function sumOdd(n) {
    if (n <= 0) return 0; // 기저조건
    if (n % 2 === 0) return sumOdd(n - 1);
    return n + sumOdd(n - 2);
}

console.log(sumOdd(10)) // 25

 

  1. 다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다. 다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.

import fs from "fs";
import path from "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("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력

console.log("------------------------");

function traverseDirectory2(directory){
    const files = fs.readdirSync(directory); // 현재 디렉토리의 파일 목록 가져오기

    for (const file of files) {
        const filePath = path.join(directory, file); // 파일 또는 디렉토리의 전체 경로
        const fileStatus = fs.statSync(filePath); // 파일정보 얻기

        if (fileStatus.isDirectory()) { // 해당 파일이 디렉토리라면
            console.log('디렉토리:', filePath);
            traverseDirectory2(filePath); // 재귀 호출하여 내부 탐색
        } else { // 파일인 경우
            console.log('파일:', filePath);
        }
    }
}

traverseDirectory2("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력

 

댓글을 작성해보세요.


채널톡 아이콘