[말랑 퀴즈] 26/09/09 문제

게시:     수정

카테고리:

태그:

제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.

말랑말랑 퀴즈 📝

날짜: 2026-09-09 문제 수: 5문제


Q1. 🟢 쉬움

빈칸을 채우시오.

패키지 게임에 게임 서버가 들어오기까지는 네 단계를 거쳤다.

1. 단독 플레이      네트워크 없이 로컬에서만 플레이
        ↓
2. ① ___ 플레이     두 플레이어 간 직접 연결
        ↓
3. ② ___ 방식       플레이어 세 명 이상이 인터넷으로 함께 플레이하되,
                    그중 한 명이 ③ ___ 역할을 겸해 게임 상태를 관리하고 동기화한다
        ↓
4. ④ ___ 서버       렌더링과 사용자 입력 처리를 하지 않고,
                    순전히 클라이언트의 연결만 처리하는 전용 프로그램

3번 방식에는 약점이 있다. 서버 역할을 맡은 플레이어도 게임에 참여하고 있으므로 그쪽이 유리해질 수 있어 ⑤ ___ 문제가 생기고, 그 플레이어가 게임을 나가 버리면 게임 전체가 흔들린다.

4번은 그 두 약점을 모두 없앤다. 게임 플레이에 참여하지 않고 오직 서버 기능만 수행하기 때문에, 특정 플레이어의 네트워크나 성능에 영향을 받지 않고 24시간 안정적인 서비스가 가능하다.

출처: server/game_server/4/2026-02-08-game_server_4_1.md

📝 내 답: P2P, ?, 서버, 데디케이티드, 형평성


Q2. 🔴 어려움

유저가 늘어 유저 DB 한 대가 과부하 상태다. 인증 서버는 이미 여러 대로 늘렸지만 DB는 여전히 한 대다. 플레이어끼리 상호작용은 없다고 전제한다.

[클라이언트] ──▶ [인증 서버 ×4] ──▶ [유저 DB]   ← 여기가 병목

(1) 이 DB를 수평 확장하려 한다. 클라이언트가 ID/PW를 보낸 뒤 어느 DB로 질의가 가는지 ① → ② → ③ 순서로 설명하시오. 그리고 이때 인덱스를 얻는 데 쓰인 키를 무엇이라 부르는지 쓰시오.

(2) 그렇게 샤드 10개로 운영하다가 11개로 늘리려 한다. 무슨 일이 벌어지며, 그것이 왜 문제인가?

(3) (2)를 완화하는 첫 번째 방법이 일관된 해시 알고리즘이다. 아래 그림을 보고 답하시오.

[ 샤드 2개 ]                        [ 샤드 3개 ]

┌── 샤드 1 ──┐ ┌── 샤드 2 ──┐      ┌── 샤드 1 ──┐ ┌─ 샤드 2 ─┐ ┌─ 샤드 3 ─┐
│ 0 ... 499  │ │ 500 ... 999│      │ 0 ... 499  │ │ 500..749 │ │ 750..999 │
└────────────┘ └────────────┘      └────────────┘ └──────────┘ └──────────┘
  • ㉠ 일반적인 해시 테이블과 무엇이 다른가? (항목과 해시 값의 대응 관계가 어떻게 바뀌었는지)
  • ㉡ 그래서 샤드를 하나 추가할 때 재배치가 어디까지만 일어나는가?
  • ㉢ 이 방식에도 남아 있는 한계는 무엇인가?

(4) 두 번째 방법은 매핑 DB다. 키 → 샤드 인덱스를 담은 DB를 따로 두는 방식이다.

  • ㉠ 이 방식에서 샤드 추가가 (2)보다 쉬운 이유는?
  • ㉡ 이 구조가 새로 떠안는 위험은 무엇이며(약어로도 답하시오), 어떻게 대응하는가?

출처: server/game_server/9/2026-03-26-game_server_10_2.md

📝 내 풀이:

(1) 인증 서버 -> 매핑 DB -> 유저 DB, 샤드 키

(2) 11개로 늘어난 샤드를 반영하려면, 해시를 재설정해주어야 한다. 문제는 서버가 오랜 시간 정지된다.

(3) ㄱ: 일반적인 해시 테이블은 항목 전체와 해시 값이 1:1 대응이다.
일관된 해시 테이블은 항목과 해시 값이 n:1 대응이다.
ㄴ: 본인이 속한 샤드만 재배치하면 된다.
ㄷ: 한계 이상의 데이터가 들어오면 결국 모두 재배치해야한다.

(4) ㄱ: 샤드를 늘릴려면 매핑 DB만 업데이트해주면 되기 때문
ㄴ: 매핑 DB 서버 정지. 이런 상황을 대비해 예비 서버를 둔다.


Q3. 🔴 어려움

온라인 게임에서 다른 플레이어의 캐릭터를 화면에 그리는 문제다.

서버가 보내 준 위치 정보는 네트워크를 타고 오느라 이미 한 템포 늦은 값이다. 그래서 지나간 시간만큼 위치를 예측해서 그린다. 이것을 추측 항법이라 한다.

송신자 측 위치: P0      수신자 측 위치: P      레이턴시: a

t=0 시점 : P(t=0+a) = P0(t=0) + a * V0(t=0)      ← 속도로 앞질러 예측
t=1 시점 : P(t=1+a) = P0(t=1) + a * V0(t=1)      ← 새 원본이 도착해 다시 예측

레이턴시 a는 아래처럼 측정한다.

① 기기 A가 기기 B에 패킷을 보낸다
② 기기 B는 받자마자 기기 A에게 패킷을 되돌려 보낸다
③ 기기 A는 (현재 시간 − 보낸 시간)을 잰다

