공부한 이야기/윈도우 OS

    XV : 쓰레드 풀링

    XV : 쓰레드 풀링 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) 쓰레드 풀에 대한 이해 쓰레드의 생성과 소멸은 시스템에 많은 부담을 준다. 만일 요청받은 작업의 수만큼 쓰레드를 생성하고 처리한 뒤, 쓰레드를 종료시키는 방식이라면 실행 성능은 매우 저하될 것이다. 쓰레드 풀을 유지하는 것은 성능 향상에 도움이 된다. 쓰레드 풀의 기본 원리는 쓰레드의 재활용으로서, 할당된 일을 마친 쓰레드를 소멸시키지 않고 쓰레드 풀에 저장해 뒀다가 필요할 때 다시 쓰는 것이다. 쓰레드 풀은 처리해야 할 일이 등록되기 전에 생성되고, 생성과 동시에 쓰레드들 또한 생성되어 풀에서 대기하게 된다. 지능적인 풀은 처리해야 할 일의 증가 및 감소에 따라서 풀 안의 쓰레드 개수를 늘리기도 하고, 줄이기..

    XIV : 쓰레드 동기화 기법 II

    XIV : 쓰레드 동기화 기법 II 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) 실행순서에 있어서의 동기화 쓰레드의 실행순서를 동기화시킨다는 것은, 정확히는 메모리에 접근하는 쓰레드의 실행순서를 동기화 하는 것이다. 생산자/소비자 모델은 실행되는 쓰레드의 순서가 중요한 상황을 설명할 때 종종 소개되는 모델이다. 이벤트 기반 동기화 Windows 개발자들은 쓰레드의 실행순서를 동기화한다고 하면, 가장 먼저 떠올리는 것이 이벤트 기반 동기화 기법이다. 세마포어나 뮤텍스와 마찬가지로 이 기법에서도 동기화를 위한 오브젝트가 사용되는데, 이를 이벤트 오브젝트라고 한다. HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL..

    XIII : 쓰레드 동기화 기법 I

    XIII : 쓰레드 동기화 기법 I 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) 쓰레드 동기화란 무엇인가 쓰레드간의 동기화 문제만 잘 처리해도 멀티 쓰레드 프로그래밍에서 발생하는 문제의 대부분을 미리 막을 수 있다. 동기화와 관련된 문제는 컴파일타임에 발생하는 오류가 아니라, 런타임에 발생하는 오류이기에 찾아내고 디버깅하기 매우 어렵기에, 미리 예측하고 동기화를 통해 확실히 방지할 줄 알아야 한다. 동기화라고 하면 보통 무엇인가를 일치시켜 주는 것이라고 통용되지만, 쓰레드에서의 동기화는 순서에 있어서 질서가 지켜지고 있음을 의미하게 된다. 실행순서의 동기화 만일 A 쓰레드가 계산한 결과를 B 쓰레드에서 사용하려고 할 때, 순서가 중요하다. 쓰레드의 실행순서를 정의하고, 이 순..

    XII : 쓰레드의 생성과 소멸

    XII : 쓰레드의 생성과 소멸 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) Windows에서의 쓰레드 생성과 소멸 CreateThread Windows에서 사용할 수 있는 가장 기본적인 쓰레드 생성 함수는 CreateThread이다. HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpTA, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); LPSECURITY_ATTRIBUTES lpTA : 프로세스를 생성하는 CreateProcess와 마찬가지로, 이 또한 핸들의 상속 여부를..

    XI : 쓰레드의 이해

    XI : 쓰레드의 이해 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) 쓰레드란 무엇인가 오래 전에는 프로그램 내 실행 흐름을 다양화하기 위해서, 하나의 프로그램에서 둘 이상의 프로세스를 생성하는 일은 아주 빈번하였다. 하지만 이런 식으로 추가적으로 프로세스를 생성하는 작업은 상당히 부담스럽다. 빈번한 컨텍스트 스위칭을 유발시키기 때문이다. 저장하고 복원하는 컨텍스트 정보의 개수를 줄일 수 있다면, 컨텍스트 스위칭의 부담을 덜 수 있을 것이다. 프로세스는 완전히 독립된 둘 이상의 프로그램 실행을 위해 사용되고, 쓰레드는 하나의 프로그램 내에서 둘 이상의 프로그램 흐름을 만들어 내기 위해서 디자인되었다. 쓰레드들 사이에는 공유하는 요소들이 많기 때문에 컨텍스트 스위칭 부담이 비교적..

    X : 컴퓨터 구조에 대한 세 번째 이야기

    X : 컴퓨터 구조에 대한 세 번째 이야기 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) 절차적 함수 호출 지원 CPU 모델 함수 호출 또한 CPU의 도움을 받아야만 가능한 일이다. 함수 호출은 소프트웨어 종속적인 기능으로 생각할 수 있지만 사실은 하드웨어 종속적인 부분이 상당수 존재한다. 함수 호출 과정에서 할당되는 메모리 블록을 스택 프레임이라고 한다. 함수 호출이 완료되면 기존에 선언된 지역변수에 접근이 불가능하다. 이는 할당되었던 메모리가 반환되었음을 의미하는 것이다. 지역변수를 위한 메모리 공간을 스택이라 이름붙인 이유는 메모리의 구조적 특성 때문이다. 가장 먼저 할당되면, 가장 나중에 반환된다. 계속해서 스택에 데이터를 쌓거나 반환하기 위해서는 현재 어느 위치까지 데..

    IX : 스케줄링 알고리즘과 우선순위

    IX : 스케줄링 알고리즘과 우선순위 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) 프로세스의 스케줄링 우리가 접하는 대부분의 운영체제는 멀티 프로세스 기반 운영체제이다. 하나의 프로그램이 실행되기 위해서는 하나의 CPU 코어가 필요한데, 프로세스 수만큼 CPU 코어가 존재할 수 있다면 가장 이상적일 것이다. 하지만 우리의 CPU 코어는 제한되어 있고, 웬만한 범용 OS에서 백그라운드 프로세스 개수만 해도 수십개가 넘어간다. 따라서 스케줄러라는 기능이 등장하게 된다. 실행 중인 모든 프로세스들에게 골고루 CPU 코어를 할당해주는 것이다. RTOS RTOS와 일반 OS의 차이는 응답성에 있다. RTOS는 응답성이 Windows와 같은 일반 OS보다 좋다. 단, 이는 결코 RTOS..

    VIII : 프로세스간 통신 (IPC) 2

    VIII : 프로세스간 통신 (IPC) 2 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) 핸들 테이블과 오브젝트 핸들의 상속 유능한 윈도우 프로그래머는 프로세스 핸들 테이블이 어떻게 관리되는지를 이해하고 있어야 한다는 Jeffrey Richter의 말이 있듯이, 핸들 테이블에 대한 이해는 IPC 를 알기 위한 필수 요소이다. 핸들은 그저 단순한 정수값인데, 이를 가지고 커널 모드에 있는 커널 오브젝트에 접근할 수 있는 이유는 무엇일까? 이는 프로세스 핸들 테이블이 있기 때문이다. 핸들 테이블은 핸들 정보를 저장하고 있는 테이블로서, 프로세스별로 독립적이다. CreateProcess() 함수를 호출하면 새로운 자식 프로세스가 생성된다. 이 때 BOOL bInheritHandles..