기타/기술 면접 대비

[신입 개발자 기술 면접] 운영체제

배발자 2022. 5. 31.
반응형

 

해당 포스팅은 운영체제 과목을 정리한 저의 포스팅을 토대로 글을 작성하기 때문에 1편부터 12편의 글을 읽고 오신다면 이해가 정말 쉬우실거에요! 

 

 

'남이 읽는 CS/운영체제' 카테고리의 글 목록

 

baebalja.tistory.com

 

 

2022.03.04 - [남이 읽는 CS/운영체제] - [운영체제 1편] 프로세스란 무엇인가

2022.03.05 - [남이 읽는 CS/운영체제] - [운영체제 2편] 스레드란 무엇인가

2022.03.08 - [남이 읽는 CS/운영체제] - [운영체제 3편] 뮤텍스가 무엇인가

2022.03.15 - [남이 읽는 CS/운영체제] - [운영체제 4편] 세마포어가 무엇인가

2022.03.22 - [남이 읽는 CS/운영체제] - [운영체제 5편] 데드락이 무엇인가

2022.04.03 - [남이 읽는 CS/운영체제] - [운영체제 6편] 유저모드 커널모드

2022.04.04 - [남이 읽는 CS/운영체제] - [운영체제 7편] 인터럽트가 무엇인가

2022.04.13 - [남이 읽는 CS/운영체제] - [운영체제 8편] IPC란 무엇인가

2022.04.13 - [남이 읽는 CS/운영체제] - [운영체제 9편] 스케줄링 종류

2022.05.08 - [남이 읽는 CS/운영체제] - [운영체제 10편] 메모리 접근

2022.05.11 - [남이 읽는 CS/운영체제] - [운영체제 11편] 메모리 할당 (연속할당 방식)

2022.05.27 - [남이 읽는 CS/운영체제] - [운영체제 12편] 페이징 세그먼테이션 (불연속 할당 방식)

 

 

 

프로세스와 쓰레드가 무엇인가요?? 

 

먼저, 프로그램은 디스크에 보관되어 있다가 실행을 하게 되면 램이라는 주기억장치에 할당되게 됩니다. 이때 프로그램에서 램으로 메모리가 상주되어 CPU의 접근이 가능한 상태를 프로세스라고 말합니다. 프로세스는 독립적이기 때문에 Code, Data, Heap, Stack 같은 메모리 영역을 다른 프로세스와 공유하지 않기 때문에 멀티 프로세스 환경에서 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리공간과 CPU 시간을 차지하는 단점이 있습니다. 

 

스레드(프로세스 내에서 실행되는 여러 흐름의 단위)는 프로세스 내에서 Stack 영역만 독립된 공간을 할당 받으며 그 외에 Code, Data, Heap 영역을 서로 공유하기 때문에 멀티스레드 환경에서 컨텍스트 스위칭이 빠르다는 장점이 있지만 레이스 컨디션(동기화 문제)과 하나의 스레드 장애로 전체 스레드가 종료 될 위험이 있습니다. 

 

 

프로세스 영역에 대해서 설명해주세요 

 

각각의 프로세스들은 독립된 영역을 가지는데 크게 4가지로 분류됩니다. (Code, Heap, Data, Stack) 

 

[Code]

프로그램을 실행시킬 때 파일 내에 명령어들이 존재하는데 이 명령어들을 메모리 상에 올려놔야합니다. 즉, 명령어들이 존재하는 공간이 Code입니다. 

 

[Heap]

runtime 시간에 동적할당을 위해 존재하는 공간이 Heap 입니다. 

 

[Data]

크게 data영역과 bss영역이 존재하는데 전역/정적변수, 배열, 구조체 등이 위치하는 공간으로 초기화 한 데이터는 data 영역에 속하고, 초기화 되지 않은 데이터는 bss영역에 저장됩니다. 

 

[Stack]

함수를 호출할 때 해당 함수에서 사용되는 지역변수와 매개변수, 리턴 값 등 잠시 사용되었다가 없어지는 데이터를 저장하는 공간입니다. 

 

