개발/운영체제

[CS 면접] 운영체제 - 1

grulsuitg 2023. 5. 15. 19:57

보초님의 github에 있는 질문들을 보며 답변을 달아본 것입니다.

문제사항, 잘못된점 혹은 궁금한점이 있다면 댓글로 남겨주시면 감사하겠습니다.

이전 글을 읽지 않았다면 먼저 읽어보시면 좋습니다.

→ 보러가기

 

[CS 면접] 자료구조 및 알고리즘 - 3

보초님의 github에 있는 질문들을 보며 답변을 달아본 것입니다. 문제사항, 잘못된점 혹은 궁금한점이 있다면 댓글로 남겨주시면 감사하겠습니다. 이전 글을 읽지 않았다면 먼저 읽어보시면 좋습

grulsuitg.tistory.com

시스템 콜이 무엇인지 설명해 주세요.

시스템 콜은 사용자가 커널을 사용하기 위해 OS가 제공하는 인터페이스입니다.

우리가 사용하는 시스템 콜의 예시를 들어주세요.

exit, fork, open, malloc 등이 있습니다.

시스템 콜이 운영체제에서 어떤 과정으로 실행되는지 설명해 주세요.

  1. 우선 커널모드로 변경됩니다.
  2. 시스템 콜을 구분하기 위해 기능별로 할당된 고유번호를 가지고 해당하는 루틴을 호출하여 실행합니다.
  3. 작업이 마치면 다시 사용자 모드로 전환됩니다.

시스템 콜의 유형에 대해 설명해 주세요.

프로세스 컨트롤: 프로세스를 생성 종료 관리 할 수 있는 시스템 콜

파일 관리 : 파일 작업을 할 수 있는 시스템 콜

장치 관리 : 하드웨어 장치를 제어할 수 있는 시스템 콜

정보 유지 관리 : 프로세스 정보를 검색할 수 있는 시스템 콜

통신 : 네트워크를 통해 통신하는데 사용하는 시스템 콜

메모리 관리 : 메모리 할당 및 해제에 관한 시스템 콜

보안 : 보안 정책 및 액세스 제어를 시행하는데 사용되는 시스템 콜

운영체제의 Dual Mode 에 대해 설명해 주세요.

시스템 자원이나 하드웨어에 접근할 수 있는 커널모드와 프로그램을 수행하는 사용자 모드 두가지의 독립된 모드로 구성되어 있는 것을 의미합니다. 이렇게 구성함으로써 시스템 구성과 안전성을 보장할 수 있습니다. 사용자 모드에서 악의적인 접근과 오류로 인한 시스템 충돌을 발생하는 것을막아 시스템을 안정적이고 신뢰할 수 있도록 유지할 수 있습니다.

서로 다른 시스템 콜을 어떻게 구분할 수 있을까요?

시스템 콜을 구분하기 위해 할당된 고유번호가 있습니다. 해당 번호를 가지고 구분할 수 있습니다.

인터럽트가 무엇인지 설명해 주세요.

인터럽트는 프로그램이 실행될 때 예외상항이 발생하여 처리가 필요한 경우에 이를 CPU에게 알려주는 것을 의미합니다. 인터럽트가 발생하면 실행중인 프로세스는 현재 수행중인 명령의 위치를 PCB에 저장해놓고 인터럽트를 처리한 후 다시 돌아와 작업을 실행합니다.

인터럽트는 어떻게 처리하나요?

인터럽트가 발생하면 CPU가 인터럽트를 확인하고 인터럽트 벡터와 인터럽트 핸들러를 통해 상황에 맞는 인터럽트를 처리합니다.

인터럽트 백터 : 해당 인터럽트가 실행해야할 루틴이 담긴 메모리주소를 담고 있는 테이블

인터럽트 핸들러 : 인터럽트를 처리하기 위한 내용

Polling 방식에 대해 설명해 주세요.

주기를 가지고 주기마다 처리를 위한 시그널이 들어 왔는지를 체크하는 방식. 구현이 쉽지만 성능적으로 안좋습니다.

HW / SW 인터럽트에 대해 설명해 주세요.

