본문 바로가기

CS 전공수업/컴퓨터 운영체제

[OS] 운영체제 꼬리물기 질문 대비

* 참고한 사이트: https://github.com/ksundong/backend-interview-question, https://suhyunsim.github.io/2023-03-14/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%A9%B4%EC%A0%91%EC%A7%88%EB%AC%B8

 

Q 프로그램의 종류에 대해 설명해주세요

 

애플리케이션, 미들웨어, 운영체제 이렇게 구분할 수 있을 것 같습니다. 애플리케이션은 사용자가 직접 사용하는 프로그램을 의미합니다. 미들웨어는 여러 개의 애플리케이션이 공통으로 사용하는 것들을 모아 앱의 실행을 도와줍니다. 운영체제는 큰 틀에서 사용자가 하드웨어를 사용하는 것을 도와주는 소프트웨어라고 할 수 있습니다.

 

Q OS의 역할은 뭐죠?

 

OS는 프로세스, 메모리, 파일, 디바이스 등을 관리하고, 보안을 유지하며, 이 전반의 과정을 유저에게 인터페이스를 통해서 제공합니다.

 

Q OS는 어떤 방식으로 동작하죠?

 

커널이라는 몸통이 있고, 사용자가 응용프로그램을 실행할 경우, 프로세스 단위로 실행이 되는데, 이 프로세스가 필요한 것들을 시스템 콜을 통해 커널에 주문합니다. 이때 커널의 모드는 유저 모드입니다. 커널이 작업을 수행하는데, 디바이스들에 접근해야하는 경우 커널에서 디바이스 드라이버를 통해서 접근하게 됩니다. 이때 커널은 인터럽트를 발생시키고 유저 모드에서 커널 모드로 전환하게 됩니다. 디바이스에서의 작업이 끝나면 다시 유저모드로 전환합니다. 이렇게 모드를 나눈 이유는, 프로세스가 직접 하드웨어에 접근하는 것을 차단하기 위함입니다.

 

Q 커널은 뭐죠?

 

기본적으로 프로그램이 실행되려면 주기억장치에 적재된 상태여야 합니다. OS도 실행되기 위해서는 RAM 위에 올라가야 하는데, 전체를 다 올릴 수 없기 때문에 가장 핵심적인 부분을 올려둔 게 커널입니다. OS의 핵심이라고 할 수 있습니다.

 

Q 시스템 콜은 뭐죠? 종류로는 뭐가 있나요?

 

프로세스의 생성이나 하드웨어의 조작 등 커널의 도움이 필요한 경우 프로세스가 커널에게 도움을 요청하는 방식입니다.

시스템 콜의 예시로는 파일, 프로세스, 메모리 제어 그리고 네트워크 통신 등이 있습니다.

 

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

프로세스는 프로그램이 인스턴스화된 상태를 뜻합니다. 쓰레드는 프로세스의 작업 흐름 중 하나를 뜻합니다. 그러니까 프로세스가 여러 개의 쓰레드를 포함하는 개념입니다.

 

Q 프로세스와 쓰레드를, 둘의 차이점을 중심으로 설명해주세요

 

사용자가 프로그램을 실행하면, OS는 해당 프로그램의 코드를 독립된 메모리 공간에 로드하고 실행할 수 있는 하나의 프로세스를 생성합니다. 프로세스는 독립적인 실행 단위로, 각 프로세스는 자신만의 코드, 데이터, 힙, 스택을 갖고 있습니다. 

 

쓰레드는 프로세스의 많은 작업 흐름 중 하나를 뜻합니다. 프로세스가 기본 실행 단위지만, 여러 개의 쓰레드를 활용해 작업을 병렬로 수행할 수 있습니다. 쓰레드는 같은 프로세스 내에서 주소 공간을 상당부분 공유합니다. 스택을 제외한 힙, 코드, 데이터 부분이 공유 대상입니다.

 

Q 메모리 구조를 영역에 따라 설명해주세요.

 

코드는 코드, 데이터는 전역 변수와 static 변수를 저장하고, 힙은 동적 메모리 할당되는 객체들을, 스택은 함수 호출 시 생성되는 변수와 주소 등을 저장합니다. 힙은 런 타임에 크기가 결정되고, 스택은 컴파일 타임에 크기가 결정됩니다. 참고로 컴파일 때 크기가 결정된 스택은 크기가 불변인 반면, 힙은 남은 메모리를 다 쓸 수 있기 때문에 가변입니다. 정확히 말하면, 런타임에 처음으로 힙의 크기를 알게 된다고 할 수 있습니다. 스택은 높->낮 주소로, 힙은 낮->높 주소로 주소가 할당됩니다.

 

