'SYSTEM PROGRAMMING'에 해당되는 글 84건

  1. 2015.08.06 IOCP 의 단계적 구현 by 뉴암스테르담
  2. 2015.08.05 stored procedure 와 아닌 코드.. by 뉴암스테르담
  3. 2015.08.05 CREATE PROC dbo.UP_INSERT_BOARDNEW by 뉴암스테르담
  4. 2015.08.05 C# 문법 특징 by 뉴암스테르담
  5. 2015.08.05 Loop through files (Recurse subfolders) by 뉴암스테르담
  6. 2015.08.05 I/O Completion Port 모델 by 뉴암스테르담
  7. 2015.08.05 윈도우즈 기반 I/O 모델 by 뉴암스테르담
  8. 2015.08.05 세마포어(Semaphore) 기반의 동기화 by 뉴암스테르담
  9. 2015.08.05 Mutex 기반 동기화 by 뉴암스테르담
  10. 2015.08.05 이벤트(Event Kernel Object)를 이용한 커널 모드 동기화 by 뉴암스테르담


IOCP 의 단계적 구현  시스템프로그래밍 

2015.08.02. 12:48

복사http://blog.naver.com/pwk0810/220438678355

전용뷰어 보기

+Completion port 의 구성

 

  • Accept 함수의 호출은 main 쓰레드가 처리하도록 하고,  별도의 쓰레드를 추가로 하나 생성하여 클라이언트와의 입출력을 담당한다
  • 입력과 출력은 non-blocking 모드로 동작하는가?
  • non-blocking 모드로 진행된 입력과 출력의 완료는 어떻게 확인하는가?
  • IOCP 에서는 완료된 IO 의 정보가 Completion 포트 오브젝트라는  커널 오브젝트에 등록된다.
  • " 이 소켓을 기반으로 진행되는 IO 의 완료상황은 저 CP 오브젝트에 등록해 주세요"
  • IOCP 모델의 서버 구현에서 진행하여야 하는 일
    • Completion Port 오브젝트의 생성
    • Completion Port 오브젝트와 소켓의 연결

 

 #include <Windows.h>

HANDLE CreateCompletionPort(HANDLE FileHandle,  HANDLE ExistingCompletionPort, ULONG_PTR CompletionKey, DWORD NumberofCoucurrentTrheads);
CP 오브젝트 생성

FileHandle

 CP 오브젝트 생성시에는 INAVLID_HANDLE_VALUE 를 전달

 ExstingCompletionPort

CP 오브젝트 생성시에는 NULL 전달 

 CompletionKey

CP 오브젝트 생성시에는 0 전달

 NumberOfConcurrentThreads

CP 오브젝트에 할당되어 완료된 IO 를 처리할 쓰레드의 수를 전달

예를 들어 2가 전달되면 CP 오브젝트에 할당되어 동시 실행 가능 한 쓰레드의 수는 최대 2개로 제한한다. 

그리고 이 인자에 0이 전달되면 시스템의 CPU 개수가 동시 실행가능한 쓰레드의 최대수로 지정된다.

 

 

 HANDLE hCpObject;

hCpObject = CreateIOCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 2);


 


+ Completion Port 오브젝트와 소켓의 연결


 

  • 생성된 CP 오브젝트를 소켓과 연결하는 과정이다.  그래야 소켓의 IO 정보가 CP 오브젝트에 등록된다.

 

 

 

 #include <Windows.h>

HANDLE CreateCompletionPort(HANDLE FileHandle,  HANDLE ExistingCompletionPort, ULONG_PTR CompletionKey, DWORD NumberofCoucurrentTrheads);

-> 성공시 CP 오브젝트의 핸들 , 실패시 NULL 반환

 FileHandle

CP 오브젝트에 연결할 소켓의 핸들 전달

  ExstingCompletionPort

 소켓과 연결할 CP 오브젝트의 핸들 전달

 CompletionKey

 완료된 IO 관련 정보의 전달을 위한 매개변수

  NumberOfConcurrentThreads

 어떠한 값을 전달하던 , 이 함수의 두번째 매개변수가 NULL 이 아니면 그냥 무시된다.

 


 

HANDLE hCpObject;

