🔥딱 8일간! 인프런x토스x허먼밀러 역대급 혜택

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

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

[인프런 워밍업 클럽 3기 - CS 전공지식 스터디]의 2주차 미션 내용을 작성한 글입니다.

 

운영체제

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

A1.

장점: 구현이 매우 쉽고 단순하다.

단점: 평균 대기 시간이 길어질 수 있다.

 

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

A2.

CPU 실행 시간을 미리 알기 어렵다. 가장 짧은 작업부터 처리하면 효율적이지만만, 실제 OS가 각 프로세스의 CPU 사용 시간을 정확히 알 수 없다.

 

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

A3.

아주 작은 타임 슬라이스로 인해, 프로세스가 실행되다가 Context Switching이 발생한다. 효율이 떨어지고 시스템 성능이 저하될 수 있다.

 

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

A4.

MLFQ에서는 타임 슬라이스 전부 소진하면 더 낮은 우선순위 큐로 내려간다.

I/O Bound 프로세스는 CPU를 짧게 쓰고 자주 I/O를 수행하기 때문에, 상대적으로 높은 우선순위를 부여받고, CPU Bound 프로세스는 계속 CPU를 사용하려 하기 때문에, 낮은 우선순위로 내려간다.

 

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

A5.

여러 프로세스가 동시에 사용하거나, 사용하고 싶어 하는 자원

 

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

A6. 상호 배제, 점유 대기, 비선점, 환형 대기

 


자료구조와 알고리즘

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

A1.

무한 재귀가 일어나고, 결국 스택 오버플로가 발생하여 프로그램이 중단될 수 있다.

 

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

A2.

function sumOdd(n){
  if (n < 1) {
    return 0;
  }

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

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

 

Q3.

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

다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.

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

A4.

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

 

 

댓글을 작성해보세요.

채널톡 아이콘