본문 바로가기
면접

[직무 면접 대비] 운영체제 면접 예상 질문

by 건복치 2021. 5. 20.
반응형

가상 메모리

가상 메모리란 보조기억장치의 일부를 주기억장치처럼 사용하는 것으로
프로그램의 여러 개의 작은 블록으로 나누어 가상 메모리에 저장한 뒤, 프로그램 실행 시 필요한 블록만 가져와 주기억장치에 할당해 처리합니다.
이때 작은 블록으로 나누는 것을 페이징이라 합니다.
프로그램을 동일한 크기로 나누는 것을 페이징이라고 하고 내부 단편화가 생길 수 있습니다.
그리고 세그먼트라는 논리적 단위로 나누는 것을 세그멘테이션이라고 하고 외부 단편화가 생길 수 있습니다.

데드락(Deadlock), 교착 상태

더보기

운영체제에서 데드락(교착상태)이란, 시스템 자원에 대한 요구가 뒤엉킨 상태입니다.

즉, 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 일컫습니다.

데드락(Deadlock)의 발생조건

데드락이 발생하기 위한 조건은 크게 4가지로 말할 수 있습니다.

  • 상호 배제
    • 한 번에 프로세스 하나만 해당 자원을 사용할 수 있다. 사용 중인 자원을 다른 프로세스가 사용하려면 요청한 자원이 해제될 때까지 기다려야 한다.
  • 점유 대기
    • 자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다.
  • 비선점
    • 이미 할당된 자원을 강제로 빼앗을 수 없다(비선점).
  • 순환 대기
    • 대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다.

데드락(Deadlock)의 해결법

데드락의 해결법을 크게 3가지로 분류할 수 있습니다.

  • 데드락이 발생하지 않도록 예방(prevention) 하기
  • 데드락 발생 가능성을 인정하면서도 적절하게 회피(avoidance) 하기
  • 데드락 발생을 허용하지만 데드락을 탐지(detection)하여, 데드락에서 회복하기

데드락 예방(Prevention)

데드락의 발생조건 4가지 중 하나라도 발생하지 않게 하는 것이 데드락을 예방하는 방법입니다.

즉, 각각의 조건을 방지(부정)하여 데드락 발생 가능성을 차단합니다.

  • 자원의 상호 배제 조건 방지 : 한 번에 여러 프로세스가 공유 자원을 사용할 수 있게 합니다.
    • 그러나 추후 동기화 관련 문제가 발생할 수 있습니다.
  • 점유 대기 조건 방지 : 프로세스 실행에 필요한 모든 자원을 한꺼번에 요구하고 허용할 때까지 작업을 보류해서, 나중에 또다른 자원을 점유하기 위한 대기 조건을 성립하지 않도록 합니다.
  • 비선점 조건 방지 : 이미 다른 프로세스에게 할당된 자원이 선점권이 없다고 가정할 때, 높은 우선순위의 프로세스가 해당 자원을 선점할 수 있도록 합니다.
  • 순환 대기 조건 방지 : 자원을 순환 형태로 대기하지 않도록 일정한 한 쪽 방향으로만 자원을 요구할 수 있도록 합니다.

이러한 조건을 방지해서 데드락을 예방하는 방법은 시스템의 처리량이나 효율성을 떨어트리는 단점이 발생할 수 있습니다.

다음에 살펴볼 데드락 회피 법은 예방법보다는 조금 덜 제한적인 방법으로 예방법의 단점을 일부 해결할 수 있습니다.

데드락 회피(Avoidance)

데드락 회피 법에서는 Safe sequence, Safe state 등이 키워드입니다.

시스템의 프로세스들이 요청하는 모든 자원을, 데드락을 발생시키지 않으면서도 차례로 모두에게 할당해 줄 수 있다면 안정 상태(safe state)에 있다고 말합니다.

그리고 이처럼 특정한 순서로 프로세스들에게 자원을 할당, 실행 및 종료 등의 작업을 할 때 데드락이 발생하지 않는 순서를 찾을 수 있다면, 그것을 안전 순서(safe sequence)라고 부릅니다.

 

반면 불안정 상태는 안정 상태가 아닌 상황을 말합니다. 

즉, 데드락 발생 가능성이 있는 상황이며, 교착 상태(데드락)는 불안정 상태일 때 발생할 수 있습니다. 불안정 상태가 교착 상태보다 좀 더 큰 집합입니다.(즉, 교착 상태가 불안정 상태의 부분집합)

 

이처럼 회피 알고리즘은 자원을 할당한 후에도 시스템이 항상 Safe state에 있을 수 있도록 할당을 허용하자는 것이 기본 특징입니다.

이러한 특징을 살린 알고리즘으로 유명한 것이 은행원 알고리즘입니다.

은행원 알고리즘(Banker’s Algorithm)

다익스트라가 제안한 기법으로, 어떤 자원의 할당을 허용하는지에 관한 여부를 결정하기 전에, 미리 결정된 모든 자원들의 최대 가능한 할당량을 가지고 시뮬레이션해서 Safe state에 들 수 있는지 여부를 검사합니다. 

