Programming/Windows System 26

Windows에서 소켓프로그래밍하기-기초

으흠~~ 소켓프로그래밍을 할 때 꼭 들어가야 하는 필수 함수들을 정리해보고 가자~~!! (이렇게 정리를 하고 가면 나중에 까먹어도 쉽게 찾을 수 있으니깐~~) Let's~~~~~~~~~~~~~~~ GO~!!! ========================================================================================== 소켓 통신을 할 때 윈도우즈에서 가장 먼저 시행되어야 할 함수는 WSAStartup()함수이다. 머하는 함수인고 하니... 사용할 윈도우소켓의 버전을 명시하고, 소켓 관련 정보들을 리턴하는 함수. 이 함수를 실행시키지 않으면 다른 소켓관련 함수들을 쓸 수 없다고 한다. 인자 값으로는 2개의 인자가 들어간다. 인자의 용도와 인자의 쓰임을 정..

[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..

[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 ..

[Windows System] 프로세스간 통신(IPC) 기법_파이프(Pipe) 방식

이름없는 파이프(Anonymous Pipe) : 단방향 통신방식이며, 파이프를 통해서 생성된 핸들을 기반으로 통신하기에 프로세스들 사이에 관계가 있어야 한다. BOOL CreatePipe( PHANDLE hReadPipe, // 데이터를 읽기 위한 파이프 끝 핸들 PHANDLE hWritePipe, // 데이터를 쓰기 위한 파이프 끝 핸들 LPSECURITY_ATTRIBUTES lpPipeAttributtes, // 보안 정보 DWORD nSize // 파이프의 버퍼 사이즈 ); (참고 : 파이프는 두 개의 끝을 가지고 있다. 한쪽 끝에는 데이터가 들어가고 다른 한쪽에서는 들어간 데이터가 흘러 나온다) 이름있는 파이프(Named Pipe) : 주소 정보가 있어 관게없는 프로세스들 사이에서도 통신이 가능하..