2014/07 166

Windows :: 유저모드 스레드 동기화

/* * http://sosal.kr/ * made by so_Sal */ 동기화에 대해서 기본적인 지식이 없다면.. 링크를 잠깐 확인하고 오세요 :: LINK_ 임계영역 :: 둘이상의 스레드가 동시에 접근하는 위험요소를 지니는 코드 블럭 쉽게 동기화는 임계영역 위험요소에 의해 발생될 문제를 제거하는 것이라 할 수 있다. 임계영역은 어떤 메모리를 말하는 것이 아니라, 위험요소를 지닌 코드입니다. 이 포스트에서 살펴볼 유저모드의 동기화 입니다. (다음 포스트에 커널모드로 연재합니다.) 이번장에서 살펴볼 내용 :: 1. 크리티컬 섹션 기반 동기화 + 예제 :: void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); :: void Enter..

Windows :: 스레드의 동기화

/* * http://sosal.kr/ * made by so_Sal */ 동기화 :: 작업들 사이의 수행 시기를 맞추는 것. 사건이 동시에 일어나거나, 일정한 간격을 두고 일어나도록 시간의 간격을 조정하는 것을 이른다. 임계영역 :: 둘이상의 스레드가 동시에 접근하는 위험요소를 지니는 코드 블럭 쉽게 동기화는 임계영역 위험요소에 의해 발생될 문제를 제거하는 것이라 할 수 있다. 그렇다면, 둘 이상의 스레드가 동시접근 하는것이 왜 위험요소인가? 간단히 예를 들겠습니다. 스레드 A와 B가 전역변수 int (0)를 1만큼 증가시킨다고 가정해보면. 스레드 A는 int (0)의 값을 가져와서 1을 증가시킨다음, 원래 int (0) 가 존재하는 메모리에 증가시킨 값(1)으로 int (1)를 대입합니다. 여기서 발..

Windows :: 스레드의 상태 컨트롤과 프로세스및 스레드의 우선순위

/* * http://sosal.kr/ * made by so_Sal */ 스레드의 상태는 프로세스의 상태를 떠올리시면 됩니다. 실제로 Windows에서 상태가 변화하는 주체는 프로세스가 아닙니다. 스레드가 변화하는 것입니다. 위 그림은 프로세스의 상태변화를 나타내는 대표적인 그림입니다. 위 상태를 나타내는 준비, 실행, 대기 (ready, running, block)에 관한 내용은 스레드의 상태를 나타낸다고 보셔도 무방합니다. :: 프로세스의 상태와 우선순위에 대한 자세한 내용을 잘 모르신다면 :: 링크로 " LINK_ " 프로세스 우선순위 설정 함수 BOOL SetPriorityClass( HANDLE hProcess, DWORD dwPriorityClass) 원하는 프로세스의 핸들을 첫 매개변수에 ..

Windows :: 스레드 생성 함수와 예제 // CreateThread _beginthreadex

