컴퓨터/기타

[면접 준비] 운영체제 면접 질문과 답 정리

도도새 도 2023. 12. 11. 13:07
저는 JAVA 백엔드 개발자, 혹은 React 프론트 엔드 개발자를 목표로 하는 취업 준비생입니다. 면접에서 대답할 주요 관심 주제는 Spring, Java, JavaScript, TypeScript, OS, Network, DB, Docker입니다. 제가 사용해본 기술 중 통합, 정리한 면접 관련 내용을 정리합니다. 틀린 내용이 있다면 댓글로 지적해주시길 바랍니다. 감사합니다

 

❓ 운영체제의 역할에는  무엇이 있나요?

더보기

운영체제란 컴퓨터 하드웨어와 응용 프로그램 간의 상호작용을 관리하고 제어하는 역할을 하는 소프트웨어이다.

 

운영체제의 역할

1. 프로세스 및 CPU 스케줄링 관리

2. 메모리 관리

3. 디스크 관리

4. IO 디바이스 관리

 

❓ 커널이 무엇인가요?

더보기
메모리에 상주하는 운영체제의 핵심 부분이다. 하드웨어와 응용 프로그램 사이 인터페이스를 제공하며 컴퓨터 자원들을 관리한다. I/O 요청 관리, I/O 디바이스 관리, 파일 시스템, 메모리, 보안 관리 등의 기능을 한다.

 

 

❓ 시스템 콜이란 무엇인가요?

더보기

시스템콜이란 운영체제가 커널에 접근하기 위한 인터페이스이다. 유저가 사용하는 응용 프로그램은 유저 레벨의 함수뿐 아닌 커널의 도움을 받아야한다. 이를테면 카메라 등 디바이스를 켜는 역할은 커널을 통해 진행된다. 즉, 스레드나 프로세스가 운영체제로 어떤 요청을 할 경우, 시스템콜 이라는 인터페이스를 통해 커널을 이용할 수 있게 된다.

 

modebit

커널은 작동할 때 modebit을 참조해 유저 모드와 커널 모드를 구분한다

0 : modebit가 0이면 커널 모드이다. 커널 모드에서는 모든 컴퓨터 자원에 접근 가능하다.

1 : modebit가 1이면 유저 모드이다.

 

 

❓ 프레세스가 무엇인지 설명하고 메모리 구조에 대해 설명해주세요.

더보기

프로세스는 프로그램이 메모리에 올라 인스턴스화 된 것을 뜻한다. 즉 실행중인 프로그램이다. 예를 들어 크롬 프로그램(chrome.exe)를 더블클릭하면 구글 크롬 프로세스가 생겨난다.

 

프로세스의 메모리 구조

프로세스는 스택, 힙, 데이터, 코드 영역을 지닌다.

이름 할당 방식 역할
스택 동적 할당 지역 변수, 매개 변수, 실행되는 함수 저장
높은 주소부터 낮은 주소 순으로 할당
동적 할당 C언어의 malloc, 자바의 new등 동적으로 생성되는 메모리 저장
낮은 주소부터 높은 주소 순으로 할당

데이터 영역 정적 할당 static, const, 전역 변수 등 할당
코드 영역 정적 할당 프로그램의 코드 할당

* 동적 할당은 런타임 시점에 할당, 정적 할당은 컴파일 시점에 할당됨을 의미한다.

 

 

❓ PCB에 대해서 설명해주세요

더보기

PCB(Process Control Block)은 프로세스의 메타데이터를 저장한 데이터이다. 프로세스가 생성될 때 해당 프로세스의 메타데이터를 담은 PCB가 생성된다.

 

포함된 정보

- 프로세스 ID

- 프로세스 스케줄링 상태

- 프로세스 권한

- 프로그램 카운터

- CPU 레지스터

- CPU 스케줄링 정보

* 메타데이터란 데이터에 관해 설명하는 구조화된 작은 데이터

 

 

❓ 쓰레드와 프로세스를 비교해서 설명해주세요.

