운영체제 면접 질문 정리

Jifrozen·2023년 2월 5일
2

기초 다지기

목록 보기
28/29

보기 좋게 수정 할 예정~

  • 운영체제란? 운영체제는 하드웨어와 가장 가깝게 맞닿아있는 소프트웨어로써 응용프로그램과 하드웨어 사이 인터페이스 역할을 합니다.
  • 커널이란? 메모리에 상주하는 운영체제 핵심부분 소프트웨어가 컴퓨터 시스템에서 수행되기 위해서는 메모리에 그 프로그램이 올라가 있어야 함 → 하지만 운영체제 전부가 메모리에 올라가있음 낭비 심함 → 필요한것만 올려야함 이게 커널임
  • 프로세스와 스레드의 차이를 설명해보세요. 프로세스는 실행중인 프로그램을 의미합니다. 스레드는 프로세스를 구성하는 독립적인 실행 단위이다. 프로세스는 운영체제로부터 자원을 할당받지만, 스레드는 프로세스로부터 자원을 할당받고, 프로세스의 코드/데이터/힙영역을 공유하기 때문에 좀 더 효율적으로 통신할 수 있습니다. 또한 컨텍스트 스위칭도 캐시 메모리를 비우지 않아도 되는 스레드쪽이 빠릅니다. 그리고, 스레드는 자원 공유로 인해 문제가 발생할 수 있으니 이를 염두에 둔 프로그래밍을 해야합니다. 한 프로세스 안에 여러개의 스레드가 생성될 수 있습니다.
  • 멀티 스레드 vs 멀티 프로세스 멀티프로세스 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것 장점 여러 개 자식 프로세스 중 하나 문제가 생겨도 영향 확산 x 단점 컨텍스트 스위칭 과정에서 오버헤드 공유 메모리 없어 비효울적 멀티 스레드 하나의 응용프로그램을 여러개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는것이다. 장점 자원의 효율성 증대 → 스택 공유자원, 프로세스 생성 시간>>>스레드 생성 시간 단점 설계 까다롭고 공유 자원으로 인한 동기화 문제
    • 꼬리 질문 동기화 문제 해결 방법
  • 멀티스레드 프로그래밍에 대해 설명해보세요. 멀티스레드 프로그래밍은 하나의 프로세스에서 여러개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것을 멀티스레드 프로그래밍이라고 합니다. 장점
    • 멀티 프로세스에 비해 메모리 자원소모가 줄어듭니다.

    • 힙 영역을 통해서 스레드간 통신이 가능해서 프로세스간 통신보다 간단합니다.

    • 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 빠릅니다.

      단점

    • 힙 영역에 있는 자원을 사용할 때는 동기화를 해야합니다.

    • 동기화를 위해서 락을 과도하게 사용하면 성능이 저하될 수 있습니다.

    • 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 종료될 수 있습니다.

  • 컨텍스트 스위칭에 대해 설명해보세요. 컨텍스트 스위칭은 • 여러 프로세스를 처리해야 하는 상황에서 현재 진행중인 Task(프로세스, 스레드)가 끝날 때까지 기다리는 것이 아니라 여러 작업을 번갈아가며 실행해서 동시에 처리될 수 있도록 하는 방법입니다 인터럽트가 발생하면 현재 프로세스의 상태를 PCB에 저장하고 새로운 프로세스의 상태를 레지스터에 저장하는 방식으로 동작합니다. 이 때, CPU는 아무런 일을 하지 않으므로 잦은 컨텍스트 스위칭은 성능저하를 일으킬 수 있습니다. 스레드와 프로세스의 동작방식이 약간 상이한데, 스레드는 캐시메모리나 PCB에 저장해야하는 내용이 적고, 비워야 하는 내용도 적기때문에 상대적으로 더 빠른 컨텍스트 스위칭이 일어날 수 있습니다.
  • 동기와 비동기의 차이(블로킹, 넌블로킹) / 장단점에 대해 설명해보세요. (몰라 따로 정리하기) 동기/비동기는 두 개 이상의 무엇인가가 시간을 맞춘다/안맞춘다로 구분할 수 있습니다. 동기 방식은 메서드 리턴과 결과를 전달받는 시간이 일치하는 명령 실행 방식입니다. 또, 동기 방식은 한 함수가 끝나는 시간과 바로 다음의 함수가 시작하는 시간이 같습니다. 비동기 방식은 여러 개의 처리가 함께 실행되는 방식으로, 동기 방식에 비해 단위시간 당 많은 작업을 처리할 수 있습니다. 단, CPU나 메모리를 많이 사용하는 작업을 비동기로 처리하게 되면 과부하가 걸릴 수 있습니다. 프로그램의 복잡도도 증가하게 됩니다. 블로킹/논블로킹은 동기/비동기와는 다른 관점으로, 내가 직접 제어할 수 없는 대상(IO/멀티스레드)을 상대하는 방법에 대한 분류입니다. 블로킹 방식은 대상의 작업이 끝날 때 까지 제어권을 대상이 가지고 있는 것을 의미합니다. 반면에 논블로킹은 대상의 작업 완료여부와 상관없이 새로운 작업을 수행합니다. 동기 논블로킹은 계속해서 polling을 수행하기 때문에 컨텍스트 스위칭이 지속적으로 발생해 지연이 발생합니다. https://youtu.be/HKlUvCv9hvA 를 참고합시다.
  • Thread-safe 하다는 의미와 설계하는 법을 설명해보세요. 두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태를 의미합니다.
    • java.util.concurrent 패키지 하위의 클래스를 사용합니다.
    • 인스턴스 변수를 두지 않습니다.
    • 동기화(syncronized) 블럭에서 연산을 수행합니다.
  • 교착상태란? 교착상태(Deadlock)가 무엇인지 알고 있어야 합니다. 서로 다른 프로세스가 서로 점유하고 있는 자원의 반납을 대기하고 있는 상태를 의미합니다.
    • 꼬리 질문 교착상태 발생조건 4가지 필수
      • 상호 배제: 한 번에 한 프로세스만 해당 자원을 사용할 수 있어야 합니다.
      • 점유 대기: 할당된 자원을 가진 상태에서 다른 자원을 기다립니다.
      • 비선점: 다른 프로세스가 자원의 사용을 끝낼 때 까지 자원을 뺏을 수 없습니다.
      • 순환대기: 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있습니다.
    • 꼬리 질문 해결방법
      • 예방: 4가지 조건 중 하나라도 만족되지 않도록 합니다.
      • 회피: 알고리즘을 데드락이 발생하지 않도록 합니다.
      • 회복: 교착상태가 발생할 때, 해결합니다.
      • 무시: 회복과정의 성능저하가 심하다면 그냥 무시합니다.
  • 기아상태의 해결방법에 대해 설명해보세요. 기아상태(Starvation): 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스가 영원히 자원 할당이 되지 않는 경우입니다. 우선순위를 변경합니다.(우선순위를 수시로 변경하거나, 오래 기다린 프로세스의 우선순위를 높여주거나, Queue를 사용합니다.)
  • 프로세스 동기화에 대해 설명해보세요. 다중 프로세스 환경에서 자원등에 한 프로세스만이 접근가능하도록 하는 것입니다. 여러 프로세스나 스레드가 공유 자원에 접근하려는 경쟁 상태일때 프로세스 동기화를 하지 않으면 데이터의 일관성이 깨지기 때문에 연산결과가 잘못 반환될 가능성이 존재하기 때문에 주의해야 합니다. 이런 동시에 접근하려는 작업 영역을 Critical Section(임계 구역)이라고 하며 한 임계구역에 하나의 스레드 혹은 프로세스만 접근이 가능합니다. 임계 구역 설계하기 위한 조건(모두 충족해야함)
    • 상호 배제(Mutual Exclusion): 한 프로세스가 임계구역에서 동작중이면 다른 프로세스는 접근할 수 없다.

    • 진행(Progress): 임계구역에서 작업중인 프로세스가 없다면 입계구역으로 진입하려는 프로세스를 진입할 수 있도록 합니다.

    • 유한 대기(Bounded Waiting): 무한대기로 인해 기아상태가 발생하는걸 막아주기 위해 한정된 대기 시간을 가져야합니다.

      임계영역 해결 방법은 뮤텍스와 세마포어

  • 세마포어와 뮤텍스의 차이에 대해 설명해보세요. 뮤텍스와 세마포어 모두 공유된 자원의 데이터를 여러 스레드(또는 프로세스)가 접근하는 것을 막는 것 세마포어는 여러개의 프로세스가 접근 가능한 공유자원을 관리하는 방식이고, 뮤텍스가 될 수 있지만, 뮤텍스는 한 번에 한 개의 프로세스만 접근 가능하도록 관리하는 방식입니다. 따라서 뮤텍스는 세마포어가 될 수 없습니다.
  • 가상 메모리에 대해 설명해보세요. 가상 메모리는 프로세스가 실제 메모리의 크기와 상관없이 메모리를 이용할 수 있도록 지원하는 기술 입니다. 메인 메모리의 크기는 한정되어 있다. 따라서 물리적인 메모리 크기보다 크기가 큰 프로세스는 실행시킬 수 없게 된다. 이를 해결하기위해 나온 방법이 가상 메모리이다. 프로그램에게 실제 메모리 주소가 아닌 가상 메모리의 주소를 주는 방식으로 가상적으로 주어진 주소를 가상 주소, 실제 메모리 상에서 유효한 주소를 물리 주소라고 한다. 가상주소공간은 메모리 관리 장치에 의해 물리 주소로 변환된다.
  • 캐시 메모리란? 기억장치에서 자주 사용하는 프로그램과 데이터를 저장해두어 속도를 빠르게 하는 메모리 속도가 빠른 장치와 느린 장치간의 속도 차에 따른 병목현상을 줄이기 위한 범용 메모리
    • 캐시 지역성이란?
      지역성(Locality)이란 기억장치 내의 정보를 균일하게 Access하는 것이 아닌 어느 한 순간에 특정 부분을 집중적으로 참조하는 특성이다. 캐시가 효율적으로 동작하려면, 캐시의 적중율(Hit-rate)를 극대화 시켜하기 때문에 캐시에 저장할 데이터가 지역성(Locality)을 가져야 한다.
  • 프로세스 관련 용어를 설명해보세요. (알아만 둡시다.) PCB: 프로세스 제어 블록, 프로세스에 대한 중요한 정보를 저장합니다. PC: 프로그램 카운터, 프로세스 실행을 위한 다음 명령의 주소를 표시합니다. 캐시메모리: 자주 사용되는 데이터가 저장되는 공간으로 CPU의 레지스터와 메모리 사이에서 병목 현상을 완화하는 장치입니다.
  • 메모리 관리 전략(paging 과 세그멘테이션 비교) 페이징은 논리주소의 메모리를 고정된 크기의 페이지로 나눠 관리하는 기법이다.
    • 페이지는 모두 같은 크기를 가진다.

    • 물리주소 공간을 페이지와 같은 사이즈로 나눈 것들을 프레임이라고 한다.

    • 페이지 테이블을 이용해 논리주소에서 프레임을 가리키는 물리주소로 매핑한다.

    • 외부 단편화는 발생하지 않으나, 내부 단편화는 발생한다.

      세그멘테이션은 논리적 내용을 기반으로 나눠서 메모리에 배치하는것을 의미한다. code영역, data영역, stack영역 등으로 나눠서 물리메모리에 저장한다. 세그먼트는 크기가 일정하지 않아, limit 정보가 추가로 들어가 있다. 내부단편화는 적지만 외부 단편화가 발생한다

    • 둘의 비교

      • 세그멘테이션은 페이징보다 보호와 공유 면에서는 더 낫다.

        세그멘테이션은 read/write/execute 권한을 테이블에 추가하는데, 이때 이것을 논리적으로 나누기 때문에 해당 비트를 설정하기 간단하고 안전하다. 반면, 페이징은 code+data+stack 영역이 존재할 때 이를 일정한 크기로 나누기 때문에 영역이 섞여 비트를 설정하기 까다로워질 수 있다.

        공유의 측면에서도 마찬가지로, 페이징은 영역이 섞일 가능성이 존재하지만, 세그멘테이션은 정확히 영역을 나누므로 더 효율적으로 공유를 할 수 있다.

        하지만, 현재 대부분은 페이징 기법을 세그멘테이션보다 많이 사용한다.그 이유는 세그멘테이션의 세그먼트 크기가 일정하지 않고 다양하기 때문이다. 세그먼트의 크기가 다양하기 때문에 다양한 hole이 발생해 외부단편화가 발생하여 메모리 낭비가 크게 된다.

  • 페이지 교체란? 페이지를 메모리에 요청하는 과정에서 page fault(페이지 부재)가 발생하게 되면, 원하는 페이지를 보조장치에서 가져오게 된다. 물리메모리가 꽉 찼으면 페이지 교체 작업이 필요하다.
  • Demand Paging (요구 페이징)란? 요구 페이징은 프로그램 실행 시작 시에 프로그램 전체를 디스크에서 물리 메모리에 적재하는 대신, 초기에 필요한 것들만 적재하는 전략을 의미 프로세스를 실행할때 해당 영역의 모든 부분이 필요한 것은 아니다. 따라서 실행 시 필요한 부분만 메모리에 올림으로써 메인 메모리에 올라가는 프로세스의 크기를 줄일 수 있다.
  • 사용자 모드와 커널 모드?