/* * http://sosal.kr/ * made by so_Sal */ 스레드 (혹은 쓰레드, Thread) 에 대해서 잘 모르신다면 링크로~! ^-^ :: LINK_ /* * CreateThread() * ExitThread() * GetExitCodeThread() * _beginthreadex() * ResumeThread(); * _endthreadex() * ------------- */ Windows에서 쓰레드를 생성하는 가장 기본적인 함수는 CreateThread 입니다. HANDLE CreateThread( 1. LPSECURITY_ATTRIBUTES lpThreadAttributes, 2. SIZE_T dwStackSize, 3. LPTHREAD_START_ROUTINE lpStart..

Windows :: 윈도우즈 스레드(thread) 프로그래밍

/* * http://sosal.kr/ * made by so_Sal */ 동시에 원하는 일을 하기 위해서, 다중 프로세스를 이용하였습니다. (다중프로세스와 스케쥴러에 대한 내용은 링크를 참조하세요 :: LINK_) 다중프로세스는 프로세스간의 자원을 공유하지 않고, IPC라는 방법을 사용하여 통신을 해야 하기 때문에, 다중 프로세스 프로그래밍에서는 메모리 낭비, 컨텍스트 스위칭에 의한 속도 저하 등 단점이 많습니다. 위 문제점을 극복하기 위해서 스레드 기법을 사용하였습니다. 한 프로세스 내에 스택을 여러개 두어, IPC처럼 메모리 공유가 필요한 부분은 공유하는 구조를 만드는 것입니다. 한 프로세스 안에서 스택을 여러개 생성하여, 메모리 흐름을 여러개 만들어서 다중프로세스처럼 한 프로세스가 한번에 다양한 ..

Windows :: 프로세스들을 실행하는 함수들

/* * http://sosal.kr/ * made by so_Sal */ 이번장에서 살펴볼 함수들 1.WinExec() CreateProcess() 2.ShellExecute() ShellExecuteEx() ================= 1. WinExec(), CreateProcess() ================= 아래는 WinExec() 와 CreateProcess()를 살펴보겠습니다. WinExec() 함수는 Windows 3.x 버전에서 새로운 프로세스 (프로그램)을 실행시키는 유일한 함수였습니다. 상당히 간결하게 사용할 수 있는 함수입니다. WinExec의 문제점은? :: 프로그램이 실행되고 나면 이전의 프로세스가 새로이 생성된 프로세스에게 간섭할 수 없다. (접근 불가) (프로그램이..

Windows :: Named Pipe를 이용한 프로세스간 통신

/* * http://sosal.kr/ * made by so_Sal */ 앞서 Windows 09. Pipe를 이용한 프로세스간 통신 / 포스트에서 파이프에 대한 내용을 알아보았습니다. 일반 Pipe는 양방향 통신을 사용하며, 핸들을 기반으로 통신합니다. 따라서 핸들을 주고받을 수 있는 프로세스들 (흔히 부모-자식)처럼 특별한 관계가 있는 프로세스들끼리만이 통신할 수 있는 기법이었습니다. 하지만 Named Pipe는 파이프의 이름만 알고있다면 어떠한 관계에 있는 프로세스라도 통신이 가능하게 됩니다. 그럼 Named Pipe의 생성과정에 사용되는 함수들은? // 서버가 하는일 // CreateNamedPipe() -> ConnectNamedPipe(). CreateNamedPipe를 이용해서 파이프를 생..

Windows :: 환경변수와 환경변수 상속

/* * http://sosal.kr/ * made by so_Sal */ 환경변수 :: 시스템의 속성을 기록하고 있는 변수. 변수의 이름과 의미가 대부분 미리 정해져 있고, 사용자가 의도적으로 변경, 생성 가능하다. 유닉스, 리눅스 운영체제에서는 환경변수를 설정하면 모든 프로세스가 동시에 접근 가능합니다. 따라서 '상속' 과정에 상관 없이, 환경변수라는 공유 메모리 영역을 통해 서로 정보를 주고 받을 수 있습니다. (사실 환경변수로 정보를 주고받게 끔 프로그래밍 하는건 흔하지 않음) 윈도우에서는 시스템 환경변수를 제외한 (Path, OS,TMP 등 컴퓨터 환경설정 고급탭에서 설정가능한 환경변수) 환경변수는 각 프로세스마다 테이블이 따로 주어져 공유하지 않게끔 되어있습니다. 환경변수로 정보를 주고받는 과..

Windows :: 윈도우 핸들찾기, pid를 이용하여 핸들 가져오기

/* * http://sosal.kr/ * made by so_Sal */ 음.. 이번 포스트에서는 음.. 사실 06 커널오브젝트, 핸들내용에서 넣지못한 글을 간단히 정리해서 올리려고 합니다. :: struct PROCESS_INFORMATION :: FindWindow() :: FindWindowEx() :: OpenProcess() :: CloseHandle() 이것들을.. 살펴보고자 합니다 ^-^ PROCESS_INFORMATION 구조체를 선언하여 CreateProcess 함수의 인자로 쓰기는 해보았는데, 가져와서 이용을 한적이 없어요. 한번 살펴보죠. 흠. typedef struct _PROCESS_INFORMATION { HANDLE hprocess; //프로세스의 핸들 HANDLE hproc..

Windows :: 커널 오브젝트, 핸들 object Handle

/* * http://sosal.kr/ * made by so_Sal */ 커널 오브젝트 :: 커널에 의해 관리되는 리소스 정보를 담고 있는 Data block. 커널? :: 모든 운영체제들이 가지고 있는 핵심이 되는 부분. 우리가 프로세스 실행을 명령하면, 그 일을 수행하는것은 커널이다. //사실 운영체제와 커널은 초기에 같은의미로 쓰였지만, 운영체제라는 단어의 의미가 //점점더 확장되면서 (상업적이라던지, 사용자의 편의를 위한 부분 등..) 하는일이 //더 많아지면서 다른 의미로 쓰이지만, 사실 운영체제를 공부한다고 한다면 //커널을 공부한다고 생각하시면 되겠습니다. 다양한 링크리스트나 트리같은 자료구조의 경우에는 프로그래머가 정보들을 직접 다루고 있다고 할 수 있습니다. 하지만 프로그래머가 프로세스..