즉 대기 중이 다른 프로세스들의 활동에 대한 교착 상태 가능성을 미리 조사하는 것입니다.

 

어떤 자원 한 가지에 대해서 은행원 알고리즘을 시뮬레이션해보고자 합니다.

처음에 시스템이 총 12개의 자원을 가지고 있다고 가정해 보겠습니다.

 

(t=t0) Max Allocation Need Available
P0 10 5 5  
P1 4 2 2  
P2 9 2 7  

P0~P2는 프로세스이고, Max는 각 프로세스마다 최대 자원 요청량, Allocation은 현재 프로세스에 할당 중인 자원의 양, Need는 남은 필요한 자원의 양(Max-Allocation)입니다.

 

현재 t0일 때 프로세스에 할당된 자원의 합은 5+2+2=9개입니다. 따라서 현재 Available 자원은 12 - 9 = 3개입니다.

 

여기서 Safe sequence를 찾아보려고 합니다. 순서가 <P1, P0, P2> 일 때 안전 순서를 만족합니다.

  • P1은 2개가 이미 할당되어 있고, 2개를 추가적으로 할당받기를(Need) 기다리고 있습니다. 현재 Available 자원은 3개이므로, 이 중에 2개를 P1에게 할당해 줍니다. => 현재 Available은 3 - 2 = 1개
  • 실행이 끝난 P1은 자신에게 할당되어 있던 자원 4개를 모두 반납합니다. => 현재 Available은 1 + 4 = 5개
  • 현재 Available 자원이 5개이고, 이를 P0에게 모두 할당해 주면 P0도 실행 가능해집니다. => 현재 Available은 5 - 5 = 0개 가 됩니다.
  • 실행이 끝난 P0은 자신에게 할당되어 있던 자원 10개를 모두 반납합니다. => 현재 Available은 0 + 10 = 10개
  • 마지막으로 P2에게 자원 7개를 할당해 줍니다. => 현재 Available은 10 - 7 = 3개
  • 실행이 끝난 P2는 자신에게 할당되어 있던 자원 9개를 모두 반납합니다. => 현재 Available은 3 + 9 = 12개

이렇게 자원의 부족함 없이 올바르게 할당하여 모든 프로세스가 실행을 할 수 있었습니다.

만약 여기에서 P2 프로세스가 처음에 자원을 하나 더 할당받고 있었다면(즉, 2개가 아니라 3개) 운영체제가 가지고 있는 Available 자원은 12 - (5+2+3) = 2개였을 것입니다.

이 상황에서는 처음에 P1에게 2개를 모두 주고, P1이 실행이 끝나고 자원을 모두 반납해도 Available 자원은 2 + 2 = 4개뿐이므로, 이 자원으로는 나머지 P0이나 P2 프로세스를 해결해 줄 수 없습니다. (모두 4개보다 많은 양의 자원을 필요로 하고 있으므로)

따라서 P0, P2는 자원을 할당받기를 계속 기다려야 할 것입니다.

운영체제가 사전에 P2 프로세스가 자원을 하나 더 요청했을 때 할당해 주지 않고, P1이 먼저 끝나게 한다면 데드락이 발생하지 않았을 것입니다. 그러므로 은행원 알고리즘을 사용해서 자원 할당량을 사전에 파악하고 데드락을 회피할 수 있도록 하면 될 것입니다.

그러나 은행원 알고리즘의 경우, 이처럼 미리 최대 자원 요구량을 알아야 하고, 할당할 수 있는 자원 수가 일정해야 하는 등 사용에 있어 제약조건이 많고, 그에 따른 자원 이용도 하락 등 단점도 존재합니다.

데드락 탐지(Detection) 및 회복(Recovery)

먼저 시스템이 데드락 예방이나 회피 법을 사용하지 않았을 때, 데드락이 발생할 수 있으니 여기에서 회복하기 위해 데드락을 탐지하고, 회복하는 알고리즘을 사용합니다.

1. 탐지 기법

Allocation, Request, Available 등으로 시스템에 데드락이 발생했는지 여부를 탐색합니다. 

즉, 은행원 알고리즘에서 했던 방식과 유사하게 현재 시스템의 자원 할당 상태를 가지고 파악합니다.

이 외에도 자원 할당 그래프를 통해 탐지하는 방법도 있습니다.

2. 회복 기법

데드락을 탐지 기법을 통해 발견했다면, 순환 대기에서 벗어나 데드락으로부터 회복하기 위한 방법을 사용합니다.

 

단순히 프로세스를 1개 이상 중단시키기

  • 교착 상태에 빠진 모든 프로세스를 중단시키는 방법 : 계속 연산중이던 프로세스들도 모두 일시에 중단되어 부분 결과가 폐기될 수 있는 부작용이 발생할 수 있음
  • 프로세스를 하나씩 중단 시킬 때마다 탐지 알고리즘으로 데드락을 탐지하면서 회복시키는 방법 : 매번 탐지 알고리즘을 호출 및 수행해야 하므로 부담이 되는 작업일 수 있음

