스마트 포인터

Posted 2012. 9. 4. 15:04

포인터는 아니지만 포인터의 역할을 하는것

 

사용 이유

생성과 소멸 작업을 조절 할 수 있다

스마트 포인터가 생성되고 소멸되는 시기를 결절 할 수 있다. 대부분의 스마트 포인터는 생성 될 때 기본값 0을 가지기 때문에 값을 주지 않으면 초기화되지 않은 포인터가 일으키는 골치아픔을 원칙적으로 봉쇄한다. 어떤 스마트포인터는 객체를 가리키고 있던 최후의 포인터가 소멸될때 자동으로 그 객체를 삭제한느 기능도 가지고 있다.

 

복사와 대입 동작을 조절 할 수 있다.

스마트포인터가 복사되거나 대입될 떄 일어나는 일을 직접 결정 할 수 있다. 어떤 경우는 포인터가 가리키는 객체까지 자동으로 복사하던지 대입하도록, 즉 깊은 복사를 수행하도록 할 수 있겠고, 어떤 경우는 포인터 자체만 복사하던지 대입할수 있도록 할 수 있다. 이 외의 경우에는 이런 동작을 전혀 허용하지 않을수도 있다. 무엇은 원하든 상관없이 바라는 바를 그대로 이행하는 포인터가 스마트포인터다

 

역참조 동작을 조절 할 수 있다.

사용자가 스마트포인터가 가리키는 객체를 가져오려고 할 떄 특정 상황이 일어나게 하는것도 사용자가 결정 할 수 있다.

'C++' 카테고리의 다른 글

interface를 사용한 종속성 최소화  (0) 2012.12.27
깊은복사 얕은 복사  (0) 2012.09.04

크리티컬섹션, 뮤텍스

Posted 2012. 9. 4. 14:59

크리티컬 섹션

크리티컬 섹션 오브젝트를 이용해 임계영역( 접근 제어가 필요한 영역 ) 에 하나의 스레드만 접근 할 수 있도록 하는 동기화 방법

유저레벨의 동기화 방법중 유일하게 커널 객체를 사용하지 않음

내부 구조가 단순하여 동기화 처리에 대한 속도가 빠르다

동일한 프로세스내에서만 사용 가능

커널객체를 사용하지 않기 때문에 핸들을 사용하지 않고 CRITICAL_SECTION이라는 정의를 사용

이미 Lock() 상태인 크리티컬섹션에 대해 다른 쓰레드가 Lock()을 호출하면 크리티컬섹션이 Unlokc() 될때까지 대기하도록 유도하는 구조

따라서 여러개의 스레드가 동기화 하려면 반드시 하나의 크리티컬 섹션을 공유해야 한다.

각 스레드 마다 별도의 크리티컬 섹션을 사용하는 경우 동기화는 불가능 하다.

 

뮤텍스

두개 이상의 스레드가 동시에 공통자원에 접근하지 않도록 하기 위해서 만들어진 알고리즘

커널 객체중 유일하게 소유권 개념을 가지고 있다.

스레드의 ID가 0( 유효하지 안는 스레드ID ) 면 뮤텍스의 소유권은 어느 스레드에게도 없다는 의미이고 뮤텍스 오브젝트는 시그널 된 상태이다

스레드 ID가 0이 아닌 값이면 해당 쓰레드가 소유권을 가지면 뮤텍스 오브젝트는 non-signal상태다

뮤텍스를 해제할때의 ID와 생성할때 설정한 쓰레드의 ID가 맞지 않으면 해제를 실패하고 시스템은

해당 뮤텍스의 시그널 상태를 기다리는 다른 쓰레드를 스케쥴링 한다

뮤텍스의 소유권을 가진 스레드가 뮤텍스를 해제하지 않고 종료되면 시스템은 해당 뮤텍스를 abandoned 상태로 두고 이 뮤텍스를 기다리는 스레드를 찾아 기다리고 있는 스레드에 뮤텍스의 소유권을 주고 해당 스레드를 스케쥴링 한다

 

두 가지의 차이

크리티컬 섹션은 단일 프로세스의 스레드에 대해서만 동작하고 뮤텍스는 여러 프로세스의 스레드에 대해서도 동작한다

 

 

커널 객체 : 커널( kernel ) 에서 관리되는 객체를 말하며 그 종류는 파일객체, 쓰레드객체, 이벤트 객체, 뮤텍스객체, 세마포어 객체 등이 있다.

특징

접근 하는 방식이 다른 객체와 틀리다. 보통 객체들은 사용자가 직접 접근하여 데이터를 바꾸고 추가하고 지울수 있지만 커널객체는 윈도우즈가 제공하는 특정한 함수를 사용하여야만 가능하다. 외관적으로 보기에는 커널객체는 우리가 생성하는 것처럼 보일 수 있지만 실제로 생성을 하는 것은 커널이다. 우리는 단지 그것을 생성해 달라고 특정한 함수를 이용해 커널에거 요청을 하고 커널은 요청을 받아 그 객체에 대한 메모리 공간을 할당하고 객체를 식별해주는 핸들 이란 것을 우리에게 반환해 준다

커널 객체의 소멸 시점이 틀리다

커널 객체가 아닌 다른 객체의 경우 보통은 객체를 생성한 프로세스가 소멸하면 객체도 같이 소멸하지만 커널객체는 그것을 생성한 프로세스가 소멸한다고 꼭 같이 소멸하는 것이 아니다. 이유는 모든 커널 객체에는 데이터멤버로서 usage count라는 것을 가지고 있는데 이것은 객체가 생성될때 1로 되었다가 다른프로세스들이 그 커널객체의 접근권한을 가지게 될떄 usage count는 1씩 자동적으로 증가하고 접근 권한을 가진 프로세스소멸할떄 usage count는 1씩 자동감소한다. 그래서 커널은 그 커널객체의 usage count가 0이 될떄 객체를 소멸한다

스케쥴링 : 처리할 일들의 진행순서. 즉 우선순위를 정하는 일

 

'Server' 카테고리의 다른 글

Connection Error] IOCP : GetQueuedCompletionStatus  (0) 2013.10.18
데드락  (0) 2012.09.04
3way hand shake  (0) 2012.08.13
라우팅  (0) 2012.08.13
OS의 종류와 차이점  (0) 2012.08.13

멀티쓰레드

Posted 2012. 9. 4. 14:46

한 프로세스를 여러 수행단위(스레드)로 나누어 처리하는 것

 

멀티 태스킹과 유사한 점이 있다 .멀티 태스킹은 한 PC에서 여러작업(프로세스)를 동시에 수행,

멀티 스레딩은 한 프로세스에서 여러 실행의 흐름(스레드)를 동시에 수행

( 말이 동시지.. 실제론 조금씩 번갈아 가며 수행하니까 동시에 하는거 처럼 보임 )

 

장점

CPU 이용률 최대화

대기시간, 응답시간 최소화

실행의 흐름을 명확히 분리

경제성

 

단점

실행 순서가 보장되지 않음

언제나 어디서나 문맥 교환이 발생 가능

스레드는 작은 변화에도 민감하고 스레드가 즉기 시작하지 않을 수 있음

하나의 스레드만 실행중인 경우 싱글 스레드의 실행시간이 개선되지 않고 오히려 지연될 수 있다

'API' 카테고리의 다른 글

ODBC  (0) 2012.08.13
« PREV : 1 : ··· : 60 : 61 : 62 : 63 : 64 : 65 : 66 : ··· : 77 : NEXT »