hCpObject = CreateIOCompletionPort(INVALID_HANDLE_VALUE, NULL, 0,

 

 HANDLE hCpObject;

SOCKET hSock


CreateIOCompletionPort((HANDLE)hSock,  hCpObject, (DWORD) ioIfo, 0);

 


+ Completion Port 의 완료된 IO 확인과 쓰레드의 IO 처리

 

  •  CP 에 등록되는 완료된 IO 의 확인 방법에 관련된 함수

#include < windows.h>

BOOL GetQueueCompletionStatus( HANDLE CompletionPort,  LPDWORD lpNumberOfBytes, PULONG_PTR lpCompletionKey,  LPOVERLAPPED* lpOverlapped,  DWORD dwMilliseconds);

 

 

 CompletionPort

완료된 IO 정보가 등록되어 있는 CP 오브젝트의 핸들 전달 

lpNumberOfBytes

입출력 과정에서 송수신된 데이터의 크기 정보를 저장할 변수의 주소값 전달 

 lpCompletionKey

CreateIOCompletionPort 함수의 세번째 인자로 전달된 값의 저장을 위한 변수의 주소값 전달 

 lpOverlapped

WSASend, WSARecv, 함수 호출시 전달하는 OVERLAPPED 구조체 변수의 주소값이 저장될

변수의 주소값 전달 

 dwMilliseconds

 타임아웃 정보 전달,  여기서 지정한 시간이 완료되면 FALSE 를 반환하면서 함수를 빠져나가며,

INFINITE 를 반환하면서 함수를 빠져나가며,  INFINITE 를 전달하면 완료된 IO 가 CP 오브젝트에 등록될때까지 블로킹 상태에 있게 된다.

 


 

  • GetQueuedCompletionStatus 함수의 세번째 인자를 통해서 얻게 되는 것은 소켓과 CP 오브젝트의 연결을 목적으로 CreateIOCompletionPort 함수가 호출될때 전달되는 네번째 인자값이다.
  • GetQueuedCompletionStatus 함수의 네번째 인자를 통해서 얻게되는 것은 WSASend, WSARecv 함수 호출시 전달되는 
    WSAOVERLAPPED 구조체 변수의 주소값이다.

  •  

+IO 가 성능이 좀 더 나오는 이유
  • NON-BLOCKING 방식으로 IO 가 진행되기 때문에,  IO 작업으로 인한 시간의 지연이 발생하지 않는다.
  • IO 가 완료된 핸들을 찾기 위해서 반복문을 구성할 필요가 없다.
  • IO 의 진행대상인 소켓의 핸들을 배열에 저장해 놓고 , 관리할 필요가 없다.

 


Posted by 뉴암스테르담
l
stored procedure 와 아닌 코드..  시스템프로그래밍 

2013.06.24. 18:55  수정  삭제

복사http://blog.naver.com/pwk0810/40191705307

전용뷰어 보기

 // stored procedure 를 사용하지 않은 코딩...  효율이 떨어지나 테스트 용으로..
        /*
        String SQLQuery = "SELECT userid, pwd, email FROM LoginInfo";
        SqlCommand command = new SqlCommand(SQLQuery, Con);

        SqlDataReader dr;
        Con.Open();
        dr = command.ExecuteReader();

        while (dr.Read())
        {
            while(username == dr["userid"].ToString() && (password == dr["pwd"].ToString()))
            {
                typedSession typedsession = new typedSession(username, password, dr["email"].ToString());

                Session["session"] = typedsession;
                dr.Close();
                return true;
            }
        }

        dr.Close();
        return false;
        */ 
*****************************************************************************************************************

        /*
        string sp = "UP_SELECT_LOGININFO_TEST1";
        


        Cmd = new SqlCommand(sp, Con);
        Cmd.CommandType = CommandType.StoredProcedure;

        Cmd.Parameters.Add("@userid", SqlDbType.VarChar, 20);
        Cmd.Parameters.Add("@pwd", SqlDbType.VarChar, 20);
        


        Cmd.Parameters["@userid"].<wbr />Value = username;
        Cmd.Parameters["@pwd"].Value = password;
        

        try
        {


            SqlDataReader dr;
            Con.Open();
            dr = Cmd.ExecuteReader();


            if(dr.Read())
            {
                if(username == dr["userid"].ToString() && (password == dr["pwd"].ToString()))
                {
                    typedSession typedsession = new typedSession(username, password, dr["email"].ToString());

                    Session["session"] = typedsession;
                    dr.Close();
                    return true;
                }
            }


            Con.Close();

            Response.Redirect("list.aspx")<wbr />;

        }
        catch (Exception ex)
        {
            //lblText.Text = "ERROR : " + ex.Source + " - " + ex.Message;
            //lblText.Visible = true;

            return false;
        }

        return false;

        */


CREATE PROC UP_SELECT_LOGININFO_TEST1
@userid varchar(20) = '%',
@pwd varchar(20) = '%',
@returnid varchar(20) OUTPUT,
@returnpwd varchar(20) OUTPUT,
@returnemail varchar(100) OUTPUT

AS
SELECT @returnid = userid, @returnpwd = pwd, @returnemail = email 

FROM LoginInfo
where userid LIKE @userid AND pwd LIKE @pwd

go


Posted by 뉴암스테르담
l
CREATE PROC dbo.UP_INSERT_BOARDNEW  시스템프로그래밍 

2013.06.20. 13:00  수정  삭제

복사http://blog.naver.com/pwk0810/40191432639

전용뷰어 보기

출처 : http://www.taeyo.pe.kr/Columns/View.aspx?SEQ=102&PSEQ=9&IDX=0

 

CREATE PROC dbo.UP_INSERT_BOARDNEW
    @Writer    Varchar(20),
    @Pwd       Varchar(20),
    @Email     Varchar(100),
    @Title       Varchar(100),
    @Mode     Bit,
    @Ip         Varchar(15),
    @Content    Text
AS
    SET NOCOUNT ON
    DECLARE@NewThreadint
    SELECT @NewThread = ISNULL(MAX(Thread),0) + 1000 FROM ThreadBoard

    INSERT INTO ThreadBoard 
        (thread, depth, writer, pwd, email, title, mode, ip, content) 
    Values 
        (@NewThread, 0, @Writer, @Pwd, @Email, @Title, @Mode, @Ip, @Content)

GO


'SYSTEM PROGRAMMING' 카테고리의 다른 글

IOCP 의 단계적 구현  (0) 2015.08.06
stored procedure 와 아닌 코드..  (0) 2015.08.05
C# 문법 특징  (0) 2015.08.05
Loop through files (Recurse subfolders)  (0) 2015.08.05
I/O Completion Port 모델  (0) 2015.08.05
Posted by 뉴암스테르담
l


C# 문법 특징  시스템프로그래밍 

2013.06.19. 10:20  수정  삭제

복사http://blog.naver.com/pwk0810/40191354255

전용뷰어 보기

 

초기 수준의 문법 수준만을 정리합니다.  소스 코드 따위.. 

 

 

1. 접근 한정자로 수식하지 않으면 클래스의 멤버는 무조건 private 으로 접근 수준으로 자동으로 지정됩니다.

  ?  코딩 컨벤션이나 C++ 사용자와의 호환을 위해 무조건 접근 지정자를 지정해야 하는건 어떨까?

 

 

2. 상속 봉인 sealed class 

의도하지 않은 상속이나 파생클래스의 구현을 막기 위해서 상속이 불가능하도록 클래스를 한정한다.

 

sealed class Base

 

class Derived : Base - 컴파일 에러

 

 

 

3. is - 객체가 해당 형식에 해당하는지를 검사하여 그 결과를 bool 값으로 변환

  as - 형식 변환 연산자와 같은 역할을 합니다.  다만 형변환 연산자가 변환에 실패하는 경우 예외를 던지는 반면에 as 연산자는 null 로 만든다는것이 다릅니다.

 

Mammal mammal = new Dog();

Dog dog;

 

if(mamal is dog)

{

do = (Dog)mammal;

dog.Bark();

}

Mammal mammal12 = new Cat();

Cat cat = mammal12 as Cat;

 

if(cat != null)

{

cat.Meow();b - mammal2가 Cat 형식 변환에 실패했다면 null

}

 

4. 오버라이딩과 다형성

 

class Armorsuite

{

public virtual void Inti()

{

}

}

 

class ironman : Armorsuite

{

public override void Init()

}

 

5.메소드 숨기기

CLR 에게 기반 클래스에서 구현된 버전의 메소드를 감추고 파생 클래스에서 구현된 버전만을 보여주는 것을 말함.

 

class Base

{

public void MyMethod()

{

 

}

}

class Derived : Base

{

public new void MyMethod() - base Mymethod 를 감추고 derived method 만 노출

{

 

}

}

 

Derived derived = enw Derived();

derived.MyMehod();

 

Base baseOrDerived = new Derived();

baseOrDerived.MyMethod (); // "Base.MyMethod()" / 출력

 

11. 오버라디딩 봉인하기

 

클래스를 상속이 안되도록 봉인하는 것처럼 메소드도 봉인..

 

virtual 키보드 대신 sealed 선언

 

 

13. 분할 클래스

 

여러번에 나눠서 구현하는 클래스

클래스의 구현이 길어질 경우 여러 파일에 나눠서 구현할 수 있게 됨.

 

partial class MyClass...

 

partial class MyClass

 

14. 확장 메소드

 

 

15. 자동 구현 프로퍼티

 

 

public class NameCard

{

public string Name

{

get; set;

}

 

public string PhoneNumber

{

get; set;

}

}

 

16. 무명 형식

 

 

var MyInstance = new { Name = "박상현" , Age = "17"};

 

17. 배열 초기화 방법

 

string [] array1 = new string[3] { "안녕", "hello", " halo" };

string [] array2 = new string[] { "안녕", "hello", " halo" };

string [] array3 = { "안녕", "hello", " halo" };

 

 

 

 

'SYSTEM PROGRAMMING' 카테고리의 다른 글

stored procedure 와 아닌 코드..  (0) 2015.08.05
CREATE PROC dbo.UP_INSERT_BOARDNEW  (0) 2015.08.05
Loop through files (Recurse subfolders)  (0) 2015.08.05
I/O Completion Port 모델  (0) 2015.08.05
윈도우즈 기반 I/O 모델  (0) 2015.08.05
Posted by 뉴암스테르담
l
Loop through files (Recurse subfolders)  시스템프로그래밍 

2013.06.18. 18:42  수정  삭제

복사http://blog.naver.com/pwk0810/40191317244

전용뷰어 보기

Loop through files (Recurse subfolders)

  Syntax
       FOR /R [[ drive :] path ] %% parameter IN ( set ) DO command

 Key
    drive : path : The folder tree where the files are located.

    set : A set of one or more files.  Wildcards must be used.
                  If (set) is a period character (.) then FOR will
                  loop through every folder.

   command : The command(s) to carry out, including any
                  command-line parameters.

    %% parameter : A replaceable parameter:
                  in a batch file use %%G (on the command line %G) 

This command walks down the folder tree starting at [drive:]path, and executes the DO statement against each matching file. 

If the [drive:]path are not specified they will default to the current drive:path.

Unlike some other variants of the FOR command you must include a wildcard (either * or ?) in the 'set' to get consistent results returned. In many cases you can work around this by adding a single character wildcard eg if you are looping through multiple folders to find the exact filename myfile.txt you could instead specify myfile.t?t 

Examples:

Delete every .bak file in every subfolder starting at C:\temp 

C:\> FOR /RC:\temp\ %%G IN (*.bak) DO del %%G

List all the subfolders under C:\Work

FOR /R "C:\Work\" %%G in (.) DO ( 
Pushd %%G 
Echo now in %%G 
Popd ) 
Echo "back home"

