부시기 시리즈/취업 부시기 시리즈

CS 면접 부시기 - 운영체제

Benn.dev 2021. 7. 9. 02:37

프로세스와 스레드의 차이를 설명해보세요

더보기

프로세스는 실행 중인 프로그램을 의미합니다.

스레드는 실행 제어만 분리한 것을 의미합니다.

프로세스는 운영체제로부터 자원을 할당받지만,

스레드는 프로세스로부터 자원을 할당받고 프로세스의 코드/데이터/힙 영역을 공유하기 때문에 좀 더 효율적으로 통신할 수 있습니다.

또한 콘텍스트 스위칭도 캐시 메모리를 비우지 않아도 되는 스레드 쪽이 더 빠릅니다.

그리고 스레드는 자원 공유로 인해 문제가 발생할 수 있으니 이를 염두에 둔 프로그래밍을 해야 합니다.

한 프로세스 안에 여러 개의 스레드가 생성될 수 있습니다.

 

콘텍스트 스위칭에 대해 설명해보세요

더보기

콘텍스트 스위칭은 한 Task가 끝날 때까지 기다리는 것이 아니라

여러 작업을 번갈아가며 실행해서 동시에 처리될 수 있도록 하는 방법입니다.

인터럽트가 발생하면 현재 프로세스의 상태를 PCB에 저장하고 새로운 프로세스의 상태를 레지스터에 저장하는 방식으로 동작합니다.

이때, CPU는 아무런 일을 하지 않으므로 잦은 콘텍스트 스위칭은 성능 저하를 일으킬 수 있습니다.

스레드와 프로세스의 동작 방식이 약간 상이한데,

스레드는 캐시 메모리나 PCB에 저장해야 하는 내용이 적고, 비워야 하는 내용도 적기 때문에 상대적으로 더 빠른 콘텍스트 스위칭이 일어날 수 있습니다.

 

동기와 비동기의 차이(블로킹, 넌블로킹)와 장단점에 대해 설명해보세요

더보기

동기/비동기는 두 개 이상의 무언가가 시간을 맞춘다/안 맞춘다로 구분할 수 있습니다.

동기 방식은 메서드 리턴과 결과를 전달받는 시간이 일치하는 명령 실행 방식입니다.

또, 동기 방식은 한 함수가 끝나는 시간과 바로 다음의 함수가 시작하는 시간이 같습니다.

비동기 방식은 여러 개의 처리가 함께 실행되는 방식으로, 동기 방식에 비해 단위 시간당 많은 작업을 처리할 수 있습니다.

단, CPU나 메모리를 많이 사용하는 작업을 비동기로 처리하게 되면 과부하가 걸릴 수 있습니다. 그리고 프로그램의 복잡도도 증가하게 됩니다.

블로킹/논블로킹은 동기/비동기와는 다른 관점으로, 내가 직접 제어할 수 없는 대상(IO/멀티스레드)을 상대하는 방법에 대한 분류입니다

블로킹 방식은 대상의 작업이 끝날 때까지 제어권을 대상이 가지고 있는 것을 의미합니다.

반면에 논블로킹은 대상의 작업 완료 여부와 상관없이 새로운 작업을 수행합니다.

동기 논블로킹은 계속해서 polling을 수행하기 때문에 콘텍스트 스위칭이 지속적으로 발생해 지연이 발생합니다.

 

멀티스레드 프로그래밍에 대해 설명해보세요

더보기

멀티스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것을 멀티 스레드 프로그래밍이라고 합니다.

 

장점

  • 멀티 프로세스에 비해 메모리 자원소모가 줄어듭니다.
  • 힙 영역을 통해서 스레드간 통신이 가능해 프로세스간 통신보다 간단합니다.
  • 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 빠릅니다.

단점

  • 힙 영역에 있는 자원을 사용할 때는 동기화를 해야합니다.
  • 동기화를 위해서 락을 과도하게 사용하면 성능이 저하될 수 있습니다.
  • 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 종료될 수 있습니다.

 

Thread-safe 하다는 의미와 설계하는 법을 설명해보세요

더보기

두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산 결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태를 의미합니다.

  • java.util.concurrent 패키지 하위의 클래스를 사용합니다.
  • 인스턴스 변수를 두지 않습니다.
  • 싱글톤 패턴을 사용합니다. (이 때, 일반적으로 구현하는 싱글톤 패턴은 Thread-safe 하지 않습니다.)
  • 동기화(syncronized) 블럭에서 연산을 수행합니다.

 

프로세스 동기화에 대해 설명해보세요

더보기

다중 프로세스 환경에서 자원 등에 한 프로세스 만이 접근 가능하도록 하는 것입니다.

프로세스 동기화를 하지 않으면 데이터의 일관성이 깨지기 때문에 연산 결과가 잘못 반환될 가능성이 존재해 주의해야 합니다.

