Linux 주니어 CS 기초 면접
새 면접Q. 프로세스(Process)와 스레드(Thread)의 차이점을 메모리 구조 관점에서 설명해주세요.
각각이 독립적으로 갖는 자원과 공유하는 자원을 생각해보세요.
프로세스는 운영체제로부터 독립적인 메모리 공간(Code, Data, Stack, Heap)을 할당받는 실행 단위입니다. 반면 스레드는 프로세스 내에서 Code, Data, Heap 영역을 공유하고 Stack만 독립적으로 할당받습니다. 프로세스 간 통신은 IPC를 통해 이루어지지만, 스레드 간에는 공유 메모리를 통해 직접 통신할 수 있어 오버헤드가 적습니다. 다만 스레드는 메모리를 공유하기 때문에 동기화 문제에 주의해야 합니다.
- • 프로세스는 독립적인 메모리 공간을 가지며, 스레드는 일부 영역을 공유함
- • 스레드는 Stack만 독립적으로 할당받고 Code, Data, Heap은 공유함
- • 스레드 간 통신은 공유 메모리로 빠르지만 동기화 이슈가 있음
웹 서버에서 멀티 프로세스 방식(Apache MPM Prefork)과 멀티 스레드 방식(Nginx, Apache Worker)의 차이를 이해하는 데 필요합니다.
Linux에서 ps 명령어로 프로세스를 확인할 때 스레드는 어떻게 확인할 수 있나요?
Q. TCP 3-way handshake와 4-way handshake의 과정을 설명하고, TIME_WAIT 상태가 필요한 이유를 말씀해주세요.
연결 수립과 종료 시 주고받는 패킷의 종류와 순서, 그리고 마지막 ACK가 유실될 경우를 고려해보세요.
3-way handshake는 연결 수립 과정으로 클라이언트가 SYN을 보내고, 서버가 SYN+ACK를 응답하며, 클라이언트가 ACK를 보내 완료됩니다. 4-way handshake는 연결 종료 과정으로 클라이언트가 FIN을 보내면 서버가 ACK를 응답하고, 서버가 FIN을 보내면 클라이언트가 ACK를 보냅니다. TIME_WAIT 상태는 마지막 ACK가 유실될 경우 서버의 FIN 재전송을 받아 다시 ACK를 보낼 수 있도록 하며, 이전 연결의 지연된 패킷이 새 연결에 영향을 주지 않도록 보장합니다. 일반적으로 2MSL(Maximum Segment Lifetime) 시간 동안 유지됩니다.
- • 3-way handshake: SYN → SYN+ACK → ACK 순서로 연결 수립
- • 4-way handshake: FIN → ACK → FIN → ACK 순서로 연결 종료
- • TIME_WAIT은 마지막 ACK 유실 대비와 지연 패킷 처리를 위해 필요함
웹 서버 운영 시 netstat 명령으로 TIME_WAIT 소켓이 과다하게 발생하는 문제를 진단하고 해결할 때 필요합니다.
TIME_WAIT 소켓이 너무 많이 쌓여서 서버 성능에 문제가 생긴다면 어떻게 해결할 수 있을까요?
Q. 해시 테이블(Hash Table)에서 해시 충돌(Hash Collision)이 발생하는 이유와 이를 해결하는 두 가지 방법을 설명해주세요.
서로 다른 키가 같은 해시 값을 가질 때 어떻게 처리하는지 생각해보세요.
해시 충돌은 서로 다른 키에 해시 함수를 적용했을 때 같은 인덱스 값이 나오는 경우 발생합니다. 첫 번째 해결 방법은 체이닝(Chaining)으로, 같은 인덱스에 연결 리스트나 트리를 사용해 여러 값을 저장합니다. 두 번째는 개방 주소법(Open Addressing)으로, 충돌 시 다른 빈 공간을 찾아 저장하며 선형 탐사, 이차 탐사, 이중 해싱 등의 방법이 있습니다. 체이닝은 구현이 간단하지만 추가 메모리가 필요하고, 개방 주소법은 메모리 효율적이지만 클러스터링 문제가 발생할 수 있습니다.
- • 해시 충돌은 서로 다른 키가 동일한 해시 값을 가질 때 발생함
- • 체이닝은 같은 인덱스에 연결 리스트로 여러 값을 저장하는 방식
- • 개방 주소법은 충돌 시 다른 빈 공간을 탐색해 저장하는 방식
Redis나 Memcached 같은 캐시 시스템의 내부 구조를 이해하고 성능 특성을 파악할 때 필요합니다.
Python의 딕셔너리나 Java의 HashMap은 어떤 충돌 해결 방법을 사용하나요?
Q. 데드락(Deadlock)이 발생하는 4가지 필요조건을 설명하고, 실제 시스템에서 데드락을 예방하거나 회피하는 방법을 말씀해주세요.
상호배제, 점유와 대기, 비선점, 순환대기 조건과 각각을 깨는 방법을 생각해보세요.
데드락의 4가지 필요조건은 상호배제(자원을 한 번에 하나의 프로세스만 사용), 점유와 대기(자원을 보유한 채 다른 자원 대기), 비선점(다른 프로세스의 자원을 강제로 빼앗을 수 없음), 순환대기(프로세스들이 순환 형태로 자원을 대기)입니다. 예방 방법으로는 자원에 순서를 부여해 순환대기를 방지하거나, 모든 자원을 한 번에 할당해 점유와 대기를 방지할 수 있습니다. 회피 방법으로는 은행원 알고리즘처럼 안전 상태를 유지하며 자원을 할당하는 방식이 있습니다. 실무에서는 타임아웃을 설정하거나 데드락 감지 후 프로세스를 종료하는 방법도 사용합니다.
- • 데드락 발생 4가지 조건: 상호배제, 점유와 대기, 비선점, 순환대기
- • 예방은 4가지 조건 중 하나를 원천적으로 제거하는 방식
- • 회피는 은행원 알고리즘처럼 안전 상태를 유지하며 자원을 할당하는 방식
멀티스레드 애플리케이션에서 여러 락을 획득할 때 일관된 순서를 유지하여 데드락을 예방하는 데 활용됩니다.
데이터베이스에서 트랜잭션 데드락이 발생했을 때 어떻게 처리되나요?
Q. 데이터베이스 인덱스(Index)의 동작 원리와 장단점을 설명하고, 인덱스를 생성하면 오히려 성능이 저하되는 경우를 말씀해주세요.
B-Tree 구조와 SELECT, INSERT, UPDATE, DELETE 연산에 미치는 영향을 고려해보세요.
인덱스는 주로 B-Tree 구조로 구현되어 특정 컬럼 값을 빠르게 찾을 수 있도록 정렬된 별도의 자료구조를 유지합니다. SELECT 쿼리의 WHERE, JOIN 조건에서 Full Table Scan 대신 인덱스를 통해 O(log N) 시간에 데이터를 찾을 수 있어 조회 성능이 향상됩니다. 그러나 INSERT, UPDATE, DELETE 시 인덱스도 함께 수정해야 하므로 쓰기 성능이 저하되고 추가 저장 공간이 필요합니다. 특히 카디널리티가 낮은 컬럼(성별, 불린 값 등)이나 데이터 변경이 빈번한 테이블에서는 인덱스의 효과가 적거나 오히려 성능이 저하될 수 있습니다.
- • 인덱스는 B-Tree 구조로 정렬된 자료구조를 유지해 빠른 검색을 지원함
- • SELECT 성능은 향상되지만 INSERT, UPDATE, DELETE 성능은 저하됨
- • 카디널리티가 낮거나 변경이 빈번한 경우 인덱스 효과가 적음
MySQL이나 PostgreSQL에서 EXPLAIN 명령으로 쿼리 실행 계획을 분석하고 적절한 인덱스를 설계할 때 필요합니다.
복합 인덱스(Composite Index)를 생성할 때 컬럼 순서가 중요한 이유는 무엇인가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!