2개의 댓글

comment-user-thumbnail
2023년 2월 6일

가상메모리라는것이 어디서 부터 할당되어 오는지 또한 정리가 돼있으면 좋을 것 같습니다.
Thread-safe하게 자바 코드를 작성한 적이 있나요 라는 질문이 나온다면 AtomicLong 등과 같은 래퍼 클래스를 사용 해본 적이 있다고 말씀하시면 좋을 것 같습니다!
저도 Cocurrent의 개념을 최근에 학습하게 되었는데, 8코어 16스레드와 같은 다중스레드가 보편화된 요즘에는 자바 개발자라면 무조건 알아야 할 개념 같습니다.
동기 비동기 방식의 차이에 있어서는 직접 프로젝트에 도입해본 경험을 정리 해보시는 것도 좋을 것 같습니다. spring은 동기 node.js는 비동기라고 보편적으로 알려졌지만, spring5부터 Spring WebFlux라는 개념이 도입 된 이후 논블락킹 방식인 비동기 처리 기술이 보급 되었습니다. 예를 들면 Spring Cloud Gateway같은 경우 Spring WebFlux stack 아래에서 기본적으로 작동하고 있습니다.MVC stack의 어플리케이션의 경우, 탐킷이 기본적으로 켜지는데, WebFlux stack 의 경우에는 nettty 서버가 자동으로 켜지는 것 부터 차이를 느낄 수 있죠.

다양한 질문들을 잘 작성하신 것 같아서 좋습니다. 다만 본인의 경험을 연관 지어서 정리해보는 시간도 가지시면 더 좋은 블로그가 될 것 같습니다!

답글 달기
comment-user-thumbnail
2023년 2월 6일

운영체제 관련해서 좋은 정리글이네요. LRU, FIFO와 같은 페이지 교체 알고리즘도 알고 계시면 더 좋을 것 같습니다!

답글 달기