2023. 4. 4. 14:20ㆍ기술 면접 준비
이미 정리해 둔 운영체제 기술면접 Q&A가 있지만 (욕심부려서.. 이번에는) 다른 분들이 정리해 두신 글을 참고하면서 리마인드 하고자 합니다.
😎 운영 체제(OS, Operating System)
하드웨어를 관리하고, 컴퓨터 시스템의 자원들을 효율적으로 관리하며, 응용 프로그램과 하드웨어 간의 인터페이스로써 다른 응용 프로그램이 유용한 작업을 할 수 있도록 환경을 제공해 주는 소프트웨어입니다.
(종류: Windows, Linux, UNIX, MS-DOS 등이 있습니다.)
▶ 운영체제의 역할을 간단하게 말씀해주세요.
1. 프로세스 관리
- 프로세스, 스레드
- 스케줄링
- 동기화
- IPC 통신
2. 저장장치 관리
- 메모리 관리
- 가상 메모리
- 파일 시스템
3. 네트워킹
- TCP/IP
- 기타 프로토콜
4. 사용자 관리
- 계정 관리
- 접근권한 관리
5. 디바이스 드라이버
- 순차접근 장치
- 임의접근 장치
- 네트워크 장치
😎 메모리
메모리는 컴퓨터에서 작업을 수행하기 위해 처리 대상이나 결과 등을 저장하는 공간입니다.
⭐ 프로세스와 스레드의 차이
- 프로세스
- 정의: 실행 중인 프로그램으로 / 디스크로부터 메모리에 적재되어 / CPU의 할당을 받을 수 있는 것
- 특징
- 운영체제로부터 독립된 메모리 영역*을 할당받는다. (원칙: 다른 프로세스의 자원에 접근 X)
- * 메모리 영역 : code, data, heap, stack
- 예외 : 프로세스들은 독립적이기 때문에 통신하기 위해 IPC를 사용해야 한다.
- 프로세스는 최소 1개의 스레드(메인 쓰레드)를 가지고 있다.
- 운영체제로부터 독립된 메모리 영역*을 할당받는다. (원칙: 다른 프로세스의 자원에 접근 X)
- 쓰레드
- 정의: 프로세스의 실행 단위
- 특징
- 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택으로 구성된다.
- 프로세스 내에서 Stack만 따로 할당받고, Code, Data, Heap 영역은 공유한다.
- 프로세스의 자원을 공유하기 때문에 다른 스레드에 의한 결과를 즉시 확인할 수 있다.
- 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 갖고 있다.
▶ 프로세스 주소 공간이란?
프로그램이 CPU에 의해 실행됨 → 프로세스가 생성되고 메모리에 프로세스 주소 공간이 할당됩니다.
프로세스 주소 공간에는 코드, 데이터, 스택으로 이루어져 있다.
- 코드 Segment : 프로그램 소스 코드 저장
- 데이터 Segment : 전역 변수 저장
- 스택 Segment : 함수, 지역 변수 저장
이렇게 구역을 나눈 이유?
최대한 데이터를 공유하여 메모리 사용량을 줄여야 한다.
Code는 같은 프로그램 자체에서는 모두 같은 내용이기 때문에 따로 관리하여 공유한다.
Stack과 data를 나눈 이유는, 스택 구조의 특성과 전역 변수의 활용성을 위한 것이다.
▶ 스택을 스레드마다 독립적으로 할당하는 이유는 무엇인가요?
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것입니다.
스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.
▶ PC Register를 스레드마다 독립적으로 할당하는 이유는 무엇인가요?
스레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC 레지스터를 독립적으로 할당한다.
😎 프로세스 제어 블록(Process Control Block, PCB)
특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조이다. 운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB를 생성한다.
프로세스는 CPU를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU 를 반환해야 하는데, 이때 작업의 진행 상황을 모두 PCB에 저장하게 된다.
그리고 다시 CPU 를 할당받게 되면 PCB에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행한다.
PCB 에 저장되는 정보
- 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
- 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
- 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
- CPU 레지스터
- CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
- 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
- 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등
▶Process Management란?
프로세스가 여러 개일 때, CPU 스케줄링을 통해 관리하는 것을 말함
이때, CPU는 각 프로세스들이 누군지 알아야 관리가 가능함
프로세스들의 특징을 갖고 있는 것이 바로 Process Metadata
- Process Metadata
- Process ID
- Process State
- Process Priority
- CPU Registers
- Owner
- CPU Usage
- Memeory Usage
이 메타데이터는 프로세스가 생성되면 PCB(Process Control Block)에 저장됩니다.
순서:
프로그램 실행 → 프로세스 생성 → 프로세스 주소 공간에 (코드, 데이터, 스택) 생성
→ 이 프로세스의 메타데이터들이 PCB에 저장
▶ PCB가 왜 필요한가요?
CPU에서는 프로세스의 상태에 따라 교체작업이 이루어진다. (interrupt가 발생해서 할당받은 프로세스가 waiting 상태가 되고 다른 프로세스를 running으로 바꿔 올릴 때)
이때, 앞으로 다시 수행할 대기 중인 프로세스에 관한 저장 값을 PCB에 저장해 두는 것이다.
▶ PCB는 어떻게 관리되나요?
Linked List 방식으로 관리된다.
PCB List Head에 PCB들이 생성될 때마다 붙게 된다. 주소값으로 연결이 이루어져 있는 연결리스트이기 때문에 삽입 삭제가 용이하다.
(프로세스가 생성되면 해당 PCB가 생성되고 프로세스 완료 시 제거된다.)
이렇게 수행 중인 프로세스를 변경할 때, CPU의 레지스터 정보가 변경되는 것을 Context Switching이라고 한다.
⭐ 컨텍스트 스위칭(Context Switching, 문맥 교환)이란?
인터럽트를 발생시켜 CPU에서 실행 중인 프로세스를 중단하고, 다른 프로세스를 처리하기 위한 과정입니다.
현재 실행중인 프로세스의 상태(Context)를 먼저 저장하고, 다음 프로세스를 동작시켜 작업을 처리한 후에 이전에 저장된 프로세스의 상태를 다시 복구합니다.
문맥 교환은 프로세스 상태 변경시 발생합니다.
▶Context Switching의 OverHead란?
CPU에 계속 프로세스를 수행시키도록 하기 위해서 다른 프로세스를 실행시키고 Context Switching 하는 것을 말합니다.
프로세스를 수행하다가 입출력 이벤트가 발생해서 대기 상태로 전환시키면서 CPU를 그냥 놀게 놔두는 것보다 다른 프로세스를 수행시키는 것이 효율적이므로 OverHead를 감수하면서 작업하는 경우를 말합니다.
😎 인터럽트(Interrupt)
프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 즉시 중단하고, 발생된 상황에 대한 우선 처리가 필요함을 CPU에게 알리는 것을 말합니다.
외부/내부 인터럽트: CPU의 하드웨어 신호에 의해 발생
소프트웨어 인터럽트: 명령어의 수행에 의해 발생
- 외부 인터럽트
- 입출력 장치, 타이밍 장치, 전원 등 외부적인 요인으로 발생
- 내부 인터럽트
- Trap이라고 부르며, 잘못된 명령이나 데이터를 사용할 때 발생
- 예) 0으로 나누기가 발생, 오버플로우, 명령어를 잘못 사용한 경우 (Exception)
- 소프트웨어 인터럽트
- 프로그램 처리 중 명령의 요청에 의해 발생한 것
▶인터럽트 발생 처리 과정을 설명해 주세요.
주 프로그램이 실행되다가 인터럽트가 발생했다.
현재 수행 중인 프로그램을 멈추고, 상태 레지스터와 PC 등을 스택에 잠시 저장한 뒤에 인터럽트 서비스 루틴으로 간다.
만약 인터럽트 기능이 없었다면,
컨트롤러는 특정한 어떤 일을 할 시기를 알기 위해 계속 체크를 해야 하는데 이를 폴링(Polling)이라고 한다.
인터럽트가 있기에 컨트롤러가 빠르게 대응할 수 있는 것입니다.
⭐ 멀티 프로세스 VS 멀티 스레드
공통점: 동시에 여러 작업을 수행한다.
- 멀티 프로세스
- 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 1개의 작업을 처리하도록 하는 것
- 특징
- 1개의 프로세스가 죽어도 자식 프로세스 이외의 다른 프로세스들은 계속 실행된다.
- Context Switching을 위한 오버헤드(캐시 초기화, 인터럽트 등)가 발생한다.
- 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다
- 각각 독립적인 메모리를 할당받았기 때문에 통신하는 것이 어렵다.
- 멀티 쓰레드
- 하나의 프로그램을 여러 개의 스레드로 구성하여 각 스레드가 1개의 작업을 처리하도록 하는 것
- 특징
- 프로세스를 위해 자원을 할당하는 시스템콜이나 Context Switching의 오버헤드를 줄일 수 있다.
- 메모리를 공유하기 때문에, 통신이 쉽고 자원을 효율적으로 사용할 수 있다.
- 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
- 여러 스레드가 하나의 자원에 동시에 접근하는 경우 자원 공유(동기화)의 문제가 발생할 수 있다.
- [정리] 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 안고 있다.
* 시스템 콜 :
프로세스가 운영체제에게 어떤 기능(서비스)을 사용하게 해달라고 요청(call)할 때 사용하는 방법
▶ 멀티 스레딩의 장점을 말씀해 주세요.
1. 프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우 메모리 공간과 시스템 자원 소모가 줄어들게 된다.
2. 스레드 간의 통신이 필요한 경우에도 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap 영역을 이용하여 데이터를 주고받을 수 있다. 그렇기 때문에 프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단하다.
3. 스레드의 context switch는 프로세스 context switch 와는 달리 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다.
▶ 멀티 스레딩의 문제점에 대해 말씀해 주세요.
1. 서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 그렇기 때문에 동기화 작업이 필요하다.
동기화를 통해 작업 처리 순서를 컨트롤하고 공유 자원에 대한 접근을 컨트롤하는 것이다. 하지만 이로 인해 병목현상이 발생하여 성능이 저하될 가능성이 높다. 그러므로 과도한 락으로 인한 병목현상을 줄여야 한다.
▶ 멀티 스레드의 동시성과 병렬성을 설명해 주세요.
동시성은 (멀티 작업을 위해) 싱글 코어에서 여러 개의 스레드가 번갈아 실행하는 것을 말합니다.
(동시에 실행하는 것처럼 보이지만 사실은 번갈아가며 실행하고 있는 것임)
병렬성은 (멀티 작업을 위해) 멀티 코어에서 한 개 이상의 스레드를 포함하는 각 코어들을 동시에 실행하는 것을 말합니다.
▶ 멀티 쓰레드 프로그래밍 작성 시 유의점이 있을까요?
다수의 스레드가 공유 데이터에 동시에 접근하는 경우에 상호 배제를 제거해 교착 상태를 예방하고 동기화 기법을 통해 동시성 문제가 발생하지 않도록 주의해야 합니다.
😎 IPC(Inter Process Communication)
프로세스는 독립적으로 실행된다. 프로세스 간의 통신을 해야 하는 상황에서 이를 가능하도록 해주는 것이 IPC 통신입니다.
프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스 간 통신을 할 수 있게 된다.
* 커널: 운영체제의 핵심적인 부분으로, 다른 모든 부분에 여러 기본적인 서비스를 제공해 줌
IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다.
(공유된 자원에 한 번에 하나의 프로세스만 접근시킬 때)
▶ IPC 종류에 대해 말씀해 주세요.
1. 익명 PIPE
파이프는 두 개의 프로세스를 연결하는데 하나의 프로세스는 데이터를 쓰기만 하고, 다른 하나는 데이터를 읽기만 할 수 있다. 통신할 프로세스를 명확히 알 수 있는 경우에 사용한다. (부모-자식 프로세스 간 통신처럼)
한쪽 방향으로만 통신이 가능한 반이중 통신입니다.
양쪽으로 모두 송/수신을 하고자 한다면 2개의 파이프를 만들어야 합니다.
매우 간단하게 사용할 수 있는 장점이 있고, 단순한 데이터 흐름을 가질 땐 파이프를 사용하는 것이 효율적이다. 단점으로는 파이프 2개를 만들어야 할 때는 구현이 복잡해지게 된다.
2. Named PIPE(FIFO)
전혀 모르는 상태의 프로세스들 사이 통신에 사용합니다.
Named 파이프 역시 읽기/쓰기 동시에 불가능함. 따라서 전이중 통신을 위해서는 익명 파이프처럼 2개를 만들어야 가능
3. Message Queue
입출력 방식은 Named 파이프와 동일함
다른 점은 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다.
사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
4. 공유 메모리
파이프, 메시지 큐가 통신을 이용한 설비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비다.
프로세스의 메모리 영역은 독립적으로 가지며 다른 프로세스가 접근하지 못하도록 반드시 보호되야 한다. 하지만 다른 프로세스가 데이터를 사용하도록 해야 하는 상황도 필요할 것이다. 파이프를 이용해 통신을 통해 데이터 전달도 가능하지만, 스레드처럼 메모리를 공유하도록 해준다면 더욱 편할 것이다.
공유 메모리는 프로세스 간 메모리 영역을 공유해서 사용할 수 있도록 허용해 준다.
프로세스가 공유 메모리 할당을 커널에 요청하면, 커널은 해당 프로세스에 메모리 공간을 할당해 주고 이후 모든 프로세스는 해당 메모리 영역에 접근할 수 있게 된다.
- 중개자 없이 곧바로 메모리에 접근할 수 있어서 IPC 중에 가장 빠르게 작동함
5. 메모리 맵
공유 메모리처럼 메모리를 공유해 준다. 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다.
주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.
6. 소켓
네트워크 소켓 통신을 통해 데이터를 공유한다.
클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.
😎 동기와 비동기의 차이에 대해 설명해 주세요.
동기는 순차적, 직렬적으로 태스크를 수행하고, 비동기는 병렬적으로 테스크를 수행합니다.
예를 들어, 서버에서 데이터를 가져와서 화면에 표시하는 작업을 수행할 때,
동기는 서버에 데이터를 요청하고 데이터가 응답될 때까지 이후 태스크들은 블로킹(Blocking, 작업 중단)됩니다.
비동기는 서버에 데이터를 요청한 이후 서버로부터 데이터가 응답될 때까지 대기하지 않고(Non-Blocking) 즉시 다음 태스크를 계속해 수행합니다. 어떤 것이 먼저 완료될지는 알 수 없습니다. 일을 모두 마치면 나에게 알려주기로 했으니 나는 다른 작업을 할 수 있는 것입니다.
출처:
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS
'기술 면접 준비' 카테고리의 다른 글
[기술면접] 자료구조 - 1/2 (2) | 2023.05.16 |
---|---|
[기술면접] 운영체제 - 2/2 (0) | 2023.04.04 |
[운영체제] 교착 상태(데드락, Deadlock) - 5/5 (0) | 2023.04.03 |
[운영체제] 프로세스와 스레드의 동기화 - 4/5 (0) | 2023.04.03 |
[운영체제] CPU 스케줄링 알고리즘 - 3/5 (0) | 2023.04.02 |