'프로그래밍/윈도우시스템'에 해당되는 글 4건

한 프로그램 안에서 다수의 프로세서가 동작할 때 공유(데이터)메모리를 사용하게 된다.

그럴때 임계영역에서 서로 경쟁하다가 동시에 충돌 나거나 순서가 뒤바뀌는 상황이 발생된다.

이러한 문제를 해결하기 위해서 만들어진게 세마포어다 . 역할은 한번에 하나의 프로세서만 접근을

가능하게 만들어주는 것이다.

 

철도의 까치발 신호기 또는 해군의 수기 신호라는 뜻으로, 복수의 작업을 동시에 병행하여 수행하는 운영 체제(또는 프로그래밍)에서 공유 자원에 대한 접속을 제어하기 위하여 사용되는 신호.

병행 내지 병렬로 동작되는 둘 이상의 프로세스 사이에서 마이크로프로세서 시간이나 입출력 접속구(port)와 같은 공유 자원을 동시에 사용할 수 없기 때문에, 한 프로세스가 사용하고 있는 동안에 세마포어를 세워서 다른 프로세스를 대기시키고 사용이 끝나면 해제시키는 방법으로 사용한다.

[네이버 지식백과] 세마포어 [semaphore] (IT용어사전, 한국정보통신기술협회)

 

세마포어는 지하철 화장실처럼 화장실 칸의 개수가 여러개 유한하게 있는 곳의 열쇠의 갯수이다.

뮤텍스는 1개의 화장실에 대해서 다룬다면, 세마포어는 여러개의 화장실로 다루게 되고

화장실을 쓰기위해 열쇠를 하나 가져가면 P, 열쇠를 반납하면 V라고 한다.

만약 열쇠를 계속 가져가서(P) 열쇠가 0개가 되면, 다음 사람은 줄을 서서 기다려야한다.

화장실을  쓴다음 열쇠를 반납하게되면(V) 다음 사람이 들어갈 수 있다.

 

 

 

 

 

 

'프로그래밍 > 윈도우시스템' 카테고리의 다른 글

뮤텍스 예제  (0) 2019.12.04
뮤텍스에 대한 이해 (Mutex)  (0) 2019.12.04
프로세스(Process)와 스레드(Thread)의 개념  (0) 2019.12.04
블로그 이미지

cocoa9518

,

 

뮤텍스를 2개생성하고 사용하는 예제

 

# MutexNoti Example


constexpr auto MAX_THR_CNT 4

 

DWORD WINAPI ThreadProc(PVOID pParam);



int main() 
{
     ① Mutex를 2개 생성 (종료Mutex, 임계구역설정Mutex)
     HANDLE arWaits[2];
     arWaits[0] = CreateMutex(nullptr, TRUE, _T("종료Mutex"));
     arWaits[1] = CreateMutex(nullptr, FALSE, _T("임계구역Mutex"));

    ② 작업 스레드를 생성  
    HANDLE arhThreads[MAX_THR_CNT];
    for(auto i=0; i<MAX_THR_CNT; i++)
    {
       DWORD dwThreadID(0);  
       arhThreads[i] = CreateThread(nullptr, 0, ThreaProc, arWaits, 0, &dwThreadID);
    }

    ③ 키를 받으면 실행중인 스레드를 종료하기 위해서 소유한 뮤텍스를 해제  
    getchar();
    ReleaseMutex(arWaits[0]);

    ④ 모든 스레드의 종료(TRUE)를 무한대기(INFINITE). 
    WaitForMultipleObjects(MAX_THR_CNT, arhThreads, TRUE, INFINITE);
 
    ⑤ 모든 스레드를 종료  
    for (auto i=0; i<MAX_THR_CNT; i++)
    {
        CloseHandle(arhThreads[i]);
    }

    for (auto i=0; i<2; i++)
    {
        CloseHandle(arWaits[1];
    }
    return 0;
}

* 스레드 엔트리 함수에 대한 구현
DWORD WINAPI ThreadProc(PVOID pParam)
{
     PHANDLE parWaits = (PHANDLE)pParam;

     while(true)
     {
          DWORD dwWaitCode = WaitForMultipleObjects(2, parWaits, FALSE, INFINITE);

          if(dwWaitCode == WAIT_FAILED)
          {  
              break;
          }

         if(dwWaitCode == WAIT_OBJECT_0)
         {
             break;
         }

         // Do somethings , Critical Region
         SYSTEMTIME st;
         GetLocalTime(&st);

         cout << "..." << "Sub Thread " << GetCurrentThreadId() << " => ";
         cout << st.wYear << "/" << st.wMonth << "/" << st.wDay << " ";
         cout << st.wHour << ":" << st.wMinute << ":" << st.wSecond << " ";
         cout << st.wMilliseconds << endl;

         ReleaseMutex(parWaits[1]);
         Sleep(1000);
     }
     return 0;
}

 

 

 

 

 

블로그 이미지

cocoa9518

,

공유자원에 대한 "Mutually exclusive access" (상호 배타적 접근)을 조정.

 

뮤텍스는 데이터를 보호하기 위한 객체이며, 공유리소스에 대한 배타적이고 독점적인 점유권을 요구하는 객체이다. 


DWORD WINAPI ThreadProc(PVOID pParam)
{
      HANDLE hMutex = (HANDLE)pParam);
      WaitForSingleObject(hMutex, INFINITE);

     // Do Action....


      Release(hMutex);
      return 0;
}


