[말랑 퀴즈] 26/10/11 문제

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 📝

날짜: 2026-10-10 문제 수: 6문제


Q1. 🟢 쉬움

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

프로그램은 실행 전 상태의 파일로 코드와 데이터, 힙, 스택 영역을 모두 갖추고 있으며, 프로세스로 실행될 때 이 네 영역이 그대로 메모리에 적재된다.

출처: server/game_server/1/2025-04-25-game_server_1_1.md

📝 내 답: X. 데이터, 힙, 스택 영역은 프로세스로 실행되고 난 뒤 적재된다.


Q2. 🟡 보통

멀티스레드 게임 서버에서 잠금 범위를 “방 단위”로 설정한 아래 구조에 대한 설명으로 가장 올바른 것은?

class MyGameServer {
	class Room {
		CriticalSection m_critSec;   // 방 뮤텍스
		String m_roomName;
		List<Player> m_players;
		List<Character> m_characters;
	}
	map<PlayerID, shared_ptr<Room>> m_roomList;
	String m_serverName;
	CriticalSection m_critSec;       // 서버 뮤텍스
}

MyGameServer.DoSomething(playerID) {
	lock(m_critSec);                 // 1
	room = m_roomList.find(player);  // 2
	unlock(m_critSec);               // 3

	lock(room.m_critSec);            // 4
	room.DoSomething(playerID);      // 5
	unlock(room.m_critSec);          // 6
}
  • A. 서버 뮤텍스는 서버 메인과 방 목록뿐 아니라 방 안의 데이터까지 함께 보호한다.
  • B. 플레이어가 있는 방을 방 목록에서 찾을 때는 서버 뮤텍스를, 그 방 안에서 처리할 일을 할 때는 해당 방의 뮤텍스를 잠근다.
  • C. 잠금 범위는 서버 전체에 뮤텍스 하나만 두는 것이 가장 적당하다.
  • D. 파일을 액세스할 때는 자주 잠그는 뮤텍스를 잠근 채로 하는 편이 성능 저하를 줄여 준다.

출처: server/game_server/1/2025-06-13-game_server_1_11.md

📝 내 선택: B.

A: 범위 상으로 Nested Class의 객체도 보호했던 것 같은데, B가 맞는 것 같아서 헷갈린다.
C: 잠금 범위는 너무 크지도, 작지도 않은 적당한 범위를 가져야 한다.
D: 자주 잠그는 뮤텍스를 잠그는 것은 성능 저하 해소와 관련이 없다.


Q3. 🟡 보통

빈칸을 채우시오.

컴퓨터 네트워크의 품질과 특성에 대한 설명이다.

  • 네트워크 품질을 평가하는 세 가지 기준은 전송 속도(스루풋), ① ___, 전송 지연 시간(레이턴시)이다.
  • 두 단말기 사이의 레이턴시는 그 사이에 있는 네트워크 기기들 각각의 레이턴시의 ② ___과 같다. (덧셈의 결과를 가리키는 말)
  • 두 단말기 사이의 스루풋은 그 사이에 있는 네트워크 기기들 중 ③ ___ 스루풋과 같다. (크기 기준으로 “가장 큰 / 가장 작은” 중 어느 쪽인지를 나타내는 한 단어)
  • 와이파이(CSMA 방식)에서는 전파를 보내기 전 다른 기기의 전파가 감지되는지 확인하여, 감지되면 잠시 ④ ___하고 감지되지 않으면 전파를 보낸다. (한 단어)

출처: server/game_server/2/2025-12-03-game_server_2_5.md

📝 내 답: 패킷 유실, 합, 가장 작은, 대기


Q4. 🟢 쉬움

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

게임 서버의 기능을 여러 서버 인스턴스에 나누는 분산 처리를 많이 할수록 서버 인스턴스 간 역할 의존이 줄어들기 때문에, 클라우드 환경에서도 인스턴스 간 통신 회선의 신뢰성은 문제가 되지 않는다.

출처: server/game_server/9/2026-03-20-game_server_9_9.md

📝 내 답: X. 서버 인스턴스 간 역할 의존은 늘어날 수 있으며, 인스턴스 간 통신 회선의 신뢰성이 좋아야 한다.


Q5. 🔴 어려움

C++ 반복자의 특성정보(traits) 클래스와 advance 함수 구현에 대해 답하시오.

(1) 특성정보는 포인터나 int 같은 기본 제공 타입에도 동작해야 한다. 그렇다면 특성정보를 타입 안에 넣는 방식이 안 되는 이유와, 대신 어디에 두어야 하는지를 쓰시오.