더보기

프로세스 : 실행중인 프로그램의 인스턴스 메인 메모리에 적재된다.

- PCB, Stack, Heap, Code, Data영역을 각자 가진다.

- 프로세스마다 각자 영역을 가지기에 컨텍스트 스위칭 비용이 크다.

- 스레드보다 생성 시간이 길다.

- 한 프로세스의 오류는 다른 프로세스에 영향을 끼치지 않는다.

 

스레드 :프로세스 내에서 실행되는 독립적인 실행 흐름

- 독립적인 Stack 영역을 가지지만, Heap, Code, Data영역은 각 스레드가 공유한다.(해당 스레드의 프로세스의 영역 을 공유)

- 메모리 공간을 공유하기에 컨텍스트 스위칭 비용이 작다.

- 메모리 공간을 공유하기에 한 스레드에서 발생한 오류는 다른 스레드에도 영향을 끼친다. 

 

 

❓ 공유자원과 임계영역에 대해 설명하고 경쟁 상태를 막기 위한 방법에 대해 설명해주세요.

더보기

공유 자원이란 시스템 내부에서 여러 프로세스나 여러 스레드가 함께 접근 가능한 자원이다. 모니터, 프린터, 메모리, 파일, 데이터 등을 의미한다. 

 

임계 영역이란 둘 이상의 프로세스나 스레드가 접근했을 때 순서 등의 이유로 결과가 달라지는 코드 영역. 뮤텍스, 세마포어, 모니터를 활용하여 이를 예방 할 수 있다.

 

* 경쟁 상태(Race condition) : 공유 자원을 두 개 이상의 프로세스 혹은 스레드가 동시에 읽거나 쓰는 상황. 즉 실행 순서에 따라 의도하지 않은 결과가 나올 수 있다. ex) 동시성 문제

 

❓ 뮤텍스, 세마포어, 모니터에 대해서 아는대로 설명하고 해당 방법들이 어떻게 레이스 컨디션을 해결 할 수 있는지 설명해주세요.

더보기

뮤텍스 

- 잠금과 잠금 해제를 통해 문제를 하나의 스레드나 프로세스만 접근 가능하다록 한다. 예를 들어 화장실에 한 명이 들어가면 문을 잠그고, 화장실에서 나올 때 잠금을 푸는 것이다. 

 - 1개의 스레드나 프로세스만 접근 가능하다. 락을 획득한 스레드나 프로세스가 락을 해제해야한다.

 

세마포어

- 세마포어 변수만큼 스레드나 프로세스가 접근 가능하다.

- 자기 자신이 올 때까지 기다리는 함수 wait(P함수)와 다음 프로세스로 순서를 넘겨주는 signal(V함수)함수를 이용한다.

- 프로세스나 스레드가 공유 자원에 접근시 세마포어에서 wait() 작업 수행, 공유 자원 해제시 signal() 작업 수행

 

* 바이너리 세마포어 : 0과 1 두 값만 가지는 세마포어. 뮤텍스는 잠금 기반인 반면 세마포어는 신호 기반이라는 차이점 존재

* 카운팅 세마포어 : 여러 값을 가질 수 있는 세마포어. 여러 자원에 대한 접근 제어

뮤텍스는 잠금 기반, 세마포어는 신호 기반 매커니즘을 가진다.

 

모니터

-  둘 이상의 스레드나 프로세스에 공유 자원에 대한 접근 인터페이스 제공

-  모니터 큐를 이용해 공유 자원에 대한 접근을 순차적으로 처리

- 모니터에서 상호 배제는 자동

 

 

❓ 교착 상태가 발생하는 원인에 대해 이야기해주세요

더보기

 

교착상태(deadlock)은 두개 이상의 프로세스, 스레드가가 서로의 자원을 기다리며 무한히 중단된 상태

 

원인

- 상호 배제 : 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근 불가

- 점유 대기 : 특정 프로세스가 다른 자원을 기다리고 있는 상태

