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

[워밍업 클럽 CS 3기] 2주차 미션

[워밍업 클럽 CS 3기] 2주차 미션

운영체제

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

장점: 직관적이고 단순해서 구현이 쉽습니다.

단점: 실행 시간이 짧은 프로세스를 먼저 배치해주지 못하는 등, 실행 시간에 따라 유동적으로는 작업을 할 수 없습니다.

 

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

프로세스가 걸리는 시간 예측이 힘들기 때문입니다. 짧은 프로세스가 먼저 실행되어야 한다는 것이 원칙인데 해당 프로세스가 짧을지, 길지 예상하기가 힘듭니다. 또한 실행시간이 긴 프로세스는 짧은 프로세스에 밀려 너무 오래 대기해야 합니다.

 

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

모든 프로세스들이 너무 조금씩만 사용하고 컨텍스트 스위칭이 발생하기 때문에 잦은 컨텍스트 스위칭으로 인한 오버헤드가 발생할 수 있습니다.

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

타임 슬라이스를 어떤 방식으로 사용하는지에 따른 CPU 사용률을 파악해서 어떤 프로세스인지 확률적으로 구분합니다.

CPU Bound Process: 프로세스가 타임 슬라이스를 오버해서 사용해서, 강제적으로 CPU를 뺏기는 상황이 발생합니다.

I/O Bound Process: 프로세스가 타임 슬라이스 범위 내에서 스스로 CPU를 반납합니다.

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

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

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

상호 배제 : 한 프로세스가 리소스를 점유했다면 그 리소스는 공유되어선 안됩니다.

비선점: A가 점유한다면 B는 뺏을 수 없습니다.

점유와 대기: 프로세스가 A를 갖고 B를 대기하는 것처럼 점유하고, 대기하는 과정이 있어야 합니다.

원형 대기: 점유, 대기하는 관계가 원형으로 구성되어 있어야 합니다.


자료구조와 알고리즘

Python 공부 중이라 구현은 Python으로 했습니다.

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

재귀 함수는 기저 조건을 만나서 종료되는 구조이기 때문에 함수가 종료되지 않고 계속 호출되어서 함수가 올라가는 메모리 영역인 스택이 가득 차서 강제 종료될 수 있습니다. 사실 강제 종료되면 오히려 다행이고..함수가 무한하게 호출되면서 예상하지 못한 결과가 발생할 수 있을 것 같습니다.

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

# n부터 0까지 내려며 홀수일 때만 더한다.
def sum_odd(n):
    # n이 0까지 왔다면 0 반환 해주고 끝냄
    if n <= 0:
        return 0
    # 짝수라면 그 다음 홀수로 넘어감
    if n % 2 == 0:
        return sum_odd(n-1)
    # 홀수라면 그 홀수인 n을 더하고 다음 홀수로 넘어간다
    return sum_odd(n-2) + n

1) 기저 조건은 n <=0 으로 해야 sum_odd(0), sum_odd(음수)도 정상적으로 실행이 가능합니다.

2) 기저 조건 검사, 그 후 짝수 검사하는 코드여야 합니다. 안그러면 종료되어야할 상황에 종료되지 않고 재귀가 호출됩니다.

 

 

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

# -*- coding: utf-8 -*-
import os

def traverse_directory(directory, file_list=None):
    # 초기 작업 - 현재 위치의 디렉토리, 파일을 리스트로
    if file_list is None:
        file_list = os.listdir(directory)

    # 다 pop시켜서 모두 순회했다면 종료
    if not file_list:
        return

    # js의 path.join(currentDir, file) 부분
    file_path = os.path.join(directory, file_list.pop())

    # isDirectory함수가 python에서는 isdir로 구현 가능
    if os.path.isdir(file_path):
        print('디렉토리:', file_path)
        # 디렉토리라면 디렉토리 내부도 순회해줘야하니까 재귀함수 호출
        traverse_directory(file_path)

    else:
        # 파일이라면 출력만 하고 끝냄
        print('파일:', file_path)

    # 위의 재귀함수가 알아서 하위 파일,디렉토리들을 출력해주니까 pop일어난 file_list 다시 순회
    traverse_directory(directory, file_list)

traverse_directory(".")

1) 재귀를 2번 사용했습니다. 현재 위치의 파일들도 돌아줘야하고, 하나의 특정 파일의 하위도 돌아줘야 해서 2번 사용하게 되었습니다.

2) file_list를 index를 하나씩 증가시키며 도는 방법이랑 하나씩 pop 하는 방법이 있을 것 같은데 예제 코드가 push, pop을 사용해서 저도 pop을 활용했습니다.

 

댓글을 작성해보세요.

채널톡 아이콘