HW 인터럽트

  • 하드웨어 인터럽트 : 하드웨어 장치의 컨트롤러가 CPU의 서비스를 요청하기 위해 발생시키는 인터럽트
  • 운영체제 타이머 인터럽트: 운영체제가 프로세스를 스케쥴링할 때 사용하는 인터럽트

SW 인터럽트(Trap)

  • 예외 : 프로그램이 허용되지 않는 연산을 수행하려고 할 때 발생하는 인터럽트
  • 시스템 콜 : 프로세스가 운영체제의 서비스를 요청하기 위해 커널 함수를 호출할 때 발생하는 인터럽트

프로세스가 무엇인가요.

프로세스는 프로그램을 실행시키는 단위입니다. 프로그램이 실행되면 가상의 메모리 공간이 할당되어 해당 공간을 가지고 프로그램이 동작하게 됩니다.

프로그램, 프로세스, 스레드의 차이에 대해 설명해 주세요.

프로그램 : 명령어들의 집합, 디스크 안에 저장되어있는 상태

프로세스 : 실행 중인 프로그램의 인스턴스, 각각의 프로세스는 독립된 가상의 공간을 가지고 있습니다.

스레드 : 프로세스 안에 실행 단위, 프로세스는 여러 스레드를 가질 수 있으며 프로세스와 동일한 메모리 공간을 사용해 동일한 데이터에 접근할 수 있습니다.

PCB가 무엇인가요?

Process Control Block 의 약자로 프로세스 간 전환, 커널 모드로의 전환 등이 수행될 때 현재 실행중인 명령어의 위치를 저장하고 불러올 때 사용되는 프로세스 별로 할당된 고유한 메모리 공간을 의미합니다.

스레드는 PCB를 갖고 있을까요?

PCB 는 프로세스 단위로 생성되기 때문에 스레드는 PCB를 가지고 있지 않다.

리눅스에서, 프로세스와 스레드는 각각 어떻게 생성될까요?

리눅스에서 프로세스는 Fork, exec 등의 명령어로 생성되게 됩니다. 스레드는 pthread_create 를 통해 스레드가 생성됩니다.

자식 프로세스가 상태를 알리지 않고 죽거나, 부모 프로세스가 먼저 죽게 되면 어떻게 처리하나요?

부모 프로세스가 먼저 죽게 되면 해당 자식 프로세스들은 Init 프로세스가 부모 프로세스가 됩니다.

자식 프로세스가 상태를 알리지 않고 죽는 경우는 좀비 프로세스가 되어 부모 프로세스가 종료될 때 좀비프로세스를 제거합니다.

리눅스에서, 데몬프로세스에 대해 설명해 주세요.

데몬 프로세스는 운영체제에서 부팅시 자동으로 켜져 백그라운드에서 계속 실행되는 프로세스를 의미합니다.

프로세스 주소공간에 대해 설명해 주세요.

프로세스 주소 공간은 프로세스가 실행될 때 할당되는 공간으로 힙, 스택, 텍스트, 데이터 영역으로 나눌 수 있다. 텍스트는 프로그램 실행코드가 포함되며 읽기 전용이고, 데이터는 컴파일 타임에 할당되며 크기가 고정된 전역 및 정적 변수들이 포함됩니다. 힙은 동적으로 할당된 메모리를 관리하는 공간이고 스택은 지역변수, 함수 콜 스택등을 관리하는데 사용됩니다.

초기화 하지 않은 변수들은 어디에 저장될까요?

BSS(Block Started by Symbol) 세그먼트라는 메모리 영역에 저장됩니다. 컴파일 타임에 정적으로 할당된 변수에만 적용이 되고 동적으로 할당된 변수는 해당되지 않습니다. bss 세그먼트는 데이터영역 내에 있지만 별도의 세그먼트로 취급하여 관리합니다.

일반적인 주소공간 그림처럼, Stack과 Heap의 크기는 매우 크다고 할 수 있을까요? 그렇지 않다면, 그 크기는 언제 결정될까요?

Stack과 Heap의 크기는 런타임시 결정되는 것으로 필요에 따라 크기를 키워 사용할 수 있습니다. 스택 같은 경우는 메모리가 할당될 때 크기가 정해지지만 힙은 필요에 따라 확장 및 축소가 가능합니다.

Stack과 Heap 공간에 대해, 접근 속도가 더 빠른 공간은 어디일까요?