(2) 사용자 정의 반복자 타입(예: deque, list의 iterator)이 iterator_traits와 연결되려면 그 타입 안에 무엇을 두어야 하는가? 그리고 포인터 타입은 iterator_traits가 어떤 방식으로 지원하는가?

(3) 아래 코드는 iterator_traits<IterT>::iterator_category와 typeid를 if로 비교해 임의 접근 반복자를 구분하려 한다. 이 방식이 근본적으로 부적절한 이유를 “컴파일 도중”과 “런타임”이라는 표현을 사용해 설명하시오.

template<typename IterT, typename DistT>
void advance(IterT& iter, DistT d) {
	if (typeid(typename iterator_traits<IterT>::iterator_category)
		== typeid(random_access_iterator_tag)) {
		iter += d;
	} else {
		if (d >= 0) { while (d--) ++iter; }
		else { while (d++) --iter; }
	}
}

(4) 올바른 해결책은 doAdvance를 random_access_iterator_tag, bidirectional_iterator_tag, input_iterator_tag 매개변수별로 오버로딩하고, advance가 iterator_traits<IterT>::iterator_category()를 넘겨 호출하는 것이다. 이때 input_iterator_tag 버전의 doAdvance가 순방향 반복자(forward_iterator)도 받을 수 있는 이유는 무엇인가?

출처: game_dev/cpp/chapter7/2025-11-02-cpp_7_47.md

📝 내 풀이:

(1) 포인터나 int는 클래스가 아니기에 타입 안에 특성 정보를 넣을 수 없다.
대신 부분 템플릿 특수화를 통해 특성 정보를 가지도록 외부에 구현한다.

(2) *_iterator_tag 중 하나를 typedef를 통해 iterator_category로 연결시켜주어야 한다.
포인터 방식은 부분 템플릿 특수화를 통해 지원한다.

(3) 템플릿 메타 프로그래밍은 컴파일 도중 모든 템플릿 인스턴스를 생성한다.
IterT와 if문도 검사하는데, 임의 접근 반복자에 해당하는 연산을 하다보니 컴파일 시점에서 에러가 발생한다.

(4) forward_iterator_tag가 input_iterator_tag를 상속하기 때문이다.


Q6. 🟡 보통 · 📌 오답노트 (2번째 복습)

온라인 게임의 플레이어 정보 저장에 대해 답하시오.

(1) 어떤 게임이 골드와 인벤토리 정보를 클라이언트 쪽 파일에 저장한다고 하자. 이 방식의 문제점 두 가지를 쓰시오. 또한 반대로 클라이언트에 두어도 되는 사소한 데이터의 예를 두 가지 이상 쓰시오.

(2) 플레이어 A가 플레이어 B에게 아이템을 넘기는 거래는 “A의 인벤토리에서 아이템 제거 → B의 인벤토리에 아이템 추가” 두 단계로 이루어진다. 첫 단계만 끝나고 시스템이 중단되면 어떤 일이 생기는가? 이를 막아 주는 데이터베이스 기능의 이름과, 그 기능의 정의(“무엇의 최소 단위인가”)를 쓰고, 이 기능이 보장하는 성질의 이름을 쓰시오.

(3) 두 개 이상의 처리가 동시에 같은 데이터에 접근해 이상한 결과가 나오는 것을 데이터베이스에서는 무엇으로 막는가? 멀티스레드 프로그래밍의 어떤 개념과 비슷한지도 쓰시오.

(4) 시스템이 중단되더라도 원래 해야 했던 일들을 찾을 수 있게 해 주는 데이터베이스의 장치 이름과, 그것이 어떻게 동작하는지 한 줄로 쓰시오.

출처: server/game_server/4/2026-02-11-game_server_4_7.md 오답노트: wn-4d40e435 · 2026-09-15 최초 오답 · 이번이 2번째 복습

📝 내 풀이:

(1) 1. 클라이언트 측에서 골드와 인벤토리 정보를 조작할 수 있다, 다른 디바이스에서 플레이 시 해당 정보가 없다.

  1. 게임 내에서 로딩 시 필요한 에셋, 설정 정보들

(2) A에서 아이템이 사라지고, B에는 변화가 없어진다. 트랜잭션, 업무 처리 단위, 원자성

(3) 락, 레이스 컨디션

(4) 로그 버퍼. 로그를 기록해두었다가, 시스템 재개시 처리한다.


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

댓글남기기