프로세스 간 독립적이라면 서로 통신은 어떻게 하나요? 

 

프로세스는 서로 독립적인 공간을 할당 받기 때문에 스레드처럼 공유하는 영역이 없습니다. 그렇기 때문에 IPC(Inter-Process Communication)기법을 통해 협력적인 프로세스들은 데이터와 정보를 교환해야합니다. 대표적으로 공유 메모리 방식과 메세지 전달 방식이 있습니다. 

 

[공유 메모리 방식]

프로세스들이 주소 공간의 일부를 공유하는 방식입니다. 원칙적으로 서로 다른 프로세스 A와 B는 상대의 프로세스의 메모리에 접근을 할수 없지만 운영체제는 공유메모리를 사용하는 시스템 콜을 지원해서 서로 다른 프로세스들이 그들의 주소 공간 중 일부를 공유할 수 있도록합니다. 중개자가 없이 곧바로 메모리에 접근할 수 있기 때문에 빠르게 동작할 수있지만 동시에 같은 자원에 접근할 경우 동기화 문제가 발생할 수 있습니다. 

 

[메세지 전달방식]

커널에 있는 공유 공간 속에 데이터를 주고 받는 방식입니다. 직접 통신과 간접 통신 방식이 있는데 직접 통신은 프로세스 A가 자원 a를 커널의 메세지 큐로 전달하고 커널이 그 자원 a를 프로세스 B에게 전달하는 방식입니다. 간접 통신은 프로세스 A가 자원 a를 커널의 메세지 큐로 전달하고 나면 프로세스 B보고 너가 와서 이 자원을 읽어가라고 하는 방식입니다. 이 두가지 방식의 차이는 연산의 인터페이스에 대한 차이일 뿐 실제 메세지 전송이 이루어지는 내부 구현은 커널의 중재에 의해 사실상 동일한 방식으로 이루어진다고 알고 있습니다. 이렇게 OS가 개입하다보니 높은 커널 의존성과 속도가 낮아지지만, 동기화 문제는 발생하지 않습니다.

 

 

 

멀티 쓰레드의 동시성과 병렬성이 무엇인가요??

 

동시성은 멀티 작업을 위해 싱글 코어에서 여러 개의 쓰레드가 번갈아 실행하는 것을 말합니다. 즉, 문맥교환이 빠르게 수행되면서 실제로는 번갈아가며 실행되는 것이지만 그 속도가 너무 빨라서 동시에 실행되는 것처럼 보여지는 것입니다. 

 

병렬성은 멀티 작업을 위해 멀티 코어에서 한 개 이상의 스레드를 포함하는 각 코어들을 동시에 실행하는 것을 말합니다. 

 

 

레이스 컨디션(동기화 문제)가 무엇인가요?? 

 

멀티 스레드 환경에서 공유자원에 접근할 때 발생하는 문제점입니다. 여러개의 스레드가 동시에 공유자원에 접근할 때 작업 순서에 따라 최종값이 달라지면서 데이터의 일관성이 깨지는 현상을 레이스 컨디션이라고 하며 동기화 문제라고도 부릅니다. 

 

동기화 문제가 발생하지 않기 위한 3가지 조건(상호배제, 진행, 유한대기)이 있습니다. 

 

[상호배제]

하나의 스레드가 임계영역에 있을 때 다른 스레드가 해당 영역에 들어올 수 없게 상호 배제를 해야합니다.

 

[진행]

임계영역에서 실행되는 스레드가 없는 상황에서 임계영역에 들어가고 싶어하는 스레드가 있다면 즉시 들어가게끔 해줘야합니다.

 

[유한대기]

다른 프로세스의 기아 현상을 방지하기 위해 한번 임계 영역에 들어간 프로세스는 다음에 임계구역에 들어갈 때 제한을 두어야한다는 유한 대기가 있습니다.

 

