본문 바로가기

반응형

Thread

(7)
[C#] 비동기 프로그래밍 - 코루틴(coroutine) 기반 비동기 서버 이번 포스트에서는 node.js와 같은 싱글 스레드 기반 비동기 서버(? 정확하게는 싱글 스레드는 아니지만..이건 다음에 설명하자) 프레임워크를 C# 프로그래밍 언어를 이용해 만드는 방법에 대해 살펴 보도록하겠다. 추가하여 콜백을 사용하지 않고도 비동기 작업을 처리 할 수 있는 부분도 함께 살펴 본다. 들어가며 일반적으로 네트워크 프로그래밍을 하게 되면(특히 서버) 대용량 트래픽을 처리하기 위해 비동기 핸들링을 선호하게 된다. 예를 들어 IO를 처리 할 때 메시지를 보내고 응답을 받을 때 까지 블로킹 되는 시간을 줄이기 위해 비동기를 많이 사용한다. 비동기 IO는 성능상으로는 확실히 이점을 가질 수 있지만, 비동기 작업이 완료 되었을 때 운영체제로 부터 작업 완료 통보를 받을 수 있는 별도의 콜백 함수를..
[C#] 비동기 프로그래밍 - Thread 이번 포스트에서는 C# 스레드 생성하고 사용하는 기본적인 방법에 대해서 살펴 보겠다. 스레드의 개념적인 부분은 이미 알고 있다고 가정하고 API 사용법에 대해서만 다룰 예정이다. Thread 생성 아래는 메인 스레드와 사용자가 생성한 스레드에서 각각의 번호를 만번씩 출력하는 예제이다. 스레드를 통해 동시에(concurrency) 코드를 진행하므로 1과 2가 섞여서 출력 되는 것을 확인 할 수 있다. using System; using System.Threading; // Thread를 위한 네임스페이스 class Program { public static void Foo() { for (int i = 0; i < 10000; i++) { Console.Write("1"); } } public static..
Threads Scheduling /** 이래저래 먹고 사는데 바쁘다 보니 글하나 올리기도 빡세구나. 아직도 해야 할 일이 많은데 내가 생각하는 뭔가를 정리하고 올린다면 시간이 더 많이 걸릴 것 같고, 오늘은 웹에서 떠돌아 다니는 원문을 간단하게 해석해 보는 것으로 블로깅을 마무리 해야겠다. 주제는 쓰레드 스케줄링(thread scheduling)에 관련한 것으로, 내가 멀티 쓰레드를 이용해서 뭔가를 하는데 아무리해도 성능이 안나오길래 혹시 scheduling에 관련한 문제가 있지 않나 해서 조사하다 찾은 문서를 설명 할 것이다. 원론적인 스케줄링에 관련된 이야기는 아니고, 여러가지 스케줄링 기법이 있고, 내가 생성한 쓰레드가 어떤 스케줄링 알고리즘을 사용하게 설정 하느냐 하는 API 사용법 정도라고 생각하면 되겠다. 보다 자세한 쓰레드..
Leader/Follower pattern 얼마전에 libevent가 threadsafe 하지 않다는 글을 대충 번역 해서 올렸더니, 지인이 leader/follower pattern이라는 것을 소개 해줬다. 인터넷 검색 결과 ACE framework에서 사용 되는 서버패턴의 일종이라는데 아직 구현을 해보지 않아서 성능이 얼마나 나올는지는 장담하지 못한다. 내가 구현 하려고 했던 형식은 이벤트(accept/read ..etc)를 감시하는 thread가 하나 있고, 이벤트가 발생하면 event queue에 그 이벤트들을 집어 넣는다. 그럼 event queue 반대편의 worker thread들이 그 이벤트에 맞는 핸들링을 하는 구조 였는데 오버헤드가 많아서 실질적으로 사용하기는 다소 무리가 있는 형식이었다. 그에 반에 leader/follower..
Condition Variables condition variables와 mutex를 같이 사용할 경우 condition variable은 임의의 상태(condition)이 발생하길 기다리는 race-free 한 방법을 제공 한다. condition과 mutex의 사용에 대한 간략한 개념을 이야기 하자면 : condition 자체는 mutex와 함께 사용되어야만 한다. mutex는 condition variable이 wait로 넘어가기 전의 초기화라던지 기타 등등에 대한 concurrency를 보장한다. condition variable 초기화 condition variable이 사용되기 전에 역시 다른 동기화 객체와 마찬가지로 초기화라는 것이 필요하다. C/C++에서 condition variable은 pthread_cond_t 데이터 ..
[C/C++] Read/Write lock Read/Write Lock의 개념 Read/Write Lock(이하 rwlock)의 기본적인 개념은 아래와 같이 간단하다. Read 작업은 값을 변경하지 않으니, 하나의 크리티컬 섹션에 여러개의 스레드가 진입해도 일관성 관련 문제가 발생하지 않는다. Write 작업은 값을 변경 할 수도 있으니, 하나의 크리티컬 섹션에 여러개의 스레드가 진입 할 경우 일관성이 깨질 수 있다. Read 작업은 여러개의 스레드가 하나의 크리티컬 섹션에 접근 가능하지만, Read하는 도중 값이 변경 되면 안된다. 위의 세 가지 사항 정도만 제외 한다면 rwlock은 mutex랑 비슷하다. 개념도 비슷하고, 사용법도 비슷하고, 하는 일도 비슷하다. rwlock의 장점은 read 작업에 있어서 여러개의 쓰레드가 서로 블록킹 하는..
libevent and multithread /** libevet를 멀티 쓰레드 환경에서 사용코자 했는데, 이것이 생각 처럼 동작 하지 않았다. connection이 하나만 들어 왔을 때는 정상동작 했지만, 둘 이 상이되면서 부터는 event_dispatch() 에서 1을 리턴(set 되어 있는 이벤트 가 없다라는 의미)하면서 계속 종료 되었다. 혹시나 싶어 libevent의 멀티 쓰레드 환경에 대해 찾아 보니 아래와 같은 글이 있어 짧은 영어 실력이나마 번역을 해 보았다. 혹시나 누군가가 잘 못된 내용을 진실로 받아 들이고 그걸 다른 사람에게 진실인양 전파 한다면 세상에 잘못된 지식들이 판치게 되고, 지식을 추구하 는 사람들에게 있어 그것만큼 나쁜 일이 없다. 아래의 글 중 잘 못된 내용이 있다면 언제든지 kukuta@gmail.com으로 알 려..

반응형