CS

    스레드 안전(Thread-Safety)란?

    멀티 스레드 프로그래밍 멀티스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것이다. 장점 멀티 프로세스에 비해 메모리 자원소모가 줄어든다. Heap 영역을 통해서 스레드 간의 통신이 가능하기 때문에 프로세스 간의 통신이 간단해진다. 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 훨씬 빠르다. 단점 힙 영역에 있는 자원을 사용할 때 동기화를 해야한다. 동기화를 위해서 락을 과도하게 사용하면 성능 저하가 발생할 수도 있다. 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 영향을 받아 종료하게 될 수도 있다. 스레드 안전 스레드 안전(Thread-Satety)란 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스..

    모듈과 컴포넌트의 차이점

    모듈이란? 모듈이란 비슷하거나 연관성 있는 것들로 이루어진 메소드나 클래스의 집합이다. 자동차로 예를 들자면 엔진을 이루고 있는 구성품들의 집합을 엔진이라고 하고 엔진을 모듈이라고 할 수 있다. 여기서 구성품들은 클래스나 메소드들을 가르킨다. 결론은 재사용이 가능한 코드의 모음이라고 보면 된다. 모듈은 코드의 재사용 및 유지보수를 쉽게 해줘서 프로그램을 만들 때 모듈화하여 만들고 있다. 컴포넌트란? 기능의 최소 단위다. 프로그램을 만들때 재사용하기 위해서 모듈화하여 사용한다고 하였다. 재사용하기 위해선 독립적인 기능을 가져야하지만 독립적으로 개발하여도 모듈간의 호환이 되지 않는 경우가 있어 소프트웨어의 재사용이 어려워지게 된다. 그런 문제를 해결하기 위한 방법이 컴포넌트이고 컴포넌트는 소프트웨어의 재사용..

    데드 레커닝 - 온라인 게임의 이동처리 기법

    현재 3D 온라인 게임 프로젝트에서 게임서버를 제작하면서 미처 예상하지 못한 부분에서 많은 문제들이 있다 그 중 캐릭터의 이동처리 부분이고 해결해 나가면서 큰 도움이 되고 있다. 사용자가 키보드를 이용한 방향키 입력으로 이동 패킷을 서버에 보내주고 그것을 서버에서는 브로드캐스트로 뿌려주는 가장 기본적이고 간단한 방법이 있지만 60프레임으로 돌아가는 게임이라고 한다면 1초에 60번이나 이동에 대한 패킷을 보내고 받게 됨으로 엄청난 서버 부하를 가져오게 된다. 이를 해결하기 위해선 기존 상태를 계속 유지하고 있다면 일정한 규칙을 가진 행동을 반복하고 있을테니 패킷을 보내지 않고 같은 처리를 계속 하도록 하고, 상태의 변화가 있을때만 패킷을 보내서 상태변화를 알리게 되면 서버는 이를 브로드캐스트하여 다른 클라..

    Select 모델

    Select 모델은 select() 함수가 핵심 역할을 한다는 뜻에서 붙인 이름이다. Select 모델을 사용하면 소켓 모드(블로킹, 넌블로킹)에 관계없이 여러 소켓을 한 스레드로 처리할 수 있다. Select 모델의 동작 원리 Select 모델을 사용하면 소켓 함수 호출이 성공할 수 있는 시점을 미리 알 수 있다. 따라서 소켓 함수 호출 시 조건이 만족되지 않아 생기는 문제를 해결할 수 있다. 소켓 모드에 따른 Select 모델의 사용 효과는 다음과 같다. 블로킹 소켓(blocking socket): 소켓 함수 호출 시 조건이 만족되지 않아 블로킹되는 상황을 막을 수 있다. 넌블로킹 소켓(nonblocking socket): 소켓 함수 호출 시 조건이 만족되지 않아 나중에 다시 호출해야하는 상황을 막을..

    Reliable Data Transfer RDT란?

    RDT는 신뢰성 있는 데이터 교환을 의미한다. 즉 송/수신하는 데이터가 오류 없이 온전히 전송되는 것을 뜻한다. Transport Layer(전송계층)에서는 신뢰성 있는 데이터 교환을 하고 싶어 하지만, 하위 레이어들에서는 신뢰성을 보장할 수 없기 때문에 문제가 발생할 수 있다. 이를 해결하기 위해 Transport Layer에서 RDT 프로토콜을 이용할 수 있다. 아래는 RDT 프로토콜을 이용해 데이터를 송/수신하는 예시이다. 송신 측 상위 레이어에서 보내려는 데이터가 있다면 rdt_send()를 호출해 데이터를 RDT 프로토콜로 전송한다. RDT 프로토콜에서 신뢰할 수 없는 채널인 하위 레이어로 보낼 때 udt_send()를 호출해 패킷을 전송한다. 수신 측 하위 레이어에서 받은 패킷이 있다면 rdt..

    객체[Object]와 인스턴스[Instance]

    객체와 인스턴스는 객체지향 프로그래밍에서는 거의 비슷한 개념으로 사용되지만 엄밀히 말하면 조금은 차이가 있는 개념이다. 객체지향 프로그래밍이 생성된 원인이 사람의 사고와 가장 비슷하게 프로그래밍을 하기 위해서라고 할 수 있다. 즉 우리 실생활의 모든 것들이 전부 객체로 이루어진 것이다. 넓은 의미에서의 객체라는 것은 보고 만질 수 있고, 이해할 수 있으며 생각이나 행동이 추구하는 바를 의미한다. 즉 객체라는 것은 우리가 인지 하고 있는 구체적인 사물이나 시스템이 될 수도 있고, 구체적이지만 물리적으로 경계가 모호한 강, 안개 등도 객체라 할 수 있는 것이다. 인스턴스란, 예로 우리는 하나의 청사진이 되는 클래스를 정의하면 이 클래스에서 각각 구별이 되는 인스턴스를 얼마든지 만들어 낼 수 있는 것이다. 사..

    데드 레커닝 (Dead Reckoning) 개념

    분산 네트워크 기반 실시간 시뮬레이션 환경에서 트래픽 데이터(traffic data)를 감소시키기 위해 사용하는 기법. 데드(dead)라는 말은 신호를 받지 못하고 있는 상태를 말하며 레커닝(reckoning)은 추산한다는 의미로 신호가 없는 동안에는 추측하여 상태 정보를 갱신하는 것을 말한다. 영어로 찾아보니 추측 항법이라는 용어를 찾을 수 있었다. 배의 방향, 여행 경로를 추측하는데 쓰이는 방법이라고 한다. 게임에 적용하면 캐릭터의 이동경로를 예측하는 방법이라고 할 수 있겠다. 현재 위치 = 이전위치 + (속도\*시간) + (1/2\*가속도\*시간^2) 이동 패킷을 1초 간격이라고 했을 때, 이전 패킷의 위치와 현재 패킷의 위치를 빼면 간격이 1초이므로 속도이자 예상 초당 이동 거리가 된다. 거기에 ..

    깃(Git) 한글 깨짐 현상 해결

    이 파일을 메모장으로 열어보니 인코딩이 ANSI로 되어있는 것을 확인할 수 있었다 1. 기존 파일 인코딩 변경 변경하고자 하는 파일 선택 후, 파일 -> 다른 이름으로 저장 을 통해 그 파일의 인코딩을 저장할 수 있다. [참고] 2. editorconfig 파일을 이용해 새 파일 생성 시 utf-8로 생성하도록 설정 이미 만들어진 기존 파일은 위와 같이 직접 변경할 수 밖에 없었지만... 앞으로 파일 생성시에도 utf-8로 생성해주는 것이 좋을 것 같아 이를 위해서 editorconfig 파일을 이용한다. 방법은 간단하다! editorconfig란? 코딩 스타일을 일관되게 설정할 수 있게 해주는 설정파일이다. 이를 통해 indentation(들여쓰기) 스타일과 같은 다를 수 있는 설정들을 미리 지정해 둘..

    Visual Studio 한글 사용 시 오류 발생

    1. 오류가 발생하는 코드 Visual Studio 2017의 최신 업데이트를 받고 아래와 같이 소스에서 한글 코드를 사용하면 오류가 발생한다. 이 오류는 소스 파일의 인코딩 옵션 때문에 발생하는 것이라서 인코딩 옵션만 수정해주면 문제를 해결할 수 있다. 2. 한글 관련 오류를 수정하는 방법 소스 파일의 인코딩 옵션을 수정하려면 아래와 같이 '파일' 메뉴의 '다른 이름으로 ... 저장'을 선택하여 '다른 이름으로 파일 저장' 대화 상자를 실행시켜야 된다. '다른 이름으로 파일 저장' 대화 상자가 화면에 나타나면 '저장' 버튼 옆에 있는 화살표를 선택하여 '인코딩하여 저장'을 선택한다. '인코딩하여 저장'을 선택하면 아래와 같이 확인창이 나오는데 '예'를 눌러서 진행하면 된다. 그러면 아래와 같이 '고급 ..

    시스템 구조와 프로그램 실행 2

    동기식 입출력과 비동기식 입출력 동기식 입출력(synchronous I/O) I / O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감 구현 방법 1 I/O가 끝날 때 까지 CPU를 낭비시킴 매시점 하나의 I/O만 일어날 수 있음 구현 방법 2 I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음 I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움 다른 프로그램에게 CPU를 줌 비동기식 입출력 (asynchronous I/O) I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감 두 경우 모두 I/O의 완료는 인터럽트로 알려준다. DMA(Direct Memory Access) DMA(Direct Memory Access) 빠른 입출력 장..