이러한 조건을 갖춘 대표적인 방법은 뮤텍스와 세마포어가 있습니다.

 

임계영역(Critical Section) : 공통으로 접근하여 데이터를 수정할 수 있는 코드 영역. (프로세스간에 공유자원을 접근하는데 있어 문제가 발생하지 않도록 한번에 하나의 프로세스만 이용하게끔 보장해줘야 하는 영역)

 

기아 현상 : 임계 영역에 들어가기 위해 무한정 기다리는 현상. 

 

 

뮤텍스와 세마포어에 대해서 설명해주세요 

 

[뮤텍스]

공유자원이 하나일 때 처리하는 동기화 방법입니다. Lock과 Unlock을 사용을 하는데 예를 들어, 임계 영역에 접근한 스레드가 문을 잠구고 임계 영역에서 벗어날 때 문을 여는 방식입니다. 대표적인 알고리즘은 데커 알고리즘, 피터슨 알고리즘, 제과점 알고리즘이 있습니다. 

 

데커 알고리즘 : 프로세스 중 누가 임계 구역에 진입할 것인지 

피터슨 알고리즘 : 데커 알고리즘과 유사하지만 공유자원을 먼저 쓰고 싶어했던 프로세스가 있는지 확인하고 있으면 양보 후 진입 

제과점 알고리즘 : 임계 영역에 접근한 스레드들에게 번호표를 부여하고 처리해야할 순의 우선순위를 부여하는 알고리즘

 

[세마포어]

공유자원이 하나 이상일  때 처리하는 동기화 방법입니다. 예를 들어, 현재 공유자원에 접근 가능한 프로세스의 수들을 S 라는 변수에 담고 있다면 해당 공유 자원에 프로세스가 접근할 때마다 -1 Operation 작업이 수행됩니다. 그리고 임계 영역에서 나올 때 +1 Operation 작업이 수행됩니다. 대표적인 알고리즘으로는 Busy-Waiting과 Block-Wakeup 방식이 있습니다. 

 

Busy-Wating : S 값이 현재 0일 때 다른 프로세스가 공유자원에 접근할 때 S 값의 갱신이 발생할 때까지 while문 돌리는 것. 

Block-Wakeup : 자원 부족 시 wait Queue에 대기 시키고 자원이 생기면 Wait Queue에서 프로세스를 꺼내와 자원 할당시키는 것. 

 

 

데드락이 무엇인가요??

 

각 스레드들이 서로가 필요로 하는 자원을 무한정 기다리고 있는 상태를 데드락이라고 합니다. 이러한 데드락을 발생시키는 조건으로는 상호배제, 점유 대기, 비선점, 순환 대기가 있습니다. 

 

[상호 배제]

프로세스들이 자원을 배타적으로 점유하고 있고 다른 프로세스들이 자원 사용이 불가합니다.

 

[점유 대기]

자원을 가진 프로세스가 다른 자원을 기다릴 때 보유 자원을 놓지 않고 계속 가지고 있습니다.

 

[비선점]

프로세스가 자원을 가지고 있을 때, 자원을 스스로 내어놓을 뿐 강제로 빼앗기지 않습니다.

 

[순환 대기]

두 개 이상의 프로세스가 자원 접근을 기다리는데 사이클이 존재해야합니다. 

 

 

이 4가지 조건이 충족되지 않는다면 데드락은 발생하지 않습니다.

 

 

데드락을 해결할 수 있는 방법이 있나요??

 

데드락을 처리하는 방법은 예방, 회피, 탐지 및 복구, 무시 기법이 있습니다. 

 

[예방]

말 그대로 예방 하자는 뜻입니다. 앞서 설명드렸던, 상호배제, 점유 대기, 비선점, 순환 대기라는 4가지 조건이 충족되지 않으면 데드락이 발생하지 않는다고 말씀드렸습니다. 이러한 조건 하나 이상을 부정하자는 뜻입니다. 

 

[회피]

