총 삽질들 514

[삽잡이] 유니코드와 멀티바이트코드

안녕하세요 삽잡이입니다. 이번 시간에는 유니코드와 멀티바이트에 대해서 알아보려고합니다. 우선 멀티바이트 코드는, MBCS 즉, 문자 집합을 여러개의 바이트를 써서 표현합니다.유니코드와 멀티바이트는 표현하는 것은 같습니다.하지만, MBCS의 경우 MS에서 만든 것 즉, 표준이 아닙니다.결국 둘의 차이는 표준이냐 표준이 아니냐의 차이이군요... 뭔말이냐면 MBCS 방식은 표준이 아니기 때문에MS계열의 OS가 아니라면 모른다 이겁니다... 인식을 못한다 이거죠... 어찌됬든간에... 지난 시간의 내용을 잠시 복습해보자면...유니코드는 '문자에 대한 정의 숫자'일 뿐입니다. 그 숫자를 어떠한 형태로 정의할 것인지가 인코딩이구요...인코딩 방식에는 여러가지가 있는데 표준이 2바이트로 표현하는 방식이라는 것...그..

[삽잡이] 유니코드(Unicode)

안녕하세요 삽잡이입니다. 이번시간에는 문자 코드에 대해서 알아보려고 합니다. 옛날부터 문자(문자열, 문자 코드)에 대한 많은 코드들이 존재했습니다.모든 컴퓨터는 0과 1의 바이너리 코드를 사용할 수 있는데,따라서 사진, 동영상들은 모두 숫자로 표현되어야 합니다. 이러한 표현을 위해 문자코드가 필요한 것입니다. A라는 문자를 어떤 숫자와 매핑 시킬 것이냐, 즉, 정의할것이냐를 문자코드라고 할 수 있는데요,여기에서 컴퓨터 용어로 사용되는 코드란, '해석해야하는', '해석되어져야하는'으로 통합니다. 어찌됬건, 문자 코드는 여러가지가 있었는데, 지금은 하나로 통합니다.전 세계적으로 표준화 된 문자코드의 집합,전 세계적으로 정의된 Uniqe한 문자 정의 코드...우리는 이를 '유니코드'라고 부릅니다. (자세한 내..

#026_WIndow_System_커널 모드 동기화 객체_메시지

안녕하세요 삽잡이입니다. 이번 시간에는 커널 동기화 객체들의 신호 상태를 기다리는 WaitForSingleObject 함수의 반환 코드에 대해서 알아보려고 합니다. 우선, WaitForSingleObject 함수는 두번째 인자의 시간까지 상태 확인을 원하는 커널 오브젝트를 기다립니다. WaitForSingleObject 함수를 통해 해당 커널 오브젝트가어떻게 종료됬는지, 혹은 상태에 대해서 파악할 수 있기 때문에 몇가지 종료 코드에 대해서 알아보도록 하겠습니다. 우선, WAIT_OBJECT_0 코드는 정상적인 신호 상태를 검출했을 때 반환 되는 코드입니다. 뮤텍스는 소유권을 가지고 있기 때문에해당 뮤텍스의 소유권을 포기할 수 있는 놈은 자기 자신 밖에 없습니다.그런데, 반환하지 않고 쓰레드가 종료된다면,..

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

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

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

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

#023_WIndow_System_커널 모드 동기화 객체_뮤텍스

안녕하세요 삽잡이 입니다.이번 시간에는 커널 모드에서 동기화 하는 방법들을 소개하려고 합니다. 우선 커널 모드에서 동기화를 수행하기 위해서는 커널 오브젝트가 필요합니다.즉, 커널 모드 동기화 객체들이 커널 오브젝트라는 것입니다.따라서 커널 모드 동기화 객체들은 핸들을 보관해야할 필요성이 있습니다. 커널 모드에서 동기화를 하는 것은 어플리케이션 모드보다 더 느릴 수 있습니다.왜냐, 커널 모드로 갔다가 유저모드로 왔다가... 왔다리 갔다리를 해야하기 때문입니다. 아무튼... 함수 이름이 다를 뿐이지, 사용방법은 유저모드에서 동기화를 수행했던 방법과 비슷합니다. 우선, Mutex에 대해서 알아보도록 하겠습니다.뮤텍스를 사용하기 위해서는 우선 뮤텍스를 생성해줘야합니다. 해당 함수를 사용하여 뮤텍스를 생성하게 되..

#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언어의 런타임 라이브러리를 사용할 때 문제가 ..