![[워밍업 클럽 CS 3기] 2주차 미션](https://cdn.inflearn.com/public/files/blogs/05e523fe-3e16-4ce3-8ac4-c24853ef3ef9/336224.png) 
    [워밍업 클럽 CS 3기] 2주차 미션
운영체제
- FIFO 스케줄링의 장단점이 뭔가요? 
장점: 직관적이고 단순해서 구현이 쉽습니다.
단점: 실행 시간이 짧은 프로세스를 먼저 배치해주지 못하는 등, 실행 시간에 따라 유동적으로는 작업을 할 수 없습니다.
- SJF를 사용하기 여러운 이유가 뭔가요? 
프로세스가 걸리는 시간 예측이 힘들기 때문입니다. 짧은 프로세스가 먼저 실행되어야 한다는 것이 원칙인데 해당 프로세스가 짧을지, 길지 예상하기가 힘듭니다. 또한 실행시간이 긴 프로세스는 짧은 프로세스에 밀려 너무 오래 대기해야 합니다.
- RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요? 
모든 프로세스들이 너무 조금씩만 사용하고 컨텍스트 스위칭이 발생하기 때문에 잦은 컨텍스트 스위칭으로 인한 오버헤드가 발생할 수 있습니다.
- 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요? 
타임 슬라이스를 어떤 방식으로 사용하는지에 따른 CPU 사용률을 파악해서 어떤 프로세스인지 확률적으로 구분합니다.
CPU Bound Process: 프로세스가 타임 슬라이스를 오버해서 사용해서, 강제적으로 CPU를 뺏기는 상황이 발생합니다.
I/O Bound Process: 프로세스가 타임 슬라이스 범위 내에서 스스로 CPU를 반납합니다.
- 공유자원이란 무엇인가요? 
프로세스 간 통신을 할 때 공동으로 이용하는 변수나 파일을 말합니다.
- 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요? 
상호 배제 : 한 프로세스가 리소스를 점유했다면 그 리소스는 공유되어선 안됩니다.
비선점: A가 점유한다면 B는 뺏을 수 없습니다.
점유와 대기: 프로세스가 A를 갖고 B를 대기하는 것처럼 점유하고, 대기하는 과정이 있어야 합니다.
원형 대기: 점유, 대기하는 관계가 원형으로 구성되어 있어야 합니다.
자료구조와 알고리즘
Python 공부 중이라 구현은 Python으로 했습니다.
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) + n1) 기저 조건은 n <=0 으로 해야 sum_odd(0), sum_odd(음수)도 정상적으로 실행이 가능합니다.
2) 기저 조건 검사, 그 후 짝수 검사하는 코드여야 합니다. 안그러면 종료되어야할 상황에 종료되지 않고 재귀가 호출됩니다.
- 다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다. 다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요. 
# -*- 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을 활용했습니다.
댓글을 작성해보세요.