Q 스택과 힙 오버플로우에 대해 설명해주세요

 

스택은 컴파일 시에 크기가 결정되는데, 무한 재귀 호출 혹은 큰 지역 변수 등의 이유로 할당된 스택보다 많은 공간이 필요할 때 스택 오버플로우가 발생합니다. 만약 이 일이 발생하면 보통 그냥 프로그램이 강제로 종료됩니다. 힙의 경우에는 보통 동적으로 할당된 메모리를 제대로 해제하지 않아 발생합니다. 나머지 세 구역이 고정이지만 힙은 가변적이기 때문에 저 세개 영역 제외 나머지 메모리를 모두 활용할 수 있는데, 그럼에도 불구하고 메모리가 부족하면 힙 오버플로우가 발생합니다.

 

Q 멀티프로세싱과 멀티쓰레딩에 대해 설명하고, 각각의 장단점을 알려주세요

 

각각의 장단점이 있는데, 프로세스의 경우 독립적인 메모리를 가지고 있기 때문에 동기화 이슈에서 비교적 자유롭습니다. 그래서 주어진 태스크가 끝나기 전까지는 독립적으로 작업 수행이 가능합니다. 반면 쓰레드의 경우 상당부분의 메모리, 그러니까 스택부분을 제외한 나머지 힙, 코드, 데이터 부분을 공유하기 때문에, 컨텍스트 스위칭 시에 속도가 빠르다는 장점이 있습니다. 그러나 프로세스와 달리 공유되는 메모리 부분이 있기 때문에 지속적으로 동기화를 해줘야 한다는 점이 있습니다. 또한 프로세스의 경우 쓰레드보다 동기화 측면에서 자유롭기 때문에 잘 소통을 안하지만, 만약 소통이 필요한 경우에는 IPC라는 과정을 거쳐야 하는데, 힙 영역을 통해서 통신이 가능한 쓰레드에 비해 IPC가 소모되는 비용이 큽니다.

 

Q 프로세스 스케줄러란 뭐고, 종류는 뭐뭐가 있죠?

 

멀티 프로세스 과정에서, CPU를 사용하기 위해 대기하고 있는 큐의 프로세스들의 순서를 관리하는 것을 프로세스 스케줄러라고 합니다. 종류는 여러가지가 있는데 FCFS, SJF, Priority Scheduling 등이 있지만 가장 많이 활용되는 것은 Round Robin 방식입니다. 그냥 할당 시간을 정하고, 한번에 그만큼씩만 사용할 수 있게 하고, 다시 큐로 돌아가 순서를 기다리게끔 하는 것입니다.

 

Q 쓰레드끼리 다른 메모리 부분들은 공유하면서, 스택만 독립적으로 배정하는 이유는 뭔가요?

 

스택은 함수의 인자, 복귀 주소, 지역 변수 등을 저장하기 위해 사용되기 때문에, 각 쓰레드가 독립적인 함수 호출을 가능하게 하기 위해서 스택을 따로 사용합니다.

 

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

여러 프로세스가 하나의 CPU 코어를 단위 시간씩 번갈아가며 사용하는데, 이때 CPU 코어 위에서 돌아가는 태스크를 컨텍스트라고 하고, 이 내용을 저장하고 다음 실행할 프로세스의 상태를 복원하는 행위를 컨텍스트 스위칭이라고 합니다.

 

Q 컨텍스트 스위칭의 과정은 어떻게 되죠?

 

우선 현재 프로세스의 상태를 PCB에 저장하고, 다음 프로세스의 PCB에서 메타데이터들을 뽑아와 상태를 복원하고, 실행하는 단계로 구성되어 있습니다.

 

Q 컨텍스트 스위칭의 중요성?

 