FOR is an internal command. 

“Just think how happy you would be if you lost everything you have right now, and then got it back again” - Frances Rodman

Related: 

FOR - Loop commands 
FOR - Loop through a set of files in one folder 
FOR /D - Loop through several folders 
FOR /L - Loop through a range of numbers 
FOR /F - Loop through items in a text file 
FOR /F - Loop through the output of a command 
FORFILES - Batch process multiple files 
IF - Conditionally perform a command 
Powershell: ForEach-Object - Loop for each object in the pipeline 
Equivalent bash command (Linux): for - Expand words , and execute commands

'SYSTEM PROGRAMMING' 카테고리의 다른 글

CREATE PROC dbo.UP_INSERT_BOARDNEW  (0) 2015.08.05
C# 문법 특징  (0) 2015.08.05
I/O Completion Port 모델  (0) 2015.08.05
윈도우즈 기반 I/O 모델  (0) 2015.08.05
세마포어(Semaphore) 기반의 동기화  (0) 2015.08.05
Posted by 뉴암스테르담
l
I/O Completion Port 모델  시스템프로그래밍 

2013.04.18. 22:12  수정  삭제

복사http://blog.naver.com/pwk0810/40187373362

전용뷰어 보기

Completion Port 는 Overlapped I/O 에 쓰레드 풀링(ThreadPooling ) 과 Queue라는 메커니즘을 동시에 접목시킨 기술이라고 할 수 있다.

 

 

 

 

 

  1. CreateCompletionPort를 이용해 socket  과 CompletionKey를 CompletionPort라는 객체를 등록시킴
  2. 완료된 작업을 받을때는 GetQueueCompletionStatus() 함수를 이용

