🎁[속보] 인프런 내 깜짝 선물 출현 중🎁

[인프런 워밍업 클럽 3기] CS - 2주차 미션

운영체제

 

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

    • 장점: 구현이 간단, 공정한 실행 순서, 기아 현상 없음

    • 단점: 평균 대기 시간이 길어질 수 있음, 짧은 프로세스가 긴 프로세스 뒤에서 대기

       

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

    • 프로세스의 실행 시간을 미리 정확히 예측하기 어려움

    • 예측 오류로 최적화 효과 감소

    • 기아 현상 발생 가능성

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

    • 문맥 교환(context switch) 오버헤드 증가

    • CPU 효율성 저하

    • 프로세스 실행보다 스케줄링에 더 많은 시간 소비

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

    • 운영체제는 프로세스가 얼마나 오랫동안 CPU를 사용하는지를 기반으로 CPU Bound와 I/O Bound 프로세스를 구분하고, I/O Bound 프로세스는 상위 우선순위로, CPU Bound 프로세스는 하위 우선순위로 배치

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

    • 여러 프로세스나 스레드가 동시에 접근하여 사용할 수 있는 자원

    • 메모리, 파일, 데이터베이스, 입출력 장치 등

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

    • 상호 배제: 자원을 한 번에 한 프로세스만 점유.

    • 점유 및 대기: 자원을 점유한 상태에서 다른 자원을 기다림.

    • 비선점: 자원을 강제로 빼앗을 수 없음.

    • 순환 대기: 프로세스들이 자원을 순환적으로 기다림.

 


자료구조와 알고리즘

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

  2. 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

 

 

 

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

댓글을 작성해보세요.


채널톡 아이콘