[인프런 워밍업클럽 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. 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;
}
댓글을 작성해보세요.