inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

인프런 워밍업 클럽 CS 3기 2주차 발자국

연유
0

학습회고

 

2주차 운영체제 강의에서는 프로세스와 메모리에 대해 깊이 배웠습니다. 강의를 들으며 공부한 내용을 기록했는데 집중도 잘되고 복습하기에도 편리했습니다. 다음주에는 3주차 학습과 함께 1주차와 2주차 내용을 복습하겠습니다.


🎯 미션

 

운영체제

 

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

장점은  단순하고 직관적인 것입니다.

단점은 실행시간이 짧고 늦게 요청된 프로세스가 실행시간이 길고 빨리 요청된 프로세스의 작업을 기다려야하는 것입니다. 또한 I/O 작업이 있다면 CPU 사용률이 떨어집니다.

 

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

프로세스가 얼마나 실행될 지 예측하기 힘듭니다. 그리고 Burst Time이 긴 프로세스의 경우 아주 오랫동안 실행되지 않을 수 있습니다.

 

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

컨텍스트 스위칭이 빈번하게 발생하여 오버헤드가 너무 커집니다. 

 

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

타임 슬라이스를 오버하여 CPU를 강제로 뺏기면 CPU Bound Process로 구분하고, 스스로 CPU를 반납하면 I/O Bound Process로 구분을 합니다.

 

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

     

    프로세스 간 통신을 할 때 공동으로 이용하는 변수나 파일입니다. 

 

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

상호배제, 비선점, 점유와 대기, 원형 대기 입니다. 

 

 

자료구조와 알고리즘

 

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

콜스택에 함수가 무한히 쌓여서  메모리가 부족해집니다. 스택 오버플로우가 발생하며 프로그램이 종료될 수 있습니다.

 

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

function sumOdd(n){
    if(n == 0) return 0;
    if(n == 1) return 1;
    if(n & 1) {
        return sumOdd(n - 2) + n;
    } else {
        return sumOdd(n - 1);
    }    
}

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

n이 홀수라면 n의 값을 더하고 sumOdd(n - 2)를 수행하도록 했습니다.

짝수라면 sumOdd(n - 1)을 수행하도록 했습니다.  

 

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

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 traverseDirectory1(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);
            traverseDirectory1(filePath);
        } else {
            console.log('파일:', filePath);
        }
    }
}

traverseDirectory1(".");
  1. 재귀함수를 사용하므로 stack을 사용하지 않아도 됨

  2. 해당 파일이 디렉토리라면 traverseDirectory1() 를 재귀적으로 호출

 


📝회고

 

미션 과정에서 재귀함수를 하향식으로 구현하려고 노력했습니다. 자료구조와 알고리즘 3번 미션에서 for문을 재귀함수로 대체하려고 했으나 구현하지 못했습니다. 이유는 디렉토리에 여러 개의 파일이 있어서 반복해서 출력해야하기 때문입니다. 구현가능한 방법이 있다면 알고 싶습니다.

답변 0