Interview - OS

Interview - OS

Q1. 프로세스보다 스레드의 컨텍스트 스위칭이 더 빠른 이유는 무엇인가요?

스레드 컨텍스트 스위칭(Thread Context Switching)의 경우 프로세스 컨텍스트 스위칭(Process Context Switching)과 달리 MMU 새로운 주소 체계 바로보도록 수정하고 TLB 가상 메모리, 실제 메모리 저장된 캐시를 비우는 등의 메모리 주소 관련 작업을 하지 않고, CPU의 상태 정보만 바꿔주면 되기 때문입니다.


Q2. 스레드,프로세스,코어의 수는 많을수록 좋을까요?

스레드가 많으면 CPU 자원이 스레드 관리에 소모됩니다. 이로 인해 많은 스레드가 동시에 실행될 경우 메모리나 캐시, 락 등의 자원을 경쟁하게 되어 성능 저하나 데드 락이 발생할 가능성이 높아집니다.

프로세스가 많으면 메모리 사용량이 급격히 증가할 수 있습니다. 프로세스 간 통신이 필요할 경우 성능 저하가 발생할 수 있습니다. 무엇보다도 프로세스 간 컨텍스트 스위칭은 스레드 간 컨텍스트 스위칭보다 더 많은 오버헤드를 수반하기 때문에, 프로세스 수가 많아지면 시스템 성능이 저하될 수 있습니다.

코어가 많으면 CPU는 병렬 처리 성능을 향상시킬 수 있지만, CPU의 비용과 전력 소비가 증가할 수 있으며, 발열 관리도 더 복잡해집니다.

따라서 스레드, 프로세스,코어의 수가 많을수록 시스템 성능이 향상된다고 생각할 수 있지만, 실제로는 그렇지 않을 확률이 큽니다.


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

운영체제는 사용자가 실행하는 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지해 자원을 보호합니다. 왜냐하면, 프로그램이 CPU, 메모리, 하드 디스크에 마음대로 접근하고 조작할 수 있다면, 자원이 무질서하게 관리 될 수 있으며 한 프로그램의 실수가 전체 컴퓨터에 영향을 주기 때문입니다. 운영체제는 프로그램들이 자원에 접근하려 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호합니다.

사용자 모드는 운영체제 서비스를 제공받을 수 없는 실행 모드를 의미합니다. 이 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 하는데요. 말씀 주신 시스템 콜(System Call) 은 이때 운영체제 서비스를 제공받기 위한 요청을 의미합니다. 시스템 콜은 일종의 소프트웨어 인터럽트입니다. 시스템 콜을 발생시키는 명령어가 실행된다면, CPU는 현재까지의 작업을 백업한 뒤에 커널 영역 내에 시스템 콜을 수행하는 인터럽트 서비스 루틴을 실행한 이후, 다시 기존 실행하고 있었던 프로그램으로 복귀하여 실행을 계속합니다.


Q4. 디스크 접근 시간에 대해서 설명해주세요.

일반적으로 단일-헤드 디스크 시스템에서 특정 데이터 블록을 읽거나 쓰기 위해서는 헤드를 데이터가 존재하는 트랙으로 이동시키는 과정, 원하는 데이터가 저장된 섹터가 헤드 아래로 회전되어 올 때까지 기다리는 과정, 데이터를 전송하는 과정이 필요합니다. 그리고 이 모든 과정을 수행하는 데 걸리는 시간을 디스크 접근 시간(Disk Access Time) 이라고 합니다. 디스크 접근 시간은 탐색 시간, 회전 지연 시간, 데이터 전송 시간을 합쳐 계산할 수 있습니다.


Q5. 연속 메모리 할당 기법에 대해서 설명해주세요.

연속 메모리 할당 기법(Continuous Memory Allocation) 은 운영체제가 프로세스에 연속적인 메모리 공간을 할당하는 방법을 의미합니다. 연속 메모리 할당 기법을 사용하면, 하나의 프로세스는 메모리 주소 공간에서 연속적으로 존재하게 됩니다.

