총 삽질들 514

#018_WIndow_System_쓰레드(thread) 란?

안녕하세요 삽잡이입니다.이번 시간에는 시스템 프로그래밍을 배우면서 가장 중요한 내용 중 하나!쓰레드에 대해서 알아보도록 하겠습니다. 요즘은 멀티코어 시대로써 여러개의 코어... 그러니까 CPU 자세하게는 연산 장치를 통해 프로그래밍을 할 수 있게 되었습니다. 우선 프로그램이 실행되기 위한 세가지 상태에 대해 알아보도록 하겠습니다.1. Running 상태2. Ready 상태3. Blocking 상태 start를Ready전에, End를 Blocking 후에 실행되게 됩니다.즉, 상태로는 크게 프로그램이 구동되고 실행되는 위의 세가지 상태로 나뉘게 된다는 것입니다. 프로그램이 실행되면 Ready 상태에 놓이게 됩니다.그리고 자기가 실행할 순서가 되면 Running 상태에 놓이게 됩니다.Running 상태에 놓..

#017_WIndow_System_리소스

안녕하세요 삽잡이입니다.이번 시간에는 리소스에 관해서 생각해보는 시간을 가져보도록 하겠습니다. 프로세스는 우리가 더블클릭해서 실행될 수 있지만, 다른 프로세스에 의해 실행될 수 있습니다.이와 같은 경우는 커널 오브젝트에서는 쓰레드와 프로세스가 있습니다.create 함수에 의해 생성될 수 있지만, 프로세스와 쓰레드는 다른 프로세스에 의해 실행 될 수도 있다는 것입니다. 프로세스는 쓰레드와 함께 리소스가 사라져도 해당 프로세스나 쓰레드의 정보를 받아가기 위한 정보가 존재하는 특징을 가지고 있습니다.다른 놈들은 이벤트가 제거되면 더 이상 이벤트를 사용할 놈이 없기 때문에 필요 없습니다.즉, 리소스가 없어지는 순간 커널 오브젝트의 의미가 없어진다는 것입니다. 하지만, 프로세스나 쓰레드는 리소스가 없어도 정보를 ..

#016_WIndow_System_커널 오브젝트 & 핸들 테이블

안녕하세요 삽잡이 입니다. 이번 시간에는 핸들 테이블에 관해서 정리해보려고 합니다. 프로세스는 내부적으로 커널 오브젝트 핸들 테이블을 가지고 있습니다. 여기서 커널 오브젝트란, 커널에서 관리하는 중요한 정보들을 담아둔 데이터 블록을 말합니다. 즉, 프로세스들은 OS가 관리합니다. 그리고 관리를 위해 구조체 하나를 만들게 된 것입니다. 프로세스가 생성될 때마다 이 구조체가 하나씩 생성되고 프로세스의 정보들이 초기화 되는데, 이를 우리는 '커널 오브젝트'라고 부르는 것입니다. 아무튼... 프로세스는 내부적으로 이 커널 오브젝트 핸들 테이블을 가지고 있는 것입니다. 이 핸들 테이블이 필요한 이유는, 모든 프로세스가 커널 오브젝트를 받을 때 커널 오브젝트를 관리하기 위해서 입니다. 또한, 이 커널 오브젝트 핸들..

#015_WIndow_System_명령행 인자

안녕하세요 삽잡이 입니다.이번 시간에는 명령행 인자에 대해서 알아보려고 합니다. 자... 우리가 C언어 공부를 할 때 한번쯤을 봤을 코드입니다. 위 코드의 int main(int argc, char**argv) 이 시그니처는.. main 함수의 원형을 나타냅니다.그리고 많이들 들어보셨겠지만, '프로그램을 실행할 때 기존에 설정한 값을 넣어서 프로그램을 실행 시킬 수 있다'라는 설명들을 많이들 보셨을 것입니다. 그냥 아무 것도 건들지 않은 상태에서 해당 프로그램을 실행 시키게 되면,프로그램명이 출력되는 것을 확인하실 수 있습니다. 그런데 위에서 설명한 '기존에 설정한 값' 이란,우리는 프로그램 인수라고 할 수 있습니다. 즉, main함수에 프로그램 인수를 받아 실행시킬 수 있다는 것입니다.비주얼 프로그램에..

#014_WIndow_System_프로세스 생성

안녕하세요 삽잡이 입니다.이번 시간에는 프로세스를 생성하는 할때에 대해 생각해보려고 합니다. 프로세스를 생성하기 위해서는 우선 CreateProcess 함수를 사용해야합니다. 많은 인자들이 있지만, 맨 마지막의 두 인자들을 우리는 주목해야합니다.아홉번째 인자는, 프로세스 시작 정보가 담길 구조체 변수이며,마지막 인자는, 프로세스 시작 시에 옵션등이 담겨있는 구조체를 넣습니다.즉, 두 인수는 설정 값과 받아오는 값이라고 할 수 있습니다. 아무튼...우리는 CreateProcess 함수를 사용하여 프로세스를 생성할 때,프로세스는 프로그램의 인스턴스로써, 프로세스를 실행하겠다는 것은프로그램의 코드가 존재한다는 뜻이겠지요. 프로그램의 코드 즉, 해당 윈도우는 생성하기 위해 당연하게 CreateWindow 함수를..