데드락이 빠질 가능성이 있는지 없는지 OS가 검사를 하고 빠질 가능성이 없을 경우에만 줘서 문제 발생을 피하는 겁니다. 대표적인 예로는 은행원 알고리즘이 있습니다.

 

[탐지 및 복구]

OS가 자원을 달라는 대로 주면서 주기적으로 데드락에 빠졌는지 검사를 하고 만약 데드락에 빠졌다면 바로 전 상태로 회복하는 기법입니다.

 

[무시]

특별한 조치를 취하지 않습니다. 데드락의 필요조건인 상호배제, 점유대기, 비선점, 순환 대기 이 4가지를 모두 만족한다고 해서 데드락이 반드시 일어나는 것이 아닙니다. 드문 상황이기 때문에 예방과 회피기법을 프로그램에 넣게 되면 시스템의 처리량과 효율성을 더 떨어뜨릴 수 있습니다. 그래서 프로그램이 작동을 멈추거나 오류가 발생하면 사용자가 직접 프로세스를 종료하는 것이 무시기법입니다. 

 

 

은행원 알고리즘이 무엇인가요?? 

 

교착 상태를 피하기 위한 회피 알고리즘입니다. 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래한 기법입니다. 프로세스가 자원을 요구할 때 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지를 사전에 검사하여 교착상태를 피합니다. 안정 상태에 있으면 자원을 할당하고, 그렇지 않다면 다른 프로세스들이 자원을 해지할 때까지 기다립니다. 

 

 

인터럽트가 무엇인가요? 

 

프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행중인 작업을 일시 중단하고, 발생된 상황을 우선 처리한 후 실행중이던 작업으로 복귀하여 계속 처리하는 것을 의미합니다. 

 

 

인터럽트 종류가 무엇이 있나요? 

 

크게 외부 인터럽트와 내부 인터럽트가 있습니다. 

 

[외부 인터러트]

 

1. 타이머 인터럽트

어떠한 프로세스가 수행중이다가 제한된 시간이 지나면 다른 프로세스와의 Context Switching이 일어납니다. 이때 제한된 시간이 지나면 타이머 인터럽트를 걸어서 다른 프로세스와의 Context Switching이 수행됩니다.

 

2. I/O  인터럽트

키보드로 작성을 하거나, 프린터에서 출력을 한다던가 마우스 커서를 움직이던가 이러한 상황에서 해당 인터럽트가 발생합니다. CPU는 고급 인력이기 때문에 만약 입출력 장치의 수행이 필요하다면 입출력장치가 처리하게끔 하고 CPU는 다른 프로세스를 수행중이다가 입출력 수행이 완료되면 그때 I/O 인터럽트 신호를 보냅니다. 

 

3. 전원 이상 인터럽트

전원 공급이 중단되면 CPU에 인터럽트를 걸어서 현재 작업중이던 프로세스를 대피시킬 수 있도록 하는 인터럽트 입니다.

 

[내부 인터럽트] 

 

1. Exception 인터럽트, trap

대표적으로 0으로 나누는 비정상적인 작업을 시도하거나, 오버플로우/언더플로우와 같이 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 시도(cpu가 수행할 수 없는 명령어)할 때 자기 자신한테 거는 인터럽트를 exception이라고 하며 trap이라고 하기도 합니다. 

 

[SVC 인터럽트]

시스템 콜이라고도 불리는데 사용자 프로그램에서 하드웨어에 대한 접근이 필요할 때 사용자 모드에서 커널모드로 전환을 해야합니다. 즉, 사용자 프로그램에서 처리할 수 없는 부분을 운영체제에게 CPU를 양도하여 처리할 수 있게 커널모드로 전환하는 인터럽트입니다. 

 

 

인터럽트 발생했을 때 어떻게 동작하나요??

 

CPU 옆에 인터럽트 라인이라는 것이 있는데 CPU가 정상적으로 수행하다가 인터럽트 라인에서 인터럽트를 감지하게 되면 CPU는 현재 진행중인 프로세스를 PCB에 기록하고 커널 모드로 전환하게 됩니다. 