연속 메모리 할당 기법은 크게 가변 크기 메모리 할당과 고정 크기 메모리 할당이 존재하는데요. 고정 크기 메모리 할당은 물리적인 메모리 공간을 고정된 크기로 나누어 프로세스에 고정된 크기만큼 할당합니다. 반면, 가변 크기 메모리 할당 방식은 프로세스의 크기에 맞춰 동적으로 메모리를 할당합니다.

외부 단편화와 내부 단편화가 무엇인가요?

외부 단편화(External Fragmentation) 는 프로세스를 할당하기 어려울 만큼 작은 메모리 공간들로 인해서 메모리가 낭비되는 현상입니다. 연속 메모리 할당 기법을 사용할 때 프로세스가 사용할 메모리 공간이 300MB라고 가정하겠습니다. 이때, 흩어져 있는 빈 공간들의 합은 300MB가 넘지만, 연속적인 300MB는 존재하지 않아 프로세스에 메모리를 할당하지 못하는 상황이 발생할 수 있습니다.

내부 단편화(Internal Fragmentation) 는 메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되는 상황에서 메모리 공간이 낭비되는 상황을 의미합니다. 고정 크기 할당 방식에서 프로세스가 사용할 메모리 공간이 300MB이지만 실제로 할당된 공간은 500MB인 경우, 200MB가 낭비됩니다.

고정 크기 할당 방식은 고정된 크기만큼 프로세스에 공간을 할당하기 때문에 내부 단편화가 발생할 수 있습니다. 반면, 가변 크기 할당 방식은 필요한 크기만큼 프로세스에 할당하기 때문에 내부 단편화는 발생하지 않습니다. 단, 할당과 해제를 반복하다보면 외부 단편화가 발생할 수 있습니다.


Q6. 가상화에 대해 설명해주세요.

가상화(Virtualization) 란 하나의 물리적인 컴퓨팅 리소스를 논리적으로 분리하여 여러 개의 가상 리소스를 생성해 사용하는 기술을 의미합니다. 서버, 스토리지, 네트워크 등 다양한 IT 리소스를 가상화할 수 있으며, 클라우드 컴퓨팅에 핵심이 되는 기술 중 하나로 활용됩니다.

가상화가 왜 필요한가요?

  1. 서버를 가상화할 경우 물리 서버에 여러 가상 서버를 배치하여 하드웨어 리소스를 효율적으로 사용할 수 있습니다.
  2. 물리적인 하드웨어 수를 줄일 수 있어 초기 구축 비용 및 유지 관리 비용을 절감할 수 있습니다.
  3. 각 가상 리소스들은 격리되어 있어 하나의 가상 리소스에 장애가 발생해도 다른 가상 리소스에 영향을 미치지 않습니다.
  4. 가상 리소스를 필요에 따라 빠르게 생성하거나 삭제할 수 있어 인프라 운영이 유연해집니다.
  5. 가상 리소스는 소프트웨어 기반이기 때문에 장애 복구가 용이하고 가용성을 높일 수 있습니다.

VM과 컨테이너의 차이점을 알고 계신가요?

VM은 하이퍼바이저를 통해 호스트 시스템에서 다수의 게스트 OS를 동시에 실행하는 기술입니다. VM은 다양한 OS를 실행할 수 있고 높은 수준의 격리를 제공하지만, 게스트 OS를 포함하기 때문에 무겁고 성능이 느리다는 단점이 있습니다.

컨테이너는 호스트 OS의 커널을 공유하며, 컨테이너 이미지를 통해 애플리케이션을 실행하는 기술입니다. 컨테이너는 VM보다 가볍고 빠른 성능, 높은 확장성을 보이지만, 커널을 공유하기 때문에 보안에 취약할 수 있고 호스트 OS와 동일한 환경으로 구성해야 한다는 단점이 있습니다.

다양한 OS가 필요한 환경이거나 높은 격리 수준이 중요할 경우 VM을 사용하고, 빠른 배포와 확장이 필요한 클라우드 네이티브 환경이거나 마이크로서비스 아키텍처를 활용할 경우 컨테이너를 사용할 수 있습니다. 하지만 VM과 컨테이너는 서로 대체하는 기술이 아니기 때문에 VM 위에서 컨테이너를 실행하는 방식과 같이 목적에 따라 함께 활용할 수도 있습니다.


