다른 분의 블로그를 보고 정리한 글입니다.
https://hoons-dev.tistory.com/95?category=1091955
⭐ OS(운영체제)가 무엇인지 설명해주실 수 있나요?
운영체제는 하드웨어 자원을 관리하고, 응용 프로그램과 하드웨어 사이를 중재하는 인터페이스를 의미합니다.
인터페이스: 서로 다른 두개의 시스템 사이에서 정보나 신호를 주고 받는 접점이나 경계를 의미
⭐ 커널이 무엇인지 설명하실 수 있나요?
기본적으로 프로그램이 실행되기 위해서는 주기억장치에 적재된 상태여야합니다.
운영체제 역시 프로그램이기 때문에 메인메모리에 적재가 되어야 하나, 운영체제의 크기가 너무 커서 전체를 다 메인 메모리에 올리게 된다면 비효율적입니다. (메모리 공간의 낭비)
따라서 커널(Kernel)이라고 하는 항상 필요한 운영체제의 핵심 부분만을 메인 메모리에 적재하여 운영체제를 사용하게끔 합니다.
즉, 커널은 메모리에 상주하는 운영체제의 핵심 부분이라고 할 수 있습니다.
⭐ 메모리의 구조를 영역에 따라서 설명해줄 수 있나요?
1) 코드 영역 (텍스트 영역)
실행할 프로그램의 코드가 저장되는 영역으로, 텍스트 영역이라고도 불립니다. CPU는 해당 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.
2) 데이터 영역 (static 영역)
전역 변수와 지역변수가 저장되는 영역으로, 프로그램이 시작되는 동시에 할당되며, 프로그램이 종료되면 소멸합니다.
3) 힙 영역 (Heap)
사용자가 직접 관리하는 영역이며 메모리 공간이 동적으로 할당 및 해제됩니다.
4) 스택 영역 (Stack)
함수의 호출에 따른 지역변수와 매개변수가 저장되는 영역으로, 컴파일 시 크기가 결정됩니다. 함수의 호출과 함께 할당되고, 함수의 호출이 종료되면 소멸합니다.
⭐ 메모리의 힙 영역과 스택 영역의 차이에 대해 설명해주세요.
힙 영역 | 스택 영역 | |
---|---|---|
저장하는 데이터 | 동적으로 생성된 변수 | 지역변수, 매개변수 |
크기가 결정되는 타이밍 | 런타임(Runtime) | 컴파일(Compile) |
크기 제한 | 크기가 제한되어 있지 않다.(늘어난다) | 스택 크기가 제한되어 있다. |
주소 할당 방향 | 낮은 주소 → 높은 주소 | 높은 주소 → 낮은 주소 |
비교 | 스택에 비해 느리다, 직접 힙 영역 관리 필요 | 힙에 비해 빠르다. 함수의 종료에 따라 소멸되므로 별다른 관리가 필요 없다. |
두 영역은 같은 메모리 공간을 공유하는데, 스택은 높은 주소에서 낮은 주소로, 힙은 낮은 주소에서 높은 주소로 채워지기 때문에 서로의 영역을 누가 침범하느냐에 따라 heap overflow, stack overflow가 발생할 수 있습니다.
참고로, 메모리의 위쪽에 위치할수록 낮은 주소이며, 아래쪽에 위치할수록 높은 주소입니다.
⭐ 메모리의 힙 영역을 너무 크게 잡으면 어떤 일이 생길까요?
힙 영역은 스택 영역과 다르게 직접 생성된 변수의 제거를 통해 메모리관리가 필요합니다.
만약 메모리의 힙 영역이 너무 크다면, 넓은 힙 영역에 존재하는 동적 변수에 대해 참조 여부를 확인해야 하기 때문에 Garbage Collection(GC)의 수행시간이 너무 길어지게 됩니다.
Garbage Collection: 메모리 관리 방법 중 하나로, 동적으로 할당한 메모리 영역 중 더 이상 쓰이지 않는 영역을 자동으로 찾아 해제하는 기능
🍀 프로세스와 쓰레드에 대해 설명하고, 둘의 차이에 대해 설명해주세요.
프로세스는 실행 중인 프로그램을 말하며, 완벽히 독립적이기 때문에 메모리 영역(Code, Data, Heap, Stack)을 다른 프로세스와 공유하지 않습니다. 프로세스는 최소 1개의 쓰레드(메인 쓰레드)를 가지고 있습니다.
쓰레드는 프로세스 내에서 Stack만 따로 할당받고, 그 이외의 메모리 영역(Code, Data, Heap)을 공유하기 때문에 다른 쓰레드의 실행 결과를 즉시 확인할 수 있습니다. 쓰레드는 프로세스 내에 존재하며 프로세스가 할당받은 자원을 이용해 실행됩니다.
🍀 컨텍스트 스위칭에 대해 설명하고, 왜 컨텍스트 스위칭이 필요한지 설명해주세요.
문맥 교환(Context Switching)은 여러 프로세스를 처리해야 하는 상황에서 현재 진행중인 Task(프로세스 혹은 쓰레드)의 상태를 PCB에 저장하고, 다음에 진행할 Task의 상태 값을 읽어 레지스터에 적재하는 과정을 의미합니다.
컨텍스트 스위칭을 통해 CPU 사용률을 높일 수 있고 여러 프로세스를 처리할 수 있습니다.
⭐ 프로세스 제어 블록 (PCB) 에 대해 더 자세히 설명해주세요.
프로세스 제어 블록 (Process Control Block, PCB)는 프로세스를 관리하기 위한 정보를 포함하는 OS 커널의 자료구조입니다.
운영체제에서 프로세스는 PCB로 표현되며, 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB도 함께 제거됩니다.
⭐ 크롬 브라우저에서 한 탭에 오류가 생기더라도, 다른 탭에 영향을 끼치지 않습니다. 그렇다면 각각의 크롬 탭은 프로세스일까요? 쓰레드일까요?
크롬 탭이 쓰레드라면, 한 크롬 탭에서 오류가 생기면 다른 크롬 탭에서도 오류가 생길 수 있습니다. 따라서 한 탭에 문제가 생기더라도 다른 영향을 끼치지 않는다는 특성에 의해, 크롬 탭은 별개의 프로세스인 것을 알 수 있습니다.
🍀 멀티 쓰레드와 멀티 프로세스를 비교해주세요.
멀티 프로세스는 하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않고 계속 실행된다는 장점이 있지만 멀티 쓰레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 있습니다.
멀티 쓰레드는 멀티 프로세스보다 더 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만 하나의 쓰레드에 문제가 생기면 전체 쓰레드가 영향을 받으며 동기화 문제가 있다는 단점이 있습니다.
⭐ 쓰레드마다 독립적으로 할당하는 2가지에 대해 설명해주세요.
쓰레드는 독립적으로 스택 영역과 PC Register를 갖고 있습니다.
1) 독립적으로 스택 영역을 갖는 이유:
프로세스 내의 독립적인 실행 흐름을 만들기 위해 쓰레드마다 스택 영역을 갖습니다.
2) 독립적으로 PC Register를 갖는 이유:
PC Register 값은, 쓰레드가 명령어를 어디까지 수행했는지를 나타냅니다. 쓰레드는 CPU를 할당받았다가, 스케줄러에 의해 선점당해 컨텍스트 스위칭이 일어납니다. 따라서 다시 해당 쓰레드가 실행될 때 어디까지 실행이 되었는지 알아야 하므로 독립적으로 PC Register 값을 갖게 됩니다.
🍀 멀티 쓰레드 환경에서의 주의해야 할 점에 대해 설명할 수 있나요?
다수의 쓰레드가 공유 데이터에 동시에 접근할 때 동시성 문제 또는 교착상태에 빠지지 않도록 주의해야합니다.
🍀 동기와 비동기의 차이에 대해 설명해주세요.
동기는 순차적, 직렬적으로 테스크를 수행하고, 비동기는 병렬적으로 테스크를 수행합니다.
동기는 A함수가 B함수를 호출할 때, B함수의 결과를 A함수가 처리하는 것입니다.
비동기에서는 A함수가 B함수를 호출할 때, B함수의 결과를 B가 처리하고 A에게 callback으로 알려주는 것입니다.
동기/비동기: 호출당한 함수의 종료를 누가 처리하느냐
⭐ Blocking 과 Non-Blocking에 대해 설명해주세요.
Blocking에서는 A함수가 B함수를 호출할 때, B함수가 자신의 작업이 종료되기 전까지 A함수에게 제어권을 돌려주지 않는 것을 의미합니다. 즉, B함수가 종료될때까지 A함수는 다른일을 할 수 없습니다.
Non-Blocking은, A함수가 B함수를 호출할 때, B함수가 A함수에게 곧바로 제어권을 돌려주게 됩니다. A함수는 제어권을 가지고 있으므로 다른 일을 수행할 수 있습니다.
blocking/non-blocking: 제어권이 누구에게 돌아가느냐
⭐ 프로세스의 종류는 무엇이 있는지 설명해주세요.
🍀 Race Condition과 Critical Section이 무엇이고, 경쟁상태를 막기 위해 어떤 방법을 사용하는지 설명해주세요.
두개 이상의 쓰레드가 공유자원에 대해 접근하려고 서로 경쟁하는 것을 Race Condition(경쟁상태)이라고 합니다.
이 공유자원이 존재하는 구간으로 Race Condition이 일어날 수 있는 영역을 Critical Section(임계영역)이라고 합니다.
이러한 임계영역에 대한 경쟁상태를 제거하기 위해 한 공유자원에 대해 한 쓰레드에만 접근을 허락하도록 하는 상호배제(Mutual Exclusion)를 사용합니다.
🍀 DeadLock(교착상태)에 대해 설명하고, 해결 방법에 대해 설명해주세요.
DeadLock(교착상태)는, 두개 이상의 프로세스가 서로 자원을 기다리면서 무한히 대기하는 상태를 의미합니다.
DeadLock이 발생하기 위한 조건에는 4가지가 있습니다.
교착 상태를 해결하는 방법은 위의 4가지 조건 중 하나라도 제거하면 막을 수 있습니다.
Race Condition 제거를 위해서 상호배제 조건을 제거하기는 어렵습니다.
⭐ '식사하는 철학자 문제' 에서, DeadLock이 어떨 때 발생하는지 설명하고, 이를 해결하기 위한 방법을 제시해주세요.
"식사하는 철학자 문제"
다섯 명의 철학자가 원탁에 앉아 있고, 각자의 앞에는 스파게티가 있고 양옆에 포크가 하나씩 있다. 그리고 각각의 철학자는 다른 철학자에게 말을 할 수 없다. 이때 철학자가 스파게티를 먹기 위해서는 양 옆의 포크를 동시에 들어야 한다.
모든 철학자가 방에 입장한 후, 각자의 왼쪽 포크를 5명이 모두 드는 경우에 DeadLock이 발생합니다.
1) 5명 모두 자신의 왼쪽 포크를 들고 있으므로 '점유 대기'
2) 남이 포크를 뺏어주지 않음 '비선점'
3) 서로 오른쪽 포크를 놓기만을 기다림 '순환 대기'
4) 각 포크에 대해 한사람만 들 수 있음 '상호 배제'
이 문제를 해결하기 위해서, 카운팅 세마포어를 사용합니다.
방에 대한 입장 정원을 카운팅 세마포어로 설계해, 최대 4명만 들어온다면 방 안의 모든 사람들이 왼쪽 포크를 든다 하더라도 DeadLock이 발생하지 않습니다.
🍀 Mutex(뮤텍스)와 Semaphore(세마포어)에 대해 설명해주세요.
뮤텍스와 세마포어를 사용해 임계 영역에서의 경쟁상태를 제거할 수 있습니다. (동기화 도구)
뮤텍스(Mutex)
오직 1개만의 프로세스(또는 스레드)만 접근 할 수 있습니다.
1개만 접근가능하므로 반드시 락을 획득한 프로세스가 락을 해제해야합니다.
세마포어(Semaphore)
세마포어 변수만큼의 프로세스(또는 스레드)가 접근할 수 있습니다.
현재 수행중인 프로세스가 아닌 다른 프로세스가 세마포어를 해제할 수 있습니다.
이진 세마포어는 뮤텍스와 동일하다고 볼 수 있습니다. 이진 세마포어가 아닌 나머지 세마포어를 카운팅 세마포어라고 부릅니다.
⭐ CPU Scheduling이 무엇인지 설명하고, CPU 스케줄링의 종류에 대해 설명해주세요.
Ready Queue에 있는 프로세스 중, 다음에 CPU를 할당할 프로세스를 선택하는 알고리즘을 CPU Scheduling이라고 합니다.
<선점>
<비선점>
🍀 선점(preemption)과 비선점(non-preemption)이 무엇인지 설명해주세요.
선점 방식은, 실행되고 있는 프로세스나 스레드를 강제로 중단시키고 다른 프로세스를 실행시키는 것을 말합니다.
비전점 방식은, 그 반대로 하나의 프로세스가 끝나지 않으면 다른 프로세스는 CPU를 사용할 수 없는 것을 의미합니다.
🍀 동시성과 병렬성이 어떻게 다른지 설명해주세요.
(멀티 쓰레드에서)
동시성은 멀티 작업을 위해 싱글 코어에서 여러 개의 쓰레드가 번갈아 실행하는 것을 말합니다.
병렬성은 멀티 작업을 위해 멀티 코어에서 한 개 이상의 쓰레드를 포함하는 각 코어들을 동시에 실행하는 것을 말합니다.
⭐ Interrupt(인터럽트)에 대해 설명해주세요.
인터럽트는 프로그램을 실행하고 있는 도중에 입출력 요청 혹은 예외 상황을 처리해야 하면 실행하던 프로그램을 멈추고 CPU가 해당 작업을 처리하도록 하는 것을 의미합니다.
⭐ System Call은 무엇인가요?
사용자나 응용 프로그램이 커널에서 제공하는 기능을 사용하기 위한 인터페이스입니다.
운영체제는 커널이 제공하는 서비스를 '시스템 콜'을 사용해야만 사용할 수 있도록 제한함으로써 컴퓨터 자원을 보호하면서 사용자나 응용 프로그램에게 서비스를 제공할 수 있습니다.
⭐ 메모리의 종류에 대해 설명하고, 종류가 여러가지인 이유에 대해 설명해주세요.
CPU에 가까운 순서대로 레지스터, 캐시, 주기억장치, 보조기억장치 등이 있습니다.
물리적 메모리의 종류가 많은 이유는, 접근 속도에 따른 차이를 두기 위해서입니다.
(레지스터 > 캐시 > 주기억장치 > 보조기억장치)
⭐ OS가 메모리 관리를 해야하는 이유에 대해 설명해주시고, 메모리 관리를 위해 어떤 전략을 사용하는지 설명해주세요.
각각의 프로세스는 독립된 메모리 공간을 갖습니다. 따라서 각 프로세스는 다른 프로세스의 메모리 공간에 접근할 수 없습니다. 오로지 운영체제만이 운영체제 메모리 영역과 사용자 메모리 영역의 접근에 영향을 받지 않습니다. 따라서 OS 만이 메모리를 관리할 수 있기 때문에 적절한 관리가 필요합니다.
가상메모리를 이용한 Swapping, 페이징 및 세그멘테이션 전략, 고정 길이 할당/가변 길이 할당, 압축 등의 방식으로 OS가 메모리 관리를 수행할 수 있습니다.
⭐ 메모리의 fit의 종류 4가지에 대해 설명해주세요.
⭐ 페이징과 세그멘테이션에 대해 설명해주세요.
페이징: 프로세스를 동일한 크기의 페이지로 분리, 메모리는 해당 페이지와 동일한 크기의 프레임으로 분리해서 메인 메모리에 불연속적으로 저장하는 방식입니다.
만약 프로세스가 13MB이고 페이지가 4MB라면, 한 페이지는 1MB가 됩니다. 프레임은 무조건 4MB로 분리했으므로 3MB의 내부 단편화가 발생할 수 있습니다.
세그멘테이션: 프로세스를 가변적인 크기의 세그먼트로 분리하고 메모리에 적재합니다. 주로 논리적인 블록단위 세그먼트로 Code, Data, Stack, Heap으로 분리할 수 있습니다. 세그멘테이션 역시 외부 단편화가 발생합니다.
⭐ 그렇다면, 내부단편화와 외부단편화가 무엇인지 설명해주세요.
단편화란, 프로세스들이 차지하는 메모리 사이에 사용하지 못할 만큼의 작은 공간을 의미합니다.
내부 단편화는 고정길이 할당/ 페이지에서 나타나는 것으로, 물리 메모리를 고정적인 길이의 파트로 잘랐을 때, 해당 파트의 길이보다 더 작은 크기의 조각이 들어가게 되어 여백이 생기는 것을 의미합니다.
외부 단편화는 가변길이 할당/ 세그멘테이션에서 나타나는 것으로, 물리 메모리의 최대크기 - 사용중인 공간의 크기가 새로운 프로세스보다 작으면 적재 할 수 없으며, 이 여백을 외부 단편화라고 할 수 있습니다.
⭐ 가상 메모리가 무엇인지 설명해주세요.
프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법입니다. 가상 메모리가 없다면 실행되는 코드의 전부를 적재해야하므로 메모리 용량보다 큰 프로그램을 실행할 수 없습니다.
가상메모리를 사용하면 동시에 많은 프로그램을 실행할 수 있고, 응답시간을 유지하면서 CPU의 이용률과 처리율을 높일 수 있습니다.
하지만, 물리 메모리의 구동보다는 속도가 느리다는 단점이 있습니다.
⭐ 요구 페이징(Demand Paging)이 무엇인지 설명해주세요.
요구 페이징은 프로그램 실행 시작 시에 프로그램 전체를 물리 메모리에 적재하는 대신, 초기에 필요한 것들만 적재하는 전략을 의미합니다. 가상 메모리와 페이지 개념을 활용해 관리합니다.
🍀 페이지 교체가 언제 발생하는지, 어떤 교체 알고리즘이 있는지 설명해주세요.
물리 메모리가 모두 사용중이라서 원하는 페이지를 물리 메모리에 적재하지 못한다면, 페이지 교체가 일어나게 됩니다.
⭐ Thrasing(쓰레싱)에 대해 설명해주세요.
메모리 영역에 접근하게 될 때, 메모리에 페이지 부재율이 높은 것을 의미하며 심각한 성능 저하를 초래합니다.
⭐ 메모리가 고갈되면 일어나는 현상에 대해 설명해주세요.
메모리가 고갈되었지만, 프로세스를 실행해야하기 때문에 swap이 활발해집니다. 따라서 CPU 이용률이 하락하고, OS는 CPU 이용률이 낮으므로 오히려 새로운 프로세스를 추가하게 되는 쓰레싱 현상이 나타납니다. 이를 해소하지 못하면 Out of Memory 상태로 판단해 중요도가 낮은 프로세스를 강제로 종료하게 됩니다.
⭐ 캐시(cache) 메모리를 왜 사용하는지, CPU의 적중률을 높이기 위해 어떤 원리를 사용하는지에 대해 설명해주세요.
CPU와 메모리 사이의 속도 차이를 완화하기 위해 사용됩니다. 메모리의 데이터를 미리 가져와 저장해두는 임시 장소입니다.
따라서 이 캐시에 있는 데이터를 사용하는 것을 '적중'이라고 하고, 이러한 적중률을 높이기 위해 참조 지역성의 원리를 사용합니다.
⭐ DMA(Direct Memory Access)에 대해 설명해주세요.
데이터의 이동에는 CPU의 개입이 필요합니다. 그러므로 다량의 데이터가 이동하는 과정에서는 CPU에 많은 부하가 걸리게 됩니다.
따라서 CPU를 거치지 않고 직접 데이터를 전송하는 방법인 DMA를 사용합니다.
⭐ 메모리 할당 중, 연속(Contiguous)방식과 불연속(Non-Contiguous) 방식에 대해 설명해주세요.
연속 할당 방식은 각각의 프로세스가 메모리의 연속적인 공간에 적재되도록 하는 방법이며, 고정길이 할당과 가변길이 할당으로 크게 2가지로 나눌 수 있습니다.
고정길이 할당
메모리를 고정된 길이로 파트를 분리하고, 프로세스를 해당 파트에 삽입합니다. 고정된 길이의 파트 내에 프로세스가 들어가므로, 여백이 생길 수 있는데 이것을 '내부 단편화'라고 합니다.
가변길이 할당
메모리를 프로세스의 길이에 알맞게 파트를 분리하고, 해당 프로세스를 적재합니다. 가변된 길이이므로 내부 단편화는 발생하지 않지만 가변적인 길이 할당에 의해 일부분이 남으므로 '외부 단편화'가 발생합니다.
불연속 할당 방식은 하나의 프로세스가 메모리의 여러 영역에 분산되어 할당하는 방식이며, 페이징과 세그멘테이션 방식이 있습니다.
페이징
프로세스를 동일한 크기의 페이지로 분리, 메모리는 해당 페이지와 동일한 크기의 프레임으로 분리해서 메인 메모리에 불연속적으로 저장하는 방식입니다. 내부 단편화가 발생할 수 있습니다.
세그멘테이션
프로세스를 가변적인 크기의 세그먼트로 분리하고 메모리에 적재합니다. 주로 논리적인 블록단위 세그먼트로 Code, Data, Stack, Heap으로 분리할 수 있습니다.
세그멘테이션 역시 외부 단편화가 발생합니다.