자원 선점하기

  • 프로세스에 할당된 자원을 선점해서, 교착 상태를 해결할 때까지 그 자원을 다른 프로세스에 할당해 주는 방법
출처 : https://chanhuiseok.github.io/posts/cs-2/

1) 운영 체제 란 무엇입니까?

운영 체제는 컴퓨터 하드웨어가 컴퓨터 소프트웨어와 통신하고 작동하도록 하는 소프트웨어 프로그램이다.

2) 운영 체제의 주요 목적은 무엇입니까?

운영 체제에는 두 가지 주요 목적이 있다.
1. 컴퓨터 시스템의 계산 활동을 관리하여 컴퓨터 시스템이 제대로 작동하도록 한다.
2. 프로그램 개발 및 실행을 위한 환경을 제공한다.

3) 프로세스란 무엇을 의미합니까?

컴퓨터에서 실행되고 있는 프로그램을 프로세스라고 한다.
두 가지 유형의 프로세스가 있다. 운영 체제 프로세스, 사용자 프로세스

3-1) 프로세스의 특징을 설명하세요.

- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다. (Ex. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용)

4) 스레드(Thread)는 무엇입니까?

스레드는 CPU 사용의 기본 단위이다. 프로세스 내에서 실행되는 여러 흐름의 단위를 말한다.
스레드는 스레드 ID, 프로그램 카운터, 레지스터 세트 및 스택으로 구성된다.
[참고] 운영체제는 자원을 효율적으로 사용하려고 한다. 스레드를 사용하면 프로세스보다 생성할 때 오버헤드도 적고 공유된 자원에 대해서도 오버헤드가 적다. 그리고 스레드를 이용하면 병렬성을 높일 수 있다.

4-1) 스레드의 특징을 설명하세요.

- 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
- 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
- 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
- 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
- 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

4-2) 프로세스와 스레드의 차이는 무엇입니까?

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다. 프로세스는 운영체제로부터 메모리, 주소 공간 등을 할당받고 스레드는 할당받은 자원들을 내부 스레드끼리 공유하면서 실행된다.

[정리]
- 프로세스는 실행 중인 프로그램으로 다른 프로세스와 상관없이 독립적으로 자원을 할당받는다.
- 스레드는 경량화된 프로세스로 프로세스 안에 존재한다. 각 스레드는 별도의 레지스터와 스택을 갖고, 힙 영역은 공유한다.

스레드를 사용하는 이유는 운영체제에서 더 효율적으로 시스템 자원을 관리하기 위해 사용된다고 할 수 있다. 멀티 프로세스로 진행되는 작업을 멀티 스레드로 수행하게 되면 시스템 콜이 줄어들기 때문에, 자원을 효율적으로 관리할 수 있고 프로세스의 통신비용보다 스레드 간의 통신 비용이 적다는 이점도 있다.

단 스레드 간의 자원 공유는 전역 변수를 이용하므로 동기화 문제에 신경을 써야 하며 멀티스레드 프로그래밍은 프로그래머의 주의를 요구한다.

4-3) 스레드의 장점?

- 스레드는 프로세스보다 생성 및 종료시간, 스레드 간 전환시간이 짧다.
- 스레드는 프로세스의 메모리, 자원 등을 공유하므로 커널의 도움 없이 상호 간의 통신이 가능하다.

4-4) 멀티 스레딩(Multi-threading)의 장점과 단점은?

- 멀티 스레딩이란 하나의 프로세스를 다수의 스레드로 만들어 실행하는 것
장점)
- 하나의 프로세스 내에 다수의 실행 단위들이 존재하여 작업의 수행에 필요한 자원들을 공유하기 때문에 자원의 생성과 관리가 중복되는 것을 줄일 수 있다.
단점)
- 교착상태를 발생시킬 수 있다.
- 동기화에 주의해야 한다.

4-5) 멀티 프로세스 대신 멀티 스레드를 사용하는 이유는 무엇입니까?

- 쉽게 설명하면, 프로그램을 여러 개 키는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이다.

- 자원의 효율성 증대
: 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다. (프로세스 간의 Context Switching시 단순히 CPU 레지스터 교체뿐만 아니라 RAM과 CPU 사이의 캐시 메모리에 대한 데이터까지 초기화되므로 오버헤드가 크기 때문)
: 스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.

- 처리 비용 감소 및 응답 시간 단축
: 프로세스 간의 통신(IPC)보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어든다. (스레드는 Stack 영역을 제외한 모든 메모리를 공유하기 때문)
: 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다. (Context Switching시 스레드는 Stack 영역만 처리하기 때문)

4-6) 멀티 프로세싱과 멀티프로그래밍의 차이는?

멀티 프로세싱은 여러 개의 처리장치(CPU)를 장착하여 동시에 여러 작업을 병렬로 실행하는 방법.
멀티프로그래밍은 다수 개의 프로그램의 같이 주기억장치에 있도록 한 방식.

5) 소켓이란 무엇입니까?

