안녕하세요 강의 잘 듣고 있습니다. 전역변수 사용에 있어 원자화 되지 않은 함수들로 인한 race condition 문제로 저희가 원하지 않는 값들이 return 되기에 lock을 사용하여 해당 lock동안에는 다른 Thread의 사용을 방지한다고 이해하였습니다. 그렇기 때문에 lock의 사용이 빈번해진다면 전반적으로 코드의 구성도 복잡해지고 성능 측면에서도 좋지 못하다 이해하였고, 그렇다면 lock의 사용은 변수를 공유하지 않는 부분에서는 필요치 않을까? 하는 의문이 들었습니다. 나아가 만약 lock을 사용하는 Thread가 있다면, 그 기간 동안에는 lock을 사용하지 않는 다른 Thread들 도 lock의 명령어들이 끝날 때까지 기다려야 하는 것인지 궁금합니다.
안녕하세요 강의 잘 수강하고 있습니다. 클러스터 설치중 아래와 같은 오류 메세지가 나옵니다. Error: loading config file "-": error converting YAML to JSON: yaml: line 24: mapping values are not allowed in this context 몇 번을 지웠다가 설치해봐도 이런 메세지가 생기네요 환경변수도 충분히 집어 넣어서 카펜더 설치 정상적으로 완료했어도요... 어떻게하면 해결할 수 있을까요?
프로토콜이란 것이 참 추상적이어서 감이 잘 잡히지 않는데요, HTTP, FTP, SMTP, POP3 -------------------------- TCP, UDP TCP와 UDP의 차이는 어떻게 구현하는 것이며, HTTP, FTP, SMTP, POP3 프로토콜과 TCP, UDP의 관계에서 비롯된 차이가 궁금합니다. 예를 들어, HTTP 프로토콜을 TCP로 구성한다고 했을 때, 또는 HTTP 프로토콜을 UDP로 구성한다고 했을 때 TCP 프로그래밍은 3 Hand - Shake 구조만 갖추면 TCP 프로토콜이라 할 수 있을지요? 또는 UDP 구조만 갖추면 UDP 프로토콜이라고 할 수 있을지요? HTTP, FTP, SMTP, POP3 프로토콜의 차이는 Client / Server 소켓 프로그래밍으로 프로그래밍을 달리 구성하는것에서 차이가 오는지요? 또 그것을 구현 중에 TCP 구조 UDP 구조를 택하는 것에서 차이가 발생하는지요? TCP/IP프로토콜이라는 말은 IP프로토콜 기반 TCP 프로토콜을 말하는 것이라 알고 있는데, HTTP/UDP 또는 HTTP/TCP 이렇게도 표기하는지요? 고맙습니다.
Event는 커널 레벨에서 다른 쓰레드와 통신하기 위해 사용하는 것이고 (이런 점에서 IPC와 유사하다고 생각됩니다. 하지만 프로세스와 달리 쓰레드는 메모리를 공유하므로 더 효율적이겠구요...) Condition Variable은 유저 레벨에서 직접 구현하는 것이라 생각하면 굳이 OS API 및 커널의 도움을 받지 않고 조건을 체크한다는 것으로 이해하였습니다. CV에서... 일단 락 받아 조건 맞아? 조건 안 맞으면 락 풀어. 다음 기회에... 다른 thread에서 신호 줄때까지 blocked 위 처럼 설명하신 것 같은데, 이해가 가지 않는 부분이 몇 군데 있어 질문드립니다. Q1. unique_lock<mutex> lock(m) 은 생성자에서 이미 락을 잡았을텐데, 왜 cv.wait() 에서 "1) Lock을 잡고" 부분에서 다시 락을 잡는건지 궁금합니다. 100% 락을 잡았다는 보장이 없는 것인가요?? 생성자에서 락을 잡지 못하면 어차피 다음 코드 실행이 안되지 않나요? (혹은 조건을 불만족했을때 cv.wait() 에 대한 루프를 돌아야 하기 때문에 락을 다시 잡는 것인가요?) Q2. 왜 예제 코드에서는 Event 방식보다 CV 방식이 효율적이라고 하신건지 궁금합니다. 결국 CV방식에서도 Blocking된 쓰레드를 깨우려면 커널의 도움을 받아야 하는 것 아닌가요? 로직 상으로도 둘 다 바쁜 대기가 존재하지 않고 같은 순서로 동작하는 것 같은데 코드의 길이가 줄어서 효율적이라고 하신 건가요?
WraightRef wraight(new Wraight()); wraight->ReleaseRef(); wraight = nullptr; wraight 에 nullptr을 넣어서 ReleaseRef가 수행하는 도중에 위처럼 (중간에 개입)을 써 놓은 부분에서 다른 WraightRef가 wraight를 참조를 시도한다면 reftCount는 0이 되지만 _refCount는 1이 되어서 delete this가 실행이 되면 문제가 발생하지 않나요??
//string Array.Copy(Encoding.Unicode.GetBytes(this.name),0,segment.Array,count,nameLen); 강사님께서 destination Index가 들어갈 자리에 count를 인자로 주셨는데, segment의 경우 자료형이 ArraySegment이기 때문에 단순 count가 아닌 segment.Offset + count를 destination Index로 주어야 될것같은 의문이 들어서 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요, 강사님?? 강의를 듣다가 궁금해서 질문 남깁니다. 두 Host가 TCP IP 통신을 위해 3 way handshake 후 통신을 할때 sequence number는 이전 그대로인가요, 아님 새로운 임의의 숫자인가요?예를 들어 초기에 Host A(1234) / Host B(369)이면 3 way handshake 후 Host A(1235) / Host B(370)가 된다. Host A에서 Host B로 데이터를 전송할 때 sequence 번호는 1235인가요? 아님 새로 배정되나요?매번 질문에 답해주셔서 감사합니다 :)
루키스님 안녕하세요? 잡큐 1, 2를 들으며 본 서버 강의 앞부분과 비슷한 내용같은데 차이를 몰라 질문 올리게 되었습니다. 아래 질문들의 제 본질적인 질문 은 옛날에 만든거 아닌가? 왜 새로 만드지? 뭐가 다른거지? 입니다 JobQueue #1 강의 중 PacketHandler.cs 수정 중에 스레드가 일을 Push할 때 처리 가능한 상황이면 해당 스레드가 처리, 그렇지 않으면 Queue에 Push만 하고 종료, 서버코어의 Session.cs의 Send()가 이미 비슷하게 구현됨 이라고 설명해주셨는데, 말씀 그대로 이미 비슷하게 큐로 구현이 되어있어 뭐가 다른거지 생각해보다가 아래 그림 플로우 처럼 제가 이해한게 맞는지 궁금합니다. JobQueue #2 강의 중 Broadcast() 로직의 O(N^2)을 O(N)으로 줄이기 위해 패킷 모아보내기 스킬을 소개해 주셨습니다. 그런데 강의 앞부분 'SendBuffer'에서 버퍼를 다룰 때 RecvBuffer와는 다르게 SendBuffer는 외부에 구현함으로써 O(N^2)을 O(N)으로 줄일 수 있다. 라고 이미 말씀해주셨는데요, O(N^2)을 O(N)으로 줄이는 둘의 차이점이 궁금합니다. 둘은 완전히 다른 얘기일까요? 만약 그렇다면, 둘 다 그대로 방치했다면 O(N^3) O(2N^2, 표현이 맞진 않지만 느낌상)이 되는 로직이 되는건가요? 답변 미리 감사합니다. 수강자 올림
강의 초반부에 windows.h같은 헤더를 사용하게 되면 추후 바꿔야 될 부분이 많아 표준인 thread를 사용한다고 하셨습니다. 강의가 window os기반으로 구성되어 있고, 제가 window os는 잘 사용해 보지 않아 막연한 걱정이 있는데, 그럼 window에서 작동하는 IOCP로 서버 구성시, 추후 리눅스로 옮겨갈때 epoll로 바꿔주는 과정에도 엄청한 자원이 소모되지 않나요? 현업에서는 대부분 window os로 서버를 구성하나요? epoll에 대해서도 꼭 공부가 필요한지, IOCP에 비해 중요도가 떨어지는지도 궁금합니다.
10:30부근에 말씀하시는 내용을 들어보면, 쓰레드의 개수 = 코어의 개수 일때 가장 이상적이라고 하셨습니다. CPU가 4코어일때 하나의 프로세스(MMO서버)에 4개의 쓰레드가 가장 이상적이라는 의미인가요? 멀티코어 프로세서에서 같은 프로세스여도 서로 다른 쓰레드이면 각 코어마다 같은 프로세스의 서로 다른 쓰레드 작업이 가능하다. 이게 가능한 이유는 유저모드 쓰레드가 아닌 커널 모드 쓰레드 이기 때문이다. 제가 이해한 위 내용이 맞는지 궁금합니다.
서로 통신할 때 핸드셰이크를 한다고 했는데 상태 유지일 경우는 핸드셰이크를 한번 하고 쭉 유지된다고 생각하면 되는데 무상태인 경우에는 응답이 오고 다시 요청을 보내고 서버가 바뀔때마다 핸드셰이크를 하는건가요?? 아니면 중계서버랑 핸드셰이크를 한 후 그게 계속 유지가 되는건가요?
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
강의에서 설명된 내용 기준으로 argument 10 및 return address가 main함수의 스택 프레임에 있는 것으로 설명되었는데, 실제 코드에서 main함수에서 Test함수를 argument 10을 주면서 호출할 시에 매개변수 10에 대한 값과 추후에 다시 main 함수로 돌아오게 될 위치에 대한 리턴 어드레스 값은 메인 스택 프레임이 아닌 그 아래에 위치할 Test함수의 스택 프레임에 있는 것이 더 정확하지 않나에 대한 질문드립니다.
Host는 네트워크에 연결된 컴퓨터를 말하고, 이 host가 네트워크를 위한 기능을 하면 switch 라고 하고, 네트워크를 이용하는 주체면 end-point 라고 하셨는데요 쉽게 말해 PC를 통칭 해 host라고 부르고, 해당 PC가 네트워크 장비인 경우 switch라 하고, 일반 user가 사용하는 PC의 경우 end-point라고 생각하면 될까요?
START ../../PacketGenerator/bin/PacketGenerator.exe ../../PacketGenerator/PDL.xml Server/PacketGenerator/bin에 PacketGenerator.exe가 생성되고, Server/PacketGenerator에 PDL.xml을 둬도 실행이 되는 것 까지 성공하였습니다. 하지만 이후 배치파일 작성 부분에서 PacketGenerator.exe을 실행하긴 하지만, PDL.xml을 찾는 경로를 Server/PacketGenerator이 아닌 Server/Common에서 찾고 있었고, 실제로 Common 폴더에 PDL.xml을 두니 정상 작동 하였습니다. 해당 현상을 해결할 수 있을까요?