분류 전체보기 504

[C#서버] TCP VS UDP

TCP 연결형 서비스(택배)1) 연결을 위해 할당되는 논리적인 경로가 존재한다.2) 전송 순서가 보장된다.3) 데이터 경계가 없어 packet을 한 번에 온전하게 받을 수 없을 때가 존재한다.속도와 신뢰성1) 패킷 유실이 일어나면 책임지고 다시 전송한다. 2) 물건을 주고 받을 상황이 아니면 일부만 보낸다.(흐름/혼잡제어)3) 고려할 것이 많으니 속도가 좋지 않다.UDP 비연결형 서비스(이메일, 비디오플레이)1) 연결이라는 개념이 없다.2) 전송 순서 보장되지 않는다.3) 데이터 경계가 존재하여 한 번 보낸 패킷을 온전하게 받을 수 있다.속도와 신뢰성1) 분실에 대한 책임을 지지 않는다.2) 일단 보내고 생각한다.3) 단순하기 때문에 속도가 빠르다.

[C#서버] 블로킹(Accept)와 논블로킹(AcceptAsync)

아래와 같이 Socket문법에서 Accept()는 블로킹 함수이다. 블로킹 함수란 무한정 대기한다는 뜻이다. 무수한 유저를 받기위해서는 블로킹 함수를 채택하는 것 은 바람직 하지 않을 수 있다. 결국 논블로킹 방법을 사용해야한다. 동기방식인 블로킹 문법 Accept() Socket _listenSocket; _listener.Accept() 비동기방식인 논블로킹 문법 AcceptAsync() internal class Listener { Socket _listenSocket; Action _onAcceptHandler; public void Init(IPEndPoint endPoint, Action onAcceptHandler) { //문지기 _listenSocket = new Socket(endPoin..

[C#서버][소스] 기본 서버, 클라이언트 소스

서버 static void Main(string[] arg) { //DNS (Domain Name System) -> www.xxxxx.com string host = Dns.GetHostName();//host는 goole.com 도메인주소 IPHostEntry ipHost = Dns.GetHostEntry(host);//도메인 주소를 통해 ip획득위해 IPAddress ipAddr = ipHost.AddressList[0];//0번은 ip6, 1번은 ip4 IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777); //문지기 Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, Prot..

[C#서버] TLS(Thread Local Storage) - 쓰레드로컬(ThreadLocal)

만약 멀티스레드 환경에서 수 많은 멀티스레드가 어떤 하나의 자원을 점유하고자 할 때 락이 잡혀 있다면 하나의 쓰레드 하나가 처리하는 속도 보다 못 할 수 있다. 이 때 쓰레드 각각 전용 공간에서 힙영역을 참조하면 효과적일 수 있다. 이러한 공간을 TLS라고 한다. (TLS의 하나의 예시일 뿐) ThreadLocal 만약 아래와 같이 static으로 선언된다면 프로젝트 내에 여러 곳 에서 사용될 수 있어 쓰레드에게 영향을 미치지만 ThreadLocal 키워드를 사용하면 각각 쓰레드마다 전용공간이 생긴 것 이기 때문에 다른 쓰레드에서 이름을 변경하여도 영향을 주지 않는다. 즉 공용 메모리를 사용하지 않는다. static ThreadLocal ThreadName = new ThreadLocal(); inter..

[C#서버][개념] 임계영역 특수락 - ReaderWriterLockSlim 특수상황 Lock 처리 방법

ReaderWriterLockSlim 이 클래스는 읽기 작업과 쓰기 작업 간의 동시성을 최적화하기 위해 설계되었습니다. ReaderWriterLockSlim은 일반적으로 읽기 작업이 많이 발생하고 쓰기 작업이 적은 상황에서 사용됩니다. 이 클래스를 사용하면 여러 스레드가 동시에 읽기 작업을 수행할 수 있지만, 쓰기 작업은 배타적으로 수행됩니다. 다시 말해, 한 스레드가 쓰기 작업을 수행하는 동안에는 다른 스레드는 읽기나 쓰기 작업을 할 수 없습니다. 평상시에는 Read락을 사용하다 특수한경우 어떤 쓰레드가 WriteLock을 사용하면 ReadLock을 사용하는 다른 모든 쓰레드는 자원을 사용하지 못하게 된다. class Reward { } static ReaderWriterLockSlim _lock = ..

[C#서버][개념] 임계영역와 Evnet락 (AutoResetEvent & ManualResetEvent)

AutoResetEvent 스레드가 AutoResetEvent를 기다리고 있는 동안 다른 스레드가 이 이벤트를 발생시키면, 대기 중인 하나의 스레드만 깨어납니다. 그 후, AutoResetEvent는 자동으로 리셋됩니다. Set 메서드를 호출하면 한 번만 대기 중인 스레드 중 하나가 깨어나고, 이벤트는 자동으로 리셋됩니다. 커널 동기화, 톨게이트느낌, _available.WaitOne(); 아래에 _available.Reset();사용하지 않아도 자동으로 락을 닫아준다. class Lock { //bool

[C#서버]임계영역과 SleepLock(컨텍스트스위칭)

Context Switching 컨텍스트 스위칭(Context Switching)은 운영 체제에서 실행 중인 여러 프로세스나 스레드 간에 실행을 전환하는 작업을 말합니다. 이러한 전환은 CPU가 한 작업에서 다른 작업으로 전환되는 과정을 포함합니다. 프로세스나 스레드는 실행을 위해 CPU를 사용하며, 한 프로세스나 스레드가 실행되고 있는 동안에도 다른 프로세스나 스레드로 전환될 수 있습니다. 이러한 전환은 여러 이유로 발생할 수 있습니다. 시분할(Time Slicing): 운영 체제는 CPU 시간을 여러 프로세스나 스레드에게 나누어 주어 각각에게 일정 시간 동안 실행할 기회를 부여합니다. 이 시간이 지나면 다른 프로세스나 스레드로 컨텍스트 스위칭이 발생합니다. 인터럽트(Interrupt): 하드웨어 인터..

[C#서버][개념] Thread.sleep 종류

Thread.Sleep(1) 무조건 1ms 쉰다. Thread.Sleep(0) 조건부 양보 나보다 우선순위가 낮은 애들한테는 양보 불가 => 우선순위가 나보다 같거나 높은 쓰레드가 없으면 다시 자기자신 실행우선순위낮은 쓰레드는 기아현상 발생가능 Thread.Yield() 관대한 양보 => 관대하게 양보할테니 지금 실행이 가능한 쓰레드가 있으면 실행해라 => 실행 가능한 쓰레드가 없으면 남은 시간 자신에게 소진

[C#서버][개념] 임계영역 Spin락(스핀락(SpinLock))

SpinLock- 무작정 기다리는 방법 (단점 cpu점유율이 많이올라감) Context Switching - 소유권 포기후 다시접근하는 방법 AutoResetEvent - 운영체제 예약시스템으로 이벤트 사용하여 비어있으면 호출하여 접근 SpinLock SpinLock은 C#에서 제공되는 스레딩 동기화를 위한 클래스 중 하나입니다. SpinLock은 다른 스레딩 동기화 메커니즘과 달리 스레드가 잠금 해제될 때까지 계속해서 "스핀"하면서 대기하는 방식으로 동작합니다. 스핀은 프로세서가 일정한 시간 동안 루프를 실행하면서 아무 일도 하지 않는 것을 말합니다. SpinLock은 기본적으로 레커시브하지 않으며, 스핀을 사용하여 잠금을 획득하려고 시도합니다. 스핀락은 단일 프로세서 시스템에서는 효율적일 수 있지만,..