멀티쓰레딩, 멀티프로세싱 등의 멀티태스킹 시에 필수적이라고 할 수 있습니다. 여러 개의 태스크에 자원을 공정하게 분배하고, 시스템 응답성을 높게 유지합니다. 그리고 CPU가 엄청 빠릅니다. I/O보다도 빠르고, 사람의 눈보다는 당연히 더 빠릅니다. 그렇기 때문에 CPU가 일찍 일을 끝내고 쉬는 시간을 줄이기 위해서도 컨텍스트 스위칭이 필수입니다.

 

Q 컨텍스트 스위칭의 비용?

 

시간 및 메모리 오버헤드가 있을 수 있습니다. 상태를 저장하고 복원하는 과정에서 CPU의 시간이 그만큼 소모되고, 각 프로세스의 상태를 저장하기 위해 추가 메모리가 필요합니다. 캐시 메모리를 상대적으로 덜 쓰고, PCB에 저장해야 하는 내용이 적은 쓰레드가 프로세스에 비해 비용이 적다고 할 수 있습니다.

 

Q 동기와 비동기 (혹은 블로킹, 논블로킹) 가 뭐죠?

동기 방식은 작업을 병렬적이 아닌, 직렬적으로 진행하는 것이고 비동기 방식은 병렬적으로 진행하는 것입니다.

 

Q 각각의 장단점은 뭐죠?

 

블로킹의 경우 직관적이기 때문에 이해하기 쉽고 디버깅에 용이하지만, 비효율적이고, 또 프론트엔드단에서 유저는 일시적으로 인터페이스가 멈추거나 느려지는 현상을 체험할 수 있습니다. 논블로킹은 효율적이지만, 코드가 복잡합니다. 또한, 만약 메모리 혹은 CPU를 과하게 많이 잡아먹는 작업을 처리할 경우 과부하가 걸려 오히려 비효율적일 수도 있습니다.

 

Q Thread-safe의 의미는 뭐죠?

멀티 쓰레드 환경에서, 여러 쓰레드가 병렬적으로 작업하더라도 여러 쓰레드가 동시에 자원에 접근할 때 데이터 무결성을 보장하는 것을 의미합니다. 주로 같은 프로세스 내에서 발생하는 문제를 해결하기 위한 개념입니다.

 

더 자세히는, 쓰레드는 자원을 공유하기 때문에 동시성 측면에서 문제가 날 수 있습니다. Race condition이라고 하여, 하나의 자원에 여러 개의 쓰레드가 동시에 접근하려 할 수 있고, 이는 Data Integrity를 해치는 등의 예측 불가능한 결과를 불러올 수 있습니다. 이 부분을 잘 방지하여 위험성이 덜하게 짜인 코드를 뜻합니다.

 

Q Race Condition은 어떻게 방지하죠?

 

동기화 작업을 통해 방지할 수 있습니다. mutual exclusion이라는 특징을 가진 객체들을 활용할 수 있습니다. 보통 활용할 수 있는 것으로는 뮤텍스, 세마포어, 모니터 이렇게 세 가지가 있습니다. 쓰레드 동기화를 관리할 때는 뮤텍스, 락, 모니터 등을 쓰고, 프로세스 동기화에는 세마포어 등을 쓰는 것으로 알고 있습니다.

 

Q 각각을 설명해주세요

 

각각을 설명하자면, 뮤텍스는 0과 1의 상태를 가진 객체입니다. 현재 자원을 쓰고 있는 쓰레드가 우선이고, 이를 다른 쓰레드 등의 외부요인이 강제로 종료시킬 수 없는, 비선점 방식니다. 그런데 세마포어의 경우에는, 현재 자원을 쓰고 있는 쓰레드를 다른 쓰레드가 시그널을 보내 종료시키고 내쫓을 수 있는 선점방식입니다. 상태가 뮤텍스와 같이 하나뿐이라면 바이너리, 여러개라면 카운터로 구분합니다. 모니터의 경우에는 객체 단위로 동기화를 관리하며, 내부적으로 락과 조건 변수를 사용하여 동기화 문제를 해결합니다. 쓰레드의 입장에서는 추상화가 되어 있기 때문에, 마치 공항 이미그레이션에서 줄 서서 기다리다가 직원분이 허락할 때 가서 작업을 수행하는 것과 비슷하다고 볼 수 있습니다.

 

Q Data Integrity는 어떻게 보장하죠?

 

