본문 바로가기

반응형

전체 글

(425)
[C#] AppDomain.GetAssemblies 메소드 사용하기 들어가며 서버를 만드는데 메시지를 핸들링하는 클래스를 만들때 마다 디스패칭을 해줄 수 있는 어딘가에 매번 등록하는게 귀찮았다. 'C#에는 리플렉션도 있는데 특정 클래스를 상속 받으면 해당 클래스들을 자동으로 찾아서 디스패처에 등록하는 방법은 없을까?' 있더라... GetAssemblies() 메소드를 이용해 현재 로드된 어셈블리의 목록을 가져 오고, 그 어셈블리에서 내가 필요한 타입만을 쏙쏙 뽑아 올 수 있었다. 아래는 한줄 한줄 설명하며 진행 된다. 만일 설명 필요 없고 그냥 예제 코드가 필요하다 하시는 분이나 나는 전체 예제를 봐야 윤곽이 쉽게 잡힌다 하시는 분들은 [여기]를 클릭하도록 하자. 코드 살펴 보기 먼저 베이스가 될 BaseMsgHandler 클래스가 있다고 가정하자. 우리는 이 클래스를 ..
[Python] C/C++ 연동 'extension' 모듈 들어가며 지난 포스트에서는 C로 만들어진 공용 라이브러리를 파이썬의 ctypes 모듈을 통해 호출하는 방법에 대해 알아 보았다. 이번 포스트에서는 C로 만들어진 공용 라이브러리를 일반 파이썬 모듈 처럼 사용 할 수 있는 방법에 대해 살펴 보겠다. C언어로 파이썬 확장 모듈을 만드는 과정을 요약하면 아래와 같다. 파이썬으로 부터 인자를 넘겨 받아 처리 할 수 있는 C 함수를 작성한다. 모듈의 메소드 정보를 저장하는 PyMethodDef 배열을 생성한다. 모듈 자체의 정보를 저장하는 PyModuleDef 구조체를 생성한다. PyInit_을 가지는 초기화 함수를 정의한다. setup.py 파일을 생성하여 모듈을 빌드한다. 위 과정을 완료하게 되면 C로 작성된 파이썬 모듈이 생성되고, 아래와 같이 일반 파이썬 ..
[Python] C/C++ 연동 'extension' 들어가며 기본적으로 스크립트 프로그래밍 언어인 파이썬은 사용하기 편리한 대신 컴파일 프로그래밍 언어에 비해 성능이 떨어진다. 이 문제에 대한 해결 방법으로 파이썬에서는 C/C++로 작성된 모듈을 파이썬에서 호출 할 수 있도록 하는 'extension'이라는 기능을 제공한다. 이번 시간에는 파이썬에서 C/C++의 함수를 호출하는 방법에 대해 살펴 보겠다. 본 포스트에 대한 다뤄진 프로젝트의 전체 소스 코드는 [여기]에서 확인 할 수 있다. 동적 라이브러리 만들기 파이썬에서 C/C++로 작성된 코드를 모듈로써 사용하기 위해서는 C/C++로 작성된 동적 라이브러리(윈도우의 경우 dll, 리눅스의 경우 so)가 필요하다. 이번 챕터에서는 각 윈도우와 리눅스에서 동적 라이브러를 만드는 방법에 대해 살펴 보도록 하..
[C#] dynamic 키워드 DLR(Dynamic Language Runtime) 이란? C# 프로그래밍 언어의 DLR이란 타입 결정을 컴파일 타임이 아닌 런타임에 하는 기능이다. 타입 키워드로는 dynamic을 사용한다. 조사 시점 대상 타입 정적 타입 바인딩 컴파일 타임 참조 변수 타입 동적 타입 바인딩(dynamic) 런 타임 메모리에 생성된 실제 객체 using System; class Base { public virtual void Foo() { Console.WriteLine("call Base.Foo()"); } } class Derived : Base { public override void Foo() { Console.WriteLine("call Derived.Foo()"); } public void Bar() { ..
서버 스레드 모델 연구 들어가며 오늘은 서버 개발에 대해 알아 보자. 특히 서버 성능과 직결 되는 서버의 스레딩 모델에 대해 알아 보도록 하겠다. 본격적인 내용을 다루기 전에 서버에서 말하는 성능에 대한 정의를 먼저 해보록 하자. 보통 서버에서 주요한 성능 측정 요소는 응답시간이다. 클라이언트로 부터 요청을 받고 결과를 가공하여 응답 하기 까지 시간이 얼마나 걸리는지가 서버의 성능을 측정하는데 주요 요소로 사용 된다. 그렇다면 이 응답 시간에 가장 영향을 미치는 요소는 무엇일까? 첫번째는 IO 연산이다. 파일이든 네트워크든 IO 연산이 발생하면 아래 그림과 같은 과정이 발생한다. 서버 어플리케이션이 IO를 요청하면 OS를 거쳐 하드웨어 까지 전달되고, 하드웨어에서 작업이 완료 될때까지 작업은 블로킹 된다. 이 시간을 디바이스 ..
[C#] 비동기 프로그래밍 - 코루틴(coroutine) 기반 비동기 서버 이번 포스트에서는 node.js와 같은 싱글 스레드 기반 비동기 서버(? 정확하게는 싱글 스레드는 아니지만..이건 다음에 설명하자) 프레임워크를 C# 프로그래밍 언어를 이용해 만드는 방법에 대해 살펴 보도록하겠다. 추가하여 콜백을 사용하지 않고도 비동기 작업을 처리 할 수 있는 부분도 함께 살펴 본다. 들어가며 일반적으로 네트워크 프로그래밍을 하게 되면(특히 서버) 대용량 트래픽을 처리하기 위해 비동기 핸들링을 선호하게 된다. 예를 들어 IO를 처리 할 때 메시지를 보내고 응답을 받을 때 까지 블로킹 되는 시간을 줄이기 위해 비동기를 많이 사용한다. 비동기 IO는 성능상으로는 확실히 이점을 가질 수 있지만, 비동기 작업이 완료 되었을 때 운영체제로 부터 작업 완료 통보를 받을 수 있는 별도의 콜백 함수를..
[C#] 비동기 프로그래밍 - async io 동기와 비동기의 차이 이전 포스트 [C#] 비동기 프로그래밍 - async/await에서는 연산 중심의 비동기 메소드를 작성하는 방법에 대해 살펴 보았다. 이번 포스트에서는 IO 중심의 비동기 예를 살펴 보도록하겠다. 먼저 동기 IO가 어떻게 이루어지는 아래 그림을 통해 살펴 보자. 예를 들어 FileStream 객체의 Write메소드를 이용해 파일에 무엇인가 쓰려고하면 아래 그림과 같은 과정이 진행 된다. 실제 쓰기 작업은 프로그램이나 OS 영역이 아닌 하드웨어 영역에서 이루어지는데 동기 IO, 그러니까, 블로킹 호출에서는 쓰기 작업이 완료 될 때까지 프로그램이 대기하게 된다. 비동기는 IO를 요청하고 대기하는 것이 아니라 즉시 리턴 한다. 그리고 IO작업이 완료 되면 OS를 통해 그 완료를 통보 받아..
Two Phase Commit(2PC) 들어가며.. "Two Phase Commit"(이하 2PC)이란 독립적인 머신에서 구동되는 프로세스들의 분산 트랜젝션 보장을 위한 프로토콜이다. '트랜잭션(transaction)'이란 용어는 주로 DB에서 많이 다루어지는데, 여러 개의 쿼리 실행을 하나의 작업 단위로 보고 모든 쿼리가 성공하거나, 그 중 하나라도 실패하면 모든 쿼리를 취소하는 작업 단위를 의미한다. 이것을 분산 시스템으로 옮겨 오면 독립적인 머신에서 구동 되는 프로세스들에게 동일한 작업들을 적용함에 있어서 모든 프로세스들에게 적용되거나 반대로 아무 프로세스에게도 적용되지 않는 작업단위를 의미한다. 예를 들어 분산 시스템 내에 A, B, C 프로세스가 구동 되고 있다고 가정하자. 프로세스 A에서 발생한 업데이트가 B, C에 도 동일하게 적..

반응형