Skip to content

Latest commit

 

History

History
58 lines (45 loc) · 4.74 KB

cs-week01.md

File metadata and controls

58 lines (45 loc) · 4.74 KB

C4-Preflight-CS 1주차

#1

일반적인 언어가 제공하는 map은 다음과 같은 특성이 있습니다.

  1. 일반적으로 Hash Function 을 사용하여 이를 구현합니다.
  2. 일부 언어의 경우, (ex. C++, Java) BBST를 사용한 구현도 제공하고 있습니다.
  • Hash Function 이 충돌하는 경우, 어떤 방식을 사용할 수 있나요? 각각의 방식을 활용할 수 있는 예시도 생각해 주세요.
  • 일반적으로 BBST를 사용하는 경우, Red Black Tree를 사용합니다. 왜 그런가요? Balanced-Tree 라는 이유를 제외한 다른 이유를 찾아 보세요.
  • 메모리가 1GB이고, key와 value가 각각 int 라고 가정해 봅시다. 그렇다면 Hash 를 사용한 map과 BBST를 사용한 map은 각각 어느정도 의 데이터를 저장할 수 있을까요?
  • Java 에서 Map<String, Map<String, Map<String, Map<String, String>>>> 과 같은 객체를 만든다고 가정해 봅시다. HashMap 과 TreeMap 을 사용해서 이를 정의한다고 할 때, 어떤 것들을 유의해야 할까요?

#2

의외로 많은 사람들이 어려워 하는 개념을 하나 고르자면, 스레드를 활용하는 법이라고 할 수 있습니다.

  • 유저 스레드와 커널 스레드의 차이가 무엇인가요? 스케쥴링의 대상은 무엇인가요?
  • Race Condition 을 해결할 수 있는 가장 쉬운 방식은 Mutex/Semaphore 등의 락을 거는 것 입니다. 다만 이 경우 성능이 저하될 수 있는 문제가 있는데요. Lock을 사용하지 않고 이 문제를 해결할 수 있는 방법이 있을까요?
  • 일반적인 프로그래밍 과정에서, 두 개 이상의 프로세스가 특정 자원을 공유하게 하고 싶습니다. 어떤 방식이 있고, 본인이라면 어떤 방식을 선택할지 작성해 주세요.
  • 프로세스의 수가 4개라고 합시다. 어떤 프로그램의 효율성을 최대한 높이기 위해 병렬 프로그래밍을 해야한다고 가정 한다면, 몇 개의 스레드를 생성할 것 같나요?

#3

캐시 메모리에 대해 고민해 봅시다.

  • 공간 지역성에 대해 설명해 주세요. 만약 페이지의 크기가 바뀐다면, 공간 지역성에도 영향을 줄까요?
  • CPU 에는 L1, L2, L3 캐시가 있다고 합니다. 각각의 역할과 효율성에 대해 설명해 주세요.
  • 멀티코어 환경을 살펴봅시다. 각 코어에는 별도의 L1, L2 Cache가 있기 때문에, 상황에 따라 전혀 의도하지 않은 문제가 발생할 수 있습니다. 어떤 문제이며, 이 문제를 어떻게 해결할 수 있을까요? (Hint: 서로 다른 스레드가 동일한 자원에 접근할 때 발생합니다.)

#4

TCP의 Handshake 과정을 조금 깊게 살펴봅시다.

  • 3/4 Way Handshake 과정을 Socket의 State 와 연관지어 설명해 주세요.
  • TIME_WAIT 는 왜 존재하는 것 일까요? 없앨 수 있는 방법은 없을까요?
  • 3 Way Handshake 가 너무 길어지면, 애플리케이션 입장에서는 많은 문제가 발생할 수 있습니다. 이를 어떻게 방어할 수 있을까요?
  • HTTP는 일반적으로 Stateless 입니다. 그렇다면, 매번 4-Way Handshake 를 수행하는 것 일까요?

#5

HTTP는 생각보다 기묘한 이슈가 많습니다.

  • Preflight 동작 방식을 HTTP Header 관점에서 설명해 주세요.
  • 큰 데이터가 포함된 파일을 HTTP로 전송하려고 합니다. TCP 패킷이 몇 번이나 전달될까요?
  • HTTP 300 번대를 호출하는 케이스는 무엇이 있을까요? 이를 권장하지 않는 이유는 무엇일까요?

#6

RDB의 인덱스는 성능을 결정짓는 가장 중요한 이슈입니다.

  • Index 를 많이 거는 것은 안 좋을까요? 왜 그런가요?
  • Redis는 왜 인덱스가 존재하지 않나요?
  • 왜 인덱스는 B-Tree를 사용하고, Red Black Tree를 사용하지 않나요? 반대로, HashMap은 왜 Red Black Tree를 사용하고 B-Tree를 사용하지 않나요?
  • ALTER 명령어를 사용하여 인덱스를 수정한다고 가정해 봅시다. 이 작업이 수행되는 동안, 해당 인덱스를 타는 쿼리는 어떻게 동작할까요?

#7

데이터 인코딩은 상당히 중요한 이슈입니다.

  • 일반적으로 Base64 인코딩을 하게 되면 오히려 용량이 올라갑니다. 상당히 비효율적이라고 볼 수 있는데, 왜 이런 방식을 사용하는 것 일까 요?
  • 일반적으로 데이터베이스는 각자의 통신 프로토콜을 사용합니다. (ex. Redis - RESP3(https://github.com/antirez/RESP3/blob/master/spec.md)) 왜 원문으로 전달하지 않는 것일까요? (위 질문과 다른 답이 요구됩니다.)
  • 본인이 알고 있는 서로 다른 인코딩 방식 3가지를 설명하고, 해당 방식의 의도와 활용 예를 중심으로 설명해 주세요.