삽질의 현장/- 윈도우 시스템 22

#033_WIndow_System_DLL (3)

안녕하세요 삽잡이입니다. 이번 시간에는 지난 시간에 이어서 DLL에 대하여 조금 더 알아보려고 합니다. DLL에도 메인이 있습니다. 우리가 아는 main은 한번 실행이 된 다음 종료가 되면 프로그램이 종료되지요...그런데, DLL의 main은 성격이 다릅니다.DllMain은 DLL이 어떤 상태인지 파악하려고 호출되는 네가지 case를 가지고 있습니다.즉, 네가지 case가 될 때마다 호출이 되는 것입니다. DLL의 초기화, 마무리를 위해 만들어진 것이 DLL의 메인이지요... 물론, DLL을 만들었을때 왜 안썼느냐 할 수있는데,초기화, 마무리를 할 때 할일이 없다면 필요가 없겠지요...하지만, DLL을 load할 때 메모리가 필요하고, Unload할 때 메모리를 해제해야한다면...DLL이 load,되고 ..

#033_WIndow_System_DLL (2)

안녕하세요 삽잡이입니다. 이번 시간에는 지난시간에 이어서 DLL의 기능에 대해서 알아보려고합니다. 서버에서는 DLL기능을 클라이언트에 가져다 쓰는데 두가지 기능을 제공한다고 했습니다.바로, 명시적인 DLL 연결 (explicit 연결)과 암묵적인 DLL 연결(implicit 연결)입니다. DLL이 먼저 만들어지게 되지 않습니까...존재하지 않는 기능을 먼저 쓸 수 없으니까 말입니다...서버와 클라이언트중 서버가 먼저 만들어집니다. 당연한 말이지요... DLL을 미리 만들어서 줘야 쓸 수 있는데,그 만든 것을 클라이언트에게 주어야하는 요소가 명시적 연결에서는 두개만 주면됩니다.서버가 클라이언트에게 주어야할 요소는 바로 'DLL', '도움말' 입니다. 암묵적인 DLL 연결은 첫번째로 DLL, 그리고 lib,..

#032_WIndow_System_DLL (1)

안녕하세요 삽잡이입니다. 이번 시간에는 DLL에 대해서 알아보겠습니다. 라이브러리는 뭘까요? 바로, 기능 집합을 말합니다.일반적으로 기능 집합과 형식집합이라고 부르는데,기능집합은 함수 형태의 프로그램에서 부르고, 형식 집합은 객체 지향 형태에서 부릅니다. 이 라이브러리는 두 가지로 나뉘게 됩니다.바로 정적 라이브러리 (static link library)와 동적 라이브러리(dynamic link library) 입니다.그래서 동적 라이브러리를 줄여서 dll이라고 부르는 것입니다.정적은 lib라고 부르고요... 왜냐, 예전에는 동적 라이브러리라는 개념이 없었기 때문에 라이브러리라고 하면 정적 라이브러리 밖에 없었습니다.그래서 lib로 사용하다가 동적 라이브러리라는 개념이 생기며 이를 dll로 불리기 시작한..

#031_WIndow_System_힙(Heap)

안녕하세요 삽잡이입니다. 이번시간에는 가상 메모리에 대한 얘기를 이어서 해보려 합니다. 물리메모리에 두개의 Application A, B가 있다고 해보겠습니다.실제 A 어플리케이션에서 사용할 수 있는 주소는 가상 주소 공간밖에 없습니다.가상 주소 공간의 메모리가 실제 할당이 되면, 물리 메모리에 똑같이 할당이 되게 됩니다.실제 메모리와 매핑되는 메모리 영역을 우리는 커밋(확장)영역이라고 부릅니다. 그리고, 실제 메모리 영역에 할당이 안되어있으며, 얼마든지 다른 물리 메모리 영역에 할당할 수 있도록 만든 메모리즉, '내 입장에서는 연속적인 메모리이지만, 실제 물리 메모리에서는 연속적이지 않아도 되는 영역'을예약(리저브)영역이라고 합니다. 마지막으로 전혀 예약도 되지 않은 영역을 자유 영역이라고 하지요.....

#030_WIndow_System_메모리 맵 파일

안녕하세요 삽잡이입니다.이번 시간에는 메모리 맵 파일에 대해서 알아보려고 합니다. 메모리 맵이 하는 일은 파일을 내 메모리처럼 사용할 수 있게 해주는 것입니다.이를 위해서는 파일 입출력이 필요합니다. 파일 입출력은 프로세스의 내용물을 영구적인 저장 장치(HDD, 플래시 메모리, SD 메모리 카드 등)에다가 쓰는 것을 말합니다.데이터를 그룹화하여 하나의 단위로 취급하는 것이 파일인데,이를 위해 WriteFile, ReadFile을 사용하지요... 아무튼... 영구적인 저장장치로부터 데이터를 프로세스에 올릴 때 ReadFile을 사용하게됩니다.그런데, 객체라는 데이터를 사용할때를 생각해봅시다.객체라는 데이터를 그대로 사용하게 될 때 그 안에 만약 참조가 들어있다고 한다면,그 참조 즉, 주소자체가 의미가 있을..

#029_WIndow_System_IPC_파이프(2)