Overlapped I/O  모델에서는 볼수 없었던 자료 구조와 매커니즘이 추가.
  1. CreateIOCompletionPort()함수를 이용해 CompletionPort 객체에 등록한 socket 과 CompletionPort 객체를 관리하는 DeviceList 라는 자료구조의 추가이다.
  2. IOCP Queue(I/O Completion Port Queue ) 라는 자료 구조 추가.
    Overlapped 모델과는 다르게 I/O작업이 완료되었을때 곧바로 사용자에게 알리지 않고완료된 작업결과를 IOCP Queue에 넣은 후 Completion port 객체를 이용해 사용자에게 알림.

  3. 커널은 쓰레드풀링 매커니즘을 이용해 사용자에게 알린다. 
    커널은 쓰레드 풀링 매커니즘을 이용하여 IOCP Queue에서 완료된 Overlapped I/O 작업을 가져와 뒤처리

 

 

 

+ Overlapped IO 모델에서 IOCP 모델로

 

 

  • Overapped IO 모델의 에코 서버는 "NON-BLOCKING 모드의 accept 함수와 alertable wait 상태로이 진입을 위한 SleepEX 함수가 번갈아 가며 반복 호출되는 것은 성능에 영향을 미칠수 있다"

  • accept 함수 호출은 main 스레드가 처리하도록 하고 , 별도의 스레드를 추가로 하나 생성해서 클라이언트 와의 입출력을 담당하게 된다.


  • CompletionPort 의 생성
    • 완료된 IO 의 정보가 Completion Port 오브젝트라는 커널 오브젝트에 등록.
    • Completion Port 의 생성
    • Completion Port 오브젝트와 소켓의 연결




 