스택이 더 빠릅니다. 왜냐하면 스택은 생성과 동시에 메모리 크기가 정해지는 등 CPU가 관리하며 연속된 공간이기 때문에 캐시가 되기 때문입니다.

다음과 같이 공간을 분할하는 이유가 있을까요?

텍스트 세그먼트 : 악의적이거나 실수로 인한 실행 코드 보호

데이터 세그먼트 : 공통으로 사용되는 정적 및 전역변수 상수를 효율적으로 관리하며 데이터를 보호

힙 : 스택 또는 데이터 오버런으로부터 힙을 보호

스택 : 스택 오버플로가 되지 않도록 보호

메모리를 효율적으로 관리하고 실수나 악의적인 데이터 조작으로 부터 프로그램을 보호하는데 도움이 됩니다.

스레드의 주소공간은 어떻게 구성되어 있을까요?

스레드는 힙, 데이터, 텍스트 영역은 공유하며 별도의 스택 영역만 갖게 됩니다.

단기, 중기, 장기 스케쥴러에 대해 설명해 주세요.

단기 : CPU 스케쥴러라고도 불리며 다음 실행할 프로세스를 선택합니다.

중기 : 메모리 스케쥴러라고도 불리며 메모리에 너무 많은 프로세스가 있으면 일부 프로세스를 디스크로 교체하거나 너무 적게 있다면 디스크에서 더 많은 프로세스를 가져오기로 결정할 수 있습니다.

장기 : 작업 스케줄러 라고도 부르며 시스템에 어떤 프로세스를 허용해야 하는지 결정하는 역할입니다.

현대 OS에는 단기, 중기, 장기 스케쥴러를 모두 사용하고 있나요?

현대에는 장기 스케쥴러를 보통 사용하지 않습니다. 현대 운영체제는 보통 time sharing system을 사용하여 장기 스케쥴러를 사용하지 않습니다. 따라서 보통 프로그램이 실행되면 바로 메모리에 올려 ready 상태가 됩니다.

프로세스의 스케쥴링 상태에 대해 설명해 주세요.

ready : 프로세스가 스케쥴러에 의해 CPU에 할당되기를 기다리고 있는 상태

running : 현재 CPU 에서 실행되고 있는 상태

waiting : 프로세스가 특정 이벤트가 완료되기를 기다리고 있는 상태

suspended : 사용자 또는 운영체제에 의해 메모리에서 제거되고 디스크로 이동되어 있는 상태

zombie : 실행이 끝났지만 아직 시스템에서 제거되지는 않은 상태*

preemptive/non-preemptive 에서 존재할 수 없는 상태가 있을까요?

존재할 수 없는 상태는 없습니다.

Memory가 부족할 경우, Process는 어떠한 상태로 변화할까요?

메모리가 부족하면 Suspended 상태가 되어 프로세스가 메모리에서 제고되고 디스크로 이동됩니다. 나중에 필요하다면 다시 메모리로 불러올 수 있습니다.

컨텍스트 스위칭 시에는 어떤 일들이 일어나나요?

  1. PCB에 현재 컨텍스트 저장 및 커널 모드로 전환
  2. 다음 실행할 프로세스 결정
  3. PC, 레지스터 등 PCB 에서 로드
  4. 사용자 모드로 전환

프로세스와 쓰레드는 컨텍스트 스위칭이 발생했을 때 어떤 차이가 있을까요?

프로세스 단위에 컨텍스트 스위칭은 스레드보다 비용이 많이드는 작업입니다. 스레드는 메모리공간을 공유하기 때문에 PC, Stack Pointer 등 일부 값만 변경되기 때문입니다.

컨텍스트 스위칭이 발생할 때, 기존의 프로세스 정보는 커널스택에 어떠한 형식으로 저장되나요?

PCB에 PC, register, 메모리 관리 정보, 스택 및 힙 포인터, 기타 프로세스 정보 등의 정보를 포함하여 저장합니다.

컨텍스트 스위칭은 언제 일어날까요?

단기스케쥴러에 의해 CPU 작업이 바뀌거나 시스템 자원의 응답을 기다리는 대기상태 일때 일어나게 됩니다. 혹은 사용자가 임의로 지정한 스레드 스케쥴링에 의해 발생합니다.


출처