Q7. 멀티 프로그래밍과 멀티 태스킹의 차이는 무엇인가요?

멀티 프로그래밍은 단일 프로세스 시스템과 달리 하나의 프로세스가 IO 작업을 하게 되어 대기하게 되면, 다른 프로세스가 실행되어 CPU가 아무 일도 하지 않는 시간을 줄입니다. 멀티 프로그래밍의 주된 목적은 CPU 사용률을 극대화 하는데 있습니다.

멀티태스킹과 멀티프로그래밍은 동시에 여러 프로그램을 실행시킨다는 면에서 유사하지만, CPU 타임을 아주 짧게 쪼개서 CPU 타임 안에서 프로세스들이 서로 번갈아 가면서 실행될 수 있도록 했다는 점이 차이가 있습니다.

멀티태스킹은 프로세스의 응답 시간을 최소화 시키는데 목적입니다. 응답시간을 최소화 시킨다는 것은 사용자 입장에서 마치 정말 여러 프로그램이 동시에 실행되는 것 처럼 느껴지게 만듭니다. 아주 짧은 타임 슬라이스 안에서 여러 프로세스들이 교대로 실행이 되면서 즉각적인 응답을 보여줍니다.

멀티태스킹의 핵심은 타임 슬롯을 아주 짧게 쪼개서 프로세스들이 번갈아가며 실행을 하게 됨으로써 어떤 프로그램을 실행시키거나 어떤 동작을 했을 때 즉각적인 반응을 받을 수 있도록 하여 동시에 여러 프로그램이 실행되는 것과 같은 느낌을 주는 것 입니다.


Q8. 명령어 파이프라이닝에 대해서 설명해주세요.

명령어 파이프라이닝(instruction pipelining) 은 CPU가 여러 명령어를 동시에 처리하기 위해 각 명령어를 여러 단계로 분할하고, 각 단계를 다른 명령어와 겹쳐서 실행하는 방법입니다. 전통적인 CPU는 한 번에 하나의 명령어를 처리하는 반면, 파이프라인 기법을 사용하는 CPU는 여러 명령어를 각기 다른 단계에서 동시에 처리할 수 있습니다

파이프라인 위험에 대해서 알고 계시나요?

파이프라이닝은 높은 성능을 가져오지만, 때로는 성능 향상에 실패하기도 하는데요. 이를 파이프라인 위험(pipeline hazard) 이라고 합니다. 파이프라인 위험에는 크게 데이터 위험, 제어 위험, 구조적 위험이 존재합니다.

  • 데이터 위험(data hazard) 이란 데이터 의존적인 두 명령어를 동시에 실행하는 경우, 파이프라인이 제대로 작동하지 않는 것을 의미합니다. 예를 들어, 명령어 B가 명령어 A의 연산 결과인 R에 의존하는 경우, 명령어 A의 결과 저장 단계가 완료되어야 명령어 B가 R을 사용할 수 있습니다.
  • 제어 위험(control hazard) 이란 분기(branch)나 조건문 등으로 인해 다음에 실행할 명령어가 무엇인지 결정되지 않아 파이프라인이 멈추게 되는 것을 의미합니다. 분기 예측 기법이 사용되기도 하지만, 예측에 실패하면 계산된 파이프라인은 모두 버려야 해서 성능 저하가 발생합니다.
  • 구조적 위험(structural hazard) 이란 한 명령어가 자원을 사용하면, 해당 자원이 필요한 다른 명령어는 멈추게 되어 파이프라인이 제대로 작동하지 않는 것을 의미합니다. 서로 다른 명령어가 동시에 ALU, 레지스터와 같은 CPU 자원을 사용하려 할 때 발생합니다.

Q9. 공유 메모리 기반 IPC가 소켓 통신보다 빠른 이유를 설명해주세요.

공유 메모리는 동일한 메모리 공간에 직접 접근하여 데이터를 주고받고, 마치 자신의 메모리 공간을 읽고 쓰는 것처럼 IPC(프로세스 간 통신)가 이루어지기 때문에 빠릅니다. 이에 반해 소켓 통신은 주고받는 데이터가 커널을 통하므로 추가적인 오버헤드가 발생할 수 있어, 공유 메모리 기반 IPC보다 다소 느릴 수 있습니다.


