System 22

#025_WIndow_System_커널 모드 동기화 객체_이벤트

안녕하세요 삽잡이입니다. 이번 시간에는 커널 모드 동기화 객체 중에 이벤트에 대해서 알아보려고 합니다. 이벤트는 다른 동기화 오브젝트와 동작방식 자체가 좀 다릅니다.지금까지 사용했던 동기화 객체들은 데이터 보호에 사용이 되었던 것이고,이벤트는 일반적으로 순서 제어에 사용됩니다.즉, 내가 원하는 시점에 그 이벤트가 신호 상태가 되도록 만드려는 매커니즘에 많이 사용됩니다. 이벤트는 '어떤 사건', '어떤 신호'를 말합니다.어떤 사건이 주어지면 신호 상태로 바꾸는 메커니즘이라는 것입니다.이벤트도 커널 오브젝트이기 때문에 신호, 비신호 상태를 가집니다. 이벤트에는 두 가지 종류가 있습니다. 바로 수동 이벤트와 자동 이벤트입니다. 우선 이벤트를 생성하기 위한 함수입니다.수동 이벤트와 자동 이벤트를 결정하는 인자는..

#024_WIndow_System_커널 모드 동기화 객체_세마포어

안녕하세요 삽잡이입니다. 이번 시간에는 커널 모드 동기화 객체중 세마포어에 대해서 알아보려고 합니다. 매개변수로는 다른 커널 오브젝트들과 같이 처음에는 속성을 받습니다.그 다음으로는 자원의 개수들을 할당 받습니다.그러니까... 두번째 인자로는 사용가능한 자원의 개수, 그 다음으로는 최대 자원의 개수마지막 인자로는 세마포어의 이름을 인자로 받습니다. 키를 쥐고 있다가, 필요가 없어지면 반환을 해야하듯이,세마포어에서는 ReleaseSemaphore 함수를 사용합니다. 키를 반환하면 카운트를 증가시킵니다.즉, CreateSemaphore 에서 생성한 키의 개수를 사용한 다음에 다시 반납하니 숫자를 증가 시키겠죠... 뭔말이냐하면... 세마포어는 소유 개념이 없습니다.즉, 뮤텍스와 조금 개념이 다르다는 것입니다..

#022_WIndow_System_유저모드 동기화 객체

안녕하세요 삽잡이입니다. 지난시간까지 동기화에 대해서 정의를 해봤습니다.그렇다면 이제는 동기화 기법에 대해서 살펴볼 시간이 찾아왔다는 것입니다... 동기화에는 '유저 모드 영역'과 '커널 모드 영역' 이 두 가지 종류의 동기화 객체들이 있습니다.우선, 유저 모드 동기화 기법을 살펴보도록 하겠습니다. 첫번째로, Critical Section을 살펴보도록 하겠습니다.Critical Section은 임계영역이라고 부릅니다. 그리고 이 임계영역은 필요한 곳에 설치를 해야합니다.즉, 어떤 작업이 완료될 때 까지 다른 놈들이 오는 것을 막는 문을 설치하는 것입니다. 문을 설치했다면, 그 문을 열쇠만 있을 경우 열 수 있도록, 키를 생성해야합니다.CRITICAL_SECTION 구조체를 통해서 말입니다. 그리고, In..

#021_WIndow_System_쓰레드 동기화

안녕하세요 삽잡이입니다. 지난 시간에 멀티 쓰레드들이 공유 메모리를 접근할 때발생하는 문제점을 어떻게 해결할지에 대해서 생각해보는 시간을 가졌었습니다. 이번 시간에는 동기화에 대해서 알아보도록 하겠습니다.지난시간의 예시를 잠깐 살펴보도록 하겠습니다. 다수의 쓰레드가 있을 때 A라는 쓰레드는 Write 중이고,다른 쓰레드들이 Read 중이라고 가정해보겠습니다. 이때 공유하고 있던 메모리가 수정이 되는 일이 발생함으로, 쓰레드들은 자신이 모르는 사이에 데이터가 변경됨으로 혼란이 옵니다.따라서 Memory Fault가 발생되는데,이를 해결하기 위해 서로 데이터가 호환 가능하도록 해야합니다.이를 우리는 동기화라고 부르게 되는 것입니다.쓰레드에서는 공유 변수, 공유 메모리, 공유 데이터에 대한 동기화 부분이 가장..

#020_WIndow_System_멀티 쓰레드 공유 메모리

안녕하세요 삽잡이입니다.이번 시간에는 쓰레드 동기화에 대해서 알아보려고 합니다. 쓰레드는 각각 독립적으로 움직이기 때문에, 공유 변수에 더욱 주의를 해야합니다.그렇지 않으면 쓰레드에 정말로 많은 문제가 발생하게 됩니다.공유 메모리에 신경쓰지 않게 되어 발생한 오류는동기화와 관련된 문제로써 에러를 찾기 상대적으로 힘들어집니다. 여러개의 독립적인 쓰레드가 하나의 공유 메모리를 사용할 경우를 생각해보겠습니다.만약, 0번째 쓰레드가 Write 중인데 나머지 쓰레드들은 Read를 하고 있다면,메모리가 변경이 되는 것인데, Read를 하던 녀석들은 당황하겠지요...결과적으로 Memory Fault가 발생하는데, 이 문제는 심각한 문제입니다. 강조하지만, 원천적으로 공유 메모리는 쓰레드에서는 문제가 많습니다.하지만,..

#019_WIndow_System_쓰레드(thread) 제어

안녕하세요 삽잡이입니다.이번시간에는 지난 시간에 이어서 쓰레드에 대해 알아보려고합니다. 이전 시간까지 쓰레드를 생성할 때에는 CreateThread() 함수를 실행했습니다. 그런데 이 CreateThread 함수는 API에서 제공하는 함수입니다. Thread를 띄우는 함수에는 위의 함수 외에 _beginthread()함수가 있습니다.둘이 차이는 없지만, 일반적으로 _beginthread()함수를 더 많이 사용한다고 합니다. (믿거나 말거나) CreateThread는 다시 말하지만, API함수입니다.thread는 stack을 제외한 Global Data 영역과 heap 영역을 공유합니다.즉, thread는 static 변수의 내용을 공유한다는 것입니다.그런데 C언어의 런타임 라이브러리를 사용할 때 문제가 ..

#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함수에 프로그램 인수를 받아 실행시킬 수 있다는 것입니다.비주얼 프로그램에..