OS 커널에는 인터럽트 벡터라는 것이 존재하는데 운영체제가 해야할 일을 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료 구조입니다. 실제 처리해야할 코드는 인터럽트 처리루틴 정의되어 있으며 해당 주소로 가서 인터럽트를 처리하게 됩니다. 그 후 유저모드로 전환되어 CPU는 이전에 처리하던 프로세스의 정보를 PCB에서 받아와서 처리하게됩니다. 

 

유저 영역과 커널 영역에 대해서 설명해주세요

 

[유저 영역]

일반적으로 프로그램을 실행시켰을 때 메모리에 상주하게 되는 공간입니다. 유저 영역에서 실행되는 코드에서 디스크에 보관되어있는 a.txt 파일 데이터를 오픈하라는 명령어가 존재한다고 가정해볼게요. 이렇게 되면 디스크에 접근하는 명령어인데 사용자 프로그램한테 쉽게 허락하면 악의적으로 데이터를 망가뜨릴 수 있습니다. 그래서 유저 모드에서는 제한적인 명령만 수행할 수 있고 이렇게 유저모드에서 수행하는 명령어를 "일반 명령"이라고 말합니다. 

 

[커널 영역]

운영체제가 실제로 사용하는 공간입니다. OS가 CPU의 제어권을 가지는 상황을 커널 모드라고 합니다. 커널 모드에서 수행하는 명령어를 "특권 명령"이라고 하는데 프로세스 제어, 파일 조작 등 OS에서만 수행할 수 있는 명령입니다. 그래서 디스크 접근 명령어는 커널 모드로 전환해서 특권 명령을 사용할 수 있게 해야합니다. 

 

유저 영역에서 커널 영역으로 전환할 때는 CPU 내부에 모드 비트라는 것을 활용하는데 모드비트가 0이면 커널 모드로서 모든 명령을 수행할 수 있고, 모드 비트가 1이면 사용자 모드로서 제한된 명령만을 수행할 수 있습니다. 

 

시스템 콜이 무엇인가요??

 

유저 모드에서 수행할 수 없는 명령들을 CPU의 제어권을 OS에 양도하면서 커널모드로 전환되는 것을 시스템 콜이라고 합니다. 

 

예를 들어,  손님(유저)이 카페에 가서 커피가 먹고싶다면 커피를 제조할 수 없습니다. 단지 커피를 만들어주세요 라는 요청을 할 뿐 어떻게 만드는지에 대한 내용들은 몰라도 됩니다. 손님이 수행할 수 없는 커피 제조를 직원(OS)이 수행하면서 커피를 반환합니다.  

 

PCB가 무엇인가요??

 

PCB는 특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조입니다. 운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB를 생성합니다. 프로세스는 CPU 를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU를 반환해야 하는데, 이때 작업의 진행 상황을 모두 PCB 에 저장하게 됩니다. 그리고 다시 CPU를 할당받게 되면 PCB 에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행합니다. PCB에는 프로세스 식별번호, 프로세스 상태, 프로그램 카운터 등이 있습니다. 

 

PCB는 메모리에 어떤 형식으로 저장되나요?

 

PCB가 프로세스의 중요한 정보를 포함하고 있기 때문에, 일반 사용자가 접근하지 못하도록 보호된 커널 영역 안에 있씁니다. PCB는 Linked List 방식으로 관리됩니다. 프로세스가 생성이 되면 자동으로 해당 프로세스의 PCB가 생성되고 해당 PCB를 커널 영역에 있는 PCB LIST를 찾아서 Head에 갖다 붙입니다. 각 PCB의 꼬리에는 다음 PCB 주소값을 가리키고 있습니다. 그래서 프로세스 종료 시 PCB 삭제를 할 때는 해당 PCB를 찾아서 앞에 연결된 PCB와 뒤에 연결된 PCB와 서로 연결시키고 제거됩니다. (삽입 삭제 용이) 

 