'SYSTEM PROGRAMMING' 카테고리의 다른 글

C# 문법 특징  (0) 2015.08.05
Loop through files (Recurse subfolders)  (0) 2015.08.05
윈도우즈 기반 I/O 모델  (0) 2015.08.05
세마포어(Semaphore) 기반의 동기화  (0) 2015.08.05
Mutex 기반 동기화  (0) 2015.08.05
Posted by 뉴암스테르담
l
윈도우즈 기반 I/O 모델  시스템프로그래밍 

2013.04.17. 17:32  수정  삭제

복사http://blog.naver.com/pwk0810/40187284674

전용뷰어 보기

 

 

 

+ WSAsyncSelect 모델

 

 

  • 클라이언트 통신 모델로는 많이 쓰인다.
  • 윈도우즈 메시지 큐를 한번 거쳐서 들어오기 때문에 성능은 좋지 않다
    • 그러나 경험상 WSAAyncSelect  모델 자체보다는 모델의 이해의 부족으로 인한 설계 혹은 잘못된 사용이 원인인 경우가 훨씬 많았다.
    • 그리고 또한 클라이언트는 메시지 송수신 자체 보다는 로직상의 병목 지점이 대다수이다. 
  • 장점은 관리하기가 굉장히 용이.
  • 소켓 통신의 결과가 윈도우 메시지로 알려준다. 
WSAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent);
  • 자동적으로 Non-Blocking 모드가 된다

+WSAEventSelect 모델

WSAEventSelect ( SOCKET s, WSAEVENT hEventObject, long lEvents);
  • 커널 오브젝트인 이벤트 객체를 사용한다.
  • 성능이 좋은편으로 소규모 서버에 적당하다. 
  • 실제 채널형 온라인 게임에 많이 쓰인다 하나 ...  ... ... 아닌듯! ㅋ
  • 두번째 인자는 네트워크 이벤트를 감지할 이벤트 객체이다.
  • 소켓의 네트워크 이벤트를 감지해 이벤트 객체와 네트워크 이벤트를 연결시키고 등록하는 역할을 함.

