Server programming61 01_15_멀티쓰레드_ThreadLocalStorage Q1. TLS를 사용하는 게 무슨 이득이 있는가? Q2. TLS의 Value에 값을 반복해서 값을 넣지 않게할 방법은 무엇인가? Q3. TLS를 날리고 싶다면? 전역 변수인데 스레드마다 고유하게 접근할 수 있는 전역변수라고 생각하면 된다. 이게 왜 필요한지 알아보자. 각 일들이 서로 연관성이 있을 거야. 이리저리 화살표로 옮겨다니면서 하는 경우가 있어. 경합이 일어날만한 모든 장소에다 락을 걸면 어떻게 될까? 주방 내에서도 동기화 작업이 필요할 수 있다. 요리사가 두명 존재하는데 만약 같은 주방 공간 사용하면 서로 방해가 될거야. 그래서 락이 필요하게 될거고, 서빙하는 사람 입장에서도 10번 테이블이라고 하면 동시 다발적으로 10번 테이블로 올 수 있다. 두명의 직원이 동시에 한 테이블에 몰리는 건 말이.. Server programming 2023. 3. 31. 01_14_멀티쓰레드_ReaderWriteLock구현 연습 Q1. WriteLock은 상호 배타적, ReadLock은 상호 배타적이 아니게 한 원리를 설명하세요. Q2. ReadLock은 해도 이상한 값이 나오는 이유를 설명하세요. Q3. 재귀적으로 Lock을 할 때 허용되는 경우와 허용되지 않는 경우는? 이유는? Q4. ReadLock에서 A,B가 동시에 진입할 때 flag가 잘 카운트 되도록 한 방법은? Lock free 프로그래밍이라는 기법이랑 유사한데 처음하면 헷갈리고 어렵긴 해. 어렵다면 한번 구경만 하고 넘어가도 된다. ServerCore에서 새 항목을 추가해서 Lock이라는 별도의 파일로 빼서 만들어 보자. namespace ServerCore { internal class Lock { // [Unused(1)] [WriteThreadId(15)] .. Server programming 2023. 3. 24. 01_13_멀티쓰레드_ReaderWriteLock Q1. 지난 시간에 알아본 기본 락 세가지 형태에 대해 설명해 보세요 Q2. 실용성있는 락 3가지를 말하고 설명해 보세요 이전시간 까지 락을 구현하는 세가지 방법에 대해 얘기 했었어. 잠시 복습 근성 양보 갑질 어떤게 더 좋다는 개념은 없어. 락을 사용할 때 하나만 골라서 쓰지 않고 대부분 라이브러리에서 여러가지 혼합해서 사용하는 경우가 많다. using System; using System.Threading; using System.Threading.Tasks; namespace ServerCore { internal class Program { // 1. 근성 // 2. 양보 // 3. 갑질 // 내부적으로 Monitor를 이용 // 버전1 static object _lock = new object(.. Server programming 2023. 3. 21. 01_12_멀티쓰레드_AutoResetEvent Q1. AutoResetEvent, ManualResetEvent, Mutext, SpinLock의 특징과 차이를 말해 보고 어떨 사용하면 될지 설명해 보세요. 이 직원이 식당 직원이 아냐 이런 식으로 커널 레벨, 즉 아래 레벨에 있는 관리자 쪽에 있는 직원이었어. 랜덤메타보다 더 느리다 생각하면 된다. 본인 입장에서는 자물쇠 풀릴 때만 행동 이어간다는 장점이 있어. C#에서 이벤트를 사용할 때는 2가지가 있다. AutoResetEvent 가 있어. 톨게이트를 생각하면 된다. 하나씩 지나가는 거 물을 열고 나간 다음에 문을 안닫으면 몇대의 차든 이 문을 통과할 수 있다는 얘기가 된다. 코드로 가서 구현을 해보자. class Lock { AutoResetEvent _available = new AutoRe.. Server programming 2023. 3. 16. 01_11_멀티쓰레드_ContextSwitching Q1. Thread.Sleep(1); Thread.Sleep(0); Thread.Yield(); 의 차이점에 대해 말해보세요. Q2. ContextSwitching 할 때 일어나는 일에 대해 말해보세요. 지난 시간에 스핀락에 대해 알아 봤어. 자리로 돌아와서 기다렸다 몇 분 후 다시 화장실이 비었는지 확인하는 그런 개념 public void Acquire() { while (true) { //int original = Interlocked.Exchange(ref _locked, 1); //if (original == 0) // break; // CAS Compare-And-Swap int expected = 0; int desired = 1; if (Interlocked.CompareExchange(re.. Server programming 2023. 3. 15. 01_10_멀티쓰레드_SpinLock Q1. 락을 구현할 때 Interlocked.CompareExchange를 이용하는 이유는 무엇인가? Q2. 스핀락을 안보고 구현해 보세요. namespace ServerCore { class SpinLock { volatile bool _locked = false; public void Acquire() { while(_locked) { // 잠김 풀리기를 기다린다 } // 내꺼! _locked = true; } public void Release() { _locked = false; } } internal class Program { static int _num = 0; static SpinLock _lock = new SpinLock(); static void Thread_1() { for(int .. Server programming 2023. 3. 15. 01_09_멀티쓰레드_Lock 구현 이론 Q1. 락의 구현 방법을 3가지로 나눠보고, 비행기 화장실에 비유하여 설명해 보세요. 락이 어떻게 동작하는지 알아야 해. 일단 이론으로 보자. 단점은 들어간 사람 안나오면 시간 낭비 자리 돌아가자마자 화장실에서 나오거나 비자마자 다른 사람이 들어가면 더 오래걸릴 수 있어. 시간을 효율적으로 활용할 수도 있지만 렌덤이야. 직원에게 망 보게 하는거 통보 받고 화장실 가면 깔끔하게 된다. 하지만 직원 입장에서는 부담이 된다. 이렇게 3가지 방법을 알아봤는데 구현할 때도 똑같다. 존버 메타 : 스핀락, 계속 뺑뺑이 돌면서 나오나 체크하는 거. 안에 있는 애 안나오면 허탕. 컴퓨터 입장에서느 대기 한다는 건 빙의해서 스레드를 계속 실행 시키는 거 가변운 작업 아냐. 무한루프 도는 거라 CPU 점유율 올라간다. 계.. Server programming 2023. 3. 14. 01_08_멀티쓰레드_DeadLock Q1. DeadLock이 발생하는 경우의 예를 설명해 보세요. Q2. DeadLock이 발생할 확률을 줄이는 방법을 두 가지 설명해 보세요. 오른쪽 직원은 하염없이 기다리는 상태 왼쪽 직원 나오면 오른쪽 직원이 똑같이 들어가서 문 잡그고 사용하는 상태 데드락은 한 직원이 들어가서 영영 풀어주지 않으면 다른 직원 영영 못들어가는 상황 되는 거 Lock이라는 키워드로 자동으로 Lock을 해제하는 거 까지 알아봤다. 데드락 중에서 가장 기초적이고 간단한 부분에 속한다. 일반적인 상황에서는 좀 더 고차원적인 상황에서 발생한다. 둘 다 잠궈야 들어갈 수 잇는 상황 각자 하나씩 잠궜어. 나머지 하나의 자물쇠도 획득하려고 노력한다. 영원히 서로 두개를 동시에 획득하는 경우는 없을거야. 서로 뺑뺑이로 물고 물리는 상황.. Server programming 2023. 3. 14. 01_07_멀티쓰레드_Lock 기초 Q1. Interlocked계열의 단점을 2개 말해 보세요. Q2. Monter.Enter(_obj), Monter.Exit(_obj)를 화장실에 비유해 설명해보세요. Q3. Monter.Enter(_obj), Monter.Exit(_obj)를 사용했을 때 문제점을 말해 보세요. 화장실에 비유해 설명해 보세요. Q4. 해결방법을 2가지 말해 보세요. Interlock 계열이 성능 빠르고 우수하긴 한데 치명적인 단점이 있다. int afterValue = Interlocked.Increment(ref number); 이런 식으로 정수만 사용할 수 있다는 단점이 있다. 나중에 멀티 스레드 코드를 짤 때는 static void Thread_1() { for (int i = 0; i < 1000000; i++).. Server programming 2023. 3. 13. 01_06_멀티쓰레드_Interlocked Q1. 경합조건을 식당의 일화에 비유해 설명해 보세요. Q2. 각 스레드에서 10000회씩 1을 더하고 빼주는 코드에서 경합조건이 왜 발생했는지 설명해 보세요. Q3. 원자성에 대해 설명해 보세요. Q4. 코드의 경합조건을 해결해 보세요. Q5. Interlocked. 계열의 함수의 단점은 무엇인가요? Q6. Interlocked의 기능중 한번에 일을 한다는 것 말고 어떤 기능이 있는지 설명하세요. 그 기능이 왜 Q5의 단점의 원인이 되는지 설명하세요. Q7. 원자성을 추가했을 때의 상황을 식당에 비유해 설명해 보세요. Q8. Interlocked.Increment(ref number);에서 매개변수를 ref로 넣어준 이유는 무엇인지 설명해 보세요. Interlocked.Increment의 결과값을 알려.. Server programming 2023. 3. 13. 01_05_멀티쓰레드_메모리 베리어 Q1. MemoryBarrier의 기능 두가지를 설명해 보세요. 컴파일러가 최적화 한게 오히려 독이 되었던 걸 지난 시간에 살펴봤어. 컴파일러 뿐만 아니라 하드웨어도 그런 짓을 하고 있어. 오늘은 하드웨어 최적화 실습을 해보자. 일단 지난 시간 코드를 다 지우고 만들어 보자. namespace ServerCore { internal class Program { static int x = 0; static int y = 0; static int r1 = 0; static int r2 = 0; static void Thread_1() { y = 1; // Store y r1 = x; // Load x } static void Thread_2() { x = 1; // Store x r2 = y; // Load.. Server programming 2023. 3. 13. 01_04_멀티쓰레드_캐시이론 Q1. 코어가 여러개면 어떤 문제가 발생하는지 식당에서 음료수 주문을 번복하는 것에 빗대어 설명해 보세요. Q2. 무엇을 캐시할 것이냐에 대한 캐시철학 두 가지를 식당에서 일어나는 일에 빗대어 설명해 보세요. Q3. arr[10000][10000] 배열에 1을 arr[x,y] 순서로 넣는 것과, arr[y,x] 순서로 넣는 것과 걸리는 시간 다른 이유가 무엇인지 설명해 보세요. 컴퓨터 구조 원리 : 캐시 손님이 몰려오다 보니 일처리 어떻게 할지 고민되기 시작했어. 주문 받은 내용을 주방에 전달해야 주문이 들어가. 주문 현황에다가 주문 받은 내용 기입하면 주방에서 확인해서 요리에 들어가는 구조로 되어 있다 주문 받아 주문현황판에 왔다 갔다 하는게 시간이 아깝다는 문제가 있어. 주문을 받자마자 주문 현황판에.. Server programming 2023. 3. 12. 이전 1 2 3 4 5 6 다음