안녕하세요 삽잡이입니다.이번 시간에는 파이프 통신하는 방법에 대해서 알아보도록 하겠습니다. 첫번째 인자로 파이프 이름을 받는데요,그 외에 읽고 쓰고를 가능하게 할지, 버퍼의 크기, 보안 속성등을 지정할 수 있습니다.여기서 우리는 네번째 인자를 봅도록 하겠습니다. 네번째 인자인 nMaxInstance의 경우 파이프를 최대 만들 수 있는 개수를 지정합니다.즉, 통신할 수 있는 파이프를 네번째 인자의 수 만큼 생성할 수 있게 지정하는 것입니다. 다섯번째, 여섯번째의 버퍼는 많은 곳에서 사용이 됩니다.파일에, DB에... 입출력을 필요로 하는 함수에서 버퍼의 존재를 심심치 않게 확인할 수 있습니다.아무튼... 다섯번째, 여섯번째의 버퍼는 입력 버퍼, 출력 버퍼의 사이즈를 명시하는 인자입니다. 자... 파이프를 ..

#028_WIndow_System_IPC_파이프(1)

안녕하세요 삽잡이입니다. 이번 시간에는 IPC 통신 기법중, 파이프에 대해서 배워보겠습니다. 예전에는 네트워크가 느렸기 때문에 프로세스간 통신을 위해 파이프를 사용했다는데 요즘은 잘 쓰지 않는다고 하네요...아무튼... 그렇지만 개념이 네트워크에서 사용하는 것과 비슷하다고 하니! 파이프에 대해서 알아봅시다! Windows, Linux에서 파이프나 메일슬롯은 파일처럼 다루고자 했다고합니다.그래서 파일 입출력과는 별개처럼 보이는데 CreateFile, ReadFile 과 같은 함수를 사용합니다. 여담으로는 파이프에 대해 알게 되면,파일 입출력을 배우지 않아도 똑같이 프로그래밍 할 수 있다네요...또한, 객체지향에 가면 파일을 직접 가지고 노는 경우는 극히 드물다고 합니다. 왜냐하면, 파일을 직접 가지고 놀게..

#027_WIndow_System_IPC_메시지

안녕하세요 삽잡이입니다. 여러개의 프로세스들은 각각 독립적으로만 움직일까요?아닙니다. 프로세스 간에 통신을 통해 서로 대화를 주고받을 수 있습니다.그래서 이번 시간에는 프로세스간에 통신의 방법 중 하나인 메시지에 대해서 알아보려고합니다. IPC는 Inter Process Communication 의 줄임말입니다.즉, 프로세스들 사이에 이야기를 하겠다는 뜻입니다.그렇다면 윈도우 시스템 프로그래밍의 IPC에 관련된 기술들을 살펴보도록하죠... 이전에 FindWindow 함수를 통해 프로세스 ID 혹은, 클래스 명을 알고 있다면 다른 프로세스의 핸들을 구할 수 있다는 사실을 확인하셨던 것 혹시 기억하십니까?왜 지금 이런 말을 언급하냐 하면, 핸들을 알고 있을 경우 다른 프로세스에게 통신이 가능할 수 있게 되기..

#026_WIndow_System_커널 모드 동기화 객체_메시지

안녕하세요 삽잡이입니다. 이번 시간에는 커널 동기화 객체들의 신호 상태를 기다리는 WaitForSingleObject 함수의 반환 코드에 대해서 알아보려고 합니다. 우선, WaitForSingleObject 함수는 두번째 인자의 시간까지 상태 확인을 원하는 커널 오브젝트를 기다립니다. WaitForSingleObject 함수를 통해 해당 커널 오브젝트가어떻게 종료됬는지, 혹은 상태에 대해서 파악할 수 있기 때문에 몇가지 종료 코드에 대해서 알아보도록 하겠습니다. 우선, WAIT_OBJECT_0 코드는 정상적인 신호 상태를 검출했을 때 반환 되는 코드입니다. 뮤텍스는 소유권을 가지고 있기 때문에해당 뮤텍스의 소유권을 포기할 수 있는 놈은 자기 자신 밖에 없습니다.그런데, 반환하지 않고 쓰레드가 종료된다면,..

#025_WIndow_System_커널 모드 동기화 객체_이벤트

안녕하세요 삽잡이입니다. 이번 시간에는 커널 모드 동기화 객체 중에 이벤트에 대해서 알아보려고 합니다. 이벤트는 다른 동기화 오브젝트와 동작방식 자체가 좀 다릅니다.지금까지 사용했던 동기화 객체들은 데이터 보호에 사용이 되었던 것이고,이벤트는 일반적으로 순서 제어에 사용됩니다.즉, 내가 원하는 시점에 그 이벤트가 신호 상태가 되도록 만드려는 매커니즘에 많이 사용됩니다. 이벤트는 '어떤 사건', '어떤 신호'를 말합니다.어떤 사건이 주어지면 신호 상태로 바꾸는 메커니즘이라는 것입니다.이벤트도 커널 오브젝트이기 때문에 신호, 비신호 상태를 가집니다. 이벤트에는 두 가지 종류가 있습니다. 바로 수동 이벤트와 자동 이벤트입니다. 우선 이벤트를 생성하기 위한 함수입니다.수동 이벤트와 자동 이벤트를 결정하는 인자는..