- 비선점 : 다른 프로세스에 할당된 자원을 강제로 뺏을 수 없음

- 환형 대기 : 프로세스 A는 B를 요구, B는 A를 요구하는 등 자원들이 꼬리를 물고 서로의 자원을 요구하는 상황

 

해결:

- 위 원인 중 하나라도 만족하지 않으면 데드락이 발생하지 않는다.

- 은행원 알고리즘 사용

- 교착 상태가 발생한 스레드 삭제

- (현재 운영체제가 채택한 방법) 교착 상태는 드물기 때문에 처리 비용이 더 크다. 그러므로 교착 상태가 발생하면 사용자 작업을 종료하는 방식을 사용한다.

 

 

❓ CPU의 각 영역에 대해 설명해주세요.

더보기

CPU(Central Processing Unit)은 명령어를 해석하고 실행하는 역할을 한다. 산술 연산 장치, 제어장치, 레지스터로 구성된다.

 

제어장치(CU, Control Unit) : 제어장치는 명령어를 해석하고 실행하는 역할을 담당한다. 프로그램 카운터를 통해 다음 실행할 명령어의 주소를 추적하고 명령어 해석기를 사용해 명령어를 이해하고 실행한다.

산술 연산 장치(ALU, Arithmetic Logic Unit) : 산술 연산 장치는 덧셈, 뺄셈, 곱셈 등의 산술 연산, AND, OR, NOT 등의 논리 연산을 담당한다.

레지스터(Register) : 매우 빠른 속도로 데이터를 저장하고 읽을 수 있는 메모리이다. 데이터를 일시적으로 저장하고 산술 연산장치로 전달하여 계산에 사용된다.

 

 

❓ 인터럽트에 대해서 설명해주세요.

더보기

인터럽트는 어떤 신호가 발생하였을 때 CPU를 잠깐 정지시키는 것을 말한다. 키보드, 마우스 등 IO 디바이스로 인한 인터럽트와 0으로 숫자를 나누는 산술 연산의 인터럽트, 프로세스 오류 등으로 발생한다. 

 

하드웨어 인터럽트

하드웨어가 발생시키는 인터럽트. 타이머, IO 디바이스 등에 의해 발생한다.

 

소프트웨어 인터럽트

소프트웨어가 발생시키는 인터럽트이다. 트랩이라고도 부른다. 프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발생한다.

 

* 인터럽트 핸들러 : 인터럽트 발생시 이를 핸들링 하기 위한 함수. 커널 내부의 IRQ(Inturrupt Requset)를 통해 호출된다.

* 인터럽트 벡터 : 인터럽트 발생시 처리해야 할 핸들러의 주소를 인터럽트 별로 보관하는 테이블

* 인터럽트 발생시 실행중이던 상태를 PCB에 저장하게 된다.

 

 

❓ CPU 스케줄링에 대해 아는대로 말해주세요.

더보기

CPU 스케줄링은 컴퓨터 시스템에서 여러 프로세스가 CPU(Central Processing Unit)를 사용하는 순서를 결정하는 방법이다. 한 CPU는 한 번에 하나의 프로세스만 실행 가능하므로 이 방법을 사용한다.

 

* 현대 컴퓨터는 멀티코어이기에 코어 수만큼 동시에 프로세스 실행 가능

 

비선점형 방식

비 선점형 방식(non-preemptive)는 프로세스가 스스로 cpu 소유권을 포기하는 방식이다.

- FCFS(First Come First Served) : 가장 먼저 온 프로세스를 먼저 처리한다. 오래 걸리는 프로세스 때문에 오래 걸리는 형상(convoy effect)가 발생한다.

- SJF(Shortest Job First) : 실행 시간이 가장 짧은 프로세스를 선택한다. 평균 대기시간은 최소화되지만 긴 시간을 가진 프로세스가 실행되지 않는 현상(기아현상, starvation)이 일어난다.

- Priority Scheduling : 각 프로세스에 우선순위를 할당하여 우선순위가 높은 프로세스를 먼저 실행한다. 예를 들어 오래된 작업일수록 우선순위를 높여 기아 현상을 방지한다.