Q10. 운영체제가 메모리에 적재되기까지의 과정을 설명해주세요.

컴퓨터 전원이 켜지면 CPU는 ROM에 저장된 BIOS를 실행합니다. BIOS는 하드웨어를 검사하는 POST 수행 후, 하드 디스크의 MBR을 읽어 부트 로더를 로드합니다. 부트 로더가 커널의 위치를 찾아 RAM에 적재함으로써 커널이 메모리에 로드됩니다.


Q11. 운영체제의 커널이 무엇이며, 커널이 왜 존재하는지에 대해 설명해주세요.

커널은 운영체제의 핵심 부분으로, 컴퓨터 하드웨어와 응용 프로그램 간의 중재자 역할을 합니다. 커널은 프로세스와 스레드가 올바르게 실행되도록 돕고, 이들이 CPU, 메모리, 보조기억장치 등의 하드웨어를 공정하게 할당받아 실행되도록 합니다. 또 커널은 이중 모드를 운영해 사용자 응용 프로그램이 안전하고 효율적으로 시스템 자원을 사용할 수 있도록 합니다.


Q12. 리눅스 OS에서 일반적인 사용자 프로세스가 어떻게 CPU를 할당받아 실행되는지 설명해주세요.

리눅스에서 일반적으로 사용자 프로세스는 CFS 스케줄러에 의해 스케줄링됩니다. CFS 스케줄러는 각 프로세스에 CPU의 시간을 공평하게 배분하는 것을 목표로 합니다.

기본적으로 각 프로세의 가상 실행 시간인 vruntime을 유지하며, vruntime이 가장 작은 프로세스부터 스케줄링합니다. 프로세스의 vruntime은 실제 실행 시간에 프로세스의 우선순위에 따른 가중치를 고려하여 계산되며, 우선순위가 높을수록 vruntime의 증가가 느려지기 때문에 우선순위가 높은 프로세스는 더 자주 CPU를 할당받게 됩니다.


Q13. 지나치게 컨텍스트 스위칭이 반복되면 어떤 문제가 발생할 수 있나요?

빈번한 컨텍스트 스위칭은 실제 작업보다 컨텍스트 저장과 복구에 CPU 시간을 사용하게 되므로 효율성을 떨어뜨립니다. 또한 캐시 메모리의 데이터를 반복적으로 무효화하게 되므로 캐시 미스율이 증가하고, 캐시 미스와 컨텍스트 교환 오버헤드로 인한 전체 시스템의 처리 속도가 저하될 수 있습니다.


Q14. 4GB보다 큰 크기의 프로그램을 4GB인 물리 메모리에 실행할 수 있을까요? 실행할 수 있다면 어떻게 가능할까요?

가상 메모리 기술을 통해 가능합니다. 운영체제는 프로세스가 필요한 메모리 공간을 가상 주소로 할당하고, 실제 물리 메모리에는 필요한 부분만 적재합니다. 필요하지 않은 부분은 디스크의 스왑 영역에 저장하고, 필요할 때 다시 물리 메모리에 적재할 수 있습니다. 이러한 기술을 가상 메모리 기술이라고 하며, 이를 통해 물리 메모리보다 큰 프로세스를 실행할 수 있습니다.


Q15. 페이지 폴트를 처리하는 과정을 설명해주세요.

CPU의 페이지 폴트 처리 과정은 CPU가 기존의 작업 내역을 백업하고, 페이지 폴트 처리 루틴을 실행합니다. 페이지 처리 루틴은 메모리로 원하는 페이지를 가져와 유효 비트를 1로 변경해주는 작업을 의미합니다. 페이지 폴트를 처리하면 CPU가 해당 페이지에 접근할 수 있게 됩니다.


Q16. 파일 디스크립터는 무엇을 식별하는 정보인가요?

파일 디스크립터는 운영체제에서 파일을 식별하기 위한 저수준 정보입니다. 리눅스를 비롯한 여러 운영체제에서는 입출력장치, IPC 등도 일종의 파일로 간주해 파일 디스크립터로 식별하고 다룰 수 있습니다.


