목록분류 전체보기 (77)
For me

Listener 1. _listenSocket.AcceptAsync(args); 이함수를 실행하면 비동기적으로 계속해서 연결요청이 있는지 확인 2. 연결 요청이 왔을시 내부에서 누군가가(닷넷)args.Completed.Invoke(sender, args) 실행 3. 등록했던 이벤트 OnAcceptCompleted 가실행됨 바로 접속하면 직접 OnAcceptCompleted 를 실행 (pending이 false일 경우) => Callback 함수를 실행할 수 없기 때문에 나중에 접속하면 args.Completed.Invoke()를 통해 실행 => 클라이언트의 입장을 기다리다가 입장 신청을 하게되면 OnAcceptComplete를 콜백으로 실행 MSDN 참고자료 Socket.AcceptAsync 메서드 (S..

소켓 준비 서버 주소로 Connet 소켓을 통해 Session 소켓과 패킷 송수신 가능 Listener 소켓 준비 Bind ( 서버 주소, Port 소켓 연동) Listen Accept => 클라 세션을 통해 사용자와 연결 가능 Server using System; using System.Net; using System.Net.Sockets; using System.Text; namespace ServerCore { class Program { static void Main(string[] args) { //DNS (Domain Name System) string host = Dns.GetHostName(); IPHostEntry ipHost = Dns.GetHostEntry(host); IPAddres..
using System; using System.Threading.Channels; using System.Threading.Tasks; namespace ServerCore { class Program { private static ThreadLocal ThreadName = new ThreadLocal(() => { return $"My Name is {Thread.CurrentThread.ManagedThreadId}"; }); static void Thread1() { bool repeat = ThreadName.IsValueCreated; if (repeat) { Console.WriteLine(ThreadName.Value + "(repeat)"); } else { Console.WriteLi..
ReaderWriterLock 구현 using System; namespace ServerCore { // 재귀적 락 허용 => WriteLock -> WriteLock, WriteLock -> ReadLock (O), ReadLock -> WrtieLock (X) // 스핀락 정책 (5000번 -> Yield) public class Lock { private const int EMPTY_FLAG = 0x0000000; private const int WRITE_MASK = 0x7FFF0000; private const int READ_MASK = 0x0000FFFF; private const int MAX_SPIN_COUNT = 5000; // [Unused(1)] [WriteThreadId(15)]..
AutoResetEvent using System; using System.Threading.Channels; namespace Server { // Event는 커널영역(운영체제)에 요청 -> 큰 비용 부담 class Lock { // bool 큰 비용 부담 class Lock { // bool

1) 무조건 대기 무조건 1ms 대기 Thread.Sleep(1); 2) 조건부 양보 우선순위가 낮은 애들한테는 양보 X => 우선순위가 나보다 같거나 높은 쓰레드가 없으면 다시 본인에게 Thread.Sleep(0); 3) 지금 실행 가능한 쓰레드가 있으면 실행 실행 가능한 애 없으면 남은 시간 소진 Thread.Yield(); 이 방법들은 좋기만 한가? 자비롭지만, 좋기만하진않음. 컨텍스트 스위칭 비용 발생 컨텍스트 스위칭 여러개의 프로세스가 실행되고 있을 때 기존에 실행되던 프로세스를 중단하고 다른 프로세스를 실행하는 것 CPU에 실행할 프로세스를 교체하는 기술 PCB (Process Context/Control Block) 별도 공간에 process 상태값들을 저장하고, 해당 값들을 찾는 방법으로 ..
SpinLock 1) bool 형식을 사용하여 구현 당연한 결과지만.. class SpinLock { volatile bool _locked = false; public void Acquire() { while (_locked) { } _locked = true; } public void Release() { _locked = false; } } 결과 작동 X 2) Interlocked.Exchange() 을 이용하여 구현 class SpinLock { volatile int _locked = 0; public void Acquire() { while (true) { int original = Interlocked.Exchange(ref _locked, 1); // original 에서는 하나의 스레드에..
DeadLock 상황 using System; namespace Server { class SessionManager { private static object _lock = new object(); public static void SessionTest() { lock (_lock) { } } public static void Test() { lock (_lock) { UserManager.Test(); } } } class UserManager { private static object _lock = new object(); public static void UserTest() { lock (_lock) { } } public static void Test() { lock (_lock) { Sessi..
Interlocked의 단점 - 정수만 사용 가능 Lock using System; namespace Server { class Program { private static int number = 0; private static object _obj = new Object(); static void Thread1() { for (int i = 0; i < 10000; i++) { Monitor.Enter(_obj); number++; Monitor.Exit(_obj); } } static void Thread2() { for (int i = 0; i < 10000; i++) { Monitor.Enter(_obj); number--; Monitor.Exit(_obj); } } static void Main..

using System; namespace Server { class Program { private static int number = 0; static void Thread1() { for (int i = 0; i < 10000; i++) { number++; } } static void Thread2() { for (int i = 0; i < 10000; i++) { number--; } } static void Main(string[] args) { Task t1 = new Task(Thread1); Task t2 = new Task(Thread2); t1.Start(); t2.Start(); Task.WaitAll(t1, t2); Console.WriteLine(number); } } } 위와 ..