운영체제 면접 정리

초보개발·2022년 3월 29일
2

🔍 운영체제의 메모리 영역에 대해 설명해보세요.

운영체제 메모리 영역은 유저 영역커널 영역으로 나뉩니다. 두 영역으로 나뉜 이유는 사용자가 시스템 운영에 필요한 메모리 영역인 커널 영역을 함부로 접근할 수 없도록 막기 위함입니다.
유저 영역은 code, data, heap, stack 영역으로 나눠집니다.
코드 영역은 프로그램의 기계어 코드가 있는 영역입니다.
데이터 영역은 전역 변수와 정적 변수가 저장되는데, 초기화 된 변수는 data, 초기화 되지 않은 변수는 bss영역에 저장됩니다.
힙 영역은 동적으로 메모리를 할당하여 사용하는 공간입니다. 동적으로 할당된 메모리가 해제되면 힙에서도 사라지게 됩니다.
스택 영역은 지역 변수와 매개 변수가 저장되는 영역입니다. 함수가 호출되면 해당 함수의 지역 변수가 스택에 쌓였다가 종료되면 해당 영역을 pop해줍니다.

🔍 프로세스와 스레드의 차이

프로세스는 실행 중인 프로세스를 말합니다. 프로세스는 각각 자신의 정보를 저장하는 PCB를 가지고 있으며, 독립적인 메모리 영역도 할당 받습니다. 스레드는 프로세스의 실행 단위로서, 기본적으로 메인 스레드 1개가 있으며 스레드가 여러 개 있다면 각 스레드마다 stack을 가지고 있습니다.
스레드는 heap 영역에서 데이터를 공유하므로 프로세스 간 IPC하는 것보다 빠릅니다. 하지만 공유 영역에 다른 스레드가 하나의 자원에 접근할 때, 순서를 정해주는 동기화를 별도로 처리해주어야 합니다.

🔍 스택을 스레드마다 독립적으로 갖고 있는 이유는?

스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것으로 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당합니다.

🔍 멀티 스레딩의 장점

프로세스를 동시에 처리하던 일을 스레드로 구현할 경우 메모리 공간과 시스템 자원의 소모를 줄일 수 있습니다. 스레드끼리 Heap 영역에서 데이터를 주고 받을 수 있어 프로세스 간 통신 방법보다 더 간단합니다. 또한, 시스템의 처리량이 증가해 자원 상태가 줄어들고 프로그램의 응답 시간을 줄일 수 있습니다.

🔍 멀티 스레딩의 문제점

스레드는 Heap 영역에서 데이터들을 공유하기 때문에, 동일한 자원에 동시에 접근할 일이 생길 수 있습니다. 따라서 원하는 값이 아닌 엉뚱한 값을 읽어올 수 있게 됩니다. 동기화 작업으로 공유 자원에 대한 접근을 컨트롤해야 되는데, 이로 인해 병목현상이 일어나 성능 저하가 발생할 수 있습니다.

🔍 mutex와 세마포어

뮤텍스는 상호배제의 줄임말로 0과 1의 값만 가지는 이진 세마포어입니다. 뮤텍스는 lock, unlock으로 오직 1개의 스레드만 공유 자원에 접근할 수 있게 합니다. 자원을 점유하고 있는 스레드가 lock을 걸고 그 자원에 접근하기 원하는 스레드들은 unlock될 때까지 대기했다가 접근할 수 있게 됩니다.
세마포어는 현재 공유 자원의 상태를 나타내는 변수를 갖습니다. 이 변수는 커널에 저장되며 각 스레드가 자원에 액세스할 때마다 1씩 감소되고 0이 될때까지 접근이 가능합니다. 연산을 하고 나오면 다시 변수를 1 증가시키게 됩니다. 이렇게 함으로써 해당 공유자원에 접근하는 스레드, 프로세스의 개수를 통제할 수 있습니다.

🔍 교착상태

상호배제, 점유 대기, 선점 불가, 순환 대기 4가지 상태를 모두 만족해야 교착상태가 발생합니다.
상호배제는 자원을 동시에 사용할 수 없다는 것을 말하며, 점유 대기는 자원을 이미 점유한 상태에서 다른 자원을 기다리고 있는 경우를 말합니다. 선점 불가는 다른 프로세스가 점유한 자원에 대해 강제로 빼앗을 수 없음을 말하고, 순환 대기는 해당 자원에 대한 대기가 순환 형태로 되어 있음을 말합니다.

🔍 Context switch(프로세스, 스레드의 차이)

문맥 교환은 기존의 프로세스, 스레드의 context를 저장하고 다음 프로세스를 실행할 수 있도록 context를 교체해주는 작업을 말합니다. 여기서 context는 CPU가 프로세스를 실행하기 위한 프로세스의 정보들을 말합니다.
문맥 교환은 입출력 요청, CPU 사용시간이 만료되었거나 인터럽트 처리를 기다릴 때 발생합니다. 하지만, 문맥 교환이 빈번하게 이루어 질경우, 그 동안 CPU는 아무 일도 못하기 때문에 성능이 저하됩니다.
선점형 스케줄링인 라운드 로빈 알고리즘으로 context switch를 수행하는데, time quantum의 값이 너무 크다면 FCFS와 같아지게 되고 너무 작다면 context switch가 많이 발생하게 되므로 오버헤드가 커지게 됩니다.
스레드를 사용하게 되면, context switch의 비용을 줄일 수 있게 됩니다. 모든 영역을 교체하는 것이 아닌 stack만 교체하면 되기 때문에 상대적으로 적은 비용이 들어갑니다.

0개의 댓글