Study/Windows System Programming (11) 썸네일형 리스트형 [Windows via c/c++] 7. 스레드 스케줄링, 우선순위, 그리고 선호도 이 글은 "제프리 리처의 Windosw via c/c++"을 보고 작성한 글입니다. 윈도우는 언제라도 특정 스레드를 정지하고 다른 스레드를 수행할 수 있어 선점형 멀티스레드 기반 운영체제라고 불린다. 1. 스레드의 정지와 계속 수행 스레드의 정치 카운트가 0이 되면 이 스레드는 어떤 일이 발생사기를 기다리는 상태(키보드 입력을 기다리는 것과 같은)가 아니라면 스케줄 가능한 상태가 된다. 2. 프로세스의 정지와 계속 수행 SuspendProcess라는 프로세스 익스플로러를 사용하여 프로세스 내의 모든 스레드를 정지시키는 효과를 낼 수 있다. 3. 슬리핑 스레드는 Sleep함수를 호출하여 일정 시간 동안 자신을 스케줄하지 않도록 운영체제에게 명령을 내릴 수 있다. 4. 다른 스레드로의 전환 SwitchToT.. [Windows via c/c++] 8. 유저 모드에서의 스레드 동기화 이 글은 책 "제프리 리처의 Windows vis c/c++"를 읽고 작성한 글 입니다. 스레드 상호 통신이 필요한 경우 1. 다수의 스레드가 공유 리소스에 접근해야 하는 경우 2. 특정 스레드의 작업이 끝났음을 다른 스레드가 알아야 하는 경우 1. 원자적 접근 : Interlocked 함수들 스레드 동기화를 수행하기 위해서는 리소스에 원자적으로 접근해야 한다. 원자적 : 어떤 스레드가 특정 리소스를 접근할 때 다른 스레드는 접근할 수 없는것. 인터락 계열 함수들은 모두 원자적으로 값을 다룬다. InterlockedExchange함수는 스핀락을 구현해야 하는 경우에 유용하게 사용될 수 있다. while (InterlockedExchange (공유리소스, TRUE) == TRUE) 스핀락은 보호된 리소스가.. [Windows via c/c++] 6. 스레드의 기본 이 글은 책 "제프리 리처의 Windows via c/c++"을 보고 작성한 글입니다. 프로세스가 프로세스 커널 오브젝트와 주소 공간으로 구성되어 있듯이 스레드도 OS가 스레드를 다루기 위해 사요하는 스레드 커널 오브젝트와 스레드가 코드를 수행할 때 함수의 매개변수와 지역변수를 저장하기 우한 스레드 스택이 존재한다. 하나의 프로세스 안에 존재하는 스레드들은 단일 주소 공간을 공유하며 동일한 코드를 수행할 수도 있고, 동일 데이터를 조작할 수도 있다. 스레드들은 커널 오브젝트 핸들 역시 공유하게 된다. 1. 스레드를 생성해야 하는경우 CPU가 유휴상태인 경우 2. 스레드를 생성하지 말아야 하는 경우 다수의 스레드를 이용하여 사용자 인터페이스를 다루는 경우 3. 처음으로 작성하는 스레드 함수 주 스레드의 진.. [Windows via c/c++] 5. 잡 (job) 이 글은 "제프리 리처의 windows via c/c++"를 읽고 작성한 글 입니다. Windosw는 잡 커널 오브젝트를 이용하여 프로세스들을 하나의 그룹으로 묶어서 다루거나 샌드박스를 만들어서 프로세스들이 수행하는 작업에 제한을 가할 수 있다. StartRestrictedProcess 함수는 잡 내에 프로세스를 배치하여 프로세스의 일부 기능을 제한하는 기능을 가지고 있다. 만약 프로세스가 이미 다른 잡 내에 포함되어 있는 경우라면 이 프로세스를 다른 잡으로 옮길 수 없다. 1. 잡 내에 프로세스에 대한 제한사항 설정 잡 내의 프로세스가 시스템 리소스를 독점적으로 사용하지 못하게 하기위해, 사용자 인터페이스를 사용하지 못하게 하기위해, 보안 제항사항에 접근할 수 없게 하기위해 제한사항을 설정한다. Sch.. [Windows via c/c++] 4. 프로세스 책 "제프리 리처의 Windows via c/c++"을 보고 작성한 글 입니다. 프로세스는 일반적으로 수행 중인 프로그램의 인스턴스(instance)라고 정의하며, 두 개의 컴포넌트로 구성된다. 1. 첫 번째 윈도우 애플리케이션 작성 윈도우는 GUI/CUI기반의 어플리케이션을 지원한다. 둘의 진입점은 _tWinMain과 _tmain이다. 진입점에 들어가기 전에, 1. 새로운 프로세스의 전체 명령행과 환경변수를 가리키는 포인터를 획득하고 2. 런타임 라이브러리의 전역변수와 힙 메모리 공간을 초기화하며 3. 모든 전역 오브젝트와 static C++ 클래스 오브젝트의 생성자를 호출한다. 모든 실행파일과 DLL파일은 프로세스의 메모리 공간 상에 로드될 때 고유의 인스턴스 핸들을 할당받는다. 2. CreatePr.. [Windows via c/c++] 3. 커널 오브젝트 이 글은 책 "제프리 리처의 Windows via c/c++"을 보고 작성한 글 입니다. 1. 커널 오브젝트란? 커널 오브젝트는 커널에 의해 할당된 간단한 메모리 블록이다. 윈도우는 이벤트 오브젝트, 파일 오브젝트, 프로세스 오브젝트 등 여러 커널 오브젝트를 생성하고 조작한다. 이 메모리 블록은 커널에 의해서만 접근이 가능한 구조체로 구성되어 있으며, 커널 오브젝트에 대한 세부 정보들을 저장하고 있다. 커널 오브젝트의 데이터 구조체는 커널에 의해서만 접근이 가능하기 때문에 애플리케이션에서 데이터 구조체가 저장되어 이쓴 메모리 위치를 직접 접근하여 그 내용을 변경하는 것은 불가능하지만, 구조체의 내용에 접근할 수 있도록 일련의 함수 집합을 제공하고 있어서 이를 통해 커널 오브젝트의 내부적인 값에 접근할 수.. [Win32API] 2. Win32API 프로그래밍 구조 이 글은 아래 동영상 강의를 참조하여 공부한 내용을 정리한 글 입니다. https://www.youtube.com/playlist?list=PLOKPEzlY4JKTFx1udqQRdYb1ydob9V5u3 1. Win32API 프로그래밍 구조 WinMain() - 윈도우 구조체 등록, 생성 ( 윈도우 구조체를 왜 사용하는가? -> 여러개의 변수를 처리해야 하기 때문에 ) - 메시지 루프 (반복적으로 메시지 체크 후 전달) WinMain() 구조 { 윈도우 구조체 설정 및 등록 윈도우 생성과 출력 메시지 루프 } 윈도우 구조체 설정 및 등록, 윈도우 생성과 출력 부분은 한 번만 실행해도 되지만, 메시지 루프는 (사용자의 프로그램 종료 입력 전까지) 프로그램이 꺼지면 안되기 때문에 대기상태에서 반복해서 실행된다.. [Windows via c/c++] 2. 문자와 문자열로 작업하기 이글은 책 "제프리 리처의 Windows via c/c++"를 읽고 작성한 글 입니다. 7. 문자와 문자열 작업에 대한 권고사항 문자열을 char 타입이나 byte의 배열로 생각하지 말고, 문자의 배열로 생각하라. 문자나 문자열을 나타낼 때 중립자료형을 사용하라 (유니코드/멀티바이트 상관없이 프로그래밍 가능) 문자나 문자열 상수 값을 표현할 때에는 TEXT나 _T매크로를 사용하라. 두 개를 혼용해서는 안된다. 버퍼와 버퍼의 크기를 동시에 인자로 받지 않는 함수는 사용하지도 만들지도 마라. (안전 문자열 함수를 사용하라.) 이전 1 2 다음