컨텍스트 스위칭이 무엇인가요??

 

멀티 프로세스 환경에서 CPU가 특정 프로세스를 실행하고 있는 상태에서 타임 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값을 PCB에 저장하고 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값을 교체하는 작업을 컨텍스트 스위칭이라고 합니다. 

 

 

CPU 스케줄링이 무엇인가요?? 

 

CPU 하나는 동시에 여러개의 프로세스를 처리할 수 없기 때문에, 한 순간에 어떤 프로세스가 CPU를 사용할 수 있게 하는지 결정하는 정책입니다. CPU 스케줄링은 비선점 스케줄링과 선점 스케줄링을 나뉘는데 FCFS, SJF, 라운드 로빈, 다단계 큐 등이 있습니다. 

 

CPU 스케줄링의 종류를 설명해주세요. 

 

먼저 CPU 스케줄링에는 비선점 스케줄링 방식과 선점 스케줄링 방식으로 나눌 수 있습니다.

 

[비선점 스케줄링 방식]

CPU가 특정 프로세스를 수행중에 다른 프로세스가 CPU를 선점할 수 없습니다. 비선점 스케줄링 방식의 대표적인 예로는 FCFS(First-come First-served), SJF(shortest-job first)가 있습니다. 

 

1. FCFS

준비 상태 큐에 도착한 순서에 따라 CPU를 할당하는 방식입니다. 공평성은 유지되지만 평균 응답시간이 깁니다. 

 

2. SJF

실행시간이 가장 짧은 프로세스에 먼저 CPU를 할당하는 방식입니다.  평균 응답 시간을 최소화 할 수 있지만 실행시간이 긴 프로세스는 CPU를 할당받지 못하고 무한히 대기하는 현상이 발생할 수 있습니다. 

 

[선점형 스케줄링 방식]

CPU가 특정 프로세스를 수행중에 다른 프로세스가 CPU를 선점할 수 있습니다. 선점형 스케줄링 방식의 대표적인 예로는 SRTF(shortest remaining time first), 라운드 로빈, 다단계 큐(multilevel Queue), 다단계 피드백 큐가 있습니다.

 

1. SRTF

작업량이 가장 적은 사람을 먼저 처리하는 스케줄링 방식입니다. 하지만 작업량이 낮은 프로세스가 계속해서 들어온다면 기아현상이 발생할 수 있습니다. 

 

2. 라운드 로빈

프로세스들 사이에 우선순위를 두지 않고, CPU를 사용할 수 있는 타임 퀀텀을 정하여 해당 타임이 지나면 순서대로 시간 단위로 CPU를 할당하는 방식입니다.  일반적으로 타임 퀀텀의 시간은 수십 밀리초 정도의 규모로 설정하는 것으로 알고 있습니다. 

 

3. 다단계 큐

우선적으로 처리되어야 하는 프로세스 그룹으로 나누고 각 그룹에 따라서 처리 할 큐를 여러개 두어 사용하는 방식입니다. 하지만 우선순위가 높은 상위 큐 프로세스가 계속해서 들어온다면, 하위 큐 프로세스의 작업을 할 수 없는 단점이 있습니다. 

 

4. 다단계 피드백 큐

CPU를 사용하고 난 프로세스는 우선순위가 낮아지는 방식입니다. 즉, CPU를 사용하고 난 프로세스는 원래의 큐로 되돌아가지 않고 우선순위가 하나 낮은 큐의 끝으로 들어가게 됩니다. 또한 피드백 큐는 큐 사이로 프로세스들의 이동이 가능하기 때문에 aging 기법을 활용해서 오랜시간동안 할당 받지 못한 프로세스가 있다면 상위 큐로 격상시키면서 우선순위를 올려줄 수 있습니다. 

 

운영체제에서 기아(starvation) 란 무엇입니까? 

 

