1. 해킹 공격에서 안전해야함 악성 유저가 의도적으로 굉장히 많은 패킷을 보내어 서버를 마비 시키거나 패킷을 보내지 않는 등 다양한 네트워크 공격이 있을 수 있다. 2. 네트워크를 보내는 방식과 택배를 보내는 방식이 매우 유사 아파트 단지마다 경비실이 있고 택배 배송 센터가 있다. 1) 아파트 단지 내에서 택배를 주고 받을 때, 경비실을 거쳐서 배송받아야 한다면, 보내는 사람과 받는 사람의 호수만 알면 보낼 수 있다 2) 다른 아파트로 택배를 보내야할 때는, 경비실 -> 택배 배송 센터를 거쳐서 보내야한다. -> 이때는 호수뿐만 아니라 아파트 이름까지 다 알아야 보낼 수 있다. 3. 네트워크 기초 각각의 아파트 호수: 단말기 경비실: 스위치 택배 배송 센터: 라우터로 이해 1) 위의 1번의 경우는 같은 ..
1. 이전시간 Spinlock & Mutex : Spinlock 또한 미리 구현된게 있기때문에 이전 시간처럼 Spin lock 클래스를 구현할 필요없이 바로 사용하면 됨 1) Enter() 함수를 통해 임계 구역에 들어갈 수 있도록 하고 Exit() 함수를 통해 빠져나오도록한다. 이때 결과값을 lockTaken 인자로 받아서 준다. * lockTaken으로 성공여부를 알 수 있다.(이미 임계 구역에 들어가있는 스레드가 있을 경우 false 반환) 2) try- finally~ 문을 사용하여 exception 발생 시 finally를 통해 locckTaken이 true 일시 잠금을 해제하도록 한다. 3) 기본적으로 Spinlock은 임계 구역에 들어가기 전까지 사용자 모드에서 계속 기다리지만, 정말 안될 ..
1. 어떤 스레드가 임계 구역에 이미 들어가있을때, 다른 스레드는 어떻게 해야하는 가? a) 프로세스가 임계 구역에 빠져나올때까지 기다린다. (Spin Lock) -> 임계 구역에 들어간 프로세스가 굉장히 오랫동안 작업을 할 수 있음 -> 단순히 기다린다고 생각하지만, 프로세스가 임계 구역에 있는지를 계속 확인해야하기 때문에 오랫동안 기다릴 시 CPU 점유율이 확올라간다. b) 제자리로 돌아온 후 나중에 (몇 분 후에 랜덤하게 )다시 접근한다. (Context Switching) -> 랜덤하게 상황이 발생, 내가 제자리로 간 직후 다른 프로세스가 임계 구역에 들어갈 수 있다. 내가 다시 접근했을때 바로 임계 구역에 들어갈 수 있을지는 미지수 -> CPU의 소유권을 포기하는 의미: 해당 CPU는 다른 작업..
Interlocked의 단점: 정수를 다루는 작업만 할 수 있음. 다양하고 긴 코드를 작성하고 그때마다 모든 코드에 Interlocked를 해줄 수 없다. 1. 임계 구역(Critical Section) : 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원을 접근하는 코드의 일부를 말한다. 공유 자원에 접근하여 수정하고 write을 하는 것에서 문제가 발생 2. Monitor Interlocked보다는 구역을 정해놓고 해당 구역에 들어가면 다른 스레드는 접근 못하도록 하는 방식이 더 좋음 -> Monitor 아래의 코드를 보면 전역 변수로 object를 만들고 임계 구역 전에 Monitor.Enter를 통해 어떤 스레드가 공유 자원을 사용하고 있음을 알린다. 임계 구역에 빠져나오면 Monitor.E..
전에 배운 메모리 베리어를 사용하지 않더라도 다양한 방법이 있다. 1. 공유 변수 접근 문제점 1) 하나의 공유 변수 number를 두고 Thread_1은 for 루프 1000번동안 number++하는 동작을 하고 Thread_2는 for 루프 1000번 동안 number--을 하는동작을 한다. 2) 메인 함수에 Task 2개를 만들어서 각각 Thread_1과 Thread_2를 동작하는 스레드를 실행하도록 한다. 3) 해당 스레드가 끝날 때까지 Task.WaitAll로 기다린 후 콘솔에 number을 출력하면, 직관적으로 생각한 것과 같이 0이 나온다. * 하지만, for문의 횟수를 늘리면 이상한 값이 나온다. namespace SeverCore { class Program { // 공유 변수 - 전역 ..
1. 스레드의 전역 변수 접근 아래의 코드를 보면 ThreadMain은 누군가가 전역변수 _stop을 true로 바꾸지 않으면 계속 무한 루프를 돌아서 프로세스가 끝나지 않는 함수이다. 1) Main 함수에서 Task를 이용하여 ThreadMain을 실행하는 스레드를 생상한다.(ThreadPool 중 하나의 Thread에게 ThreadMain을 실행하도록 함) 2) 후에 Main 함수(Main Thread)를 1초 동안 잠들게 한다. (Task 스레드가 실행하도록) 깨어나면 메인 스레드가 _stop을 true로 바꾼다. 이때 Task 스레드가 while문에서 빠져나올 수 있다 3) t.Wait()(Thread에서 Join 함수와 같은 역할)을 통해 Task t가 종료되기를 기다린 후 메인 함수 종료하도록..