Windows Via C/C++

작성일: 2013-05-21


* 윈도우(비스타 이상)는 유니코드 문자를 UTF-16으로 인코딩한다(UTF: Unicode Transformation Format).

* 문자열 간의 비교나 정렬은 매우 일반적인 작업들인데, 윈도우에서 이를 위한 최상Best의 함수는 CompareString(Ex)나 CompareStringOrdinal이다.

* 윈도우의 GetThreadLocale 함수를 이용하면 함수를 호출한 스레드의 LCID 값을 알 수 있다. * C++/국가 설정 구하기(로캘)

* 독립된 프로세스 핸들 테이블이 존재한다.

* 커널 오브젝트 생성이 실패하면 보통 0(NULL)을 반환한다. 그러나 시스템의 가용 메모리가 매우 작거나 보안상의 이유로 함수가 실패하는 경우 몇몇 함수는 -1(INVALID_HANDLE_VALUE)를 반환하는 함수가 있다. 따라서 반환 값 실패를 비교할 때 상당한 주의가 필요하다.

* DuplicateHandle을 이용할 때 원본 프로세스에서 원본 오브젝트를 사용할 수 있다면 절대로 복사된 핸들을 닫아선 안 된다.

* DuplicateHandle의 1, 3번째 파라메터에 같은 프로세스 오브젝트 핸들을 넣어 동일 프로세스에서 사용되는 핸들을 복사할 수 있다. 주로 같은 커널 오브젝트에 액세스 권한을 제한한 핸들을 생성할 때 사용할 수 있다.

* 프로세스는 두 개의 컴포넌트로 구성된다. 프로세스를 관리하기 위한 목적으로 운영체제가 사용하는 커널 오브젝트와 실행 모듈이나 Dll 코드와 데이터를 수용하는 주소 공간. 주소 공간엔 스레드 스택이나 힙 할당 같은 동적 메모리 할당에 사용되는 공간도 포함한다.

* 프로세스는 다음 네 가지 방법으로 종료될 수 있다.
  1. 스레드의 진입점 함수가 반환된다.
  1. 프로세스 내의 어떤 스레드가 ExitProcess 함수를 호출한다.
  1. 다른 프로세스의 스레드가 TerminateProcess 함수를 호출한다.
  1. 프로세스 내의 모든 스레드가 종료된다.
이 중 1번 만이 유일하게 프로세스의 자원이 적절히 해제되는 것을 보장할 수 있으며 이를 강력히 추천한다. 스레드 종료의 경우도 거의 동일하다.

* 프로세스는 자신만의 주소공간을 가지기 때문에 스레드에 비해 더욱 많은 시스템 리소스를 사용한다. 개별 프로세스는 상당량의 정보를 시스템 내부에 저장하고, .exe와 .dll 파일이 주소 공간으로 로드되어야 하므로 파일 리소스가 필요하다. 스레드는 프로세스에 비해 비교적 적은 리소스가 필요한데 사실 스레드는 하나의 스레드 커널 오브젝트와 스레드 스택 정도만 필요로 할 뿐이다.(사실 스레도도 그렇게 가벼운 자원은 아니다. 어디까지나 비교적이다.)

* 캐시 라인에 대해. 애플리케이션이 사용하는 데이터는 캐시 라인의 크기와 그 경계 단위로 묶어서 다루는 것이 좋다.

* 항상 단일 스레드에 의해서만 접근되는 데이터를 구성하거나(함수의 매개변수와 지역변수를 사용하는 것이 이러한 방식을 따를 수 있는 가장 쉬운 방법이다.), 단일 CPU에 의해서만 접근되는 데이터를 구성하는 것(스레드 선호도를 사용하여)이 성능을 위해서는 가장 좋은 방법이다. 이 두 가지를 동시에 할 수 있다면 캐시 라인과 관련된 문제를 완전히 피할 수 있다.

* 윈도우는 프로세스들 사이에 데이터를 전달하는 다양한 방법들을 제공하고 있지만 내부적으로는 모두 메모리 맵 파일을 사용하여 구현되었으며, 실제로 메모리 맵 파일을 사용하는 것이 단일 머신에서 프로세스 간에 데이터를 전달하는 가장 효과적인 방법이다.



이 글에는 0 개의 댓글이 있습니다.