이번 포스팅에서 정리할 운영체제 핵심 키워드
프로세스
스레드
인터럽트
시스템 콜
Process Context Switching
IPC (Inter Process Communication)
Q. 프로세스와 스레드에 대해 설명해주세요.
프로세스 : 프로그램이 정적 코드의 집합이라면, 프로세스는 프로그램이 실행되어 메모리에 적재 된 이후, CPU 자원을 할당 받아서 실행되고 있는 동적인 상태인 것을 의미한다.
스레드 : 하나의 프로세스 안에서 동시에 실행중인 작업 흐름의 단위를 의미한다. 인터넷 브라우저에서 동영상 재생을 하며, 쇼핑을 할 수 있는데 이는 하나의 프로세스 안에서 동시에 여러 스레드들이 진행되기 때문에 가능하다.
Q. 프로세스의 내부 구조에 대해 설명해주세요.
- 코드영역
- 프로그래머가 작성한 코드들이 기계어로 저장된다.
- 데이터영역
- 전역 변수, static 변수, 상수 키워드 선언된 변수 등 프로그램이 실행되면서 사용되는 변수가 저장된다.
- 스택영역
- 함수 호출이 되면 할당되는 공간이며 함수의 호출이 완료되면 소멸하게 된다. stack 영역을 초과하면 stackoverflow 에러가 발생한다.
- 힙영역
- 사용자에 의해 메모리가 동적 할당되는 데이터들이 존재하는 영역이다. 생성자, 인스턴스와 같이 동적할당 되는 데이터들이 저장된다.
코드 영역과 데이터 영역은 프로그램 실행시 이미 크기가 결정되지만 스택영역과 힙 영역은 동적으로 메모리 크기가 달라지는 공간이다.
Q. 프로세스와 스레드의 차이에 대해 설명해주세요.
- 프로세스는 독립적인 메모리 공간에서 실행되는 반면에 스레드는 Stack 영역만 별도로 할당 받고 나머지에 해당하는 Heap, Data, Code 영역은 한 프로세스 내부의 다른 스레드들과 공유한다.
- 스레드가 Stack 영역을 독립적으로 사용하기 때문에 스레드는 독립적인 '작업의 흐름' 을 실행할 수 있게 된다. Stack 영역에서 함수가 되돌아 갈 주소값, 함수 내부에서 사용되는 변수의 값, 함수가 실행될 때 전달되는 파라미터 값이 저장되기 때문이다.
- 스레드가 다른 스레드들과 공유영역이 있는 이유는 하나의 프로세스 내부에서 스레드들이 중복되어 사용할 수 있는 자원을 공유함으로써 더 효율적으로 자원을 사용하고 프로세스를 실행시킬 수 있도록 하기 위함이다.
Q. 스레드를 많이 쓸 수록 항상 성능이 좋아지나요?
- 어플리케이션이 순차적으로 실행되어야만 하는 특성을 가져서, 태스크를 잘게 쪼개서 동시에 실행하기에 매우 어려운 성격의 어플리케이션이라면 스레드를 많이 사용한다고 해도 실제로 사용할 수 있는 스레드 수에는 한계가 있을 것이다.
- CPU의 코어 수는 고정된 채 스레드 수만 계속 늘리게 된다면, 각 코어에서 관리되는 멀티스레딩을 처리하기 위해 context switching이 일어나게 될 것이며 이때 overhead가 늘어나게 될 것이다. 이는 context switching과도 관련이 있는데, context switcing 이 일어나는 때 process 간 전환에 cpu time이 필요하기 때문에 overhead가 발생한다.
- CPU bound 어플리케이션은 코어 수와 비슷한 수준 이상으로 스레드를 늘려도 이점이 없다. 오히려 각 코어에서 관리하는 스레드 수가 많을 수록 overhead가 발생하여 성능 저하가 일어날 수 있다.
- 반면, I/O bound 어플리케이션의 경우 상대적으로 CPU가 일을 하지 않는 시간이 많다. 이 경우에는 코어수보다 스레드를 많이 늘려주는 것이 코어를 효율적으로 사용할 수 있게 될 것이다.
- CPU bound : CPU의 연산 능력에 의존하는 작업. ex. 영상처리,
- I/O bound : I/O 장치의 응답속도에 의존하는 작업. ex. 데이터베이스 접근 작업, 네트워크 통신, 파일 입출력
Q. 인터럽트에 대해 설명해주세요.
- 인터럽트란, 프로그램이 실행되는 도중에 예기치 않은 상황이 발생해서 현재 수행 중인 작업을 멈추고 CPU에게 알리는 것을 말한다.
- 인터럽트의 종류는 다음과 같다.
- 외부 인터럽트 : 외부 입출력 장치, 외부 신호, 전원에 이상 발생등 외부적인 요인에 의해 발생하는 인터럽트입니다.
- 내부 인터럽트 : 잘못된 명령이나 데이터를 사용하는 경우 발생합니다. Trap 이라고도 합니다. 예를 들어 0으로 나누는 문제가 발생하거나, 오버플로우, 명령어를 잘못 사용하여 Exception이 발생하는 경우가 있습니다.
- 소프트웨어 인터럽트 : 프로그램의 처리 중에 발생한 인터럽트
- 인터럽트는 발생 시기를 예측하기 힘든 경우에 컨트롤러가 가장 빠르게 대응할 수 있는 방법이다.
Q. 프로세스의 상태에 대해 설명해주세요.
프로세스는 일반적으로 다음과 같은 5가지 상태를 가지게 된다 있다.
- 생성 (new) : 프로세스가 생성되고 아직 준비되지 않은 상태이다.
- 준비 (ready) : 프로세스가 실행되기 전 기다리는 상태이다. CPU를 할당받아서 바로 실행될 준비가 되어 있다.
- 실행 (running) : 프로세스가 CPU 자원을 할당 받아서 실행되는 상태이다.
- 종료 (terminated) : 프로세스의 작업이 종료된 상태이다. 메모리에서 제거된다.
- 대기 (waiting) : 프로세스가 I/O 인터럽트 와 같은 특정 이벤트의 발생에 의해 대기하는 상태이다. CPU를 할당받지 못하며, 다시 준비 상태로 전환되기 까지 대기해야 한다.
Q. 프로세스 간 자원 공유는 어떻게 하나요?
- 커널에서 IPC (Inter Process Communication) 을 제공하고, 프로세스는 IPC를 사용하여 프로세스 간 통신을 할 수 있다.
- 크게 공유 메모리와 메시지 전달이라는 두 가지 모델이 있다.
1. Shared Memory (공유 메모리)
- 협력 프로세스들에 의해 공유되는 메모리 영역이 구축된다. 프로세스들은 그 영역에 데이터를 읽고 쓰면서 데이터를 공유할 수 있다.
- 프로세스가 공유 메모리 할당을 커널에 요청하면 해당 프로세스에 메모리 공간을 할당한다.
- 프로세스 간 read, write 작업이 모두 필요할 때 사용한다.
- 중개자 없이 바로 메모리에 접근하면 되기 때문에 IPC 방법 중에서 가장 빠르다.
2. 메시지 전달 (Message Passing) : 협력 프로세스들 사이에 교환되는 메시지를 통하여 이루어진다. 프로세스들이 커널에 있는 메세지 큐 공간으로 자원을 전달하면, 운영체제가 메세지를 대리 전달한다. 운영체제의 개입으로 속도가 느려질 수 있지만 동기화 문제, 즉 같은 자원에 대한 충돌 문제는 발생하지 않는다.
3.Pipe : 두 프로세스가 통신할 수 있게 하는 전달자로서 파이프가 동작한다.
3.1 익명(Anonymous) Pipe (=일반 파이프)
- 통신할 프로세스가 명확하게 알 수 있는 경우에 사용한다.
- 파이프는 두개의 프로세스를 연결하고 생산자 프로세스는 데이터 쓰는 작업만, 소비자 프로세스는 데이터를 읽기 작업만 하는 단방향 통신만 지원한다.
- 외부 프로세스에서 사용할 수 없다.
3.2 지명 (Named) Pipe
- 통신할 프로세스를 명확하게 알지 못하는 경우 사용한다. 부모 프로세스와 무관한 다른 프로세스와도 통신할 수 있다.
- FIFO 라는 특수 파일로 서로 관련없는 프로세스 간 통신에 사용한다.
- 외부 프로세스와 통신에 사용할 수 있다.
4. 소켓
- 클라이언트-서버 환경에서 원격으로 프로세스 간 데이터를 공유하는 경우 사용한다.
- 소켓은 데이터를 교환하기 위한 통신의 endpoint를 의미한다.
5. 메시지 큐
- 입출력 방식은 Named Pipe 와 동일하지만, 메시지 큐는 데이터의 흐름이 아닌 메모리 공간이다.
- 다수의 프로세스 간 메시지를 주고받을 수 있다.
- 메시지 접근을 위해 Key 값이 필요하다.
6. 메모리 맵
- 공유 메모리같이 메모리를 공유한다.
- 열린 파일을 메모리에 매핑시켜서 공유한다.
- 대용량 파일을 공유해야 하는 경우 사용한다.
Q. 프로세스 간 자원을 공유할 수 있음에도 멀티 스레딩을 사용하는 이유는 무엇일까요?
- 프로세스 간 자원을 공유하는 작업은 CPU 캐시 메모리 를 초기화 하기도 해야 하므로 자원 부담이 크다. 따라서 현대의 운영체제에서 다중 작업이 필요한 경우 multi threading 을 기본으로 사용하고 있다.
Q. IPC 기법 중에 빠른 성능을 가진 방법은 어떤것인가요 ?
공유 메모리 방식이 중개자 없이 바로 메모리에 접근하면 되기 때문에 IPC 방법 중에서 가장 빠르다.
Q. Context Switching 이란 무엇인가요?
CPU가 한 프로세스에서 다음 프로세스로 전환하는 과정이다. 실행되던 프로세스의 상태에 해당하는 Context를 보관하고 다음으로 실행할 프로세스의 Context를 복구하는 과정이다. CPU 스케줄러가 다음으로 수행할 프로세스를 스케줄링한다.
Q. Context Switching 의 오버헤드가 발생하는 이유는 무엇입니까?
- 프로세스를 스케줄링하는 비용이 든다.
- 스케줄링된 프로세스로 전환하기 위해서 PCB에 실행되던 프로세스의 Context를 저장하고, 다음으로 실행시킬 프로세스를 복원하는 비용이 든다.
- 새로운 프로세스로 전환될 때, 기존 프로세스와 관련된 데이터가 캐시에 남아있을 수 있다. 새 프로세스에 필요한 데이터로 캐시를 갱신 및 캐시 메모리 초기화 작업이 필요하며 이는 추가적인 시간 소요가 발생한다.
Q. PCB (Process Control Block) 가 필요한 이유는 무엇입니까 ?
CPU는 프로세스 상태에 따라 프로세스를 교체하는 작업을 관리한다. 그리고 이 프로세스의 상태 정보를 담고 있는 공간이 PCB이다. 하나의 프로세스에서 컨텍스트 스위칭이 일어나게 되면 기존의 프로세스 상태를 저장해두어야 이후에 다시 이어서 작업을 할 수 있게 된다. 또한 새롭게 스케줄링된 프로세스에 대해서도 어떤 작업부터 이어서 해야하는지 상태를 알아야 한다. 따라서 CPU가 프로세스 스케줄링을 위해 관련된 프로세스의 상태 정보를 저장하기 위해 PCB가 필요하다.
Q. 운영체제에서 '동시성'에 대해 설명해주세요.
동시성 (Concurrency) 이란, 둘 이상의 작업들이 마치 동시에 수행되는것처럼 보여지도록 작업을 수행하는 것이다. 프로세스들을 번갈아 가면서 조금씩 작업을 처리해 나가면, 사용자 입장에서는 컴퓨터가 프로세스를 번갈아 가면서 매우 빠르게 처리해 나가므로 마치 여러개의 작업을 동시에 수행하는 것처럼 보이게 된다. 이는 사용자에게 빠른 반응성을 제공한다.
Q. 동시성이 필요한 이유는 무엇인가요 ?
물리적인 이유에서, CPU에 코어를 여러개 넣는다고 해도 수백개의 프로세스를 처리하기 위해 코어 수를 늘리는데에는 하드웨어 적인 한계가 있을 것이다.
논리적인 이유에서는 어떤 태스크가 끝나는데 걸리는 시간이 길고, 어떤 태스크는 걸리는 시간이 짧을 텐데 시간이 오래 걸리는 태스크를 붙잡게 되면 빨리 끝낼 수 있는 태스크는 계속해서 대기열에 있어야 할 것이다. 따라서 작업을 잘게 나누어서 번갈아 가며 처리하는 동시성에 따라 처리하게 되면, 사용자 입장에서는 반응성이 빨라지며 일처리도 논리적인 측면에서 효율적으로 할 수 있다.
Q. 시스템 콜이란 무엇인가요?
유저 모드에서 커널 모드에서의 작업을 수행하기 위해서 사용하는 API 이다. 일반적으로 우리가 다루는 프로그램은 응용 프로그램이며, 유저 모드에서 수행된다. 반면, 커널과 관련된 작업은 반드시 커널 모드에서 이루어져야 한다. 유저 모드에서 커널에 접근하기 위해서는 반드시 시스템 콜을 통해 작업을 수행하게 함으로써 보안과 안정성을 유지한다.
'Computer Science > CS 기술 면접 스터디' 카테고리의 다른 글
주니어 개발자 CS 기술 면접 예상 질문 - 자료구조 (0) | 2024.01.28 |
---|---|
주니어 개발자 CS 기술 면접 예상 질문 - 운영체제 (2) (1) | 2024.01.21 |