티스토리 뷰
5. 운영체제
[ Byte Ordering이란 ]
Byte Ordering이란 데이터가 저장되는 순서를 의미합니다. Byte Ordering의 방식에는 빅엔디안(Big Endian)과 리틀엔디안(Little Endian)이 있습니다.
- Big Endian
- MSB가 가장 낮은 주소에 위치하는 저장 방식
- 네트워크에서 데이터를 전송할 때 주로 사용됨
- 가장 낮은 주소에 MSB가 저장되므로, offset=0인 Byte를 보면 양수/음수를 바로 파악할 수 있다.
- Little Endian
- MSB가 가장 높은 주소에 위치하는 방식
- 마이크로프로세서에서 주로 사용된다.
- 가장 낮은 주소에 부호값이 아닌 데이터가 먼저 오기 때문에, 바로 연산을 할 수 있다.
[ 동시성과 병렬성 ]
동시성이란 논리적으로 동시에 수행될 수 있는 성질이고, 병렬성이란 물리적으로 동시에 수행될 수 있는 성질입니다.
예를 들어 1~100까지의 합을 구하는 것을 범위를 나누어 4개의 쓰레드로 쿼드 코어에서 돌린다면, 이는 동시성을 가지면서 병렬성을 갖습니다. 반대로 이것을 싱클 코어에서 돌린다면, 이는 동시성을 갖지만 병렬성은 갖지 않습니다.
그렇다고 싱글 코어라고 하여 반드시 동시성을 못갖는 것은 아닙니다. 하나의 코어는 여러 개의 파이프라인으로 처리되기 때문입니다. 예를 들어서 명령을 해석하고, 메모리로부터 레지스터로 값을 불러오는 것은 CPU의 제어 장치가 처리하지만, 연산을 수행하는 것은 CPU의 연산 장치가 처리합니다. 따라서 서로 다른 명령을 동시에 처리할 수 있는 상황이라면, 하나의 코어임에도 병렬적으로 실행될 수 있습니다.
[ 컨텍스트 스위칭(Context Switching)이란? ]
Context Switching이란 인터럽트를 발생시켜 CPU에서 실행중인 프로세스를 중단하고, 다른 프로세스를 처리하기 위한 과정입니다. Context Switching는 현재 실행중인 프로세스의 상태(Context)를 먼저 저장하고, 다음 프로세스를 동작시켜 작업을 처리한 후에 이전에 저장된 프로세스의 상태를 다시 복구합니다. 여기서 인터럽트란 CPU가 프로세스를 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요함을 CPU에게 알리는 것을 말합니다.
[ 프로세스와 쓰레드의 차이 ]
- 프로세스
- 정의: 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
- 특징
- 운영체제로부터 독립된 메모리 영역을 할당받는다. (다른 프로세스의 자원에 접근 X)
- 프로세스들은 독립적이기 때문에 통신하기 위해 IPC를 사용해야 한다.
- 프로세스는 최소 1개의 쓰레드(메인 쓰레드)를 가지고 있다.
- 쓰레드
- 정의: 프로세스 내에서 할당받은 자원을 이용해 동작하는 실행 단위
- 특징
- 쓰레드는 프로세스 내에서 Stack만 따로 할당 받고, Code, Data, Heap 영역은 공유한다.
(Stack을 분리한 이유는 Stack에는 함수의 호출 정보가 저장되는데, Stack을 공유하면 LIFO 구조에 의해 실행 순서가 복잡해지기 때문에 실행 흐름을 원활하게 만들기 위함이다.) - 쓰레드는 프로세스의 자원을 공유하기 때문에 다른 쓰레드에 의한 결과를 즉시 확인할 수 있다.
- 프로세스 내에 존재하며 프로세스가 할당받은 자원을 이용하여 실행된다.
- 쓰레드는 프로세스 내에서 Stack만 따로 할당 받고, Code, Data, Heap 영역은 공유한다.
[ 멀티 프로세스 VS 멀티 쓰레드 ]
- 멀티 프로세스
- 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 1개의 작업을 처리하도록 하는 것
- 특징
- 1개의 프로세스가 죽어도 자식 프로세스 이외의 다른 프로세스들은 계속 실행된다.
- Context Switching을 위한 오버헤드(캐시 초기화, 인터럽트 등)가 발생한다.
- 프로세스는 각각 독립적인 메모리를 할당받았기 때문에 통신하는 것이 어렵다.
- 멀티 쓰레드
- 하나의 프로그램을 여러 개의 쓰레드로 구성하여 각 쓰레드가 1개의 작업을 처리하도록 하는 것
- 특징
- 프로세스를 위해 자원을 할당하는 시스템콜이나 Context Switching의 오버헤드를 줄일 수 있다.
- 쓰레드는 메모리를 공유하기 때문에, 통신이 쉽고 자원을 효율적으로 사용할 수 있다.
- 하나의 쓰레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
- 여러 쓰레드가 하나의 자원에 동시에 접근하는 경우 자원 공유(동기화)의 문제가 발생할 수 있다.
[ 레이스 컨디션과 그로 인해 발생할 수 있는 문제들 ]
둘 이상의 실행 주체가 동시에 하나의 자원에 접근하기 위해 경쟁하는 상태입니다. 레이스 컨디션에 의해 자원의 동기화 문제, 교착 상태, 프로세스 충돌 등의 문제가 발생할 수 있습니다.
[ 데드락(DeadLock)과 임계 영역(Critical Section) ]
데드락(DeadLock) 또는 교착상태란 한정된 자원을 여러 프로세스가 사용하고자 할 때 발생하는 상황으로, 프로레스가 자원을 얻기 위해 영구적으로 기다리는 상태입니다. 예를 들어 다음과 같은 상황에서 데드락이 발생할 수 있습니다.
자원 A를 가진 프로세스 P1과 자원 B를 가진 프로세스 P2가 있을 때, P1은 B를 필요로 하고 P2는 A를 필요로 한다면 두 프로세스 P1, P2는 서로 자원을 얻기위해 무한정 기다리게 됩니다.
임계 영역은 둘 이상의 실행 주체가 동시에 접근해서는 안 되는 영역입니다. 임계 영역에 동시 접근하여 데드락이 발생하는 등의 문제를 예방하기 위해서는 뮤텍스나 세마포어 등을 사용할 수 있습니다.
[ 멀티 쓰레드 프로그래밍 작성 시 유의점 ]
멀티 쓰레드 프로그램을 개발한다면, 다수의 쓰레드가 공유 데이터에 동시에 접근하는 경우에 상호 배제를 제거해 교착 상태를 예방하고 동기화 기법을 통해 동시성 문제가 발생하지 않도록 발생하지 않도록 주의해야 합니다.
[ 세마포어(Semaphore) vs 뮤텍스(Mutex) 차이 ]
- 세마포어
- 리소스에 동시 허용이 가능한 스레드의 수를 제어하는 데 사용됨
- 소유 권한이 없으므로, 잠금을 획득하지 않은 쓰레드도 signal 연산을 사용하여 잠금을 해제할 수 있음
- 초기 값을 설정할 수 있으며, 이 값은 허용 가능한 동시 액세스 수를 나타냄
- wait (P)와 signal (V) 연산을 통해 제어됨
- 뮤텍스
- 임계 영역을 보호하여 데이터 무결성을 보장하기 위해 사용됨
- 소유 권한을 가지므로, 잠금을 획득한쓰레드만 잠금을 해제할 수 있음
- 주로 이진 세마포어(Binary Semaphore)로 초기화되며, 두 가지 상태(잠금 상태와 잠금 해제 상태)만 가짐
- lock과 unlock 연산을 통해 제어됨
[ CPU의 메모리 I/O 도중 생기는 병목 현상 해결 방법 ]
이러한 문제를 해결하기 위해 메모리를 계층화하여 병목현상을 해결하고 있습니다. 자주 접근하는 데이터의 경우에는 캐시에 저장하여 접근 속도를 향상 시킴으로써 부하를 줄이고 있습니다.
[ 가상메모리란? ]
가상메모리는 RAM의 부족한 용량을 보완하기 위해, 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 할당하는 방식입니다. 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여, 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만듭니다.
OS는 프로세스들의 내용(페이지) 중에서 덜 중요한 것들을 하드디스크에 옮겨 놓고, 관련 정보를 페이지 테이블에 기록합니다. CPU는 프로세스를 실행하면서 페이지 테이블을 통해 페이지를 조회합니다. 당장 사용하지 않는 영역을 하드디스크로 옮겨 필요할 때 다시 RAM으로 불러오고, 사용하지 않으면 다시 하드디스크로 내림을 반복하여 RAM을 효과적으로 관리하는 것을 스와핑이라고 합니다.
가상 주소는 메모리 관리 장치에 의해 실제 주소로 변환되며, 이 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축할 수 있습니다. 가상메모리는 가상 주소와 실제 주소가 매핑되어 있고, 프로세스의 주소 정보가 들어 있는 페이지 테이블로 관리됩니다. 이때 속도 향상을 위해 캐시(TLB)를 사용합니다.
[ 페이지 폴트란? ]
가상 메모리를 사용함으로 인해, 실제 메모리에 원하는 페이지가 없는 상황이 발생할 수 있습니다. 가상 메모리에는 존재하지만 실제 메모리에는 없는 데이터나 코드에 접근할 경우 발생하는 에러가 페이지 폴트입니다. 가상메모리는 하드디스크에 저장되어 있기 때문에 디스크로부터 읽어와야 하는데, 디스크 I/O에 의한 속도의 저하가 발생하는 문제가 있습니다.
[ 페이지 교체 알고리즘과 LRU(Least Recently Used) ]
LRU(Least Recently Used)는 페이지를 교체하기 위한 알고리즘 중 하나입니다.
페이지를 교체하는 이유는 가상메모리를 통해 조회한 페이지는 다시 사용될 가능성이 높기 때문입니다. 페이지 교체를 위해서는 실제메모리에 존재하는 페이지를 가상메모리로 저장한 후에, 가상메모리에서 조회한 페이지를 실제메모리로 로드해야 됩니다. 그렇다면 어떤 실제메모리의 페이지를 가상메모리로 희생시킬 것이냐에 대한 문제가 발생하는데, 이때 사용하는 알고리즘 중 하나가 LRU(Least Recently Used) 알고리즘 입니다.
LRU 알고리즘은 실제메모리의 페이지들 중에서 가장 오랫동안 사용되지 않은 페이지를 선택하는 방식입니다. 그 외에도 먼저 적재된 페이지를 희생시키는 FIFO(First In First Out) 알고리즘이나 LRU 알고리즘을 응용하여 페이지에 Second-Change를 주는 LRU Approximation 등이 있습니다.
[ 운영체제의 스케줄러 ]
시스템의 자원은 제한적입니다. 따라서 운영체제는 한정된 자원을 여러 프로세스가 효율적으로 사용할 수 있도록 할당해주어야 하는데, 이러한 역할을 하는 것이 스케줄러입니다. 프로세스를 스케줄링하기 위해서는 아래의 3가지 큐가 사용됩니다.
- Job Queue : 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready Queue : 현재 메모리 내에 있으면서 CPU를 할당 받기를 기다리는 프로세스의 집합
- Device Queue : Device I/O 작업을 대기하고 있는 프로세스 집합
스케줄러는 크게 3가지 종류가 존재합니다.
- 장기 스케줄러(작업 스케줄러)
- 이때 디스크에서 어떤 프로그램을 가져와 준비 큐에 등록할지를 결정
- 수십 초 내지 수 분 단위로 가끔 호출되므로 상대적으로 느린 속도를 허용
- 단기 스케줄러(CPU 스케줄러)
- 스케줄링 알고리즘에 따라 cpu를 할당할 프로세스를 선택
- (ms) 이하의 시간 단위로 매우 빈번하게 호출되므로 수행 속도가 충분히 빨라야 함
- 중기 스케줄러
- 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러
- 메모리에 올라와 있는 프로세스 중 일부의 메모리를 디스크에 저장
[ CPU 스케줄링 알고리즘 ]
시스템의
혹시 내용에 빠진 좋은 면접질문 있으면 댓글로 남겨주세요! 빠르게 추가하도록 하겠습니다:)
기술 면접 준비를 위해 기술 문제 질문을 메일로 발송해주는 서비스를 구현하였습니다. 혹시 도움이 필요하신 분은 아래 링크를 통해 자세한 내용을 확인해주세요!
https://mangkyu.tistory.com/200
관련 포스팅
- CS 기술면접 질문 - 프로그래밍 공통 (1/8)
- CS 기술면접 질문 - 자료구조(2/8)
- CS 기술면접 질문 - 알고리즘 (3/8)
- CS 기술면접 질문 - 네트워크 (4/8)
- CS 기술면접 질문 - 운영체제 (5/8)
- CS 기술면접 질문 - 데이터베이스 (6/8)
- CS 기술면접 질문 - 개발 언어 (7/8)
- CS 기술면접 질문 - 백엔드 (8/8)
- 기술 외 공통 면접 질문
- CS 기술 면접 준비를 위한 문제 구독 서비스
'나의 공부방' 카테고리의 다른 글
[기술면접] CS 기술면접 질문 - 개발 언어 (7/8) (12) | 2020.10.13 |
---|---|
[기술면접] CS 기술면접 질문 - 데이터베이스 (6/8) (8) | 2020.10.13 |
[기술면접] CS 기술면접 질문 - 네트워크 (4/8) (13) | 2020.09.18 |
[기술면접] CS 기술면접 질문 - 알고리즘 (3/8) (8) | 2020.09.16 |
[기술면접] CS 기술면접 질문 - 자료구조 (2/8) (4) | 2020.09.16 |