+ Overlapped I/0  모델


+ Overlapped I/O EventModel 


Posted by 뉴암스테르담
l
세마포어(Semaphore) 기반의 동기화  시스템프로그래밍 

2013.04.17. 16:01  수정  삭제

복사http://blog.naver.com/pwk0810/40187278177

전용뷰어 보기

엄밀히 말하면 뮤텍스는 세마포어의 일종이다

 

  • 세마포어의 최대 가질수 있는 내부 카운트를 1로 제한하여 실질적으로 그 카운트가 0과 1을 가진다.
  • 이러한 기능을 하는 세마포어를 바이너리 세마포어라고 한다.

 

뮤텍스는 게임 서버에서는 잘 사용하지 않는 기법임에 반해 세마포어는 아주 많이 사용한다.

윤성우님의 "뇌를 자극하는 윈도우즈 시스템 프로그래밍" 에서의 예를 든 "명동 교자" 라는 설명은 아주 탁월한 비유인듯 하다. 그보다 나은 설명을 해낼 방법이 없다능..

 

"임계 영역에 동시접근할 수 있는 쓰레드의 개수는 10개" 의 의미


 

  • 세마포어는 내부에 카운트를 두어서 소유권을 가질수 있는 쓰레드 들의 수를 설정할 수 있다.
  • 동시에 실행되는 쓰레드를 수를 설정할 수 있다는 뜻.
  • 바이너리 세마포어가 아닌 경우는 세마포어(내부 카운트 2이상) 는 스레드가 동시에 같은 공유 자원을 접근할 수 있기 때문에 크리티컬 섹션이나 뮤텍스 같은 다른 동기화 자원가 함께 사용해야 한다. ( 당연히 게임서버는 크리티컬 섹션 )
  • 동시에 접근 할수 있는 쓰레드의 수를 설정하기 위해 쓰레드 풀링을 사용한다.

CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
                        LONG lInitailCount, 
      LONG maximumCount,
      LPCTSTR lpName);
  • 커널 객체 생성을 커널에 요청하는 역할을 한다.
  • 세마포어는 값을 지닌다.
  • 세마포어가 생성될때 전달 인자 lInitailCount 의 초기 카운트가 결정.
  • 카운트가 0인 경우 Non-Signaled 상태
  • 1인 경우 Signaled 상태가 된다.
  • 핸들을 인자로 전달하면서 WaitForSingleObject 함수를 호출할 경우, 그 값이 하나씩 감소하면서 함수를 반환.
  • 세마포어를 생성할때 초기 카운트를 10으로 놓을 경우,  WaitForSingleObject 함수가 총 열번 호출 될때 까지 카운트가 하나씩 감소하면 함수를 반환.
  • 열한번째 호출시 세마포어 카운트가 0인 관계로 블록킹 상태가 된다.
  • iIntialCount 는 할당하고자 하는 열쇠의 카운트로 비유


RelaseSemaphore(HANDLE hSemaphore, LONG lReleaeCount, LPLONG lpPreviouCount );
로 해제한다. 


                        


'SYSTEM PROGRAMMING' 카테고리의 다른 글

I/O Completion Port 모델  (0) 2015.08.05
윈도우즈 기반 I/O 모델  (0) 2015.08.05
Mutex 기반 동기화  (0) 2015.08.05
이벤트(Event Kernel Object)를 이용한 커널 모드 동기화  (0) 2015.08.05
객체 상태별 종류  (0) 2015.08.05
Posted by 뉴암스테르담
l
Mutex 기반 동기화  시스템프로그래밍 

2013.04.17. 15:40  수정  삭제

복사http://blog.naver.com/pwk0810/40187276800