특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태입니다. 예를 들어, 선점형 스케줄링 방식에서 SRTF  라는 것이 있습니다. 해당 스케줄링 방식은  작업량이 가장 적은 사람을 먼저 처리하는 스케줄링 방식이지만 작업량이 낮은 프로세스가 계속해서 들어온다면 작업량이 많은 프로세스는 평생 CPU의 할당을 받지 못할 수 있습니다. 이러한 현상을 기아 현상이라고 일컬으며 에이징 기법을 통해 해결할 수 있습니다. 

 

운영체제 에이징(aging) 는 무엇입니까? 

 

에이징은 자원 스케줄링 시스템에서 기아를 방지하기 위해 사용되는 기술입니다. 우선순위가 높은 프로세스가 계속 들어와서 CPU의 할당을 받게 된다면 이전에 우선순위가 낮은 프로세스들은 무한정기다리게 되는 상황이 생길 수 있습니다. 이때 기다린 시간에 비례하여 일정 시간이 지나면 우선순위를 한 단계씩 높여서 자원을 할당 받을 수 있도록 하는 기법입니다. 

 

 

가상 메모리가 무엇인가요??

 

실제 주기억장치인 램보다 큰 메모리 영역을 제공하는 방법으로 사용됩니다. 예를 들면, 8기가 램일 때 20기가 프로그램을 실행시키면 메모리 부족이 발생할 것이라고 생각되지만 실제로는 필요한 부분만 메모리에 적재하여 실행시키는 것을 의미합니다. 즉, 필요한 부분들, 사용하지 않는 것은 메모리에 올리지 말고 사용하는 부분들을 쪼개서 메모리에 넣는 거에요.

 

가상 메모리를 수행하기 위해서 실행 시간 바인딩 방식을 사용하게 되는데요. CPU가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지 기준 레지스터와 한계 레지스터, 메모리 관리 장치 (Memory management Unit) MMU 하드웨어가 사용됩니다. 

 

MMU는 CPU 안에 탑재되어 논리적 주소를 물리적 주소로 매핑해주는 하드웨어입니다. 

만약 CPU가 특정 프로세스의 논리적 주소를 참조하려고 할 때 기준 레지스터(프로세스의 물리적 메모리 시작 주소)의 값을 더해 물리적 주소값을 얻어냅니다. 

 

한계 레지스터는 CPU가 해당 프로세스의 주소 공간을 넘어서는 메모리 참조를 하려고 하는지 체크하는 용도이며, 프로세스의 논리적 주소의 최댓값, 즉 그 프로세스의 크기를 담고 있습니다. 

 

 

페이징 기법에 대해서 설명해주세요 

 

프로그램을 실행시킬 때 특정 크기의 페이지 별로 잘라서 필요한 부분들만 메모리 공간에 분할해서 넣습니다. 그리고 메모리에서는 페이지의 크기에 딱 맞는 공간인 프레임으로 분할 시켜놓습니다. 

 

메모리 내에서는 page table이라는 표를 만들어서 각각의 페이지들이 어느 위치에 저장해놓았는지 기록을 하고 page table의 시작주소를 page table base register라는 레지스터에 저장을 합니다. 

 

만약 특정 페이지를 CPU가 수행할 때 먼저 page table base register에 저장한 page table의 시작 주소로 접근합니다. 

그리고 필요한 특정 페이지의 시작 주소를 들고와서 페이지의 오프셋을 더한 실제 메모리 공간의 알아냅니다. 

 

* 메모리 접근이 두번 발생하는데 TLB라는 캐시를 사용한다고 합니다.(페이지 테이블 정보 일부분 저장) 

 

페이징의 장점과 단점은? 

 

페이징의 장점은 메모리 공간을 페이지 크기만큼 일정한 프레임으로 나누어 메모리를 할당하므로 외부 단편화 문제를 해결할 수 있습니다. 하지만 프로그램의 마지막 페이지에서는 프레임 크기보다 작을 가능성이 크므로 내부 단편화는 발생할 수 있습니다. 또한, 페이지 테이블에 대한 메모리 영역을 할당 시켜줘야하기 때문에 메모리 공간을 차지하는 문제가 발생합니다. 

 

 

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

 

