'전체'에 해당되는 글 115건
- 2010.03.31 명령이 1 코드에서 끝났습니다.
- 2010.03.31 Thread(스레드)
- 2010.03.31 Managed Code & Unmanaged Code
- 2010.03.26 ReadFile() 함수
- 2010.03.24 CloseHandle() 함수
- 2010.03.24 WriteFile() 함수
#. 정의
- 운영 체제에서는 프로세스를 사용하여 실행 중인 다양한 응용 프로그램을 구분하는데 스레드는 운영 체제에서 프로세서 시간을 할당하는 기본 단위 입니다. 두 개 이상의 스레드가 해당 프로세스 내에서 코드를 실행할 수 있습니다. 각 스레드에서는 예외 처리기와 스케줄링 우선 순위, 시스템에서 일정을 잡을 때까지 스레드 컨텍스트를 저장하는 데 사용되는 구조 집합을 유지 관리합니다.
- 하나의 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말합니다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있는데 이러한 실행방식을 Multithread(멀티 스레드)라고 합니다. 스레드가 여러개 실행될 경우 스케줄러는 각 스레드에게 시간을 할당하여 실행함으로써 사용자가 보기에 여러 스레드가 동시에 실행되는 것 처럼 보이게 됩니다.
#. 특징
- 각 스레드는 독립적인 Stack(스텍)을 가집니다.
- 코드 영역을 공유합니다.
- 데이터 영역 및 힙 영역을 공유합니다.(전역변수와 동적 할당된 메모리 공간도 공유가 가능합니다.)
- 프로세스 핸들 테이블을 공유합니다. 프로세스 핸들 테이블에 대한 핸들 정보는 프로세스 내의 쓰레드들에게 공유되어 각 스레드가 그 핸들에 대해 접근이 가능합니다.
※ 결국 같은 프로세스 내의 스레드들은 스텍 이외의 모든 것을 공유하게 됩니다.
#. Managed Code
- .NET 프레임워크 환경에서 동작하는 코드로 CLR(Common Language Runtime)에 적용받는 코드입니다. managed code의 경우 .NET 실행환경에 의해 제공되는 기능들(ex. 가비지 컬렉션 등)을 그대로 이용할 수 있습니다. C#, VB.NET, ASP.NET등이 managed code에 포함됩니다.
#. Unmanaged Code
- Unmanaged code, 또는 Native code라고 불리우며 CLR에 적용 받지 않고 개발자가 사용하고 있는 PC의 윈도우 운영체제상에서 동작하는 코드를 말합니다. 이럴 경우 각 운영체제에 따라 동작이 안될 수도 있습니다. 예를 들면 Visual Studio 6.0까지의 VC++ 6.0을 들 수 있습니다.
#. 내용.
- 파일로 부터 데이터를 읽어옵니다. 주로 동기적인 입력에 사용하기 때문에 데이터를 완전히 읽기 전에는 리턴하지 않으며, 비동기 입력에 사용할 경우는 즉시 리턴합니다. 현재 파일 포인터 위치에서부터 데이터를 읽으며 다 읽은 후 실제 읽은 바이트 수만큼 파일 포인터를 이동시켜 줍니다. 단, 비동기 입출력중일 때는 응용 프로그램이 파일 포인터를 직접 이동시켜 주어야 합니다.
#. 원형.
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
#. 파라미터.
- HANDLE hFile: 읽고자 하는 파일의 핸들. 이 파일은 GENERIC_READ 액세스 권한으로 열어야 합니다.
- LPVOID lpBuffer: 읽어 올 데이터를 저장할 버퍼의 포인터 입니다.
- DWORD nNumberOfBytesToRead: 실제 읽어오는 바이트 수를 지정합니다.
- LPDWORD lpNumberOfBytesRead: 실제로 읽어온 바이트 수를 리턴하기 위한 출력용 인수입니다. ReadFile함수는 호출되는 즉시 이 값을 0으로 만듭니다. 비동기 입출력을 하지 않을 경우 이 인수는 null을 줄 수 없으며, 반드시 DWORD형 변수에 대한 포인터를 제공해야 합니다.
LPOVERLAPPED lpOverlapped: 비동기 입출력을 위한 OVERLAPPED 구조체의 포인터입니다. 파일을 FILE_FLAG_OVERLAPPED 플래그로 열었으면 이 구조체를 반드시 제공해야 하며 비동기 입출력을 사용하지 않을 경우 NULL을 주면 됩니다.
#. 리턴 값.
- 성공하면 0이 아닌 값을 리턴합니다.
- 리턴값이 0이 아닌데 실제 읽은 바이트가 0이라면 파일 포인터가 끝부분(EOF)인 것입니다.
- 실패하면 0을 리턴 합니다.
- 파일에 데이터를 기록합니다. 파일 포인터가 가리키고 있는 지점에 데이터를 기록하며 기록을 완료한 후 실제 기록한 바이트 수 만큼 파일 포인터를 이동시켜 줍니다.
- 파일뿐만 아니라 파이프, 소켓, 통신 포트, 콘솔 등의 장치로도 데이터를 출력할 수 있습니다.
#. 원형.
BOOL WriteFile (
HANDLE hFile,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
OVERLAPPED lpOverlapped
);
#. 파라미터.
- HANDLE hFile: 기록하고자 하는 파일의 핸들입니다. 이 파일은 GENERIC_WRITE 엑세스 권한으로 열어야 합니다.
- DWORD nNumberOfBytesToWrite: 기록할 수 있는 바이트 수를 지정합니다.
- LPDWORD lpNumberOfBytesWritten: 실제로 기록한 바이트 수를 리턴받기 위한 출력용 파라미터 입니다. writeFile호출시 이 값은 바로 0으로 변경됩니다. 비동기식 입출력을 하지 않을 경우 이 인수는 null로 줄 수 없으며, 반드시 DWORD형 변수에 대한 포인터를 제공해야 합니다.
- OVERLAPPED lpOverlapped: 비동기식 입출력을 위한 OVERLAPPED 구조체의 포인터 입니다. 파일을 FILE_FLAG_OVERLAPPED 플래그로 열었으면 이 구조체를 반드시 제공해야 하며, 비동기 입출력을 사용하지 않을 경우 NULL을 주면 됩니다.
출처: http://www.nicklib.com/library/WIN32API/