소켓은 두 응용 프로그램을 연결하는 데 사용된다. 연결의 끝점을 소켓이라고 한다.

6) 커널이란 무엇입니까?

커널은 OS의 모든 부분에 대한 기본 서비스를 제공하는 컴퓨터 운영 체제의 핵심이자 가장 중요한 부분이다.

7) 힙 영역과 스택 영역의 차이점을 설명하시오.

프로그램이 실행되기 위해 프로그램이 메모리에 로드가 되어야 한다.
따라서 운영체제에서 프로그램의 실행을 위해 다 향한 메모리 공간을 제공한다.
코드, 데이터, 스택, 힙 영역이 할당되고 각 역할은 다음과 같다.

  • 코드 : 실행할 프로그램의 코드가 저장되는 텍스트 영역이다. CPU는 코드 영역에서 저장된 명령어를 하나씩 가져가서 처리한다.
  • 데이터 : 전역 변수와 정적 변수가 이해 해당된다. 프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸된다.
  • 스택 : 스택 영역은 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역이다. 함수의 호출과 함께 할당되며, 함수의 호출이 종료될 때 해제된다.
  • 힙 : 힙 영역은 사용자가 직접 관리할 수 있는 메모리 영역이다. 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

8) 운영 체제에서 페이징을 사용하는 것은 무엇입니까?

페이징은 운영 체제에서 외부 조각화 문제를 해결하는 데 사용된다. 이 기술을 사용하면 필요한 데이터를 최대한 빨리 사용할 수 있다.

9) 멀티 프로세서 시스템의 장점은 무엇입니까?

프로세서가 많을수록 처리량이 크게 증가한다. 리소스를 공유할 수 있기 때문에 비용 효과적이다. 따라서 전반적인 안정성이 향상된다.

10) 가상 메모리(Virtual Memory)란 무엇입니까?

가상 메모리는 프로세스가 메모리 외부에서 실행될 수 있도록 하는 매우 유용한 메모리 관리 기술이다. 이 기술은 실행 프로그램이 실제 메모리에 맞지 않을 때 특히 사용된다.

11) 교착 상태(DeadLock)이란?

두 개 이상의 프로세스나 스레드가 서로 자원을 기다리면서 무한히 기다리게 되는 상태를 말한다.
교착 상태는 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태이다. 배치 처리 시스템에서는 일어나지 않는 문제이다. 프로세스, 스레드 둘 다 이와 같은 상태가 일어날 수 있다.

11-1) 교착 상태의 4 가지 필요조건은 무엇입니까?

다음과 같은 4 가지 조건이 있다.
1. 상호 배제(Mutual Exclusion) : 한 자원에 대한 여러 프로세스의 동시 접근은 불가능하다. 즉, 하나의 자원을 특정 시기에 하나의 프로세스나 스레드만 소유할 수 있는 형태.

2. 점유와 대기(Hold and Wait) : 하나의 자원을 소유하고 다른 프로세스 혹은 스레드의 자원을 요청하는 상태이다.

3. 비선점(Non preemptive) : 하나의 프로세스나 스레드에게 주어진 자원은 해당 프로세스나 스레드가 스스로 놓기 전에는 놓게 만들 수 없는 상태. 즉, 다른 프로세스에서 자원을 사용하는 동안 자원을 강제로 가져올 수 없다.

4. 환형 대기(Circle wait) : 각 프로세스가 다음 프로세스가 요구하는 자원을 가지고 있는 것을 말한다. 두 개의 프로세스나 스레드의 경우, A -> B, B -> C, C -> A에게 서로 자원을 요청하고 기다리는 상황

11-2) 교착 상태 해결 방법을 말하시오.

위의 4가지 조건들 중 하나라도 제거하면 된다. 예방, 회피, 탐지, 복구방법이 있다.
공유 자원 중 많은 경우가 한 번에 한 프로세스만 사용할 수 있기 때문에 상호 배제 조건은 제거하기 어렵다. 대부분의 교착상태 방지 알고리즘은 순환 대기가 발생하는 일을 막는데 초점이 맞춰져 있다.

1. 예방(Prevention) : 교착상태가 발생하지 않도록 하는 것

2. 회피(Avoidance) : 교착상태를 피하는 것. Ex) Dijkstra의 Banker’s Algorithm

3. 탐지(Detection) : 교착상태가 발생하면 탐지하는 것, 복구를 수반

4. 복구(Recovery) : 프로세스 중지, 자원 선점(희생자의 선택-> 기아, 복귀)

11-3) Banker's algorithm 은 무엇입니까?

교착 상태를 피하기 위해 뱅커 알고리즘이 사용된다. E, J, Dijkstra가 제안한 방법으로, 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래한 기법이다. 프로세스가 자원을 요구할 때 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지를 사전에 검사하여 교착 상태를 회피하는 기법이다. 안정 상태에 있으면 자원을 할당하고, 그렇지 않으면 다른 프로세스들이 자원을 해지할 때까지 대기한다. 은행은 더 이상 모든 고객의 요구 사항을 충족시킬 수 없는 방식으로 가용 현금을 할당하지 않는 뱅킹 시스템에서 뱅커 알고리즘이라고 한다.