- HRN(Highest Response Ratio Next) : 대기 중인 프로세스 중 Response Ratio가 가장 높은 프로세스가 CPU를 소유한다. Response Ration = (대기 시간 + 서비스 시간)/서비스 시간. 대기 시간이 길수록 우선순위가 높아진다.

 

선점형 방식

선점형 방식(preemptive)는 지금 사용중인 프로세스를 알고리즘에 의해 강제로 중단하고 다른 프로세스에 cpu 소유권을 할당하는 방식이다. 현대 운영체제에서 쓰인다.

 

- 라운드로빈(Round Robin) : 각 프로세스에 일정 시간을 할당하여 그 시간만큼 CPU를 소유한 후 시간이 지나면 준비 큐(ready queue)의 뒤로 보낸다. 할당 시간이 너무 크면 FCFS와 다를 게 없으며, 너무 작으면 오버헤드가 커진다. 로드밸런서에서 트래픽 분산 알고리즘으로도 사용한다.

- SRT(Shortest Remaining Time) : 짧은 시간 순서대로 프로세스를 수행한다. 남은 처리 시간이 더 짧은 프로세스가 준비 큐에 들어오게 되면 해당 작업을 먼저 실행하게 된다.

- 다단계 큐(Multi-level Queue) : 준비 큐를 여러 개 사용하며, 각 큐에서 자신만의 스케줄링 알고리즘을 수행한다.

 

 

❓ 메모리 계층 구조에 대해 설명해주세요.

더보기

메모리 계층 구조란 메모리를 필요에 따라 여러 종류로 분류한 것이다. 보통 아래 그림으로 나타낸다.

 

메모리 계층 구도

레지스터 : CPU 내부 가장 빠른 메모리. 휘발성. 기억 용량이 가장 작다.

캐시 : L1, L2 캐시를 의미한다. 속도 빠름. 휘발성. 기억 용량이 작다.

메모리(주기억장치) : 보통 RAM(Random Access Memory)를 나타낸다. 휘발성. 보통 속도.보통 기억 용량.

하드 디스크(보조기억장치): 보통 HDD, SSD를 나타낸다. 비휘발성. 낮은 속도. 많은 기억 용량

 

* 위쪽 계층일수록 속도가 빠르고 용량이 작아진다.

  

 

❓ 가상 메모리 개념에 대해 이야기해주세요.

더보기

가상 메모리는 메모리 관리 기법 중 하나로 컴퓨터가 실제 이용 가능한 메모리 자원을 추상화하여 작은 용량을 보안하고 매우 큰 메모리로 보이게 하는 방법이다. 즉 프로세스 전체가 메모리에 올라가지 않더라도 실행 가능하도록 하는 기법이다.

 

- CPU는 실행파일을 실행하면 0번부터 시작하는 독자적인 주소 공간을 생성하며 이를 논리 주소(logical address)라고 한다. 실제 메모리상의 주소를 물리 주소(physical address)라고 한다. 

- 논리 주소는 물리 주소의 특정 위치에 매핑되며 이를 주소 바인딩이라고 한다. 이 중 가상 메모리를 사용하기 위해서는 MMU의 도움을 받아 사용하는 실행 시간 바인딩을 사용한다.

- 메모리 관리 장치(MMU)에 의해 가상 주소가 실제 주소로 변환된다. MMU는 RAM을 여러 부분(페이지)로 나누어 각 페이지를 하나의 독립된 항목으로 처리하게 된다.

 

장점

- 사용자 프로그램이 물리 메모리의 제약에서 벗어날 수 있다.(ex 사용자 프로그램이 물리 메모리보다 커도 된다.)

- 각 프로그램이 더 작은 메모리를 차지하기 때문에 더 많은 프로그램을 실행 할 수 있다. 즉, CPU 이용률과 처리률이 증가한다.

- 프로그램을 메모리에 올리고 Swap하는 데 필요한 IO 횟수가 줄어든다.

 

 

