전체 글 69

char, wchar_t, TCHAR, CString 클래스

char, wchar_t, TCHAR, CString 클래스는 모두 문자(열)을 다루는 타입이다. 하지만 이들 사이에 어떤 식의 연관 관계가 있는지 궁금했다. 특히나 char, wchar_t, TCHAR의 관계와 이 3가지 타입을 CString에 대입하는 방법이였다. 자~~~! Let`s Go~~~~~ ==================================================================================== 음. 우선 VS2008의 환경부터 알아봐야겠다. (아마 이전 버전도 지원되는 부분이 있을것이다. 이전 버전들을 사용할 때는 정확한 개념 없이 그냥 무작정 사용했던 관계로 정확한 건 아니다. : |) VS2008에서는 유니코드와 멀티바이트 문자 집합을 지원한..

Language/C++ 2011.02.16

[Windows System] 쓰레드(Thread) 동기화에 대한 개념정리

쓰레드 동기화 : 쓰레드 간의 질서가 잘 지켜지고 있음을 의미 쓰레드 동기화의 방법 : 유저 모드 동기화 : 동기화가 진행되는 과정에서 커널 코드가 실행되지 않는다. 커널 모드로의 전환이 이뤄지지 않으므로 성능상에 이점이 있지만 기능상의 제한도 있다. 커널 모드 동기화 : 커널에서 제공하는 동기화 기능을 활용한다.(유저 모드에서 제공하지 못하는 기능을 제공받을 수 있다) 커널 모드로의 전환으로 인해 성능이 저하된다. 두가지 관점에서의 쓰레드 동기화 : 메모리 접근에 대한 동기화 : 쓰레드들의 임계 영역 동시접근을 막아 동기화한다. (참고 : 임계 영역(Critical Section) : 배타적 접근(한 순간에 하나의 쓰레드만 접근)이 요구되는 공유 리소스(전역변수와 같은)에 접근하는 코드 블록) (예 :..

[Windows System] 쓰레드(Thread) 동기화 - 순차 실행 관점

이벤트(Event) 기반 동기화 : 개념 : 생산자는 문자열을 생성한다(입력받는다), 소비자는 문자열을 소비한다(출력한다) 생산자가 문자열을 생성하고 나면, 이 상태를 감지한 소비자가 문자열을 가져가 소비한다. 이벤트 커널 오브젝트의 특성 : 1. 이벤트 커널 오브젝트는 파라미터에 의해 Signaled or Non-Signaled 상태로 생성된다. 2. 프로그래머의 요청에 의해 Signaled 상태가 된다. 3. 자동 리셋 모드 일시 WaitForSingleObject 함수 호출로 Signaled -> Non-Signaled 상태로 변경된다. 수동 리셋 모드 일시 추가로 ResetEvent 함수를 사용한다. 사용법 : HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEven..

[Windows System] 쓰레드(Thread) 동기화 - 메모리 접근 관점

1. 크리티컬 섹션 기반의 동기화(유저 모드) : 개념 : 열쇠(Critical Section)를 생성한다. 쓰레드가 임계 영역에 접근하기 위해서는 열쇠를 얻어야 한다. 열쇠를 얻어 임계 영역에 접근한 쓰레드는 일을 마친후 다음 쓰레드를 위해 열쇠를 반환한다. 사용법 : CRITICAL_SECTION gCriticalSection; // 열쇠를 생성한다 // 크리티컬 섹션 오브젝트 선언후에는 반드시 초기화 해야한다. void InitializeCriticalSection( // 크리티컬 섹션 오브젝트 초기화 함수 LPCRITICAL_SECTION lpCriticalSection // 초기화 하려는 크리티컬 섹션 오브젝트의 주소값 ); void EnterCriticalSection( LPCRITICAL_S..

[Windows System] 쓰레드(Thread)의 생성과 소멸

쓰레드 생성 : HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // 보안속성(TRUE : 상속, NULL : 상속제외) SIZE_T dwStackSize, // 쓰레드의 스택 크기 LPTHREAD_START_ROUTINE lpStartAddress, // 쓰레드로 동작하기 위한 함수(쓰레드 main) // 리턴타입 DWORD, 매개변수 타입 LPVOID(void*) LPVOID lpParameter, // 쓰레드 함수에 전달할 인자 지정 DWORD dwCreationFlags, // 쓰레드 생성 및 실행을 조절 LPDWORD lpThreadId // 쓰레드 ID를 전달받기 위한 변수의 주소값 ); 쓰레드 소멸 : 1. return(일반적,..

[Windows System] 쓰레드(Thread) 소개

쓰레드(Thread) : 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델 1. 독립적인 스택(Stack)을 가진다. 2. 코드 영역을 공유한다. (위와 같이 쓰레드 main 함수는 코드 영역에 존재하는 모든 함수를 호출할 수 있다) 3. 데이터 영역과 힙을 공유한다.(전역변수와 동적 할당된 메모리 공간 공유 가능) 4. 프로세스 핸들 테이블 공유 프로세스 핸들 테이블에 대한 핸들 정보는 프로세스 내의 쓰레드 들에게 공유되어 각 쓰레드가 그 핸들에 대해 접근이 가능하다 (참고 : 같은 프로세스내의 쓰레드들은 스택 이외의 모든 것을 공유한다) 프로세스와 쓰레드 Windows 에서 프로세스는 단순히 쓰레드를 담는 상자다. 실제 프로그램 흐름을 형성하는 것은 쓰레드이다. 따라서 스케줄러(Windo..

컴퓨터 프로그래밍 개발을 위한 정보와 이야기

보통 방학때 포트란이라던지 c언어라던지 컴퓨터언어를 가르치는 강좌가 개설되곤 하기도 했는데 리스트라던지 프롤로그라던지 인공지능관련이나 컴퓨터그래픽 관련 전문 과목은 아마 달랑 한 과목정도 일듯하다. 즉 개인이 알아서 공부해야 되는게 많다는 뜻일듯.. 사실 컴퓨터지식이 많다는 해커는 누가 가르치는 것도 아니다.. 이게 인생이다.. ㅋㅋ 자 이제 현실로 돌아와서 컴퓨터 프로그래밍을 배울려면 가장 필요한 것이 물론 컴퓨터이다. 그리고 개발툴이 필요하다. 사실 소프트웨어도 사용되는 분야에 따라 상당히 다양하다. 운영체제, 개발툴, 멀티미디어관련, 네트워킹관련, 보안관련, 데이타베이스관련, 게임관련, 그리고 연구나 산업용 전문툴까지.. 즉 하나의 지식으로 소프트산업을 보면 안되고 학문에서 자주 이야기 되는 학문융..

Programming 2011.01.24

[Windows System] 스케줄링 알고리즘과 우선순위

˚ 선점형(Preemptive) OS와 비선점형(Non-Preemptive) OS - 프로세스의 실행을 다른 프로세스로 넘기는 방식에 따라서 선점형 OS와 비선점형 OS를 구분한다. OS의 기본 개념을 공부한다는 의미에서 이 두 가지 OS의 성격을 간략히 짚고 넘어간다. · 비선점형(Non-Preemptive) OS : 현재 실행 중인 프로세스보다 높은 우선순위의 프로세스가 등장한다고 해서 실행의 대상을 바로 변경하지 않는다. 새로 등장한, 보다 높은 우선순위의 프로세스가 실행되기 위해서는 현재 실행 중인 프로세스가 명시적으로 CPU를 양보할 때까지, 혹은 I/O 작업 등으로 블로킹 상태에 놓일 때까지 기다려야만 한다. · 선점형(Preemptive) OS : 현재 실행 중인 프로세스보다 높은 우선순위의..

[Windows System] 환경변수

환경변수 : 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값. 프로세스별로 별도의 메모리 공간에 저장하고 관리하는 데이터. (key = value 의 형태) 윈도우즈의 환경변수 1. 기본 제공 시스템 변수 2. HKEY_LOCAL_MACHINE 하이브에 있는 시스템 변수 3. HKEY_CURRENT_USER 하이브에 있는 로컬 변수 4. 모든 환경 변수 및 Autoexec.bat 파일에서 설정된 경로 5. 모든 환경 변수 및 로그온 스크립트에서 설정된 경로 6. 스크립트 또는 배치 파일과 상호 작용하는 변수 함수를 통한 환경변수 : 환경변수 등록 : BOOL SetEnvironmentVariable( LPCTSTR lpName, // key 에 해당하는 값 LPCTSTR lpValue // value..

[Windows System] 커널 오브젝트(Kernel Objects)_0x02

커널 오브젝트의 상태(State) : 리소스에 특정 상황이 발생함에 따라 Signaled 상태(신호를 받은 상태)와 Non-Signaled 상태(신호를 받지 않은 상태)로 나뉜다. (예 : 프로세스 커널 오브젝트의 상태 종료된 프로세스는 다시 살릴수 없다. 따라서 프로세스 커널 오브젝트의 상태는 Signaled -> Non-Signaled 로 변경될 수 없다) 커널 오브젝트의 상태를 확인하는 함수 : DWORD WaitForSingleObject( HANDLE hHandle, // 상태 확인을 원하는 커널 오브젝트의 핸들 DWORD dwMilliseconds // hHandle가 가리키는 커널 오브젝트가 Signaled 상태가 될 때까지 기다릴수 있는 최대 시간(INFINITE 전달 : Signaled ..