12) RAID 란 무엇입니까?

RAID의 종류에 대해 말하시오. RAID는 Redundant Array of Independent Disks의 약자이다. 전체 성능을 향상하기 위해 동일한 데이터를 중복 저장하는 데 사용된다.

  • RAID 0-내결함성이 없는 스트립 디스크 어레이
  • RAID 1-미러링 및 이중화
  • RAID 2-메모리 스타일 오류 수정 코드
  • RAID 3-비트 인터리브 패리
  • RAID 4-블록 인터리브 패리티
  • RAID 5-블록 인터리브 분산 패리티
  • RAID 6-P + Q 이중화

13) Sync와 Async의 차이는 무엇입니까?

일반적으로 동기와 비동기의 차이는 메서드를 실행시킴과 동시에 반환 값이 기대되는 경우를 동기라고 표현하고 그렇지 않은 경우에 대해서 비동기라고 표현한다.
동시에라는 말은 실행되었을 때 값이 반환되기 전까지는 blocking 되어 있다는 것을 의미한다.
비동기의 경우, blocking 되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task를 위임하고 바로 다음 코드를 실행하기 때문에 기대되는 값이 바로 반환되지 않는다.

14) 스풀링이란 무엇입니까?

스풀링은 장치, 프로그램 또는 시스템에서 데이터를 사용하고 실행하기 위해 일시적으로 데이터를 수집하는 프로세스이다.
인쇄와 관련이 있다. 다른 응용 프로그램이 동시에 출력을 프린터로 보내면 스풀링은 이러한 모든 작업을 디스크 파일에 보관하고 프린터에 따라 대기열에 넣는다.

15) 뮤 텍스란 무엇입니까?

프로세스 혹은 스레드 간의 통신 시에 shared memory 등을 쓰는 경우 하나의 자원에 두 개 이상의 프로세스 혹은 스레드가 접근하는 경우에 문제가 발생한다. 이를 제어하기 위해 스레드는 뮤 텍스를 사용하고, 프로세스에서는 세마포어를 사용한다.
- 뮤 텍스 : 상호 배제라고도 하며, Critical Section을 가진 스레드의 Running Time이 서로 겹치지 않도록 각각 단독으로 실행하게 하는 기술이다. 뮤 텍스는 상태가 0, 1 두 개뿐인 이진 세마포어. synchronized 또는 lock을 통해 해결한다.

15-1) 세마포어란 무엇입니까?

세마포어는 사용 중인 리소스를 잠그는 데 사용되는 보호된 변수 또는 추상 데이터 유형이다. 공유된 자원의 데이터를 여러 '프로세스'에서 접근하는 것을 막는다. 세마포어의 값은 공통 자원의 상태를 나타냅니다. 리소스 상태를 나타내는 간단한 카운터이다. 공유 리소스에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용할 수 있다.

15-2) 뮤 텍스와 세마포어의 차이?

가장 큰 차이는 동기화 대상의 개수이다. 뮤 텍스는 동기화 대상이 하나뿐이고, 세마포어는 동기화 대상이 하나 이상일 때.

16) 운영 체제에서 기아(Starvation) 란 무엇입니까?

특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당받지 못하는 상태이다.
기아상태는 자원 관리 문제이다. 이 문제에서 대기 중인 프로세스는 리소스가 다른 프로세스에 할당되어 있기 때문에 오랫동안 필요한 리소스를 얻지 못한다.

17) 운영 체제에서 에이징(Aging)은 무엇입니까?

에이징은 자원 스케줄링 시스템에서 기아를 방지하기 위해 사용되는 기술이다. 특정 프로세스의 우선순위가 낮아 무한정 기다리게 되는 경우, 한번 양보하거나 기다린 시간에 비례하여 일정 시간이 지나면 우선순위를 한 단계씩 높여 가까운 시간 안에 자원을 할당받도록 하는 기법을 말한다.

18) 운영 체제에서 페이징(Paging)은 무엇입니까?

세그먼테이션과 가상 메모리를 고정된 크기로 나누어 메모리(가상 메모리)를 관리하는 기법을 말한다.
자세하게 말하자면 커다란 크기의 작업을 일정한 크기로 나누어 잘게 쪼개어 처리하는 것이다. 따라서 불연속적인 메모리 요청 등에 유연하게 처리할 수 있다.
세그먼테이션은 논리적 블록을 필요에 따라 다른 크기로 할당한 것이라면, 페이징은 고정된 크기로 나누는 것이다. 외부 단편화는 해결하지만, 내부 단편화가 발생할 수 있다.

18-1) 페이징의 장점과 단점은?

장점: 메모리를 페이지 단위로 가져와서, 프로세스의 효율적인 운영이 가능하다.
단점: 페이지 크기별, 단위별로 페이지 폴트 현상이 발생할 수 있다.

19) 세그먼테이션(Segmentation) 이란?