❓ 메모리의 페이지 개념을 설명해주세요.

더보기

페이지(Page)는 가상 메모리 관리에 사용되는 기본적인 단위이다. 페이지란 가상 메모리를 일정한 크기로 나눈 블록을 뜻한다.

 

* 물리 메모리를 일정하게 나눈 것을 프레임이라고 한다.

 

- 페이지 테이블 : 각 프로세스마다 하나씩 가지는 자료구조. 가상 주소와 물리 주소간 매핑 정보를 담는다. 페이지 번호인 색인과 해당 페이지에 할당된 물리 메모리(프레임)의 시작주소인 내용으로 구성된다.

- 페이지 폴트(page fault) : 프로세스가 요청한 페이지가 현재 물리 메모리(RAM)에 없는 경우를 뜻한다.

 

 

❓ 요구 페이징(Demand Paging)에 대해 설명해주세요

더보기

요구 페이징은 메모리 관리 기법 중 하나로 프로그램이 실행될 때 필요한 페이지만 메모리에 로드하는 방식이다. 모든 페이지를 메모리에 올리는 전체 로딩과 달리 프로그램 실행에 실제로 필요한 페이지만 메모리에 가져와 사용함으로서 시스템 자원을 효율적으로 사용 가능해진다. 페이지 폴트를 해결하는 과정이다.

 

페이지 폴트 발생시

ref: https://www.geeksforgeeks.org/page-fault-handling-in-operating-system/

1. CPU가 물리 메모리 확인하여 해당 메모리가 없으면 트랩을 발생시킨다.

2. CPU를 중지한다.

2. 운영체제가 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인한다(프로그램은 실행될 때 필요한 페이지만 메모리에 로드하기에 없을 수 있다). 없으면 프로세스를 중단하고 물리 메모리에 비어있는 프레임이 있는지 찾는다. 이도 없으면 스와핑이 발동한다.

3. 비어있던 프레임에 해당 페이지를 로드하고 페이지 테이블을 최신화한다.

4. CPU를 다시 실행시킨다.

 

 

❓ 페이지 교체 방법에 대해 설명해주세요.

더보기

  

ref: https://www.geeksforgeeks.org/page-fault-handling-in-operating-system/

- 페이지 부재가 발생하면 요청된 페이지를 디스크에서 메모리로 읽어와야하지만 물리 메모리에 빈 프레임이 없을 수 있다

- 이경우, 메모리에 올라와 있는 페이지 중 하나를 쫓아내 메모리에 빈 공간을 확보한 후 새로운 페이지를 메모리에 올리게 된다.

 

즉, 페이지 폴트 발생 후, 페이지 테이블을 찾았을 확인했는데 RAM에 원하는 페이지가 없다면 페이지 교체가 발생한다.

 

페이지 교체 알고리즘이란 가상 메모리 시스템에서 페이지 폴트(page fault)가 발생했을 때 어떤 페이지를 메모리에서 제거하고 새로운 페이지를 적재 할 것인지를 결정하는 방법이다. 

 

오프라인 알고리즘

- 먼 미래에 참죄되는 페이지와 현재 할당하는 페이지를 바꾸는 방법, 최선의 방법

- 존재 하지 않는 가상의 방법, 그러나 가장 좋은 방법이기에 성능 측정의 상한(upper_bound)가 되어줌

 

FIFO(First In First Out)

- 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓음

 

LFU(Least Frequently Used)

- 참조가 가장 적은 페이지 교체

 

LRU(Least Recentle Used)

- 참조가 가장 오래된 페이지를 바꿈

- 오래된 것을 파악하기 위해 페이지마다 계수기, 스택을 두어야함

 

NRU(Not Used Recently)

- clock알고리즘이라고도 부름

- 0과 1을 가진 비트를 둠, 0: 최근 참조 X, 1: 최근 참조

- 시계 방향으로 돌며 0을 찾으면 해당 프로세스를 교체 후 1로 변경