OS
1. 커널의 역할:
커널은 운영체제의 핵심 부분으로 하드웨어와 소프트웨어 간의 중재 역할을 합니다. CPU, 메모리, 디스크, 네트워크 등 시스템 자원을 관리하고, 시스템 콜을 통해 애플리케이션과 하드웨어 사이의 인터페이스를 제공합니다. 또한 프로세스 스케줄링, 메모리 관리, 파일 시스템 관리를 담당하며, 하드웨어에 대한 직접적인 접근을 추상화하여 사용자와 프로그램이 안전하게 자원을 사용할 수 있도록 합니다.
2. 문맥 교환 문제점:
문맥 교환은 CPU가 하나의 프로세스에서 다른 프로세스로 전환할 때 발생하는 작업입니다. 지나치게 자주 발생하면 CPU가 작업을 전환하는 데 많은 시간을 소모하게 되어, 실제로 유용한 작업을 처리하는 시간은 줄어듭니다. 이로 인해 성능이 저하되고 응답 시간이 길어지며, 시스템이 비효율적으로 작동하게 됩니다. 이러한 현상은 과도한 프로세스 전환으로 시스템 자원 낭비를 초래할 수 있습니다.
3. 10GB 프로그램 실행 가능 여부:
88GB의 물리 메모리가 있다면, 10GB의 프로그램을 실행하는 데 문제가 없습니다. 그러나 이 프로그램이 사용 중인 메모리 외에 추가적인 시스템 자원(운영체제, 다른 프로세스 등)도 고려해야 합니다. 운영체제는 물리 메모리가 부족할 경우 가상 메모리를 활용하여 디스크에 데이터를 스와핑하는 방식으로 추가적인 메모리 공간을 제공합니다. 하지만 이 경우 성능 저하가 있을 수 있습니다.
4. 페이지 폴트 수행:
페이지 폴트는 프로세스가 요구하는 메모리 페이지가 RAM에 없을 때 발생합니다. 이때 운영체제는 해당 페이지를 하드 디스크에서 읽어와 RAM에 로드합니다. 이 과정은 I/O 연산이 필요하고 시간이 소요되므로 성능 저하를 초래할 수 있습니다. 페이지 폴트는 시스템이 메모리를 효율적으로 관리하기 위해 발생하며, 가상 메모리 시스템에서 중요한 역할을 합니다.
5. 메모리 누수 발생 및 처리:
메모리 누수는 프로그램이 동적으로 할당한 메모리를 해제하지 않아서 발생합니다. 이는 시스템 자원을 낭비하고, 장기적으로는 프로그램의 성능을 떨어뜨리거나 시스템 크래시를 유발할 수 있습니다. 메모리 누수를 방지하려면, 메모리 할당 후 반드시 해제하도록 하고, 스마트 포인터나 가비지 컬렉션을 사용하여 자동으로 메모리를 관리할 수 있습니다.
6. 여러 프로세스 vs 여러 스레드:
여러 프로세스는 각각 독립적인 메모리 공간을 가지며, 프로세스 간의 통신은 IPC(Inter-Process Communication)를 통해 이루어집니다. 반면, 여러 스레드는 동일한 프로세스 내에서 실행되며, 메모리 공간을 공유하기 때문에 더 적은 자원으로 효율적인 작업을 처리할 수 있습니다. 스레드는 프로세스보다 더 가볍고, 컨텍스트 전환 비용이 낮으며, 빠른 상호작용이 가능합니다.
7. 교착 상태:
교착 상태는 두 개 이상의 프로세스가 서로 필요한 자원을 점유한 채 다른 자원을 기다리면서 무한 대기에 빠지는 상태입니다. 이 문제는 자원 할당과 관련된 규칙을 부적절하게 설정했을 때 발생할 수 있습니다. 교착 상태를 해결하려면 자원 할당 순서를 제어하거나, 타임아웃을 설정하여 특정 시간 이후에는 자원을 반환하게 할 수 있습니다. 또한, 교착 상태를 예방하는 방법으로 자원 요청 순서를 고정하거나, 자원 요구를 분할하는 방법이 있습니다.
8. 메모리 부족 현상:
메모리가 부족하면, 운영체제는 가상 메모리 시스템을 통해 디스크를 임시 메모리 공간으로 활용합니다. 이를 통해 일부 데이터를 디스크에 스와핑하여 물리 메모리 부족 문제를 해결하지만, 디스크 I/O가 느리기 때문에 성능 저하가 발생할 수 있습니다. 심각한 메모리 부족 상황에서는 프로세스가 종료되거나 시스템이 불안정해질 수 있습니다.
9. 가상 머신과 컨테이너 차이:
가상 머신(VM)은 하드웨어 가상화를 사용하여 각 가상 머신마다 독립적인 운영체제를 실행하며, 각각 고유한 커널을 가집니다. 반면, 컨테이너는 운영체제 수준에서 격리된 환경을 제공하여, 호스트 운영체제의 커널을 공유하며 더 가볍고 빠른 실행 환경을 제공합니다. VM은 자원 소모가 많고, 컨테이너는 가볍고 효율적이며 빠르게 시작됩니다.
10. CPU 스케줄링 알고리즘:
CPU 스케줄링 알고리즘은 운영체제가 CPU 자원을 효율적으로 할당하기 위한 방법을 제공합니다. 대표적인 알고리즘으로는 FCFS(First-Come-First-Served), SJF(Shortest Job First), Round Robin, Priority Scheduling 등이 있습니다. 각 알고리즘은 대기 시간, 응답 시간, 공정성을 최적화하려고 하며, 시스템에 적합한 알고리즘을 선택하여 성능을 향상시킬 수 있습니다.
DB
1. 데이터 정규화와 비정규화:
• 정규화: 데이터를 중복을 줄이고 일관성 있는 형태로 분리하는 과정입니다. 주로 1NF, 2NF, 3NF 등의 정규형을 따르며, 데이터 중복을 방지하고 무결성을 높입니다. 장점: 데이터 중복 감소, 무결성 향상. 단점: 조인이 많이 필요해져 성능 저하.
• 비정규화: 성능을 고려하여 데이터를 일부러 중복시켜 저장하는 방식입니다. 장점: 읽기 성능 향상, 조인 감소. 단점: 데이터 중복 증가, 일관성 유지 어려움.
2. 트랜잭션 격리수준:
트랜잭션 격리수준은 하나의 트랜잭션이 다른 트랜잭션의 작업을 볼 수 있는 정도를 정의합니다. 주요 격리수준은 다음과 같습니다:
• READ UNCOMMITTED: 다른 트랜잭션의 커밋되지 않은 데이터를 읽을 수 있습니다.
• READ COMMITTED: 커밋된 데이터만 읽을 수 있습니다.
• REPEATABLE READ: 트랜잭션 시작 이후 읽은 데이터가 다른 트랜잭션에 의해 변경되지 않도록 보장합니다.
• SERIALIZABLE: 트랜잭션이 순차적으로 실행되도록 보장하여 가장 높은 수준의 격리수준을 제공합니다.
3. 비관적 락과 낙관적 락의 차이점:
• 비관적 락: 데이터에 대해 작업을 시작할 때 잠금을 획득하고 작업이 끝날 때까지 잠금을 유지합니다. 장점: 충돌을 방지할 수 있음. 단점: 성능 저하, 경쟁이 심한 환경에서 대기 시간 증가.
• 낙관적 락: 데이터에 잠금을 두지 않고, 작업을 끝낸 후 충돌이 발생하지 않으면 커밋합니다. 충돌이 발생하면 롤백됩니다. 장점: 성능 향상. 단점: 충돌 가능성 존재.
4. 인덱스 과도한 사용의 성능 저하 이유:
인덱스는 데이터를 빠르게 찾을 수 있도록 도와주지만, 과도하게 사용되면 삽입, 업데이트, 삭제 시 인덱스를 갱신해야 하므로 성능이 저하됩니다. 또한, 너무 많은 인덱스는 데이터베이스의 디스크 공간을 많이 차지하고, I/O 작업이 증가하여 성능에 부담을 줄 수 있습니다.
5. 클러스터드 인덱스와 넌클러스터드 인덱스:
• 클러스터드 인덱스: 데이터 자체가 인덱스 순서대로 정렬되는 방식입니다. 하나의 테이블에 하나의 클러스터드 인덱스만 존재할 수 있습니다. 장점: 데이터 검색 속도가 빠름. 단점: 삽입, 수정 시 성능 저하.
• 넌클러스터드 인덱스: 데이터와 인덱스가 별도로 저장되며, 인덱스만 정렬되어 있습니다. 여러 개의 넌클러스터드 인덱스를 생성할 수 있습니다. 장점: 다양한 인덱스를 사용해 성능을 최적화 가능. 단점: 조회 시 추가적인 I/O 발생.
🔹 클러스터드 인덱스에서 삽입/수정 시 성능 저하되는 이유
1️⃣ 데이터가 물리적으로 정렬된 상태를 유지해야 함
• 클러스터드 인덱스는 데이터 자체가 인덱스 순서에 따라 저장됨.
• 즉, 새로운 데이터를 중간에 삽입해야 하는 경우 기존 데이터들을 재배치해야 함.
→ 많은 추가 연산이 발생! (데이터 이동, 페이지 분할 등)
• 반면, 일반적인 리스트(정렬되지 않은 데이터)라면 그냥 마지막에 추가하면 됨.
6. B-Tree와 B+Tree의 차이점:
• B-Tree: 내부 노드에 데이터 값이 포함되어 있으며, 검색할 때 데이터와 인덱스를 모두 사용합니다.
• B+Tree: 모든 데이터가 리프 노드에만 존재하며, 리프 노드끼리 연결되어 있어 범위 검색에 유리합니다. 장점: B+Tree가 더 효율적이며 디스크 I/O가 적습니다.
이 트리구조와 관련해서 인덱스가 많아지면 생기는 이슈
✅ 1️⃣ 데이터 삽입/수정 시, 모든 관련 인덱스를 갱신해야 함
• 인덱스는 기본적으로 B+Tree 구조를 사용하므로,
데이터를 삽입/수정할 때 해당 인덱스 트리도 수정해야 함.
• 인덱스가 많을수록 삽입/수정 시 트리 갱신 작업이 많아져 성능 저하 발생.
B+Tree는 균형 트리 구조를 유지해야 함.
• 만약 삽입으로 인해 한 노드가 꽉 차면, 새로운 노드를 생성하고 데이터를 분산시켜야 함.
→ 이 과정에서 추가적인 디스크 I/O와 연산 비용 증가!
• 특히, 인덱스가 많으면 이러한 작업이 여러 번 발생할 수 있음.
특히 UPDATE가 인덱스가 포함된 컬럼을 수정하면 성능 저하 심각
→ 기존 인덱스에서 삭제 후, 새로운 값으로 다시 삽입해야 함.
7. JOIN의 종류와 차이점:
• INNER JOIN: 두 테이블에서 일치하는 데이터만 반환합니다.
• LEFT JOIN (OUTER JOIN): 왼쪽 테이블의 모든 데이터와 일치하는 오른쪽 테이블의 데이터를 반환합니다. 일치하지 않으면 NULL로 반환됩니다.
• RIGHT JOIN (OUTER JOIN): 오른쪽 테이블의 모든 데이터와 일치하는 왼쪽 테이블의 데이터를 반환합니다.
• FULL JOIN: 양쪽 테이블에서 일치하는 데이터와 일치하지 않는 데이터를 모두 반환합니다.
8. 데이터베이스 샤딩과 파티셔닝의 차이점:
• 샤딩: 데이터를 여러 개의 서버에 분산 저장하여 처리 성능을 향상시키는 방식입니다. 각 서버는 데이터의 일부를 담당합니다.
• 파티셔닝: 단일 데이터베이스 내에서 테이블을 여러 개의 파티션으로 나누어 데이터를 관리합니다. 물리적으로 하나의 시스템에 존재합니다.
9. DB Replication:
DB Replication은 데이터를 한 데이터베이스 서버에서 다른 서버로 복제하는 과정입니다. 이를 통해 데이터의 가용성을 높이고, 읽기 성능을 향상시킬 수 있습니다. 주로 Master-Slave 구조로 운영되며, 데이터의 복사본을 유지하여 장애 발생 시 빠르게 복구할 수 있습니다.
10. NoSQL과 RDBMS의 차이점:
• NoSQL: 비관계형 데이터베이스로, 구조화되지 않은 데이터나 동적으로 변경되는 데이터를 처리합니다. 유연성과 확장성에 강점이 있습니다. 대표적인 예로 MongoDB, Cassandra가 있습니다.
• RDBMS: 관계형 데이터베이스로, 데이터를 테이블 형식으로 저장하고 정규화된 데이터를 다룹니다. ACID 트랜잭션을 지원하며, 데이터 일관성을 유지하는 데 강점이 있습니다. 대표적인 예로 MySQL, PostgreSQL이 있습니다.
Network
1. DNS (Domain Name System):
DNS는 도메인 이름을 IP 주소로 변환하는 시스템으로, 사람은 도메인 이름으로 웹사이트를 쉽게 기억하지만, 컴퓨터는 IP 주소를 사용하여 서로 통신하기 때문에 필요합니다. DNS는 인터넷상의 전화번호부와 같은 역할을 합니다.
2. TCP 3-Way Handshake:
TCP 연결은 3단계로 이루어집니다:
• SYN: 클라이언트가 서버에 연결 요청을 보냄.
• SYN-ACK: 서버가 요청을 받고 수락함을 알림.
• ACK: 클라이언트가 연결을 수락하고 완료 메시지를 보냄. 이를 통해 안정적 연결이 성립됩니다.
3. HTTP 버전별 특징:
• HTTP/1.0: 각 요청마다 새로운 연결을 맺고 끊음, 비효율적.
• HTTP/1.1: 연결을 재사용하고, 파이프라이닝을 지원해 성능 개선.
• HTTP/2: 멀티플렉싱을 통해 하나의 연결에서 여러 요청과 응답을 동시에 처리, 성능 크게 향상.
• HTTP/3: QUIC 프로토콜 기반으로 연결 성능 향상 및 지연 시간 감소.
4. TCP에서 송신측이 수신측보다 속도가 빠를 경우 문제와 해결 방법:
• 문제: 송신측은 데이터를 빠르게 보내지만, 수신측은 처리 속도가 더 느려 패킷이 손실될 수 있습니다. 이때 송신측은 혼잡 제어를 통해 속도를 조절해야 합니다.
• 해결 방법: **흐름 제어(Flow Control)**와 혼잡 제어(Congestion Control) 메커니즘을 사용하여 송수신 속도를 조정하고, 버퍼를 사용해 패킷 손실을 방지합니다.
5. 네트워크에서 Blocking과 Non-Blocking, 동기와 비동기의 차이:
• Blocking: 작업이 완료될 때까지 다음 작업을 진행하지 않고 기다립니다.
• Non-Blocking: 작업이 완료되기를 기다리지 않고 바로 다음 작업을 진행합니다.
• 동기(Synchronous): 한 작업이 끝나야 다른 작업을 시작할 수 있습니다.
• 비동기(Asynchronous): 작업이 끝나기를 기다리지 않고 다른 작업을 동시에 처리할 수 있습니다.
6. HTTP 메소드:
• GET: 서버에서 리소스를 가져옵니다.
• POST: 서버에 데이터를 보내어 리소스를 생성합니다.
• PUT: 서버의 리소스를 업데이트합니다.
• DELETE: 서버에서 리소스를 삭제합니다.
• PATCH: 서버의 리소스를 부분적으로 수정합니다.
7. 웹 브라우저에서 https://example.com 입력 후 진행 과정:
1. 브라우저가 DNS 조회를 통해 IP 주소를 얻습니다.
2. TCP 연결을 위해 3-way handshake를 수행합니다.
3. SSL/TLS 핸드쉐이크로 보안 연결을 설정합니다.
4. 서버에 HTTP 요청을 보냅니다.
5. 서버가 응답을 보내고, 브라우저가 페이지를 표시합니다.
8. TCP와 UDP의 차이점과 사용 사례:
• TCP: 연결 지향적, 신뢰성 높은 데이터 전송. 사용 사례: 웹, 이메일, 파일 전송.
• UDP: 비연결 지향적, 빠르고 경량. 사용 사례: 스트리밍, 실시간 게임, VoIP.
9. CORS (Cross-Origin Resource Sharing):
CORS는 다른 출처의 리소스 요청을 제어하는 보안 메커니즘입니다. 해결 방법: 서버에서 Access-Control-Allow-Origin 헤더를 설정하여 다른 도메인에서의 요청을 허용합니다.
10. CDN (Content Delivery Network):
CDN은 콘텐츠를 전 세계 여러 서버에 분산하여 사용자에게 빠르고 안정적인 서비스를 제공합니다. 웹 서비스 활용: 사용자와 가장 가까운 서버에서 콘텐츠를 제공하여 로딩 시간을 단축시키고, 서버 부하를 분산시킵니다.
MSA
1. 마이크로서비스 아키텍처(MSA)와 모놀리식 아키텍처의 차이점:
• **마이크로서비스 아키텍처(MSA)**는 애플리케이션을 독립적인 작은 서비스로 나누어 각 서비스가 독립적으로 배포, 확장, 관리될 수 있도록 하는 아키텍처입니다. 각 서비스는 자신만의 데이터베이스를 가질 수 있고, REST, gRPC, 메시지 큐 등을 이용해 서로 통신합니다. 이 구조는 높은 확장성, 장애 격리, 독립적인 배포를 가능하게 합니다.
• 모놀리식 아키텍처는 하나의 큰 애플리케이션으로 모든 기능을 구현하며, 모든 컴포넌트가 tightly coupled 되어 있습니다. 배포와 관리가 쉬울 수 있으나, 시스템이 커지면 유지보수와 확장이 어려워지고, 하나의 서비스 장애가 전체 시스템에 영향을 미칠 수 있습니다.
2. SAGA 패턴:
SAGA 패턴은 분산 트랜잭션을 관리하는 패턴으로, 하나의 큰 트랜잭션을 여러 개의 작은 트랜잭션으로 나누어 처리합니다. 각 트랜잭션은 독립적으로 실행되며, 만약 중간에 실패가 발생하면 해당 트랜잭션을 보상하는 작업을 수행하여 전체 트랜잭션의 일관성을 유지합니다.
• 보상 트랜잭션: 예를 들어, 주문 처리 중 하나의 서비스가 실패하면, 이전에 수행된 서비스들도 롤백하도록 보상 트랜잭션을 실행합니다.
• SAGA는 대부분의 트랜잭션이 성공적으로 완료되면, 일부 실패 시 보상하는 방법으로 구현됩니다.
3. CQRS 패턴:
CQRS (Command Query Responsibility Segregation) 패턴은 명령(Command) 과 조회(Query) 의 책임을 분리하는 패턴입니다. 이 패턴은 데이터를 변경하는 명령과 데이터를 조회하는 쿼리를 완전히 분리하여 처리합니다.
• 장점: 읽기와 쓰기 성능을 독립적으로 최적화할 수 있습니다. 예를 들어, 조회는 빠르게, 명령은 신속하게 처리할 수 있도록 최적화된 별도의 모델을 사용할 수 있습니다.
• 사용 사례: 이벤트 소싱(Event Sourcing)과 결합하여 상태 변경 이력을 추적하는 시스템에서 유용합니다.
4. API Gateway:
API Gateway는 클라이언트 요청을 여러 마이크로서비스로 라우팅하는 중앙 서버 역할을 합니다. 클라이언트는 다양한 마이크로서비스와 직접 통신하지 않고, API Gateway를 통해 서비스에 접근합니다.
• 기능: 인증/권한 검사, 로깅, 트래픽 관리, 응답 집합화 등을 중앙에서 처리합니다.
• 장점: 클라이언트는 단일 진입점을 통해 모든 서비스에 접근할 수 있어 클라이언트와 마이크로서비스 간의 복잡성을 숨길 수 있습니다. 또한, 보안과 성능을 관리하는 데 유리합니다.
5. MSA에서 메시지 브로커 사용 이유와 장점:
MSA에서는 서비스 간 비동기 메시징을 통해 통신할 때 메시지 브로커(Kafka, RabbitMQ, NATS 등)를 사용합니다. 이 방식은 서비스들 간의 느슨한 결합(loose coupling) 을 가능하게 하고, 시스템의 확장성과 장애 처리 능력을 향상시킵니다.
• 장점: 비동기적 처리로 응답 속도가 빨라지고, 실시간 데이터 전송이 가능합니다. 서비스 간 통신을 큐나 스트림으로 처리해 서비스 장애로 인한 영향을 최소화합니다.
6. MSA에서 이벤트 소싱(Event Sourcing) 패턴:
이벤트 소싱은 시스템의 상태 변경을 이벤트로 기록하고, 그 이벤트들을 기반으로 현재 시스템 상태를 재구성하는 패턴입니다. 상태 변경이 발생할 때마다 이벤트를 생성하고, 이 이벤트들이 시스템의 상태를 변화시키는 방식으로 동작합니다.
• 장점: 시스템 상태를 추적할 수 있어 장애 복구가 용이하고, 상태 변화의 이력을 관리할 수 있어 디버깅과 감사 로그에 유리합니다. 또한, 이벤트가 발생할 때마다 이를 비동기적으로 처리함으로써 성능을 최적화할 수 있습니다.
7. Circuit Breaker 패턴:
Circuit Breaker 패턴은 서비스 간 통신에서 장애 발생 시 자동으로 서비스 호출을 중단하는 패턴입니다. 실패가 감지되면 일정 시간 동안 해당 서비스를 호출하지 않음으로써, 장애가 다른 서비스로 퍼지지 않도록 막는 역할을 합니다.
• 필요성: 마이크로서비스 환경에서는 서비스 간 의존성이 복잡해지므로, 하나의 서비스 실패가 전체 시스템에 영향을 미치는 것을 방지하기 위해 사용됩니다. 장애 전파 방지, 시스템 안정성 유지에 중요한 역할을 합니다.
8. 마이크로서비스 간 통신 방식:
• REST: HTTP 프로토콜을 기반으로 한 통신 방식으로, API 요청과 응답을 JSON 또는 XML 형식으로 처리합니다. 장점: 간단하고 널리 사용됨. 단점: 동기적 호출로 성능 이슈가 발생할 수 있음.
• gRPC: Google에서 개발한 RPC 프레임워크로, 성능이 뛰어나며, 다양한 언어와 플랫폼을 지원합니다. 장점: 빠르고 효율적인 통신. 단점: REST보다 설정이 복잡.
• 메시징 시스템: Kafka, RabbitMQ와 같은 메시지 큐 시스템을 이용한 비동기 통신. 장점: 느슨한 결합과 확장성, 장애 발생 시 복구가 용이. 단점: 비동기적 처리로 실시간 처리에 지연이 있을 수 있음.
9. MSA에서 트랜잭션 관리와 분산 트랜잭션 해결 방법:
마이크로서비스 아키텍처에서는 분산 트랜잭션을 처리하기 위해 여러 방법을 사용합니다.
• SAGA 패턴: 분산 트랜잭션을 여러 개의 작은 트랜잭션으로 나누어 처리하고, 실패 시 보상 트랜잭션을 실행하여 전체 트랜잭션을 롤백합니다.
• 2PC(2-Phase Commit): 두 단계 커밋 방식으로, 분산 시스템에서 모든 트랜잭션이 동기적으로 일관성을 맞추는 방법이지만, 성능과 확장성에 제한이 있을 수 있습니다.
• MSA에서 트랜잭션을 관리할 때는 보상 트랜잭션, 이벤트 소싱, SAGA 패턴 등이 주로 사용되며, 서비스 간 일관성과 고가용성을 보장합니다.
'면접 준비' 카테고리의 다른 글
[면접 스터디용 질문 리스트] JAVA/SPRING/JPA/Redis/ 면접 질문 리스트 10개 씩 (0) | 2025.03.02 |
---|---|
[CS -DB] Index 상식, JPA에서 자동생성하는 Index, Index가 많아지면 생기는 문제 (0) | 2025.02.20 |
[컴퓨터 구조 + 캐시 ] 우리가 Redis를 사용해서 캐시 메모리를 쓰는 이유 (0) | 2024.12.05 |
면접 준비시 반드시 피해야 할 것들! (2) | 2024.11.12 |
백엔드 자바 CS 면접 빈출 질문 대비하기 - 데이터 베이스 개념 정리 1 (0) | 2024.08.22 |