메모리를 서로 크기가 다른 논리적인 블록 단위인 세그먼트(segment)로 분할하고 메모리를 할당하여 물리 주소를 논리 주소로 변환하는 것을 말한다. 미리 분할하는 것이 아니라 메모리를 사용할 시점에 할당된다. 내부 단편화는 없지만 외부 단편화가 발생할 수 있다.

20) 멀티 스레드 프로그래밍의 장점은 무엇입니까?

프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우 메모리 공간과 시스템 자원 소모가 줄어들게 된다.
스레드 간의 통신이 필요한 경우에도 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap(힙) 영역을 이용하여 데이터를 주고받을 수 있다. 그렇기 때문에 프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단하다. 심지어 스레드의 context switch(문맥 교환)는 프로세스 context switch 와는 달리 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다. 따라서 시스템의 성능이 향상되고 자원 소모가 줄어들며 자연스럽게 프로그램의 응답 시간이 단축된다. 이러한 장점 때문에 여러 프로세스로 할 수 있는 작업들을 하나의 프로세스에서 스레드로 나눠 수행하는 것이다.
- 사용자의 반응을 향상한다.(= 응답성이 좋다 : 하나의 프로세스에 여러 스레드를 생성하여 스레드에 각기 다른 작업을 하게 함으로써 특정 작업을 하면서도 사용자로부터 명령을 입력받게 할 수 있다.)

- 프로세스 내 리소스 공유하여 경제적이다. (= 자원 공유를 효율적으로 할 수 있다.)

- 작업이 분리되어 코드가 간결해진다.

20-1) 멀티 스레드 프로그래밍의 단점은 무엇입니까?

멀티 프로세스 기반으로 프로그래밍할 때는 프로세스 간 공유하는 자원이 없기 때문에 동일한 자원에 동시에 접근하는 일이 없었지만 멀티 스레딩을 기반으로 프로그래밍할 때는 이 부분을 신경 써줘야 한다. 서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다.

그렇기 때문에 멀티스레딩 환경에서는 동기화 작업이 필요하다. 동기화를 통해 작업 처리 순서를 컨트롤하고 공유 자원에 대한 접근을 컨트롤하는 것이다. 하지만 이로 인해 병목현상이 발생하여 성능이 저하될 가능성이 높다. 그러므로 과도한 락으로 인한 병목현상을 줄여야 한다.

- 구현하기 어렵고, 테스트와 디버깅이 어렵다.
- 전체 프로세스에 영향을 줄 수 있다.
- 성능 저하가 동반됩니다.
- 동기화 작업이 필요하다.
- 교착상태가 발생하지 않도록 주의해야 한다.

21) Scheduling 이란(Process Scheduling)?

여러 프로세스가 있고, 이 프로세스들이 자원(CPU 등)을 동시에 요구하는데 자원이 제한되어 있다. 그러면 제한된 자원들을 어떻게(순서를 할당하는 등) 나눠줄 것인지에 대한 정책을 말한다.

22) CPU Scheduling?

CPU 하나는 동시에 여러 개의 프로세스를 처리할 수 없기 때문에, 한 순간에 어떤 프로세스가 CPU를 사용할 수 있게 하는지 결정하는 정책이다.

22-1) CPU 스케줄링은 언제 발생하는가?

  • 실행상태에서 대기상태로 전환될 때 (예, 입출력 요청) - Non preemptive(비선점)
  • 실행상태에서 준비상태로 전환될 때 (예, 인터럽트 발생) - preemptive(선점)
  • 대기상태에서 준비상태로 전환될 때(예, 입출력이 종료될 때)
  • 종료될 때(Terminated)

22-2) CPU 스케줄링의 종류를 설명하시오.

비선점(Non-preemptive) 스케줄링

- 이미 할당된 CPU를 다른 프로세스가 강제로 빼앗아 사용할 수 없는 스케줄링 기법이다.
- 프로세스가 CPU를 할당받으면 해당 프로세스가 완료될 때까지 CPU를 사용한다.
- 일괄 처리 방식의 스케줄링(공정하지만 긴급 응답을 요하는 작업에 좋지 않다.)

  • FCFS(FIFO) : 준비상태 큐에 도착한 순서에 따라 CPU를 할당하는 기법. 공평성은 유지되지만 짧은 작업이 긴 작업을, 중요한 작업이 중요하지 않은 작업을 기다리게 됨.
    • 장점 : 평균 응답 시간이 길다. (대화식 시스템에 부적합)
    • 단점 : 도착 순서에 따라 공평하다.
  • SJF(Shortest Job First) : 실행시간이 가장 짧은 프로세스에 먼저 CPU를 할당하는 기법. 가장 적은 평균 대기 시간을 제공하는 최적 알고리즘
    • 장점 : 평균 응답 시간을 최소화할 수 있다.
    • 단점 : 실행시간이 긴 프로세스는 CPU를 할당받지 못하고 무한히 대기하는 현상 발생(starvation) 
  • HRN(Highest Response ratio) : 실행 시간이 긴 프로세스에 불리한 SJF 기법을 보완하기 위한 것으로 우선순위 계산 결과 값이 높은 것부터 우선순위가 부여된다. 대기 시간이 길수록 계산 결과가 높다. 우선순위 = (대기시간 + 서비스 시간 / 서비스 시간) 큰 프로세스일수록 우선순위가 낮으므로 평균 응답 시간도 단축
  • 기한부(DeadLine) : 프로세스에게 일정한 시간을 주어 그 시간 안에 프로세스를 완료하도록 하는 기법
  • 우선순위(Priority) : 준비상태 큐에서 기다리는 각 프로세스마다 우선순위를 부여하여 그중 가장 높은 프로세스에게 먼저 CPU를 할당하는 기법. 정적, 동적 우선순위 방법 존재