전용뷰어 보기

  • 커널 모드 동기화 방법
  • 유저 모드에 비하면 느리다 ( 커널 모드 -> 유저모드 -> 커널 모드로 변환되어야 한다 )
  • 유저모드에서 제공받지 못하는 기능을 제공받는다.
  • 그러나 느리다. 그래서 게임 서버에서는 거의 사용하지 않는다.
  • 뮤텍스는 기본적으로 자동 리셋 모드로 동작한다.
    • bInitialOwner:   FALSE(크리티컬 섹션처럼 먼저 차지하는 사람이 임자 )
    • bInitialOwner : TRUE (뮤텍스를 생성하는 쓰레드가 먼저 기회를 얻는다 )
    • 대기하고 있는 스레드중 어떤 쓰레드가 실행 상태로 바뀌게 될지 알수 없다는 의미이다.
    • 실행순서를 동기화한다는 측면에서의 접근은 역시 모호? 
  • 누군가에 의해 획득될때 sIgnaled 상태에 놓인다.
  • WaitForSingleObject 함수를 통해서 임계 영역에 진입을 위한 뮤텍스 획득 용도로 사용된다.
      • 인자로 전달된 핸들의 커널 오브젝트가 Signaled 상태가 되어서 반환하는 경우, 해당 커널 오브젝트를 Non-Signaled 상태로 변경함.

CreateMutex( LPSECURITY_ATTIRBUTES lpMutexAttributes,
                   BOOL bInitialOwner,
                   LPCSTR lpName )

ReleaseMutex(hMutex) : 뮤텍스를 반환할 때

CloseHandle() :  리소스 해제, 핸들 반환


Posted by 뉴암스테르담
l
이벤트(Event Kernel Object)를 이용한 커널 모드 동기화  시스템프로그래밍 

2013.04.17. 13:13  수정  삭제

복사http://blog.naver.com/pwk0810/40187267107

전용뷰어 보기

 

  • 특정 쓰레드를 우리가 원하는 시점에서 대기 상태에서 실행 상태로 바꿀수 있다.
  • 한개의 쓰레드만이 아니라 여러개의 쓰레드들을 동시에 실행 상태로 바꿀수 있다.
  • 커널에서 프로그램으로 어떤 신호를 알려줄 때에도 많이 사용

Auto-Reset  Mode

 

  • 신호 받음 상태 (signaled)) 상태가 되었을때 곧바로 Non-Signaled 상태로 바뀌는 모드
  • 여러개의 쓰레드가 동시에 같은 자동 리셋 모드의 이벤트를 대기하고 있는 중에 신호 받음 상태가 될 때
    • 어떤 쓰레드들 중 실행상태가 될지는 알 수 없다. 
Manual-Reset Mode
  • 신호 받음 상태가 되었을때 자동 리셋 모드와 같이 자동으로 신호 못받음 상태로 바뀌지 않기 때문에 사용자가 ResetEvent() 함수를 호출하여 신호 못받음 상태로 바꿔줘야 한다.
  • 대기하는 여러개의 스레드가 동시에 수동 리셋 모드 이벤트를 대기 중에 신호 받음 상태가 된다면 대기하고 있던 모든 쓰레드들이 실행 상태로 바뀌게 된다.
  • 어러개의 쓰레드가 동시에 수동 리셋 모드 이벤트를 대기하고 있는 중에 신호 받음 상태가 된다면 대기하고 있던 모드 쓰레드들이 실행 상태로 바뀌게 된다.
  • Auto-Reset모드와의 차이점이다.

자동 리셋 모드와 수동 리셋 모드의 차이점이다.


CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes,   // 보안 속성
BOOL bManualReset,       // TRUE 수동 리셋  ,  FALSE 
BOOL bInitiaState,           // 이벤트 객체 초기 상태 FALSE : non-signaled
LPCTSTR lpName )


SetEvent(HANDLE hEvent) ;    // 지정된 이벤트 객체를 신호 받음 상태로 바꾸는 역할
ResetEvent(HANDLE hEvent); // 지정된 이벤트 객체를 신호 못받음 상태로 바꾸는 역할
PulseEvent(HANLDE hEvent); // 지정된 이벤트를 신호받음 상태로 바꾸었다가 곧바도 신호 못받                                          // 음 상태로 바꿈


'SYSTEM PROGRAMMING' 카테고리의 다른 글

세마포어(Semaphore) 기반의 동기화  (0) 2015.08.05
Mutex 기반 동기화  (0) 2015.08.05
객체 상태별 종류  (0) 2015.08.05
채널서버  (0) 2015.08.05
Event ( Auto-Reset) 모드와 ( Manual-Reset) 모드  (0) 2015.08.05
Posted by 뉴암스테르담
l