Race Condition(경쟁 상태): 여러 프로세스나 스레드가 동기화 메커니즘 없이 자원에 접근하려는 상황을 가리킵니다. 공유된 자원에 대한 접근 순서에 따라 실행 결과가 달라질 수 있는 상황을 의미합니다.

Critical Section(임계 구역): 여러 스레드가 동시에 접근해서는 안 되는 공유자원에 접근하는 코드 블록을 얘기합니다. 한 임계 구역에 하나의 스레드 혹은 프로세스만 접근이 가능합니다. 임계 구역에 접근하는 것을 제어하기 위해 세마포어, 뮤텍스와 같은 메커니즘을 사용합니다.

임계 구역 문제를 해결하기 위한 조건(모두 충족해야 합니다)

  • 상호 배제(Mutual Exclustion): 한 프로세스가 임계구역에서 동작중이면 다른 프로세스는 접근할 수 없다.
  • 진행(Progress): 임계구역에서 작업중인 프로세스가 없다면 임계구역으로 진입하려는 프로세스를 적절히 선택해서 진입할 수 있도록 합니다.
  • 유한 대기(Bounded Waiting): 한 프로세스가 임계영역으로 진입을 요청한 후 다른 프로세스는 진입이 유한한 횟수로 제한되어야 합니다. (기아상태 방지)

 

교착상태와 기아상태의 해결방법에 대해 설명해보세요

더보기

서로 다른 프로세스가 서로 점유하고 있는 자원의 반납을 대기하고 있는 상태를 의미합니다.

 

발생 조건

  • 상호 배제: 한 번에 한 프로세스만 해당 자원을 사용할 수 있어야 합니다.
  • 점유 대기: 할당된 자원을 가진 상태에서 다른 자원을 기다립니다.
  • 비선점: 다른 프로세스가 자원의 사용을 끝낼 때 까지 자원을 뺏을 수 없습니다.
  • 순환 대기: 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있습니다.

해결 방법

  • 예방: 4가지 조건 중 하나라도 만족되지 않도록 합니다.
  • 회피: 알고리즘을 데드락이 발생하지 않도록 합니다.
  • 회복: 교착상태가 발생할 때, 해결합니다.
  • 무시: 회복과정의 성능저하가 심하다면 그냥 무시합니다.

기아상태(Stravation): 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스가 영원히 자원 할당이 되지 않는 경우입니다.

우선순위를 변경합니다. (우선순위를 수시로 변경하거나, 오래 기다린 프로세스의 우선순위를 높여주거나, Queue를 사용합니다.)

 

세마포어와 뮤택스의 차이에 대해 설명해보세요

더보기

세마포어는 여러 개의 프로세스가 접근 가능한 공유자원을 관리하는 방식이고, 뮤텍스가 될 수 있지만

뮤텍스는 한 번에 한 개의 프로세스만 접근 가능하도록 관리하는 방식입니다. 따라서 뮤텍스는 세마포어가 될 수 없습니다.

또, 세마포어는 다른 프로세스가 세마포어를 해제할 수 있지만, 뮤텍스는 락을 획득한 프로세스만 락을 반환할 수 있습니다.

 

가상 메모리에 대해 설명해보세요

더보기

흔히 말하는 Swap 영역, 실제 메모리에서 공간이 부족한 경우 보조기억장치에서 임시로 사용하는 영역입니다.

OS에서 관리하며 프로세스는 이것이 실제 메모리인지, Swap 영역인지 모릅니다.

Java에서는 Swap 영역을 잡아주지 않은 경우 OOM이 발생할 수 있습니다.

당연히 실제 메모리가 아니기 때문에 지연시간이 많이 발생하며, 가급적이면 Swap에 메모리를 사용하지 않도록 설계하는 것이 좋고,

만약 계속해서 사용하는 양이 증가한다면 메모리 누수를 의심해 볼 수 있습니다.

 

캐시의 지역성에 대해 설명해보세요

더보기

시간 지역성과 공간 지역성으로 나눌 수 있으며,

시간 지역성은 최근에 접근한 데이터에 다시 접근하는 경향을 의미하고,

공간 지역성은 최근 접근한 데이터의 주변 공간에 다시 접근하는 경향을 의미합니다.

 

프로세스 관련 용어를 설명해보세요

더보기

PCB: 프로세스 제어 블록, 프로세스에 대한 중요한 정보를 저장합니다.

PC: 프로그램 카운터, 프로세스 실행을 위한 다음 명령의 주소를 표시합니다.

캐시 메모리: 자주 사용되는 데이터가 저장되는 공간으로 CPU의 레지스터와 메모리 사이에서 병목 형상을 완화하는 장치입니다.

 

레퍼런스