동시에 접근을 못하게 하거나, 동시에 접근을 하더라도 대상이 되는 메모리가 변하지 않게 만들면 됩니다. 동시에 접근을 못하게 동기화하는 방법은, 뮤텍스나 락 같은 객체를 활용하거나, 아니면 메소드를 synchronized로 하는 방법이 있습니다. 대상이 되는 메모리가 변하지 않게 하는 방법은 불변 객체를 사용하는 방법이 있습니다.

 

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

위의 thread-safe와 개요가 동일합니다. 다만 앞서 언급했듯, 쓰레드를 다룰 때 뮤텍스, 락, 모니터 등을 주로 쓴다면 프로세스 동기화를 위해서는 세마포어를 쓴다는 점이 다릅니다.

 

Q 교착상태와 기아상태는 무엇이고, 어떻게 해결하나요?

Deadlock, 즉 교착상태는, 멀티 프로세스 혹은 멀티 쓰레드 상황에서 서로가 서로의 자원을 필요로 하지만 반납은 하지 않아 더 이상 작업을 진행하지 못하고 stuck 되어 있는 상태를 말합니다. 상호 배제, 점유 대기, 비선점, 순환대기의 4가지 조건을 모두 만족할 때 발생합니다. 해결 방법은, 저 네가지 중 하나라도 만족하지 않도록 합니다. 그러나 현재의 OS에서는, 데드락이 발생한다면 더 소모적인 상황을 만들기 보다는 그냥 프로그램을 조기종료하는 것으로 알고 있습니다.

 

기아상태란, 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스가 영원히 자원 할당이 되지 않는 경우입니다. 이 경우에는 큐의 우선순위를 수정하는 해결방법이 있을 수 있습니다.

 

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

실제 메모리보다 더 많은 양의 메모리더 효율적으로 활용하기 위해 지원하는 추상화 기술입니다. 가상 메모리는 RAM과 디스크 동간을 모두 활용합니다. 기본적으로 페이징과 스와핑을 기반으로 합니다.

 

페이징은 가상 메모리를 일정 크기의 페이지로 나누고, 필요할 때만 페이지를 물리 메모리에 로드하여 메모리의 효율적인 사용을 하게 하는 기법입니다.

스와핑은 물리 메모리가 부족할 때 사용하지 않는 페이지를 디스크로 옮겨, 필요한 페이지를 물리 메모리에 로드하는 과정입니다. 이 과정을 통해 RAM보다 더 많은 양의 메모리를 사용할 수 있게 됩니다.

 

Q 스와핑의 문제점은 뭐가 있을까요?

 

단편화 fragmentation이 있습니다. 단편화는 메모리의 사용되는 공간들 사이에 사용 못하는 공간이 있는 것을 뜻합니다. 

외부 단편화는, 보수적으로 메모리 주소를 잡다보니 연속된 메모리 공간이 충분하지 않아 새로운 프로세스를 할당할 수 없는 것을 뜻하고, 내부 단편화는 메모리 주소를 필요보다 좀 더 널널하게 배정하다보니 남는 공간이 생기지만 이미 프로세스에 배정되었기 때문에 역시나 활용은 못하는 것을 뜻합니다.

 

Q 단편화를 어떻게 해결하죠?

 

외부 단편화는 페이징 등으로 줄일 수 있고, 내부 단편화는 동적 메모리 할당으로 해결할 수 있습니다. 물론 이 동적 메모리 할당도 프로그래머의 부담이 늘어나고, 관리 오버헤드가 생긴다는 단점이 있긴 합니다.

 

Q 가상 메모리를 왜 쓰죠?

 

페이징안정성효율성을 제공합니다. 각 프로세스에 독립적인 가상 주소 공간을 제공하여 프로세스 간의 충돌을 방지합니다. 스와핑확장성을 제공합니다. 이렇게 실제 메모리보다 더 많은 양의 메모리를 활용할 수 있게 합니다.

 

Q 컴퓨터 구조에서의 메모리에 대해 설명해주세요

작고 빠른 순부터 나열하자면, CPU 레지스터, L1, L2, L3, RAM, Disk 이 순서대로 나열할 수 있을 것 같습니다. CPU 레지스터는 CPU에 존재하고, L1은 보통 CPU 내에 존재하고, L2는 CPU 내든 외든 존재가능하고, L3는 외부에 존재합니다. RAM은 주기억장치로써 메모리라고 칭하는 부분이고, 디스크는 RAM의 활동을 보조하는 보조기억장치입니다.

 

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

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