개발자 면접 질문 정리 - 운영체제

    운영체제 (Operating System)

    메모리 구조 (Memory Structure)

    운영체제의 메모리 구조는 유저 영역커널 영역 두가지 영역으로 나뉜다. 사용자가 함부로 커널 영역에 접근할 수 없도록 영역을 나누어 놓았다. 유저 영역에는 4가지로 나뉘는데 코드, 데이터, 스택, 으로 구분된다.

    코드 영역 (Code)

    실행할 프로그램의 코드가 저장되는 영역이다. 텍스트 영역이라고도 불린다. 여기서 코드는 컴파일된 기계어 코드를 뜻한다.

    데이터 영역 (Data)

    전역변수와 정적(static) 변수가 저장되는 영역이다. 프로그램이 시작되고 종료될 때까지 메모리에 계속 남아있다.

    스택 영역 (Stack)

    프로그램에서 호출되는 함수의 지역변수와, 매개변수가 저장되는 영역이다. 스택은 함수가 시작, 호출되는 순간 적재 되며 함수가 종료될 때 데이터는 사라진다. 런타임에 크기가 결정된다.

    힙 영역 (Heap)

    동적으로 메모리를 할당하여 사용하는 영역이다. malloc, new 연산자를 통해 할당하고, free, delete 연산자를 통해 해제한다. 런타임에 크기가 결정된다.


    프로세스와 쓰레드 (Process & Thread)

    프로세스는 실행중인 프로그램을 뜻하며, 쓰레드는 하나의 프로그램내에서 여러개의 실행 흐름을 두기위한 모델이다.

    메모리적 차이점

    프로세스는 독립적이여서 메모리 영역(Code, Data, Stack, Heap)을 다른 프로세스와 공유를 하지 않지만, 쓰레드는 쓰레드를 위한 스택을 생성할 뿐이며, 나머지 영역(Code, Data, Heap)을 공유한다.


    컨텍스트 스위칭 (Context Switching)

    CPU가 어떤 프로세스를 실행하고 있는 상태에서 인터럽트에 의해 다음 우선 순위의 프로세스를 실행하고자 할 때 기존의 프로세스 상태나 레지스터 값(Context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스 상태나 레지스터 값(Context)으로 교체하는 작업을 뜻한다.

    Context

    CPU가 프로세스를 실행하기 위한 해당 프로세스의 정보들이다. Context는 프로세스의 PCB에 저장된다.

    PCB (Process Control Block)

    다음의 정보를 저장하고 있다.

    • 프로세스의 상태(생성, 준비, 수행, 대기, 중지)
    • 프로그램 카운터(다음에 실행할 명령어의 주소)
    • 레지스터(누산기, 스택, 색인 레지스터)
    • 프로세스 번호

    인터럽트(Interrupt) 종류

    • 입출력 요청 (I/O Request)
    • CPU 사용 시간 만료 (time slice expired)
    • 자식 프로세스를 만들 때 (fork a child)
    • 인터럽트 처리를 기다릴 때 (wait for an interrupt)

    멀티프로세스와 멀티 쓰레드

    멀티 프로세스는 다수의 프로세서(CPU)가 협력하여 하나 이상의 작업(Task)을 병렬적으로 처리하는 것이다. 독립된 구조로 안정성이 높다는 장점이 있지만, 독립된 메모리 영역을 가지고 있기에 작업량이 많을수록 컨텍스트 스위칭(Context Switching)이 자주 일어나서 오버헤드가 발생하며 성능저하가 발생 할 수 있다.

    멀티 쓰레드는 하나의 프로세스에 여러개의 쓰레드로 자원을 공유하며 작업을 나누어 수행하는 것이다. 프로그램의 응답 시간을 단축 할 수 있고, 시스템의 자원 소모를 줄일 수 있다. 그러나 자원을 공유하기에 동기화 문제(병목현상, 데드락)등이 발생 할 수 있다. 또한 디버깅이 어렵고, 하나의 쓰레드에 문제가 생기면 전체 프로세스에 영향을 끼친다.


    CPU 스케줄링 (CPU Scheduling)

    CPU가 처리할 일들의 진행순서를 정하는 일을 뜻한다. 처리율과 CPU 이용률을 증가시키고, 오버헤드, 응답시간, 반환시간, 대기시간을 최소화 하기 위한 기법이다. 한마디로 효율적으로 CPU가 처리되도록 계획을 잡는 것이다.

    스케줄링 전략에는 선점과 비선점 두가지 전략이 있다.

    비선점 (Non Preemption) 스케줄링

    이미 할당된 CPU를 다른 프로세스가 빼앗아 갈 수 없도록 하는 방식이다. 선점에 비해 스케줄러 호출 빈도가 낮고 오버헤드도 적다. 일괄 처리 시스템에 적합하고, CPU 사용시간이 긴 하나의 프로세스가 짧은 여러 프로세스를 대기시킬수 있어 처리율이 떨어질 수 있다. 비선점 스케줄링 알고리즘으로는 FCFS, SJF, HRN 이 있다.

    FCFS (First Come First Served)

    먼저 요청한 프로세스를 순차적으로 할당해주는 기본적인 알고리즘

    SJF (Shortest Remaining Time First)

    평균 대기 시간을 최소화 하기 위해 CPU 점유시간이 가장 짧은 프로세스를 먼저 할당하는 방식. 짧은 프로세스들이 지속적으로 들어온다면 긴 프로세스는 계속해서 지연되는 단점이 있는데 이러한 상황을 기아상태(Starvation State)라 한다.

    HRRN (Highest Response Ratio Next)

    각 프로세스의 응답률을 계산하여 응답률이 가장 큰 프로세스를 먼저 처리하는 스케줄링 방식. 응답률은 (대기시간+서비스시간)/서비스시간 으로 구한다.

    선점 (Preemption) 스케줄링

    이미 실행 중인 프로세스가 있더라도 우선 순위가 높은 프로세스가 CPU를 차지할 수 있다. 우선순위가 높은 프로세스를 빠르게 처리해야 할 경우 유용하다. 그러나 선점이 일어날 경우 오버헤드가 발생하며 처리시간을 예측하기 힘들다. 선점 스케줄링 알고리즘으로는 SRT, RR, Multi-Level Queue 등이 있다.

    SRT (Shortest Remaining Time)

    짧은 시간 순서대로 수행하는 방식 비선점의 SJF를 보완한 버전

    RR (Round Robin)

    라운드 로빈 알고리즘은 모든 프로세스가 같은 크기의 CPU 시간을 할당 받아서 할당받은 시간(타임 퀀텀) 만큼만 선점하고 시간을 초과하면 다음 프로세스에 할당하는 방식이다. 타임 퀀텀 설정이 중요하다. 타임 퀀텀이 작으면 CPU 컨텍스트 스위칭이 자주일어나 오버헤드가 커지고, 타임 퀀텀이 너무 크면 FCFS와 다를바 없어진다.

    다단계 큐 (Multi-Level Queue)

    Ready큐를 여러개 사용하여 각각의 큐는 자신의 스케줄링 알고리즘을 수행하면서, 큐와 큐 사이에도 우선순위를 부여한다.

    반응형

    댓글

    Designed by JB FACTORY