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

게시:     수정

카테고리:

태그:

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

말랑말랑 퀴즈 📝

날짜: 2026-09-24 문제 수: 6문제


Q1. 🟡 보통

TCP의 recv()와 UDP의 recvfrom()은 둘 다 1바이트(또는 데이터그램 1개)라도 있으면 즉시 리턴하고, 그 외에는 블로킹된다. 문제는 수신 측이 데이터를 꺼내는 속도가, 운영체제가 수신 버퍼를 채우는 속도보다 느려서 수신 버퍼가 가득 찼을 때 송신 측이 어떻게 되느냐다.

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

  • A. TCP와 UDP 모두 수신 버퍼가 가득 차면 송신 측의 send()가 즉시 블로킹되어, 데이터가 유실되는 일은 절대 없다.
  • B. TCP는 수신 버퍼가 가득 차면 송신 측 send()가 블로킹되어 흐름 제어가 이루어지지만, UDP는 수신 버퍼가 가득 차도 송신 측이 멈추지 않고 계속 보내기 때문에 넘치는 데이터가 그대로 버려진다. 이런 UDP의 무분별한 전송은 네트워크 혼잡을 일으켜 같은 네트워크를 쓰는 TCP 통신에도 불리하게 작용할 수 있다.
  • C. recv()는 수신 버퍼가 완전히 가득 찰 때까지 기다렸다가 한 번에 리턴하며, 1바이트만 도착한 상태에서는 리턴하지 않는다.
  • D. 라우터는 처리 능력을 초과하는 패킷이 들어와도 절대 패킷을 버리지 않고, 큐에 무한정 쌓아 순서대로 처리한다.

출처: server/game_server/3/2026-02-03-game_server_3_5.md

📝 내 선택: B

A: UDP는 상대방의 상태를 고려하지 않고 보내기에 유실된다.
이와 반대로 TCP는 블로킹된다. C: TCP는 데이터그램 기반이며, 전송끝이라는 문자가 있었던 것으로 기억한다. D: 라우터는 큐에 무한정 쌓지 않으며, 일정 수치를 초과하면 버려진다.


Q2. 🔴 어려움

C++11의 특수 멤버 함수 자동 작성 규칙에 대해 답하시오.

(1) 이동 생성자·이동 대입 연산자가 자동으로 작성되려면 만족해야 하는 세 조건은 무엇인가?

(2) 두 이동 연산(이동 생성자, 이동 대입 연산자)은 서로 독립적인가? 하나만 선언했을 때 다른 하나도 자동으로 작성되는가?

(3) 두 복사 연산(복사 생성자, 복사 대입 연산자)은 서로 독립적이다. 그런데 어떤 경우에 이 둘이 자동으로 삭제(비활성화)되는가?

(4) 아래 클래스를 보자.

class StringTable {
public:
    StringTable() {}
    ~StringTable()                                         // 추가됨
    { makeLogEntry("Destroying StringTable object"); }
private:
    std::map<int, std::string> values;
};

소멸자를 직접 선언한 것이 이동 연산에 어떤 영향을 미치는가? 그로 인해 StringTable 객체를 “이동”하려는 코드가 실제로는 어떤 동작을 하게 되며, 왜 성능 문제가 생기는가? = default를 쓰면 이 문제가 왜 해결되는가?

출처: game_dev/moderncpp/3/2026-08-25-moderncpp_3_17.md

📝 내 풀이:

(1) 복사 생성자, 생성자, 소멸자를 선언하지 않아야한다.

(2) 독립적이지 않고, 하나를 선언했을때 다른 하나도 자동 작성된다. (잘모름)

(3) 1번이랑 비슷했던 것 같은데 잘모르겠다.

(4) 이동 생성자와 이동 대입 연산자가 생성되지 않는다.


Q3. 🟡 보통

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

논블록(non-blocking) 소켓과 Overlapped I/O는 둘 다 소켓 I/O 함수를 호출할 때 사용자 데이터 블록을 커널 버퍼로 복사하는 연산이 발생하며, 이 복사 비용 때문에 두 방식의 성능 차이는 거의 없다. 또한 Overlapped I/O는 크로스 플랫폼 방식이라 리눅스에서도 그대로 사용할 수 있다.

출처: server/game_server/3/2026-02-05-game_server_3_7.md

📝 내 답: X. 논블록은 지속적으로 상태를 확인하지만, Overlapped I/O는 그렇지 않았던 것으로 기억한다. 그러므로 성능 차이는 존재하며, Overlapped I/O는 윈도우에서 사용할 수 있어서, 리눅스에서는 epoll을 썼던 것 같다.