Q17. EXT4 파일 시스템에서 디렉터리 내 파일의 데이터를 찾는 과정을 설명해 주세요.

파일이 속한 디렉터리에서 파일 이름에 해당하는 디렉터리 엔트리를 찾고, 해당 파일의 아이노드 번호를 얻습니다. 아이노드 번호를 이용하여 아이노드 테이블에서 해당 아이노드를 찾습니다. 아이노드는 파일의속성과 데이터가 저장된 위치를 포함하고 있으므로 아이노드를 통해 실제 파일 데이터가 저장된 위치에 접근할 수 있습니다.


Q18. 메모리 누수는 무엇이며, 어떻게 해결할 수 있는지 설명해 주세요.

메모리 누수는 프로그램이 할당받은 메모리를 해제하기 않아 메모리가 지속적으로 점유되는 현상을 말합니다. 메모리 누수 문제를 해결하기 위해서는 메모리를 사용한 후 명시적으로 해제하거나 프로그래밍 언어의 가비지 컬렉션을 활용해 정리해야 합니다.


Q19. 동일한 코드를 여러 프로세스로 동시에 실행하는 것과 여러 스레드로 프로세스를 실행하는 것에는 어떤 차이가 있나요?

차이점은 자원 공유 여부에 있습니다. 동일한 코드를 여러 프로세스에서 동시에 실행하는 경우, 기본적으로 각 프로세스는 독립적으로 실행되며 메모리, 파일 등의 자원을 공유하지 않습니다. 반면, 여러 스레드로 프로세스를 실행하는 경우, 동일한 프로세스 내에서 실행되며 자원을 공유합니다. 따라서 스레드 간에는 통신과 협력이 쉽지만, 한 스레드의 문제가 전체 프로세스에 영향을 줄 수 잇습니다. 반면, 프로세스는 스레드와 달리 서로 독립적이기 때문에 한 프로세스의 문제가 다른 프로세스에 미치는 영향이 적습니다.


Q20. 교착 상태가 무엇인지, 왜 발생하는지 설명해 주세요.

교착 상태는 2개 이상의 프로세스가 서로 상대발의 자원을 기다리며 무한정 대기하는 상황을 말합니다. 이는 네 가지 조건이 충족될 때 발생할 수 있습니다.

  1. 자원이 상호 배제되어 한 번에 하나의 프로세스만 사용할 수 있는 경우
  2. 이미 자원을 점유한 프로세스가 다른 자원을 기다리는 경우
  3. 자원이 비선점되어 다른 프로세스가 강제로 자원을 빼앗지 못하는 경우
  4. 프로세스들이 원형으로 자원을 대기하는 경우

Q21. 디버깅할 때 주로 볼 수 있는 주소는 실제 물리 메모리의 주소일까요?

실제 메모리 주소가 아닌 논리 주소(가상 메모리 주소)입니다. 프로세스를 실행하는 CPU나 메모리에 적재된 프로세스 입장에서 메모리 내에 물리 주소를 모두 알기는 어렵기 때문에 프로세스마다 부여되는 논리 주소를 활용합니다. 따라서 디버깅할 때의 메모리 주소는 프로세스의 가상 주소 공간 내에서의 주소에 해당합니다. 이 가상 주소(논리 주소)는 CPU와 메모리 사이에 위치하는 MMU에 의해 물리 주소로 변환됩니다.


Q22. 프로세스의 페이지 테이블이 모두 메모리에 적재될 경우 발생할 수 있는 문제점과 해결방안을 설명해 주세요.

크게 두 가지 문제 상황이 발생할 수 있습니다. 먼저, 메모리 접근 횟수가 많아져 성능이 저하됩니다. 페이지 테이블 접근과 실제 데이터 접근으로 인해 메모리 접근이 두 배로 늘어나기 때문입니다. 또 페이지 테이블이 차지하는 메모리 용량이 커져 비효율적입니다. 이는 TLB를 사용해 페이지 테이블의 일부를 캐싱하거나, 계층적 페이징 기법을 사용해 페이지 테이블을 나누어 관리함으로써 메모리 접근 횟수와 메모리 사용량을 줄일 수 있습니다.


이 페이지는 면접 준비를 위한 정리 페이지입니다.