int main()
{
     (1) Mutex의 생성
     HANDLE hMutex = CreateMutex(nullptr, FALSE, nullptr);

     (2) 작업스레드 생성
    HANDLE arhThreads[MAX_THR_CNT];

    for(auto i=0; i<MAX_THR_CNT; i++)
    {
      DWORD dwThreadID(0);
      arhThreads[i] = CreateThread(nullptr, 0, ThreaProc, hMutex, 0, &dwThreadID);
    }

     (3) 모든 스레드의 작업완료를 기다린다. 
    WaitForMultipleObjects(MAX_THR_CNT, arhThreads, TRUE, INFINITE);

     (4) 작업스레드 종료 
    for(auto i=0; i<MAX_THR_CNT; I++)
    {
      CloseHandle(arhThreads[i];
    }

     (5) Mutex 소멸
    CloseHandle(hMutex);
  

  return 0;
}

 

 

 

 

뮤텍스와 세마포어는 운영체제에서 사용하는 동기화 기법들임.

뮤텍스는 개념적으로 상호배제를 함으로써 임계구역에 하나의 스레드만 들어갈 수 있고

세마포어는 하나의 스레드만 들어갈 수도 있고, 여러개의 스레드가 들어갈 수 있다는 점이

차이가 있다. 

 

뮤텍스의 세마포어의 차이점

뮤텍스는 공유자원을 접근 할 수 있는 키가 하나인 세마포어와 같다. 키를 하나 쓸수 있는가?

여러개를 쓸 수 있는가의 차이가 있을 뿐이다. 

 

 

 

 

블로그 이미지

cocoa9518

,

정의 (Definition) 

  프로세스 : 운영체제로부터 자원을 할당받는 (독립적인)작업의 단위
  스레드 : 프로세스가 할당받은 자원을 이용하는 실행의 단위


프로세스  
 - 운영제제로부터 (독립적인) 주소공간, 파일, 메모리등을 할당받음
 - 각 프로세스는 독립적이며, 자신만의 고유의 영역을 할당받아 사용한다. 
 - 실행중인 프로그램을 의미

스레드 
 - 스레드는 프로세스 안에 존재하며, 여러 스레드가 자원을 공유
 - 스레드는 프로세스내에서 각각의 스택 공간을 제외한 모든 주소공간과 자원을 공유
 

 

프로세스는 실행될 때 운영체제로부터 프로세서, 필요한 주소공간, 메모리등 자원(Resource)을 할당을 받는다. 

스레드는 할 프로세스 내에서 동작되는 여러 실행(Execution)의 흐름으로 프로세스 내의 주소공간이나 자원들을

같은 프로세스내의 스레드끼리 공유하면서 실행된다. 

 

요약하면, 

운영체제(OS)가 시스템의 자원을 어떤 단위로 할당하고, 프로세스와 스레드는 이 자원을 어떻게 사용하느냐를 

결정하는 것이라고 할 수 있다. 

 

여러 프로세스가 할 수 있는 작업들을 스레드로 하는 이유?

운영체제는 시스템 자원을 효율적으로 관리하기 위해서 스레드를 사용한다. 멀티 프로세스로 실행되는 작업을 

멀티 스레드로 싱핼할 경우, 프로세스를 생성하여 자원을 할당하는 시스템콜(System call)이 줄어들어 자원을 

효율적으로 관리할 수 있다. 뿐만 아니라 프로세스 간의 통신보다 스레드 간의 통신비용이 적게들기 때문에 

통신부담이 줄어들게 된다. 

 

https://kldp.org/node/295

 

사용자수준 쓰레드와 커널수준 쓰레드의 차이? | KLDP

사용자 수준 쓰레드와 커널 수준 쓰레드의 차이에 대해서 설명해 주실수 있으시겠습니까? 각각 장단점이 있다고 하는데, 잘 이해가 되질 않네요. 사용자 수준은 문맥교환의 오버해드가 없다, 커널 수준은 사용자 수준 보다 효율적일 수 있다.. 라고 하는데 잘 이해가 가질 않네요.. 그리고 현재 리눅스에서는 두가지 쓰레드 모델이 모두 지원 되나요?

kldp.org

 

 

 

 

'프로그래밍 > 윈도우시스템' 카테고리의 다른 글

세마포어(Semaphore)에 대한 이해  (0) 2019.12.04
뮤텍스 예제  (0) 2019.12.04
뮤텍스에 대한 이해 (Mutex)  (0) 2019.12.04
블로그 이미지

cocoa9518

,