[인프런 워밍업클럽 2기] CS전공지식_Mission02

[인프런 워밍업클럽 2기] CS전공지식_Mission02

운영체제


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

장점

  • 단순하고 직관적인 이다.

단점

  • 처음 들어온 작업이 끝나야 다음 프로세스가 된다. ( 즉 늦게 도착하면 실행시간이 길어진다 빨리 도착했던 작업을 먼저 기다려야 하기 때문이다.)

  • I/O 작업 같은 것도 다른 작업이 끝날 때 까지 다른 작업을 못하게 되어 사용률이 떨어진다.

 

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

  • FIFO 스케줄링 방식보다는 좋으나. 어떤 프로세스가 먼저 실행 될지 예측하기 힘들어졌다.

  • SJF는 BURST타임이 가장 짧은 것 부터 실행되는 문제점 때문에, 타임이 긴 프로세스가 뒤로 밀려나는 현상이 생겼다.

 

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

  • 어떤 프로그램 같은 것들이 동시에 실행되는 것 처럼 보일 수 있으나 -> 컨텍스트 스위칭이 자주 일어나서 처리되는 TimeSlice의 양보다 컨텍스트 스위칭 처리가 더 많아져서 오버헤드가 발생할 수 있다.

 

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

  • MLFQ는 손해보는 프로세스가 어떻게 손해보지 않을까 생각해 보는 것

  • 각각에게 맞는 타임슬라이스를 할당하는 방식

     

     

    프로세스 구분 : 프로세스가 CPU를 자발적으로 반납하면 I/O Bound Process일 확률이 높고, 타임 슬라이스를 초과해 강제로 CPU를 뺏기면 CPU Bound Process일 확률이 높다.

 

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

  • 각 프로세스가 통신을 할 때 공동으로 이용하는 변수파일

     

 

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

상호배제, 비선점, 점유와 대기, 원형 대기 (상비점원)

  1. 상호배제 : 어떤 프로세스가 리소스 점유시 그 리소스는 다른 프로세스 사용하지 못해야 한다. (리소를 점유하는 상황)

  2. 비선점 : 프로세스가 점유한 리소스를 다른 프로세스가 빼앗을 수 없다. (사용중인 리소스를 빼앗을 수 없는 상황)

  3. 점유와 대기 : 프로세스가 이미 리소스를 점유한 상태에서 추가적인 리소스를 요청해야 한다. (다른 리소스를 기다리는 상황)

  4. 원형 대기 : 점유와 대기 관계가 원형으로 형성되어야 한다. (서로가 기다리는 상황)

 

자료구조와 알고리즘


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

  • 무한루프가 발생하거나, 스택 오버플로우가 발생할 수 있음

그래서 반드시 기저조건(탈출조건)을 작성해야 한다.

재귀는 반드시 작성할 때 그 재귀의 깊이 및 수행시간도 고려해서 하향식 설계하는 것을 중요시 한다.

 

*하향식 설계 : 전체 문제를 작은 하위 문제로 나누어 접근하는 것 (큰 문제를 먼저 정의 후 점진적으로 해결)

 

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

#include <iostream>
using namespace std;

int sumOdd(int n)
{
    // 기저 사례 : n이 1일때
    if (n <= 0) {
        return 0; 
    }
    // 1 3 5 7 9
    if (n % 2 == 1) // 2로 나눈 나머지가 1인 것 
    {
        return n + sumOdd(n - 1); // n이 홀수 일때 
    }
    else {
        return sumOdd(n-1); // n이 짝수이면 이쪽으로 오게 된다 그러고 -1시켜 줄여나간다.
    }
}


int main()
{
    int sum;
    cin >> sum;
    cout << sumOdd(sum) << endl;
}

더 줄이기

#include <iostream>
using namespace std;

int sumOdd(int n)
{
    if (n <= 0) return 0; // n이 0일때 홀수의 합은 0
    return (n % 2 == 1 ? n : 0) + sumOdd(n-1); 
    // 홀수라면 해당 값을 넘겨주는데 sumOdd(로 재귀를 계속 실시)
}

int main()
{
    int sum;
    cin >> sum;
    cout << sumOdd(sum) << endl;
}

댓글을 작성해보세요.

채널톡 아이콘