선점(Preemptive) 스케줄링

- 하나의 프로세스가 CPU를 할당받아 실행하고 있을 때 우선순위가 높은 프로세스가 CPU를 강제로 빼앗아 사용할 수 있는 스케줄링 기법
- 선점으로 인한 많은 오버헤드가 발생한다.
- 시분할 시스템에 사용하는 스케줄링이다. (긴급을 요하는 우선순위를 갖는 시분할 처리, 실시간 처리에 유용)
- 선점을 위해 시간 배당을 위한 인터럽트용 타이머 클럭(Clock)이 필요한다.

  • SRT(Shortest Remaining Time) : 현재 실행 중인 프로세스의 남은 시간과 대기 큐에 프로세스의 실행시간이 가장 짧은 프로세스에게 CPU를 할당하는 기법 (비선점 기법인 SJF 알고리즘의 선점 형태로 변경한 기법)
    • 단점 : 잦은 선점으로 인한 문맥 교환의 부담, starvation의 위험
  • 선점 우선순위 : 준비상태 큐의 프로세스들 중에서 우선순위가 가장 높은 프로세스에게 먼저 CPU를 할당하는 기법
  • RR(Round Robin) : 시분할 시스템을 위해 고안된 방법으로, FCFS 알고리즘을 선점 형태로 변형한 기법. 대기 큐를 사용하여 먼저 대기한 작업이 먼저 CPU를 사용한다.
    • 단점 : CPU를 사용할 수 있는 시간(Quantum) 동안 CPU를 사용한 후에 다시 대기 큐의 가장 뒤로 배치된다. 할당되는 시간이 클 경우 FCFS 기법과 같아지고, 시간이 작을 경우 문맥 교환 및 오버헤드가 자주 발생됨
  • MLQ(다단계 큐) : 프로세스를 특정 그룹으로 분류할 수 있는 경우 그룹에 따라 각기 다른 준비상태 큐를 사용한다. 작업들을 여러 종류의 그룹으로 분할. 큐들 간에 프로세스 이동이 불가능하다. 각 큐는 자신만의 독자적인 스케줄링을 가진다. 상위 우선순위의 큐가 Empty 이면 하위 우선순위의 큐의 프로세스가 수행된다.
  • MLFQ(다단계 피드백 큐) : 특정 그룹의 준비상태 큐에 들어간 프로세스가 다른 준비상태 큐로 이동할 수 없는 다단계 큐 기법을 준비상태 큐 사이를 이동할 수 있도록 개선한 기법. 새로운 프로세스는 높은 우선순위, 프로세스의 실행이 길어질수록 점점 낮은 우선순위 큐로 이동. 제일 마지막 단계에서는 RR/FCFS 처리. 우선순위가 높은 단계의 큐일수록 시간 할당량을 작게 설정한다. 기아 상태를 예방하는 Aging 방법. 현대 OS에서 RR방식과 함께 가장 많이 사용되는 스케줄링 기법.
  • RM(Rate Monotonic, 주기 단조) 알고리즘 : 수행 주기가 가장 짧은 프로세스에 가장 높은 우선순위를 부여하는 실시간 스케줄링 알고리즘. 정적 스케줄링 방식. 마감 시간과 주기가 일치.
    • 장점 : 간단, 사용률이 0.69 이하일 때 항상 스케줄링 가능
    • 단점 : 주기가 긴 태스크들의 우선순위가 낮아서 장시간 대기
  • EDF(Earliest Deadline First, 최단 마감시간 우선) 알고리즘 : 프로세스의 마감시한이 가까울수록 우선순위를 높게 부여하는 선점 방식의 동적 스케줄링
    • 장점 : 이론적으로 총이용률이 1 이하면 스케줄링 가능
    • 단점 : 태스크들의 수행 시간, 마감시간, 주기 등을 정확히 예측하는 것이 현실적으로 어려움.

[정리]
비선점형 : FCFS, 비선점형 SJF
선점형 : RR, MLQ, MLFQ, 선점형 SJF(SRF), RM(Rate Monotonic), EDF

22-3) 선점 스케줄링과 비선점 스케줄링의 차이점?

선점 : CPU를 할당받아 실행 중인 프로세스로부터 CPU를 선점(빼앗는 것)하여 다른 프로세스를 할당할 수 있는 방식
Ex) RR, SRT, MLQ, MFQ
비선점 : CPU를 할당받은 프로세스는 스스로 CPU를 반납할 때까지 CPU를 독점하여 사용
Ex) FCFS, SJR, HRN

