앞에서 정리한 내용들을 토대로, 실전에서 물어볼 법한 질문을 한 번 만들어보았습니다.
인터페이스, 메모리, 사용자 관리(커널?), 디바이스 드라이버 관리
인터페이스란 무엇인가요?
답변 : 서로 다른 두 개의 시스템 사이에서 정보나 신호를 주고 받는 경계를 의미합니다.
운영체제의 핵심부분은 어느 메모리에 장착되어 돌아가나요?
답변 : 커널에 장착되어 돌아갑니다. 기본적으로 프로그램이 실행되기 위해서는 주기억장치에 적재된 상태여야 합니다. 운영체제 역시 프로그램 중의 하나이므로 메인 메모리에 적재되어야 하나, 운영체제의 크기가 너무 커서 전체를 다 올리면 메모리공간의 낭비로 인해 비효율적이게 됩니다. 따라서 커널에는 항상 필요한 운영체제의 핵심부분만을 메인 메모리에 적재하여 사용합니다.
운영체제가 메모리 관리를 해야하는 이유와, 메모리 관리를 위해 어떤 전략을 사용하나요?
답변 : 오로지 운영체제만이 운영체제 메모리 영역과 사용자 메모리 영역의 접근에 영향을 받지 않습니다. 반대로 각 프로세스는 다른 프로세스의 메모리 공간에 접근이 불가능합니다. 따라서 운영체제만이 메모리 관리를 할 수 있습니다.
전략으로는 페이징과 세그멘테이션 전략, 가상메모리를 이용한 Swapping, 고정길이 할당/가변 길이 할당 등의 방식으로 메모리 관리를 하고 있습니다.
프로세스와 스레드의 차이점은 무엇인가요?
답변 : 프로세스는 자신만의 고유한 공간과 자원을 할당받아 사용한다. 하지만 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용한다는 차이가 있다.
그럼 프로세스와 스레드는 아예 별개의 것을 봐야 하나요??
답변 : 아닙니다. 스레드는 경량화된 프로세스로, 프로세스 안에 존재합니다. 단지 스레드는 힙 영역은 공유하되, 별도의 레지스터와 스택 영역을 가지는 경량화된 프로세스로 보면 됩니다.
스레드에는 스택과 레지스터만은 독립적으로 가지는데, 그 이유는 무엇인가요?
답변 : 스택영역은 함수의 호출을 독립적으로 하기 위함입니다. 기본적으로 스택 영역은 함수의 실행과 관련이 있는데 프로세스 내의 독립적인 실행 흐름을 만들기 위해 스레드마다 스택 영역을 가집니다.
레지스터 영역은 명령어 수행이 어디까지 진행되었는지를 알아야 하기 때문에 독립적으로 가지게 됩니다. 스레드가 cpu를 할당받아 작업하다가 스케줄러에 의해서 컨테스트 스위칭이 일어나게 됩니다. 이때 다시 해당 스레드가 실행되려면 어디까지 작업이 수행되었는지를 알아야 하기 때문에 독립적인 레지스터 영역을 가집니다.
그렇다면 스레드가 프로세스에 비해 가지는 장점은 무엇인가요?
답변 : 독립적인 프로세스에 비해서 공유하는 메모리가 있으므로, 시간/자원의 손실이 감소한다. 도한 전역변수, 정적 변수에 대한 자료 공유가 가능하다 .
반대로 스레드의 치명적인 단점이 있다면 어떤 것이 있을 것 같나요?
답변 : 안정성 문제가 있을 수 있습니다. 왜냐하면 하나의 스레드가 데이터 공간을 망가뜨리면 모든 스레드가 공유하므로 작동이 불가능해지기 때문입니다.
이러한 안정성 문제를 해결할 수 있는 방안이 있다면 어떤 것이 있을까요?
답변 : Critical Section을 통한 상호 배제 기법을 통해서 대비가 가능합니다. Critical Section이란, 하나의 스레드가 공유 데이터 값을 변경하는 시점에 다른 스레드가 그 값을 읽으려 할 때의 문제를 해결하기 위한 동기화 과정이라고 볼 수 있습니다. 두 개 이상의 스레드가 공유자원에 대해 접근하려고 서로 경쟁하는 것은 Race Condition(경쟁상태)라고 합니다. 이러한 Critical Section에 대한 Race Condition을 제거하기 위해, 한 공유자원에 대해서 한 스레드만 접근을 허락하는 상호배제를 사용합니다.
멀티 스레딩의 장단점을 말씀해주세요.
답변: 멀티스레딩이란, 하나의 프로세스를 다수의 스레드로 만들어 실행하는 것입니다.
장점으로는 메모리 공간과 시스템 자원 소모가 줄게 됩니다. 또한 HEAP을 사용하여 데이터를 주고 받을 수 있습니다. 게임같은 곳에서 사용된다.
단점으로는 HEAP영역이 있으므로 동기화에 신경써야 합니다. 따라서 동기화를 위해 작업 처리 순서를 컨트롤하고 공유 자원에 대한 접근을 컨트롤해야 합니다.
프로세스 주소 공간에 대해서 말씀해주세요
답변 : 프로세스가 실행 중에 접근할 수 있도록 허용된 주소의 최대범위입니다. 프로세스 주소 공간에는 코드, 데이터, 스택으로 이루어져 있습니다.
코드 영역에는 프로그램 소스 코드가 저장되며, 데이터 영역에서는 전역 변수가 저장됩니다. 스택 영역에서는 함수, 로컬 변수가 저장됩니다.
이렇게 구역을 나눈 이유는 무엇인가요?
답변 : 최대한 데이터를 공유하여 메모리 사용량을 줄여야 하기 때문입니다.
1) 코드 영역은 프로그램 자체에서 모두 같은 내용이기 때문에 따로 관리하여 공유합니다.
2) 스택 영역과 데이터 영역은 스택 구조의 특성을 이용합니다. 따라서 함수들과 지역변수는 LIFO성격을 띕니다. 이로써 전역변수는 따로 지정해두면 메모리를 아낄 수 있습니다.
+) 별개의 질문으로, 크롬 브라우저에서 한 탭에 오류가 생기더라도, 다른 탭에는 영향을 끼치지 않습니다. 그렇다면 각각의 크롬 탬은 프로세스일까요, 스레드일까요?
답변 : 프로세스입니다. 만약 스레드라면 한 크롬탭의 영향이 다른 탭에도 가기 때문입니다.