이 상황에 대한 설명으로 가장 올바른 것은?

  • A. ③에서 잰 값이 곧 레이턴시 a이므로 그대로 예측식에 넣으면 된다. 이 왕복 측정값을 RTT라 부르며, 편도 시간을 따로 구할 필요는 없다.
  • B. t=0에서 하던 예측과 t=1에서 새로 시작한 예측은 어차피 예측이므로 값이 일치할 수 없다. 그래서 실제로 렌더링하는 위치 P_follow를 새 목표 P_target으로 순간 이동시키지 않고 선형 보간하며 따라가게 만든다. 이렇게 레이턴시가 만드는 문제를 감추는 기법들을 통틀어 레이턴시 마스킹이라 한다.
  • C. 추측 항법을 도입하면 위치가 정확히 예측되므로, 전송 텀이 길어서 생기는 끊김을 메우는 상태 값 보정(선형 보간·스플라인)은 더 이상 필요 없다. 둘은 같은 문제를 푸는 방법이라 하나만 쓰면 된다.
  • D. 서버가 게임 로직·렌더링·화면 송출을 모두 맡고 클라이언트는 입력과 화면 출력만 하는 방식이 있다. 클라이언트가 그래픽 리소스를 갖지 않아 보안이 완벽하고, 클라이언트가 할 일이 적어 레이턴시도 가장 낮다. 그래서 현대 온라인 게임은 이 방식으로 돌아가는 추세다.

출처: server/game_server/5/2026-02-13-game_server_5_2.md

📝 내 선택: B.

틀린 이유:

  • A: ③에서 잰 값은 RTT이며, a는 RTT/2로 구해야 한다.
  • C: 위치가 정확히 예측되지 않아서 쓰는 것이, 레이턴시 마스킹이다.
  • D: 마지막 문단이 틀렸다. 현대 온라인 게임은 서버 부하가 커지기에, 클라/서버가 나눠 처리한다.

Q4. 🟡 보통

멀티스레딩에서 공유 데이터를 다룰 때의 문제다.

x += y 한 줄은 기계어 수준에서 세 개의 연산으로 쪼개진다.

t = x
t = t + y
x = t

(1) x = 2인 상태에서 스레드 1이 x += 3을, 스레드 2가 x += 4 동시에 실행한다. 순서대로 잘 실행되면 x = 9가 되어야 한다. 그런데 실제로는 x = 5가 나올 수 있다.

  • ㉠ 위 세 줄을 이용해 x = 5가 되는 실행 순서를 단계별로 적으시오. (어느 스레드가 어느 줄을 언제 실행하는지)
  • ㉡ 이 현상을 무엇이라 부르는가?

(2) 아래는 스레드 4개로 100만까지의 소수를 구하는 코드다. 겉보기엔 멀쩡하지만 치명적인 문제가 두 가지 숨어 있다. 각각 어떤 변수에서 무슨 일이 벌어지는지 설명하시오.

int num = 1;
Array<int> primes;      // 내부에 [배열 포인터]와 [크기 정보]를 멤버로 가진다

ThreadProc() {
    while (num <= 1000000) {
        if (IsPrime(num))
            primes.Add(num);
        num++;
    }
}

main() {
    Array<Thread> threads;
    for (int i = 0; i < 4; i++)
        threads.Add(BeginThread(ThreadProc));
    for (int i = 0; i < 4; i++)
        threads.WaitForExit();
    PrintNumber(primes);
}

힌트: 두 번째 문제는 primes에 원소를 추가하다 공간이 부족해지면 벌어지는 일과 관련이 있다.

(3) 이런 문제를 막으려면 공유 데이터에 대해 두 가지 성질을 보장해야 한다. 그 두 성질의 이름을 쓰고, 위 코드에서 각각 무엇을 지켜 주는지 연결하시오. 그리고 그것을 가능하게 하는 기법을 세 가지 쓰시오.

출처: server/game_server/1/2025-05-30-game_server_1_5.md

📝 내 풀이:

(1) ㄱ: 스레드/줄 번호라고 쳤을때. 1-1, 1-2, 2-1, 2-2, 2-3, 1-3
ㄴ: 레이스 컨디션

(2) 1. 스레드 간 primes.Add(num)과 num++ 순서가 보장되어 있지 않다.

  1. 한 스레드당 25만번의 while문을 돌기에 생기는 크기 문제? 잘 모르겠다.

(3) 원자성, 순서 보장 잘 모르겠다.


Q5. 🟡 보통

다음 명제가 참(O)인지 거짓(X)인지 판단하라.

OSI 2계층인 데이터 링크 계층은 LAN 안에서의 통신을 담당한다. 단말기마다 고유한 MAC 주소가 있고, 데이터는 프레임 단위로 오간다. 프레임은 송신자와 수신자 주소를 담은 헤더와 실제 데이터인 페이로드로 이루어진다.

3계층인 네트워크 계층은 여러 LAN 사이의 경로를 설정하고 데이터를 전달한다. 라우팅·포워딩·세그멘테이션·인터네트워킹이 주요 기능이며, 라우터와 일부 L3 스위치가 이 계층에서 동작한다.

그런데 스위치 하나에 연결할 수 있는 단말기 수에 한계가 있는 것은, 결국 MAC 주소가 32비트뿐이라 주소 공간이 모자라기 때문이다. 그래서 128비트 주소를 쓰는 IPv6로 넘어가면 이 한계가 사라져 LAN 하나에 사실상 무제한으로 단말기를 붙일 수 있게 된다.

출처: server/game_server/2/2025-06-30-game_server_2_1.md

📝 내 답: X. 마지막 단락이 틀렸다. 이는 MAC 주소가 아닌 IP 주소에 대한 내용이다.


MallangQuiz 카테고리 내 다른 글 보러가기

댓글남기기