Q4. 🟡 보통

빈칸을 채우시오.

범위 없는 enum(C++98 스타일)의 열거자는 그 ① ___ 밖으로 새어나가 이름공간을 오염시키지만, 범위 있는 enum(enum class)의 열거자는 ② ___ 안에서만 유효하다. 범위 없는 enum의 열거자는 정수·부동소수점 타입으로 ③ ___ 변환되지만, 범위 있는 enum은 이런 변환이 되지 않아 다른 타입이 필요하면 ④ ___을 직접 써야 한다. 범위 없는 enum은 기본적으로 전방 선언이 안 되지만 ⑤ ___을 지정해 주면 가능해지고, 범위 있는 enum은 이것이 기본적으로 ⑥ ___(으)로 정해져 있어서 언제나 전방 선언이 가능하다.

출처: game_dev/moderncpp/3/2026-04-19-moderncpp_3_10.md

📝 내 답: 잘 기억나지 않는다.


Q5. 🟡 보통

게임 서버의 데이터 저장 방식에 대한 설명으로 가장 올바른 것은?

  • A. 게임 서버는 보통 RDBMS 하나만 사용하며, NoSQL은 로그·통계 분석에는 적합하지 않아 거의 쓰이지 않는다.
  • B. 게임 서버 개발에서는 흔히 RDBMS와 NoSQL을 함께 사용한다 — 플레이어 데이터는 RDBMS로, 로그·통계 분석은 NoSQL(예: MongoDB)로 관리하는 식이다. MongoDB는 오브젝트 ID를 수동으로 지정할 수도 있고, 한번 정한 샤드 키는 샤드를 재구성하지 않는 한 바꿀 수 없으며, upsert는 “없으면 삽입, 있으면 수정”을 의미한다.
  • C. MongoDB의 인덱스는 RDBMS보다 비용이 낮아서, 인덱스를 최대한 많이 걸어도 성능에 문제가 없다.
  • D. NoSQL은 RDBMS보다 질의 기능이 많고 표준화되어 있어서, 복잡한 조인 질의가 필요한 경우 NoSQL이 항상 더 유리하다.

출처: server/game_server/8/2026-03-14-game_server_8_10.md

📝 내 선택: B

A: 게임 서버는 용도에 따라 RDBMS와 NoSQL을 결정한다. 그리고 NoSQL이 로그 통계 분석에 적합했다.
C: 비용이 낮은건 맞지만, 인덱스를 많이 건다고 성능에 문제가 없지 않다.
D: RDBMS가 질의 기능이 많고 표준화되어있다.


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

아래는 게임 로딩 화면을 멀티스레드로 구현한 코드다.

bool isStillLoading;

Thread1 {
	isStillLoading = true;
	while(isStillLoading) {
		FrameMove();
		Render();
	}
}

Thread2 {
	LoadScene();
	LoadModel();
	LoadTexture();
	LoadAnimation();
	LoadSound();

	isStillLoading = false;
}

(1) 이 코드에서 isStillLoading 변수의 역할은 무엇인가? 이 변수가 두 스레드를 어떻게 조율하는지 설명하시오.

(2) 같은 작업(배경 렌더링 + 리소스 로딩)을 싱글스레드로 구현해서 렌더링과 로딩 함수를 번갈아 호출했다면, 어떤 두 가지 문제가 생기는가?

(3) 멀티스레딩이 필요한 상황은 크게 세 가지다. 이 게임 로딩 예시는 그중 정확히 어떤 상황에 해당하는가? 그리고 “기기의 모든 CPU 코어를 최대한 활용하고 싶을 때”는 이 예시와 목적이 어떻게 다른가?

출처: server/game_server/1/2025-05-28-game_server_1_3.md 오답노트: wn-b14846d4 · 2026-09-10 최초 오답 · 이번이 2번째 복습

📝 내 풀이:

(1) 로딩중인지 확인. 로딩이 끝나면 로딩 변수를 false로 하여 thread1이 빠져나오게 하는 식이다.

(2) I/O와 화면 처리를 번갈아가며 하기에 뚝뚝 끊기며, 다른 작업을 하지 못하게된다.

(3) I/O 처리 동안 해야할 다른 작업이 있을 때. 해당 예시는 스레드가 코어보다 적어 활용하지 못하는 경우?


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

댓글남기기