#013_WIndow_System_시스템 프로그래밍이란? & PID에 관하여

안녕하세요 삽잡이입니다. 이전 시간까지 어플리케이션을 사용할 수 있도록 API를 배웠습니다.API는 OS의 라이브러리를 쓰는 것이라고도 할 수 있는데...이 API에는 시스템 프로그래밍에 관해서도 포함되어 있습니다.이번 시간부터는 시스템 프로그래밍에 대해서 배워보도록 하겠습니다. 일반적으로 OS의 동작 원리를 이해하고 알아가는 것이 시스템 프로그래밍이라고 할 수 있습니다.시스템 프로그래밍에는 쓰레드, 프로세스, DLL, 메모리, 동기화 오브젝트, 커널 오브젝트등이 해당됩니다. 아무튼...OS의 구조를 이해하고, OS와 밀접하게 연관된 프로그램과 관련된 요소들을 공부해보자는 것이 바로, 시스템 프로그래밍입니다. 물론, 현 시절 MS에서는 .NET을 밀고 있는 추세로서,.NET에는 OS API가 굳이 필요가..

[삽잡이] 0, NULL, \0?

안녕하세요 삽잡이입니다.이번 시간에는 NULL과 0의 차이점에 대해서 알아보려고 합니다. 저와 같은 개발 공부에 관심을 가지고 있는 햇병아리(?)들은 흔히들char* s = 0; 처럼 변수를 초기화 하곤 합니다.해당 코드는 '문자열을 담는 변수 s의 주소는 0이다.' 라고 말할 수 있습니다.그렇다면, char* s = NULL; 과 char* s = 0; 은 과연 어떤 차이가 있을까요?정답부터 말씀드리자면, 같은 기능을 담당하고 있습니다.흠... 0과 NULL은 같다는 것처럼 들리는데요? 우선 0은 정수입니다. 맞습니다. 숫자입니다.NULL은 포인터입니다. 사실 주소는 주소인데 0 주소라고 정의할 수 있습니다.사실 NULL의 원형은 (void *) 형식으로 정의되어 있다는 말입니다. 따라서, 주소가 없다..

#014_WIndow_API_비트맵

안녕하세요 삽잡이 입니다.이번 시간에는 비트맵에 대해서 알아보려고 합니다. 비트맵은 MS에서 만든 이미지 포멧입니다.대표적으로 이미지 포멧에는 JPG, PNG 등이 있습니다.이는, 표준화 기구, 범용 기구, 회사에서 만들었다는 차이를 가지고 있습니다.MS에서는 자신의 것들로 그리자고 만든 것이 바로 비트맵입니다. 화면에 그리기를 시도할 때에는 디바이스 컨텍스트 (DC)를 얻어야합니다.DC를 얻어서 사용하기 위해서는 해당 DC의 핸들을 얻어서 사용하게 됩니다.즉, DC는 화면에 그리기 위한 정보입니다.그 중에서 우리가 사용했던 DC는 클라이언트 영역에 그리기 위한 DC였습니다. 우리가 보고 있는 화면은,비디오 메모리 비트맵으로 보관되어 있고, 해당 화면에 그림을 그리게 된다면 비트맵이 바뀌면서 화면이 그려..

#013_WIndow_API_부모와 자식이 함께해요_자식 프로세스

안녕하세요 삽잡이입니다.이번 시간에는 몇가지 윈도우를 함께 다뤄보는 시간을 가지려 합니다. 대부분의 윈도우에는 메시지 루프, Dispatcher, CreateWindow, Proc가 있습니다.그렇다면 여러 윈도우를 생성할 때를 생각해보도록 하지요...윈도우 생성을 할 때에는 CreateWindow를 사용합니다.또한, Window 생성 시 반드시 윈도우 클래스 이름이 필요합니다. 어플리케이션에서 메인 윈도우는 어딜 가나 하나입니다.그리고 나머지는 모두 메인 윈도우의 자식 윈도우들이라고 할 수 있습니다.(참고로, 팝업 윈도우는 메인 윈도우의 영역을 벗어날 수 있는 자식 윈도우를 말합니다. 뜬금...) 어찌됬건, 메인 윈도우는 단 하나입니다.또한, 자식 윈도우는 메인 윈도우보다 먼저 만들어질 수 없습니다. 자..

#012_WIndow_API_GUI 프로그래밍에서 주의할 점

안녕하세요 삽잡이입니다. 이번 시간에는 잠시 GUI 환경의 프로그램에서 신경써야할 사항들에 대해서 알아보려고 합니다. GUI에는 크게 UI 부분인 View와 코드 영역인 Data가 있습니다.이 둘은 서로 일대일로 부합해야 되며, 이를 싱크라고 합니다. View는 사용자에게 직접 보이는 곳으로써, 사용자의 Input을 받고 Output을 제공하는 역할을 담당하고 있습니다.그말인 즉, Input으로 받은 데이터를 가공하는 역할을 담당하는 부분이 Data라는 것입니다. 다시 한번 강조하지만,GUI에서는 View와 Data가 정말로 중요합니다.따라서 데이터를 어떻게 조직하고 어떻게 UI로 나타낼지에 대해 고민하는 것이바로 개발 공부를 하는 저와 같은 허접들의 고충이 되겠지요... 아무튼... API를 공부하며 ..