인프런 워밍업 클럽 스터디 2기 - CS 전공지식<10월 둘째주 미션>
운영체제
1. FIFO 스케줄링의 장단점이 뭔가요?
FIFO : 먼저들어간 작업이 먼저 나온다.
- 프로세스가 작업이 다 끝나야 비로소 다른 프로세스가 작업할 수 있기 때문에 직관적이고 쉽지만 비효율적이다.
입출력 작업이 들어올 땐 cpu가 그 작업이 끝났다는 메시지만 기다리고 있기 때문에 cpu가 낭비된다.- 먼저 들어간 프로세스의 작업시간이 길수록 오래걸리고 다음에 오는 프로세스들의 대기 시간이 길어진다.
그렇게 되면 평균적인 대기시간이 길어지는데 효율이 낮다고 볼 수 있다.
짧은 작업시간을 가진 프로세스 먼저 실행하게 되면 뒤에 있는 프로세스들의 대기 시간이 짧아지면서 평균 대기시간도 줄고, 전체적인 효율도 높아진다.
단점을 보안하기위해 sjf 이라는 짧은 작업시간 먼저 실행하도록 하는 알고리즘이 생겼다.
2. SJF를 사용하기 여러운 이유가 뭔가요?
짧은 평균 대기 시간을 갖을 수 있다. 하지만 대기 중인 프로세스 중에서 계속 짧은 작업시간을 가진 프로세스가 들어온다면 아주 예전부터 대기하던 긴 작업시간을 프로세스들이 무한히 기다리게 될 수있는 상황이 생기게 된다.
그렇게 되면 작업수행을 하지 못하는 프로세스들이 생길 수 있게 된다.
또한 프로세스 중에 어떤 것이 짧은 작업시간을 갖는지 구분하기 불가능하기 때문에 SJF 을 사용하기 어렵다.
3. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?
RR : Round Robin
타임슬라이스를 부여해서 순서대로 온 프로세스들을 스케줄링한다.
타임슬라이스 길이를 초과하는 작업이라면 그때까지 한 작업을 강제로 멈추고 프로세스들 중 맨 뒤로 보낸다.
그 후 그 다음 프로세스가 타임슬라이스 동안 작업한다.
> 타임 슬라이스가 너무 작을 경우에는 컨텍스트 스위칭이 실행시간보다 더 많이 생겨서 오버헤드가 생긴다.
적절한 타임슬라이스로 작업하여 사용자가 사용했을 때 동시에 이용하고 있다는 느낌을 주어야한다.
(타임 슬라이스 크기가 크면 FIFO 이랑 똑같이 된다. 오히려 RR 알고리즘이 컨텍스트 스위칭이 일어나 더 비효율적이게 된다.)
4. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?
MLFQ : 멀티 레벨 피드백 큐. 여러 큐를 준비하고 큐마다 타임슬라이스와 우선순위를 준다.
우선순위가 낮을수록 타임슬라이스 값이 커진다.작은 타임 슬라이스를 이용해서 프로세스들을 처리하게 된다. -> 긴 대기 시간을 가진 프로세스 오버헤드🔼 불리함.
긴 대기시간을 가진 프로세스도 불이익 없게 하기 위해서는 어떻게 해야할까?
-> MLFQ 알고리즘 사용> CPU Bound Process는 cpu에 할당되어 작업할 것이 많을 텐데 그렇게되면 타임 슬라이스에 비해 오래 걸리기 때문에 자주 cpu를 뺏길 것이다.
I/O Bound Process는 cpu 보다 입출력 작업을 더 많이 한다. 그렇게 된다면 분명 cpu를 자주 혹은 빨리 cpu 돌려줄 것이다. 이것을 보고 I/O bound Process 인 것을 예상할 수 있다.
5. 공유자원이란무엇인가요?
> 프로세스들간에 작업을 할 때 같이 공통으로 쓰이게 되는 자원.
공유자원을 한 프로세스가 사용할 때 다른 프로세스가 차지하지 않도록해야한다.
-> 세마포어, 모니터 상호배제 알고리즘이 있다.
6. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?
> 총 4가지 조건을 충족해야 한다.
상호배제 : 작업 중인 프로세스가 공유자원을 사용하는데, 다른 프로세스가 공유자원을 사용
비선점 : 프로세스가 하는 작업을 다른 프로세스가 와서 뺏지 않는다.
점유와 대기 : 프로세스가 a작업을 하는 중에 다른 b작업을 하려고 대기하는 상태
환형대기 : 점유와 대기 모습이 원형 모습으로 서로서로 대기하는 상태
자료구조와 알고리즘
1. 재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?
기저 조건에 따라 다르지만 프로그램이 멈추지 못하고 영원히 재귀함수를 호출하거나 원하지 않는 결과가 나올 수있다.
2. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.
function sumOdd(n){
// 재귀 로직
if(n < 0) return ;//기저조건
return n+ sumOdd(n-1);
}
console.log(sumOdd(10)) // 25
댓글을 작성해보세요.