내부 단편화는 분할된 영역이 할당된 프로그램의 크기보다 커서 사용되지 않고 남아있는 빈 공간을 말합니다. 

외부 단편화는 분할된 영역이 할당될 프로그램의 크기보다 작아서 모두 빈 공간으로 남아있는 전체 영역을 말합니다. 

 

 

페이지 폴트가 무엇인가요?? 

 

프로세스가 페이지를 요청했을 때 그 페이지가 메모리에 없는 경우를 페이지 폴트라고 합니다. 가상 메모리의 페이지 테이블에는 페이지가 물리 메모리에 있는지, 스왑영역(디스크)에 있는지 표시하는 유효 비트를 사용합니다. 페이지 폴트가 발생하면 프레임을 새로 할당 받아야 하며, 프로세스가 해당 페이지를 사용할 수 있도록 스왑 영역에서 물리 메모리로 옮겨야합니다.

 

페이지 교체 알고리즘이 무엇인가요? 

 

페이징 기법으로 메모리를 관리하는 운영체제에서 필요한 페이지가 주기억장치에 적재되지 않았을 시 어떤 페이지 프레임을 선택해 교체할 것인지 결정하는 방법을 페이지 교체 알고리즘이라고 합니다. 

 

페이지 교체 알고리즘의 종류에 대해서 설명해주세요

 

FIFO(first in first out)

가장 간단한 알고리즘으로, 메모리에 올라온 지 가장 오래된 페이지를 교체합니다. 

 

Optimal(최적)페이지 교체

앞으로 가장 오랫동안 사용되지 않을 페이지를 교체하는 알고리즘입니다. 최적 페이지 교체는 선행 조건이 있는데, 프로세스가 앞으로 사용할 페이지를 미리 알아야 한다는 것입니다. 이 조건은 실제 활용에선 알 방법이 없기 때문에 최적 알고리즘은 구현이 불가능한 알고리즘입니다. 

 

LRU(least-recently-used)

는 가장 오래 사용되지 않은 페이지를 교체하는 알고리즘입니다. OPT 알고리즘의 방식과 비슷한 효과를 낼 수 있는 방법이며, OPT 알고리즘보다 페이지 교체 횟수가 높지만 FIFO 알고리즘 보다 효율적입니다. 

 

LFU(least-frequently-used)

참조 횟수가 가장 작은 페이지를 교체하는 알고리즘입니다. 

 

세그먼테이션은 무엇인가요? 

 

프로세스에는 코드, 데이터, 스택, 힙 이러한 영역들이 존재하는데 프로세스를 논리적 내용을 기반으로 영역별로 메모리에 배치하는 것을 뜻합니다. 하지만 논리적 내용을 기반으로 나눈 데이터들은 크기가 다 다르므로 메모리에서 세그먼트들의 교체가 계속해서 발생한다면 외부 단편화가 발생합니다. 대신에 내부 단편화는 발생하지 않습니다. 

 

세그먼트들은 segement table을 활용해서 메모리에 접근하게 되는데, 세그먼트 번호와 시작주소, 세그먼트 크기를 엔트리로 갖습니다.

 

 

멀티 프로세싱, 멀티 프로그래밍, 멀티 태스킹의 차이점을 아시나요? 

 

멀티 프로세싱은 다수의 프로세서(CPU)가 서로 협력적으로 일을 처리하는 것을 의미합니다. 

멀티 프로그래밍은 프로세서가 입출력 작업의 종료를 대기할 동안 하나의 프로세서에서 다른 프로그램을 수행할 수 있도록 하는 것입니다. 

멀티 태스킹은 OS의 스케쥴링에 의해 task를 번갈아가며 수행하는 것을 의미합니다. 즉, 여러개의 task를 자주 번갈아가며 수행하다 보니 사용자는 동시에 여러 task가 수행되고 있다고 느낍니다. 

 

 

 

반응형

댓글