운영체제 CS 인터뷰

똘맹·2025년 5월 29일

CS 스터디

목록 보기
18/20

캐시 사용의 장점에 대해 설명해주세요

장점: 속도가 빠른 장치와 느린 장치 사이에서 속도 차이에 따른 병목 현상을 완화할 수 있다.



멀티 스레드 방식이 멀티 프로세스 방식에 비해 가지는 장점에 대해 설명해주세요

멀티 프로세스 방식만으로도 하나 이상의 작업을 수행할 수 있지만, 멀티 프로세스보다 메모리 등 자원을 적게 사용하고, 자원을 어느정도 공유하기 때문에 스레드 간 데이터 주고 받는 통신 비용이 적게 든다는 장점을 가집니다.



가상 메모리의 동작 원리에 대해 아는대로 설명해보세요

페이징, 세그멘테이션

  • 페이징
    일반적으로 사용되는 방식
    가상 메모리와 물리적 메모리를 페이지라는 작은 고정 크기의 블록으로 나누는 방식
    페이지: 가상 메모리의 일정 크기 단위 (보통 4KB 또는 8KB)로 나눈 블록
    프레임(Frame): 물리 메모리의 일정 크기 단위로 나눈 블록, 페이지와 크기가 동일함
    페이지 테이블(Page Table): 각 프로세스의 가상 주소와 실제 물리 주소를 매핑하는 테이블
    페이징 시스템의 동작 과정: 가상 주소 -> 물리 주소 변환 (프로그램이 데이터를 읽거나 쓸 때 가상 주소를 참조함)
    CPU는 가상 주소를 물리 주소로 변환해야 하며, 이를 위해 페이지 테이블을 참조함
    페이지 부재(Page Fault): 프로그램이 접근하려는 페이지가 현재 물리 메모리에 없으면 페이지 부재가 발생함
    운영체제는 하드디스크에서 해당 페이지를 물리 메모리로 로드함
    교체 정책: 물리 메모리가 꽉 찼을 때는, 새로운 페이지를 불러오기 위해 기존의 페이지 중 하나를 내보내야 함.
    → 이를 페이지 교체 알고리즘으로 결정함
    페이지 교체 알고리즘 예시: LRU(Least Recently Used), FIFO(First In, First Out)

  • 세그멘테이션
    가상 메모리를 논리적으로 크기가 다른 세그먼트로 나누는 방식
    프로그램은 코드, 데이터, 스택 등의 메모리 공간을 각각 다른 세그먼트로 구분하여 관리함
    장점: 논리적인 구분이 명확함
    단점: 페이징만큼 효율적이지 않음

사용자 수준 스레드와 커널 수준 스레드는 어떤 상황에서 각각 유리한가요?

사용자 수준 스레드는 문맥 교환이 빠르고 시스템 콜이 필요 없기 때문에, I/O가 적고 스레드 전환이 빈번한 연산 중심의 프로그램에서 유리합니다.
반면 커널 수준 스레드는 멀티코어에서 병렬 실행이 가능하고, 한 스레드가 블로킹되어도 다른 스레드가 실행될 수 있기 때문에, I/O가 빈번하거나 병렬성이 중요한 서버 환경에서 유리합니다.

블로킹과 동기의 차이점은 무엇인가요?

동기는 작업이 끝날 때까지 다음 작업을 시작하지 않는 방식이고, 블로킹은 작업이 끝날 때까지 현재 스레드가 멈추는 상태를 말합니다.
동기는 흐름 제어의 개념이고, 블로킹은 리소스 대기 상태로 인해 실행이 멈추는 물리적인 현상입니다.

•	동기/비동기는 코드 흐름의 순서 개념
•	블로킹/논블로킹은 CPU 스레드가 멈추는지 여부

동기 방식이 적합한 상황은 언제인가요?

순서와 결과가 중요하고, 처리 흐름이 직관적일 때
예를 들어, 결제 승인 후 주문 생성처럼 앞선 작업이 성공해야 다음 작업이 가능한 경우 동기 방식이 안전하고 신뢰성이 높습니다.

