본문 바로가기

backup

병렬 컴퓨팅 Mutex와 Semaphore

CPU가 속도가 점점 발달하다가 어느 정도 선에서 멈추고, CPU 코어를 늘리는 쪽으로 개발이 되기 시작하였는데, 이는 속도 증가에 따른 발열 등을 따라갈 수가 없어서 한계에 봉착한 것이죠.

그래서 이제, CPU의 성능은 코어 수에 의해서 영향을 받게 되었고, 개발자들에게는 성능 향상을 위해서는 반드시 병렬컴퓨팅을 할줄 알아야만 하는 시대로 넘어온 것이죠.

HFT에서와 같이 방대한 데이터를 빠르게 처리하려면, 반드시 병렬컴퓨팅이 필요로 하게 됩니다.

그래서 멀티쓰레드를 쓰게 되고, 그러다 보면 자연히 특정 영역에서 같은 데이터를 동시에 접근하여야 하는 상황이 발생을 합니다. 이때 Lock을 걸어서 다른 쓰레드의 접근을 제한하고 작업이 끝난 뒤에 Lock을 풀어주어야 합니다.

그러기 위해서 여러가지 다양한 방법들이 사용되는데, 그 중 대표적인 방법이 바로 Mutex와 Semaphore입니다. 둘 사이에는 몇 가지 차이가 있긴 하지만, 사용하는 입장에서 가장 큰 차이는 동기화 처리 대상의 숫자입니다. Mutex는 하나씩 제어를 할 수 있지만, Semaphore는 한번에 다양하게 처리가 가능합니다.

개발자들은 백문이 불여일코드 아래에 예제를 보시면 mutex와 semaphore를 이용한 Queue의 예제입니다. C#코드입니다. Mutex나 Semaphore는 물론 C#말고 리눅스 등에서도 다 쓰이는 개념입니다.

 

using System;
using System.Collections.Generic;
using System.Threading;


public class BlockingBoundedQueue<T>
{
    private Queue<T> m_queue = new Queue<T>();
    private Mutex m_mutex = new Mutex();
    private Semaphore m_producerSemaphore;
    private Semaphore m_consumerSemaphore;

    public BlockingBoundedQueue(int capacity)
    {
        m_producerSemaphore = new Semaphore(capacity, capacity);
        m_consumerSemaphore = new Semaphore(0, capacity);
    }

    public void Enqueue(T obj)
    {
        m_producerSemaphore.WaitOne();

        m_mutex.WaitOne();

        try
        {
            m_queue.Enqueue(obj);
        }
        finally
        {
            m_mutex.ReleaseMutex();
        }

        m_consumerSemaphore.Release();
    }

    public T Dequeue()
    {
        m_consumerSemaphore.WaitOne();

        T value;

        m_mutex.WaitOne();
        try
        {
            value = m_queue.Dequeue();
        }
        finally
        {
            m_mutex.ReleaseMutex();
        }

        m_producerSemaphore.Release();

        return value;
    }

}

'backup' 카테고리의 다른 글

C# FIX엔진 라이브러리  (0) 2013.06.28
fx마진거래 2013.6.28  (0) 2013.06.28
MetaTrader(MT4, MT5)와 C# DLL 연동하기  (0) 2013.06.28
2013.6.27 거래2  (0) 2013.06.27
심심풀이 FX 2013.6.27  (0) 2013.06.27