전체보기(67)
-
Login Server
안녕하세요 대학생개발자입니다. 오랜만에 제 원래 전공으로 돌아왔습니다. 오늘은 오랜만에 서버에 대한 포스팅으로 돌아왔는데요. 이전까지는 데이터베이스에 대한 설치와 간단한 쿼리를 익히는게 시간을 쓰느라 포스팅에 지연이 있었습니다. 그럼 시작하도록 하겠습니다. 우선 이전까지는 채팅서버를 만들었었습니다. 일반적으로 우리가 아는 채팅서버라는건 로그인이라는 과정을 통해서 인증을 받은 유저들에 한해서 접근이 가능하도록 설계가 되어있을겁니다. 생각해보면 너무나도 당연한 얘기입니다. 로그인도 하지않은 유저가 채팅서버에 들어와서 채팅 메시지를 보낸다는건 상식적으로 봤을때 정상적으로 보이지 않는 것 같습니다. 반대의 경우도 마찬가지입니다. 로그인도 안한 유저가 로그인이 되어있는 유저의 채팅을 받아 본다는것도 말이안되는건 ..
2022.05.19 -
c_4
안녕하세요 대학생개발자입니다. 이번글에서는 반복문에 대해서 간단히 알아보겠습니다. 반복문이란 말 그대로 코드가 반복되는 구간을 의미하는거겠죠... 그리고 거의 모든 반복에는 조건이 있습니다. 우선 반복문에 어떤것들이 있는지부터 봐야할 것 같습니다. 첫번째로 for문이 있습니다. 두번째로 while문이 있습니다. 세번째로 do while문이 있습니다. 먼저 조건문에 공통적으로 들어가는 구성에 대한 얘기를 먼저 해보겠습니다. 1. 초기식 2. 조건식 3. 증감식 조건식에는 위의 세가지 구성이 들어가는데요. 초기식의 경우에는 말그대로 조건식에서 사용될 값을 초기화 해주는 부분입니다. 초기화되지 않은 값을 사용하게되면 visual studio에서는 컴파일 에러를 뱉어주지만 그외 다른 컴파일러에서는 에러를 뱉어주..
2022.05.10 -
c_3
안녕하세요 대학생 개발자입니다. 이번 글에서는 이제 모든 코드에 로직이라는것을 결정하는 조건문이나 반복문에 대해서 알아볼거에요. 우선 조건문이라는게 무엇일까요? 말 그대로 어떤 조건에서 실행하고 어떤 조건이 아니면 실행하지 않겠다는 의미로 해석이 되는데요. 우선 조건문은 크게 두가지로 쓰이는데요 첫번째는 if문이고 두번째는 switch문입니다. if문의 경우에는 true와 false로 떨어지는 하나의 명제를 넣어서 그 명제가 참이라면 실행하고 참이 아니라면 실행하지 않는 구문이에요. 물론 if문이라고 해서 꼭 if만 있는건 아닙니다. if 조건에 해당하지 않는 경우에만 실행하고 싶은 부분이 분명 있기 때문에 else라는 키워드도 같이 제공하고 있습니다. if(조건){ 실행블럭 } else{ 실행블럭 } ..
2022.05.10 -
c_2
안녕하세요 대학생개발자입니다. 이번글은 저번글에 이어서 C언어에대한 기본 두번째 글입니다. 사실 C언어라는게 막상 접해보면 그렇게 어렵지 않은데 많은분들이 어려운줄 알고계셔요 그래서 어떻게하면 쉽게 설명할 수 있을까 고민하며 적고있습니다. 이번글에서는 자료형에 대한 얘기와 함께 데이터가 실제 어떻게 저장되는지에 대한 얘기를 좀 해볼겁니다. 자료형은 간단히 말하면 어떤 방식으로 이 데이터를 저장할거냐 혹은 표현할거냐 입니다. 저 방식이라는 것에는 다양한게 존재할수있는데요. 첫번째로 데이터를 크기에 따라 나누는 방법이 있습니다. 두번째로 데이터의 종류에 따라 나누는 방법이 있습니다. 먼저 데이터를 크기에 따라 나누는 방법인데요 여러분이 계산기를 사려고 한다고 생각해봅시다. 난 3자리 이상의 연산을 할일이 없..
2022.05.08 -
Chatting Server(Multi Thread)
안녕하세요 대학생개발자입니다. 이번글의 목적은 저번글에 이어서 채팅서버에 대한 다 하지 못한 얘기를 해볼까합니다. 이전 글에서 다뤘던 내용이지만 채팅 서버의 구조는 다음과 같았습니다. 메시지를 처리하는 1개의 스레드와 그 외에 IO를 처리하는 워커 스레드들... 그리고 그 워커 스레드들에게서 하나의 큐를 통해 Job을 전달받는 메시지 처리 스레드가 존재했었습니다. 이 구조에서는 메시지 처리 스레드는 메시지가 없으면 큐가 계속 비었는지 있는지 확인하는 방식의 폴링을 채택했었습니다. 물론 이벤트를 이용해서 폴링을 하지 않고 잠들게 할 수 있었지만, 그렇게 하지 않고 그냥 폴링을 통해 하나의 cpu를 계속 사용하도록 만들었었습니다. 이부분에서는 장점도 있고 당연히 단점도 있을겁니다. 우선 장점으로는 구현이 매..
2022.05.04 -
c_1
안녕하세요 대학생 개발자입니다. 오랜만에 돌아왔습니다. 그리고 진짜 기본이라는 새로운 카테고리를 가지고 돌아왔습니다. 이 카테고리는 c언어를 처음하시는 분들을 위한 카테고리입니다. 만약 나는 이런거 볼 레벨은 아닌데...? 하시는분들과 서버 개발일지를 보러 오셨다면 과감히 좋아요를 누르고 뒤로가기를 눌러주시면 감사하겠습니다. 먼저 변수에 대한 얘기를 해보려고합니다. c언어의 책에 뭐라고 써져있는지 모르겠지만 변수는 사실 정해진 크기의 값을 담을 수 있는 공간입니다. 이렇게 말로만 말씀을 드리면 이해가 안되실겁니다... 지금 제입장에서는 너무나도 당연히 받아들여지는 부분이 입문한지 얼마안되신 분들께는 어려운 내용이니 말이죠. 우선 변수를 선언하는 방법은 다음과 같습니다. 타입 이름 = 값;(int a = ..
2022.05.04 -
NetServer(Chatting Server)
안녕하세요 대학생개발자입니다. 여전히 저는 할일이 많이 남았습니다. 사실 요샌 거의 이론보단 실제 개발에 치중해 있다보니 블로그 글을 쓸 일이 크게 없는것 같습니다. 예전에 LanServer, LanClient 서버와 서버간의 연결에서의 서버, 클라이언트 역할을 하게될 두개의 클래스에 대한 소개를 했었습니다. 이제 시작할 부분은 실제 유저인 클라이언트와 연결을 담당할 외부로 노출될 서버를 개발하게 되었습니다. 뭐... 이름이 바뀌었다고 해서 기능이 크게 달라지진 않았습니다. 대부분의 기능은 LanServer와 동일할겁니다. 뭐... 컨텐츠 쪽의 로직이 많이 달라지겠지만 그건 지금 네트워크 라이브러리에게 중요한것은 아닙니다. 우리가 중요하게 여겨야 할 부분은 네트워크를 타고 흐르는 패킷에 대한 보안입니다...
2022.05.03 -
LockFreeStack Trouble Shooting
안녕하세요 대학생 개발자입니다. 락프리에 대한 언급이 있었던지 1주일쯤 지났습니다. 아마 보신분들이 실제로 개발을 해보셨을지는 모르겠습니다만 락프리 알고리즘을 구글링했을때 나오는 의사코드를 보고 코딩을 하셨던분들은 간단히 테스트 해봤을때에는 전혀 문제가 발생하지 않았을겁니다. 하지만 여러 스레드에서 초당 몇백만건의 push, pop을 하게되면 여러 문제가 발생할 수 있는데요. 그럼 시작하도록 하겠습니다. 그래서 무슨문제가 발생하는데? 아마 이 부분이 제일 궁금할 것 같습니다. 저도 이 문제를 찾기위해서 거의 2주일 가까운 시간을 소모하면서 메모리 로그를 봤던 것 같습니다. 사실 이 트러블슈팅의 과정을 올리는게 맞는지 모르겠습니다만... 뭐 이건 제 포트폴리오가 될것이니 이런것도 올려도 상관없을 것 같다는..
2022.03.28 -
DumpClass
안녕하세요 대학생 개발자입니다. 이번 글에서는 예외에 대한 핸들링에 대한 부분과 덤프클래스에 대해서 정리를 해보려고합니다. 우리가 0을 분모로 나눗셈을 하려고 하거나 혹은 new에서 메모리가 할당이 되지 않은 이런 경우를 포함 다수 경우에 예외가 발생하게 됩니다. 그리고 이 예외는 c runtime library가 처리를 하거나 혹은 os가 처리할 수 도있겠죠. 우리는 이 예외에대한 모든 핸들링 처리를 우리 코드로 돌리는 작업을 할겁니다. 그리고 예외가 발생했을때 덤프를 남겨 우리가 확인할 수 있게 할겁니다. 그리고 최근 글을 보신분들은 아시겠지만 덤프에대한 구현을 하려는게 아니라 왜 덤프를 써야하는지 왜 에러를 직접 핸들링 해야되는지에 대한 베이직한 이론내용이 들어가지 구현에 대한 부분은 언급하고있지 ..
2022.03.28 -
LockFree
안녕하세요 대학생 개발자입니다. 정말 오랜만에 글을 남기게 되었습니다. 한동안 락프리 개발에 시간을 많이 들였습니다.. 사실 락프리라는 알고리즘이 나온지 얼마 안된 기술은 아닙니다. 문서상에 언급되는것만 해도 거의 10년이상된 오래된 기술입니다. 그런데 제가 이런걸 공부하는데 왜 이렇게 오래걸리게 되었냐하면 락프리는 순수하게 멀티스레딩으로 잘 작동되는지 확인이 필요합니다. 사실 만드는 시간보다 검증하고 에러 수정하는 작업에 더 많은 기간을 소모했던것 같습니다. 그리고 락프리 스택과 큐를 사용하기 위해서는 또 다른 문제가 생기는데 이부분에 대해서는 제가 나중에 글을 통해서 언급하도록 하겠습니다. 그럼 시작하겠습니다. 왜 락프리냐? 아마 일반적으로 락프리를 사용하는 경우라면 다음과 같은 경우일겁니다. 너무 ..
2022.03.22 -
Network Library - LanServer,LanClient
안녕하세요 대학생 개발자입니다. 마지막 글을 올리고 나서 아주 오랜 시간이 흘렀습니다. 사실 이 테스트를 올릴까 말까 고민을 했었는데 말입니다... 이 내용은 새로운 지식이라기보다는 제가 만든 서버에 대한 구현만 있기 때문에 따로 올릴까 말까 고민했었는데 말입니다... 그래도 일단은 쓰기로 했습니다... 이번 글은 그냥 저 혼자 끄적이는 느낌이 강하고 따로 새로운 지식이 들어가는 부분도 아니기 때문에 크게 고민 없이 술술 읽으셔도 될 것 같습니다. 그리고 가장 중요한 점... 크게 유익 한글은 아닐 겁니다. 직전 글에서는 IOCP에 대한 주의사항과 문제가 될 수 있는 점을 정리했었습니다. 그리고 한동안 그를 바탕으로 주의하며 에코 더미 테스트를 했었습니다. 추가로 서버와 서버 간 통신을 하기 위한 서버 ..
2022.03.03 -
IOCP 사용중 주의사항
안녕하세요 대학생 개발자입니다. 최근 들어서 거의 2일에 한 번꼴로 글들을 찍어내고 있습니다. 거의 이론위주로 작성을 하고 있는데... 사실 내용이 그렇게 쉬운내용은 아닙니다. 당연히 서버개발을 한다면 이 정도 지식은 함양해야 된다고 생각하지만, 이번 글에서는 잠깐 쉬어가는 느낌으로 IOCP를 사용하면서 주의할 사항이나 문제가 생겼을 때 어떻게 대처할지에 대한 논의를 해보려고 해요. 우선 지난 글에서는 IOCP자체에 대한 내용보다는 Overlapped IO의 시각으로써 IOCP를 사용할 때 주의점을 정리했었습니다. 비동기 IO에 대한 문제점들과 이를 해결하기 위한 방법, 그리고 비동기 IO가 무엇인지에 대한 논의도 했었습니다. 이번 글에서는 IOCP로 에코 서버를 만드는 데 있어서 주의해야 할 점에 대해..
2022.02.19 -
IOCP + Overlapped IO는 비동기IO인가
안녕하세요 대학생 개발자입니다. 저번 글에서는 IOCP에 대한 내용을 정리했습니다. 글에서 핵심 내용만 몇개 뽑아본다면 다음과 같을겁니다. Overlapped IO Model2에서 IO를 타스레드로 전달하기 위한 조건을 걸다보면 결국 IOCP와 거의 흡사한 모습이된다. IOCP를 효율적으로 사용하기 위해 스레드풀을 사용할것이고 스레드풀은 컨텍스트 스위칭과 캐시히트 때문에 스택형태로 되어져있다. CreateIoCompletionPort함수에 파일 핸들과함께 하나의 키값을 등록할 수 있고 그 키는 GQCS함수를 호출할 때 다시 얻을 수 있다.(일반적으로 세션포인터를 전달하고 세션을 달고다니는 셈이된다) Running Thread와 Worker Thread는 우리가 원하는 만큼 세팅할 수 있으며 WorkerT..
2022.02.17 -
IO Completion Port Introduction
안녕하세요 대학생 개발자입니다. 저번 글에서는 Overlapped IO Model2라고 불리는 CALLBACK 방식으로 완료를 통지하는 오버랩 모델에 대해서 논의를 해봤습니다. 이번 글에서는 IOCP에 대한 내용을 다뤄볼 건데요. IOCP는 직전의 글과 같이 동일한 오버랩 모델 중 하나입니다. 먼저 큰 틀에서 말씀을 드린다면 완료 통지를 받는 방법으로 하나의 큐를 통해서 완료 통지를 받고 그 완료 통지를 받았다면 하나의 스레드를 깨워서 작업을 하는 방식을 의미하고 있습니다. 우선 그럼 Overlapped IO Model2에서 IO의 통지를 APC큐를 통해서 했을 경우 문제가 되는 부분은 다음과 같이 말씀드렸습니다. 하나의 APC큐와 IO는 스레드에 종속적이기 때문에 하나의 스레드는 박터져라 일을 하고 있..
2022.02.15 -
Overlapped IO Model2
안녕하세요 대학생 개발자입니다. 저번 글에서는 Overlapped IO Model1에 대한 내용에 대해서 언급했었습니다. Overlapped IO Model1에서는 Event를 이용해서 IO에 대한 완료통지를 하는것이라고 했었고, 그렇기 때문에 생기는 비효율적인 면에 대해서 언급했었습니다. 이번글에서 다룰 내용은 Overlapped IO Model2번째 모델입니다. 아마 이전글에서 언급을 했었겠지만 Overlapped IO Model2의 경우에는 Completion_Routine이라는 CALLBACK 등록을 통해서 IO의 완료 통지를 받는다고 했었습니다. 그럼 우선 우리가 알아야 하는건 CALLBACK이 과연 뭐냐입니다. CALLBACK 많은 사람들이 말을하고 있지만 이게 정확히 뭐냐 라고 물어봤을 때 ..
2022.02.15 -
Overlapped IO Model + heap
안녕하세요 대학생 개발자입니다. 마지막 글에서 동기화에 대한 얘기와 overlapped io모델에 필요한 구조체들에 대한 간단한 언급을 했었습니다. 이번 글에서는 진짜 overlapped io모델에 대한 얘기를 하려고 합니다. 아 그리고 그 이전에 동적 할당과 힙에 대한 잠깐의 논의를 해보고 넘어가려고 합니다. int * ptr = new int[100]; for(int i=0; i< 140; i++) { ptr[i] = 10; } delete ptr; 다음과 같은 코드가 있습니다. 여기서 에러가 나오는 부분은 어디인가라고 물었을 때 대부분의 입문자분들은 ptr[i] = 10; 부분이라고 말할 겁니다. 이렇게 말씀하시는 이유는 알겠으나 일단은 에러가 어디서나냐는 질문에는 틀린 겁니다. Visual Stu..
2022.02.11 -
Overlapped IO Introduction
안녕하세요 대학생개발자입니다. 마지막 글에서 기본적인 소켓 api를 다뤘었습니다. 그리고 한동안 알고리즘과 스레드, 그리고 select 서버에 대한 얘기를 했었습니다. 아마 제가 만든 AsyncSelect 클라이언트를 보셨는지는 모르겠습니다만, 그 이상의 새로운 모델이 아직 나오지 않았었습니다. 그리고 이제 Overlapped IO모델을 정리하면서 동시에 IOCP서버 개발에 착수할 예정입니다. 물론 처음부터 크고 멋진 서버를 만들겠다는 계획은 없습니다. 그리고 스레드 디자인부분도 아직 완벽하지 않기 때문에 확실하게 모든게 짚어지고 나면 그다음 제작에 진입을 할 예정입니다. 우선 서론이 길었습니다. 먼저 이전에 다뤘었던 모델들의 장점과 단점에대한 정리를 간단히 해보고 넘어가도록 하겠습니다. 우선 selec..
2022.02.10 -
Thread Design3과 잡다한얘기
안녕하세요 대학생 개발자입니다. 저번 글에서는 IO를 완료한 스레드가 직접 로직에 개입을하는 그런 스레드 디자인을 알아봤습니다. 그리고 IO스레드와 따로 메시지를 처리하는 스레드와 월드의 프레임을 돌려주는 스레드를 분리한 디자인과의 차이점도 확인을 했었습니다. 그리고 가장 중요한 어떤 디자인이 더 효율적이고 더 좋은 디자인인지에 대한 논의를 해봤었습니다. 이번글에서는 헤테로 지니어스와 호모 지니어스에 대한 얘기를 해볼겁니다. 물론 이얘기는 진작 언급 했어야 됬지만 이때까지의 구조는 거의 모두 호모지니어스에 가까운 구조였습니다. 먼저 그럼 시작에 앞서서 이부분에 대해서 짚고 넘어가겠습니다. 워커 스레드들이 있을 때 우리는 이 워커 스레드들이 어떠한 작업을 할지 알려줘야 됩니다. 하나의 스레드는 하나의 함수..
2022.02.09 -
Thread Design2
안녕하세요 대학생 개발자입니다. 저번 글에서는 쓰레드 디자인에 대해서 좀 정리를 해봤었습니다. 우선 이전 글에서는 이런 내용들이 있었습니다. 베이스는 무조건 멀티스레드 IOCP로 송수신 처리를 하는 겁니다. IO처리(비동기 recv겠죠)가 완료된 후에는 일거리(잡)들을 업데이트 서버의 큐에 넣어주는 방식이었습니다. 그럼 업데이트를 하는 서버는 큐에서 하나씩 꺼내서 사용하는 방식으로 작동했었는데요. 여기서 서버 월드를 돌리는 메인루프 스레드와 메시지 처리부 스레드가 하나였기 때문에 싱글스레드 서버라고 했었습니다. 그리고 만약 서버에 부하가 큰 로직(길찾기, 물리엔진, AI등)을 처리할땐 그 쓰레드를 분리한다고 했습니다. 추가로 그 쓰레드는 메인 루프를 처리하는 쓰레드에게 최소한의 부하를 주기 위해서 조력하..
2022.02.04 -
Thread Design
안녕하세요 대학생 개발자입니다. 저번 글에서는 피터슨 알고리즘을 끝으로 마무리를 지었었는데요... 이번 글에서도 피터슨 알고리즘에 대해서 조금 마무리를 짓고 나서 스레드 디자인으로 넘어가 보겠습니다. 피터슨 알고리즘이란 이런 것이죠. 언어적 차원에서의 논리적인 문제가 전혀 존재하지 않음에도 불구하고 cpu의 out of ordering excution에 의해서 load와 store의 순서가 뒤바뀌게 되고 그 뒤바뀜으로 인해서 결과가 이상해지는 그런 경우였던 거였죠... 근데 이 부분은 고칠 수 있을 것 같이 들립니다. { flag0 = true turn = 0; while(flag1 == true && turn == 0); } 바로 위 코드에서 문제가 되는 상황인 flag1이 load 되는 게 turn의..
2022.01.27 -
Out Of Ordering Excution
안녕하세요 대학생 개발자입니다. 저번 글에서는 동기화와 관련된 얘기를 계속 했었습니다. 이번글에서는 out of ordering excution에 대한 정리를 할겁니다. 우선 저 글을 정리하기 이전에 저번 글에서 마져 다 소개하지 못했던 내용들을 정리해놓고 시작하도록 하겠습니다. 저 그럼 시작하겠습니다. Event에 대한 얘기를 하고서는 마감을 했었던 것으로 기억합니다. 어떤 함수를 동기로 처리한다 라고 하면 이런 구조로 처리가 됩니다. ----|A:(return)|---- 저 사이구간은 다른 작업을 하지 못하고 A라는 함수에만 매달려 있어야 하므로 동기 함수라고 할 수 있죠. 근데 이걸 비동기화 시키고 싶다면 예전 같은 경우에는 ----(AThread생성)----- ---(A)---(return) 와 ..
2022.01.24 -
Synchronization2
안녕하세요 대학생 개발자입니다. 저번 글에서는 동기화에 대한 얘기와 동기화 객체에 대한 얘기를 간단히 했습니다. 오늘할 얘기도 별반 다르지 않습니다. 다만 다른점은 이번에 다룰 WaitOnAddress는 객체는 아니라는점이죠 ㅋㅋㅋㅋㅋ 주소를 가지고 기다리는 거니까... 객체는 아니잖아요? 어째뜬 시작해보도록 하겠습니다 WaitOnAddress가 뭔지 간단히 파헤쳐 보겠습니다. WaitOnAddress 방식의 동기화는 동기화 객체의 방식처럼 뭔가를 획득하고 안되고라는 개념은 아닙니다. 나는 어느 주소를 대상으로 기다리고 있을테니 니가 준비가 되면 나를 깨워줘의 느낌입니다. 네 그리고 WaitOnAddress의 경우에는 이 하나만 가지고는 동기화를 보장할 수 없습니다. 왜냐면... 주소를 기준으로 기다리기..
2022.01.21 -
Synchronization
안녕하세요 대학생 개발자입니다. 오늘은 시간이 많이 남아서 두번째글을 연달아서 쓰고있습니다. 이런날이 언제쯤 또 올수있을지... 한동안 해야할 일이 너무 많았기 때문에 바빳는데... 좋습니다 그럼 시작하겠습니다 저번 글에서는 쓰레드에 대한 얘기를 했었습니다. 쓰레드를 사용할때 어떤점을 주의해야되고 어떤점이 있으니 참고해야된다고 말씀드렸었는데요... 이번시간에는 쓰레드들간에 같은 공유자원을 사용할 때 어떤식으로 공유자원의 동기화를 걸 수있는지 몇가지 방법에 대해서 소개를 할겁니다. 그리고 동기화를 하는 알고리즘 몇가지를 소개할 예정입니다. 자 그러면 시작하겠습니다. 먼저 cpu차원에서의 동기화인 인터락 함수에 대해서 알아보겠습니다. 인터락이라는 것은 먼저 아주 간단하게 보자면 최소단위의 연산을 cpu가 보..
2022.01.21 -
Thread
안녕하세요 대학생 개발자입니다. 저번 글에서 동기화 객체에 대한 얘기를 했고 조금 짧은 글이었습니다.왜냐면... 이번글부터 쓰레드 부분인데 사실 쓰레드 부분에 들어가는 순간 어디서 끊어야할지 매우 난감하기 떄문에 중간에 한번 끊고 갈 수 밖에 없었던 부분입니다... 그리고 이번글을 시작하기전에 이번글의 표지사진은 이번글과는 관계가 없음을 알려드립니다. 멀티쓰레드에 대한 얘기를 해야되는데 아직 쓰레드에 대한 얘기도 못꺼냈습니다 ㅋㅋㅋ... 무려 4번째 글만에 드디어 쓰레드라는 제목을 달고 나왔긴 하지만... 사실 이글에서 쓰레드에 대한 모든부분을 다루지는 못할거에요... 그럼 일단 시작해보겠습니다.윈도우는 쓰레드 스케쥴링을 하는 os입니다. 물론 요새는 거의 대부분os가 쓰레드를 스케쥴링하는것으로 알고있습..
2022.01.20 -
Synchronization object
안녕하세요 대학생 개발자입니다. 제가 졸업하기까지 이제 거의 한달정도 남았는데 닉네임을 뭐로 바꿔야하는지 참고민이 많습니다... 그것보다 닉네임은 그렇다 치더라고... 블로그 주소는 어찌합니까... 이런 고민들이 참 많습니다... 째뜬 이건 중요하지 않습니다 중요한건 오늘 할 내용이겠죠 자 보면 저번 글에서까지 윈도우즈의 스케쥴링과 컨텍스트 스위칭에 대해서 간단히 알아봤습니다. 저부분에 관한건 계속 언급될겁니다 매우 중요하기 때문이죠... 일단 동기화 객체에 얘기하기 전에 동기화 객체가 왜 필요한지에 대한 언급이 먼저 나와야 될 것 같습니다. int g_Counter; void WorkerThread() { for(int i=0; i< 1000000 ; i++) g_Counter++; } 이런 코드가 있..
2022.01.19 -
windows scheduling
안녕하세요 대학생 개발자입니다. 이번 글에서는 저번 글에 이어서 윈도우즈의 스케쥴링 방식에 대해서 얘기를 더 해볼겁니다. 우선 스케쥴링이란게 뭔지 알아야될겁니다. 스케쥴링이란건... 뭐 간단히 따지면 어떤 쓰레드를 실행할 것이냐에 대한 부분인거겠죠 스케쥴링의 주체가 누구인지를 먼저 알아야 될 것 같은데요... 사실 윈도우가 스케쥴링 한다가 맞는말이겠지만... 좀더 구체적으로 어떤 계기로 스케쥴링이 발생하느냐 그리고 누가 직접 스케쥴링을 하느냐 에 대한 부분을 따지고 든다면 cpu자체가 스케쥴링의 주체이자 대상이 될겁니다. 무슨말인지 잘 이해가 안되실 수도있습니다. 간단히 설명하면 os는 코드에 불과합니다 결국 코드라는건 하드웨어 의존없이 혼자서 작동될 수 없는 것인데요... 결국 os의 스케쥴링이란것도 ..
2022.01.19 -
Windows preemptive priority based round-robin scheduling
안녕하세요 대학생 개발자입니다 이전 글에서는 싱글 스레드로 구현할 수 있는 간단한 mmo타입의 게임을 만들어봤습니다. 이번 글에서는 게임 서버 개발자가 되면 주로 접하게될 Windows Server, 즉 Windows OS에 대한 얘기를 해보려고합니다. os에 따라 내용이 다른 부분이 있을 수 있으니, 미리 Windows를 상정하고 말씀드린다는 부분 양해부탁드립니다. preemptive 우선 선점에 대한 개념부터 정리를 하고 넘어가겠습니다. 우선 우리가 일반적으로 사용하는 windows os는 선점형이냐 비선점형이냐 라는 부분인데요. 하지만 이 전에 우리가 먼저 따져봐야할 부분이 있습니다. 선점의 주체가 누가 되는것인가 입니다. OS가 선점의 주체가 된다면 스레드들은 OS의 관리를 받는 주체가 될 것입니..
2022.01.18 -
MMO_TCPFighter
안녕하세요 대학생 개발자입니다 이번글에서는 저번에 AsyncSelect 모델로 만들었었던 클라이언트의 서버를 만들어 볼 예정입니다. MMO식으로 바꿔서 약 7천명의 더미 봇들을 넣고 테스트를 해볼겁니다. 소켓 모델에 대해서 소개를 해야겠습니다. MMO라고 하면 일반적으로 IOCP를 떠올리시겠지만... 이번프로젝트는 여전히 싱글스레드 + select모델입니다. (왜냐... 아직 멀티스레드에 대한 언급을 안했기 때문에) iocp의 구현이 안됩니다. 그리고 select모델을 이용해도 7000명수용...뭐 큰 문제 없었습니다. 간단한 클라이언트 수정부분에 대해서만 설명드리고 본격적으로 서버에 대한 내용으로 넘어가겠습니다. 우선 클라이언트 기존의 경우에는 MO방식이었죠... 그래서 맵 크기도 640 480 이었습..
2022.01.17 -
Chatting Server
안녕하세요 대학생 개발자입니다. 요새 날씨가 많이 춥습니다... 어디 나갈때마다 손발이 얼어붙을거같은데요 역시 이런날에는 집에 짱박혀서 코딩이나 하면서 블로그 쓰는게 제일 좋은거 같아요 그럼 시작하도록 하겠습니다. 이번 글에서 제가 다뤄볼 내용은 채팅서버입니다. 채팅서버는 서버 중에서 가장 난이도가 쉬운 서버중 하나인데요... 이유가 채팅의 경우에는 온 데이터를 따로 가공하지 않고 그대로 돌려보내는 에코서버와 비슷한 방향으로 구현이 되기 때문입니다. 물론 채팅도 중간에 내용을 변경해야되는 경우가 있다면 변경해야되겠지만(욕설 필터링 과같은) 이번 서버에서는 그런게 없기 때문에 그냥 온 패킷 그대로 돌려주는 경우가 많았습니다. 그리고 가장 중요한것은 채팅서버는 온 경우 바로 그자리에서 반응을 취하는 구조이기..
2021.12.30 -
Red-Black tree delete
안녕하세요 대학생개발자입니다. 저번 글에 이어서... 레드블랙트리에 대해서 얘기를 해보려고 합니다. 생각보다 포스팅간의 텀이 길어졌는데요... 제가 실수로 다만들어놓고 삭제를 해버리는바람에 ^^... 다시만들었답니다^^^^ 그래도 다행인게 한번 만들어 보니까 그다음에 만들때는 금방 만들더라구요... 그와 동시에 이해도도 조금 상승한 것 같습니다... 바로 시작하도록 하겠습니다. 우선 삭제과정까지는 이진탐색트리와 동일합니다. 삭제노드의 자식이 하나이하일 케이스에서는 자기 노드를 바로 삭제하고 아래노드로 연결시켜주면 끝납니다. 삭제노드의 자식이 둘일경우에는 - 오른쪽 자식중 가장 작은 노드를 삭제하면서 그 값을 타겟에 넣거나 - 왼쪽 자식중 가장 큰 노드를 삭제하면서 그 값을 타겟에 넣는 방법이 있습니다. ..
2021.12.23