캐시 미스가 발생하는 경우 어떤 현상이 발생하고, 이를 줄이기 위한 방법에는 어떤 것이 있을까요?

캐시 미스란, 요청한 데이터가 캐시에 존재하지 않아 원본 저장소(DB나 API 등) 에서 데이터를 조회해야 하는 상황입니다.

이 경우, 응답 속도가 느려지고, 원본 저장소에 부하가 집중되며, 트래픽 비용이 늘어나는 등의 문제가 발생할 수 있습니다.

TTL 설정을 데이터 특성에 맞게 조정하여 너무 자주 무효화되지 않도록 하고, 자주 조회되는 데이터는 서비스 초기나 배포 시점에 미리 캐싱하는 Preloading 전략을 활용합니다.
또한, Write-through 또는 Write-behind 방식으로 데이터를 갱신하면서 캐시도 함께 유지하고, 멀티 레벨 캐시 구조를 통해 로컬 캐시와 분산 캐시(Redis)를 병행해 미스를 줄이는 설계도 고려합니다.

  • 캐시 미스(Cache Miss)란?

요청한 데이터가 캐시에 없을 때 발생하는 상황
즉, 빠르게 가져오려고 했지만 캐시에 없어서 느린 원본 저장소(DB, API 등) 에서 데이터를 가져와야 하는 상황

공간 지역성이 낮은 데이터 구조의 예시로는 어떤 것이 있을까요?

공간 지역성이란, 한 번 접근한 메모리 주소 근처의 데이터가 곧이어 다시 접근될 가능성을 의미합니다.

공간 지역성이 낮은 자료구조의 대표 예시는 링크드 리스트입니다.
→ 포인터로 연결되어 있어 메모리 연속성이 없고, 캐시 미리 읽기(prefetch) 효과가 떨어집니다.

반면에, 배열(Array) 은 메모리상에 연속적으로 배치되어 공간 지역성이 높기 때문에 캐시 효율이 좋습니다.

시스템 콜이 호출되면 어떤 일이 발생하나요?

시스템 콜(System Call)은 사용자 모드에서 커널 모드로 진입하기 위한 인터페이스입니다.
사용자 프로그램이 입출력, 파일 처리, 메모리 관리 등 운영체제의 자원에 접근하려 할 때, 시스템 콜을 통해 커널에게 요청을 전달합니다.

시스템 콜이 호출되면 사용자 모드에서 커널 모드로 전환되고, 운영체제가 요청된 작업을 수행한 뒤 다시 사용자 모드로 복귀합니다.
경우에 따라 문맥 교환이 발생하며, 이는 시스템 콜의 오버헤드로 작용할 수 있습니다.

시스템 콜 오버헤드를 줄이기 위한 방법은?

첫째, 시스템 콜 호출 횟수를 줄이는 것입니다. 예를 들어, read()나 write()를 자주 호출하기보다는, 버퍼링을 통해 한 번에 많은 데이터를 처리하면 오버헤드를 줄일 수 있습니다.

둘째, 비동기 I/O나 Non-blocking I/O를 활용하는 방법입니다. select, poll, epoll과 같은 이벤트 기반 시스템 콜은 여러 I/O 작업을 하나의 호출로 감시할 수 있어, 불필요한 대기와 호출을 줄일 수 있습니다.

셋째는, Memory-mapped I/O를 사용하는 방법입니다. 파일을 메모리에 직접 매핑하여 I/O 시스템 콜 자체를 줄이고, 메모리 접근 방식으로 데이터를 처리할 수 있어 성능이 향상됩니다.

시스템 콜 오버헤드란, 유저 모드에서 커널 모드로 전환되는 과정에서 발생하는 비용을 말합니다.
이 전환은 문맥 교환(Context Switching)을 동반하기 때문에 성능에 영향을 줄 수 있습니다.

profile
척척학사가 되고 싶은 똘맹

0개의 댓글