본문 바로가기
cs공부/네트워크프로그래밍

네트워크 프로그래밍 - non-blocking code에 대해 더 알아보기

by 코딩하는 돼징 2023. 7. 3.
반응형

blocking 및 non-blocing에 대해 알아보러 가기

 

네트워크프로그래밍 - blocking(send등), non-blocking(BeiginSend,SocketAsyncEventArgs등)

입출력 작업은 블로킹(blocking) 또는 논블로킹(Non-blocking)방식으로 수행된다. 1. 블로킹(Blocking) 블로킹 방식에는 입출력 작업이 완료될 때까지 호출한 함수가 대기한다. 입출력 함수가 호출되면,

code-piggy.tistory.com


1. 유저들이 많이 몰리는 경우 문지기들을 여러 설치 하는 방법

* 낚시대가 10개가 된다는 것으로 이해하면 쉬움

for( int i = 0 ; i < 10 ; i++ )
{
   SocketAsyncEventArgs args = new SocketAsyncEventArgs();
   args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted);
   RegisterAccept(args);
}

2. OnAccetCompleted가 어떻게 실행되는 걸까?

우리의 메인 쓰레드 부분은 계속 무한 반복을 하고 있는데 어떻게 OnAccetCompleted가 어떻게 실행되는지 알아보자

메인 쓰레드 부분

while (true)
{
    ;
}

작업자 쓰레드 부분

void OnAcceptCompleted(object sender, SocketAsyncEventArgs args)
{
    if(args.SocketError == SocketError.Success)
    {
        //todo
        _onAcceptHandler.Invoke(args.AcceptSocket);
    }
    else
        Console.WriteLine(args.SocketError.ToString());
    // 다음아이를 위한 등록
    RegisterAccept(args);
}

우리의 코드에서는 Task나 Thread를 만든적이 없지만 AcceptAsync를 만들어가지고 콜백함수는 비동기 작업 쓰레드 풀 에서 호출되며 이를 통해 별도의 쓰레드에서 실행됨을 알 수 있다.

비동기 작업은 작업자 쓰레드 풀에서 관리되며, 작업이 요청시 쓰레드 풀 중 하나의 쓰레드가 할당되어 작업이 처리된다. 작업 완료시 해당 쓰레드는 다음 작업을 처리하기 위해 풀로 반환된다.

 

만약 OnAcceptCompleted와 Main쓰레드가 동시에 같은 데이터를 건드리면 어떻게 될까?

RaceCondition문제가 발생하게 된다.

 

그러므로 작업자 쓰레드 부분이 멀티쓰레드로 실행이 될 수 있다는 것을 염두하자


non - blocking 코드 보러 가기

 

네트워크프로그래밍 - C# 간단한 Non - blocking 사용한 Server 소켓프로그래밍 구현

blocking방식 이용한 Server코드 네트워크 프로그래밍 - C# 간단한 Server 소켓프로그래밍 구현 소켓프로그래밍 과정 알아보러가기 네트워크프로그래밍 - 소켓 프로그래밍(클라이언트 관점, 서버관점)

code-piggy.tistory.com

 

 

 

 

 

 

 

 

참고 :  본 내용은 MMORPG  PART4 강의를 수강하여 작성하였습니다.

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4

 

반응형

댓글