본문 바로가기

반응형

진리는어디에

(289)
[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를 통해 그 완료를 통보 받아..
[Python] 파이썬 3의 Modern 함수들 본 포스트의 원문은 Bartek Ciszkowski의 Modern Functions in Python 3이다. annotation을 이용해 함수 인자에 타입을 지정하고 mypy를 이용해 타입 검사를 하는 것에 대한 내용이지만 정작 mypy에 대한 설치나 사용 방법들에 대해서는 설명이 빠져 있다. mypy 관련 내용은 포스트 아래에 링크해 두었으니 참고 바란다. 파이썬은 빠르고 효과적으로 작업할 수 있는 언어로 지난 수십 년 동안 번창했습니다. 많은 현대 회사와 마찬가지로 우리 회사도 시스템 스택의 대부분에서 파이썬을 상당히 광범위하게 사용하지만 많은 경우 아직 파이썬 2.7을 계속 유지하고 있습니다. 가혹한 현실이지만 파이썬 2.7은 이미 한물 갔습니다. 솔직히 말해서 - 때가 되었습니다! - 우리는 P..
[Python] 유용하지만 잘 알려지지 않은 고급 트릭 5가지 본 포스트는 Charudatta Manwatkar의 Hidden Gems of Python을 한글로 번역한 내용이다. 요즘 저에게는 재미로 파이썬 문서를 읽는 취미가 생겼습니다. 재미로 무엇인가를 읽을 때에 비로소 우리가 지금까지 놓치고 있었던 "오! 파이썬으로 이런 것도 할 수 있어요?"라고 할만한 흥미로운 것들을 찾는 경향이 있습니다. 1. Function 속성(attribute) 클래스 및 개체의 속성을 설정하는 방법과 유사하게 함수에도 속성을 설정할 수도 있습니다. def func(x): intermediate_var = x**2 + x + 1 if intermediate_var % 2: y = intermediate_var ** 3 else: y = intermediate_var **3 + 1 ..
[C#] 비동기 프로그래밍 - async/await 들어가며 이전 포스트에서는 C#의 'Task' 사용법에 대해 알아 보았다. 예를 들어 여러분이 Task를 이용해 GUI 프로그램을 만든다고 가정하자. GUI프로그램은 UI이벤트를 처리하기 위해 메인 스레드는 블로킹 되지 않고 항상 유저의 입력을 받을 수 있도록 블로킹 되지 않아야 하며, 따라서 시간이 오래 걸리는 작업들은 Task를 이용해 다른 스레드에서 한다. 그리고 작업들이 처리되어야 하는 순서가 있다면 - 연속 실행 또는 연속 작업이라고 함 - Task의 ContinueWith 메소드 또는 TaskAwaiter를 이용하여 Task가 완료 되면 등록된 다음 작업을 처리 한다. Task에 대한 설명은 [여기]에서 찾아 볼 수 있다. 이번 포스트는 Task의 사용법에 대해서는 따로 설명을 하지 않을 예정..
[Python] 당신이 모를 수도 있는 함수에 대한 4가지 고급 트릭 본 포스트는 Python Land’s deep dive on functions의 내용을 한글로 번역한 내용이다. 기본 파이썬 문법을 이해하고 있는 사람을 대상으로 하지만 각 섹션들마다 자세한 이해에 도움이 될만한 글들을 링크 걸어 두었으니 조금만 노력을 들이면 초보자들도 이해 할 수 있을것이라 생각한다. 하지만 아직 시작 단계이신 분들께는 여전히 어려운 주제일 수 있다. 그런 분들은 이 글과 함께 '파이썬 기초부터 시작하기'를 읽어 볼 것을 권해드린다. 당신은 함수의 키워드 아규먼트를 강제하거나, 함수 데코레이터를 생성하거나, 익명(람다) 함수를 생성하거나, 배열 또는 딕셔너리를 함수의 인수로 언팩(unpack)하는 방법을 알고 있습니까? 본 포스트는 파이썬 함수에 관한 4가지 고급 트릭을 다루고 있습니..
[C#] 비동기 프로그래밍 - Task 이번 포스트에서는 스레드와 스레드 풀의 제약 사항을 해결해줄 'Task'에 대해 살펴 보겠다. 들어가며 [C#] Thread [C#] ThreadPool 이전 까지 포스트에서 C#의 스레드에 대해 알아 보았다. 앞의 글을 안봤다고 다시 돌아가서 볼 필요는 없다. 앞의 글들은 단지 이번 포스트 "Task"를 설명하기 위한 준비작업이었을 뿐이다. 간단하게 앞의 내용을 요약하면, 스레드를 지속적으로 생성하고 삭제하면 오버헤드가 발생한다. 이것을 해결하기 위해 스레드 풀을 사용했지만, C# 스레드 풀의 제약 사항으로인해 작업이 완료 되기도 전에 프로세스가 종료 될 수 있다는 단점이 있었다(이유가 궁금하면 위 링크 되어있는 포스트들에 정리해놨으니 살펴보고 오도록하자). 이 모든 단점을 커버 해주는 것이 이번에 소..
[C#] 비동기 프로그래밍 - ThreadPool 들어가며 프로세스에서 스레드를 새로 만들었다 삭제하는 것을 반복하면 스레드 생성에 대한 오버헤드가 발생한다. 그래서 일반적으로 프로세스에 스레드 풀을 생성하고 스레드 작업이 필요한 경우 풀에서 스레드를 꺼내와 사용하고 작업이 끝나면 해제하는 것이 아니라 스레드 풀에 되돌려 주는 방식으로 성능의 향상을 꾀한다. C#에서는 이런 스레드풀을 언어 레벨에서 지원한다. 스레드 수행 할 작업을 스레드 풀의 큐에 넣으면 내부적으로 스레드를 생성하거나 기존 생성되어 있던 스레드를 가져와 작업을 수행 후 스레드를 삭제하는 것이 아니라 대기 상태로 유지 시킨다. CLR[?]은 이 스레드풀에 최적의 스레드 개수를 유지하도록 관리해준다. ThreadPool 사용 using System; using System.Threadin..

반응형