23) 메모리 단편화 란 무엇인가?

메모리의 빈 공간 또는 자료가 여러 개의 조각으로 나뉘는 현상을 말한다. 할당한 메모리를 해제를 하게 되면 그 메모리 공간이 빈 공간(사용하지 않는 공간)이 되고 그 빈 공간의 크기보다 큰 메모리는 사용할 수 없다. 그리하여 이 공간들이 하나 둘 쌓이게 되면 수치상으로는 많은 메모리 공간이 남았음에도 불구하고, 실제로 사용할 수 없는 메모리가 발생한다.

23-1) 내부 단편화와 내부 단편화란?

- 내부 단편화

: 분할된 영역이 할당된 프로그램의 크기보다 커서 사용되지 않고 남아 있는 빈 공간을 말한다.
: 내부 단편화는 페이징에서 발생한다.

- 외부 단편화

: 분할된 영역이 할당될 프로그램의 크기보다 작아서 모두 빈 공간으로 남아 있는 전체 영역을 말한다.
: 외부 단편화는 세그먼테이션에서 발생한다.

23-2) 메모리 단편화 해결방법은?

메모리 압축(디스크 조각 모음), 메모리 통합(단편화가 발생된 공간들을 하나로 통합시켜 큰 공간으로 만드는 기법)

24) 문맥 교환(Context Switching)이란?

프로세스 상태를 변경하는 것을 말한다. 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해 이전 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업이다. 즉, 스케줄링에 의해 실행 중인 코드, 자원 등을 저장하고 현재 상태를 대기 상태로 만들고, 다른 프로세스를 실행시키는 과정

[참고] CPU가 현재 처리 중인 프로세스의 PCB(Process control Block)을 따로 저장하고 다른 PCB를 가져오는 것
PCB? 특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조이다. 운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB를 생성한다.

PCB의 구성

25) 커널 수준 스레드와 사용자 수준 스레드의 각각 장단점?

- 커널 수준 스레드
: 장점

  • 프로세스의 스레드들을 몇몇 프로세서에 한꺼번에 디스패치 할 수 있기 때문에 멀티 프로세서 환경에서 매우 빠르게 동작한다.
  • 다른 스레드가 입출력 작업이 다 끝날 때까지 다른 스레드를 사용해 다른 작업을 진행할 수 있다.
  • 커널이 각 스레드를 개별적으로 관리할 수 있다.
  • 커널이 직접 스레드를 제공해 주기 때문에 안정성과 다양한 기능이 제공된다.

: 단점

  • 스케줄링 동기화를 위해 커널을 호출하는데 무겁고 오래 걸린다. (저장한 내용을 다시 불러오는 과정이 필요)
  • 즉, 사용자 모드에서 커널 모드로의 전환이 빈번하게 이뤄져 성능 저하가 발생한다.
  • 사용자가 프로그래밍할 때 구현하기 어렵고 자원을 더 많이 소비하는 경향이 있다.

- 사용자 수준 스레드
: 장점

  • 운영체제에서 스레드를 지원할 필요가 없다
  • 스케줄링 결정이나 동기화를 위해 커널을 호출하지 않았기 때문에 인터럽트가 발생할 때 커널 레벨 스레드보다 오버헤드가 적다
  • 즉, 사용자 영역 스레드에서 행동을 하기에 OS Scheduler의 context switch가 없다. (사용자 레벨 스레드 스케줄러 이용)
  • 커널은 스레드의 존재조차 모르기 때문에 모드 간의 전환이 없고 성능 이득이 발생한다.

: 단점

  • 시스템 전반에 걸친 스케줄링 우선순위를 지원하지 않는다. (무슨 스레드가 먼저 동작할지 모른다)
  • 프로세스에 속한 스레드 중 I/O 작업 등에 의해 하나라도 블록이 걸린다면 전체 스레드가 블록 된다.

25-1) 사용자 수준 스레드와 커널 수준 스레드 차이는?

코드가 실행되는 모드의 차이.
커널 수준의 스레드는 커널 모드기 때문에 write() 같은 함수를 사용할 수 있다. 사용자 모드에서 커널 스레드를 사용하면 문맥 교환이 일어나서 오버헤드가 발생할 수 있다. 사용자 스레드가 여럿 있을 때 하나라도 커널 모드가 되면 다른 스레드가 중지된다. 그래서 요즘에는 혼합해서 쓸 수 있는 스레드를 사용하는 것으로 알고 있다.

26) 모드 스위치와 프로세스 스위치 간의 차이점은?

모드 스위치는 사용자 모드에서 커널 모드로 변경할 때 발생하며 완전 문맥 교환이 필요하지 않고 시스템 스택을 사용한다. 프로세스 스위치는 보통 문맥 교환이라고 부르는 것이며 실행 중인 프로세스를 멈추고 새 프로세스를 실행하는 것

출처 : https://hyonee.tistory.com/95
반응형

댓글