본문 바로가기

게임개발/게임서버11

메모리 배리어 1. 메모리 배리어 정의 중앙처리장치(CPU)나 컴파일러에게 특정 연산의 순서를 강제하는 기능 2. 메모리 배리어가 없을시의 문제점 중앙처리장치와 컴파일러는 멀티스레드 환경에서 개발자가 의도한 로직 순서를 뒤바꿀 수도 있는데 로직 실행 순서가 바뀌어 실행된다면 잘못된 결과가 발생할 수 있다. 3. 메모리 배리어의 용도 - 코드 재배치 억제 int a = 0; void Thread_A() { a = 10; console.writeLine(a); } void Thread_A() { a = 10; Thread.MemoryBarrier(); console.writeLine(a); } 멀티 스레드 환경에서 메모리 배리어가 없으면 무조건 "a=10" 라는 연산이 처음부터 실행되는 게 아니라 "console.writ.. 2024. 4. 18.
멀티 쓰레드 프로그래밍 프로그램 실행되기 전까지 HDD, SDD 같은 보조기억장치에 저장되어 있는 데이터 덩어리 프로세스 프로그램이 메모리에 적재되어서 실행될 때 프로세스가 만들어짐 * 백그라운드 프로세스 : 사용자와 상호작용하지 않는 프로세스로 데몬(유닉스 체계), 서비스(윈도우)가 있다. 메모리에 상주하면서 특정요청이 오면 즉시 대응할 수 있도록 대기중인 프로세스이다. PCB(Process Control Block) 프로세스가 실행되기 위해서 CPU를 필요로 하는데 CPU 자원은 한정되어 있으므로 모든 프로세스가 CPU를 점유할 수 없다. 프로세스들은 차례대로 한정된 시간만큼 CPU를 점유하고 한정된 시간이 끝나면 CPU 점유권을 다른 프로세스에게 넘긴다. 이러한 방식을 운영체제는 PCB를 이용해서 빠르게 번갈아 수행하는 .. 2024. 4. 17.
멀티쓰레드 Lock 구현 방식 1. SpinLock Lock을 얻기 위해 계속해서 Lock 획득을 할 때 까지 루프를 돌면서 수행하는 방식으로 하나의 쓰레드가 Lock을 오랜시간동안 점유하고 있다면 다른 쓰레드는 Lock을 획득하기 위해서 루프를 돌면서 Lock이 풀렸는지 계속 확인하므로 CPU에 부담이 가해진다. SpinLock 코드 using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace ServerCore { class SpinLock { // volatile 키워드를 사용해서 가시성 역할 수행 volatile int _locked = 0; public void Acquire() { // .. 2024. 1. 15.
소켓 프로그래밍 소켓이란? OS는 User(사용자)영역과 Kernel(커널)영역으로 나뉘는데 OS 커널 영역에 구현되어 있는 프로토콜 요소(TCP, IP ..등)에 대한 추상화된 인터페이스를 소켓이라 부른다. 윈도우에서 메모장에 글을 쓰고 저장할 때 물리적으로 디스크에 저장이 되는데 디스크에 저장이 되기 전에 사용자와 커널 영역 사이에서 파일 형태라는 추상화된 정보 단위로 묶어진다. 여기서 말하는 파일 형태는 사용자 영역과 커널영역간의 데이터를 주고 받기 위한 추상화된 인터페이스를 의미한다. (폴더는 윈도우에서 제공하는 것으로 데이터를 트리 구조로 분류하는 것이며 파일과는 다름) H/W 단에 있는 디스크(SSD 또는 HDD)에 데이터를 저장하기 위해 시스템 콜을 통해 커널 모드로 전환이 되서 저장이 된 다음에 사용자 모.. 2023. 10. 29.