목록포직스 (POSIX)/쓰레드 프로그래밍 고급 (Advanced Threaded Program) (5)
Automotive Software
쓰레드도 프로세스와 같이 스케줄링 정책 및 우선순위를 적용하여 스케줄링을 제어할 수 있다. 쓰레드 생성 시 별도로 해당 속성을 설정해 주지 않으면 시스템에서 정의한 방식에 따라 쓰레드의 스케줄링을 처리하게 된다. 예, QNX의 경우, 기본적으로 부모 쓰레드의 스케줄링 정책 및 우선순위를 상속받아 생성된다. 스케줄링 방식을 정의할 때 중요한 것은 스케줄링 정책 SCHED_FIFO : First In First Out, 먼저 준비가 된 (Ready Queue에 등록된) 쓰레드를 실행 후 종료 시까지(또는 상위 우선순위를 가진 쓰레드가 준비되기 까지) CPU 점유 SCHED_RR : Round Robin, 운영체제에서 정의된 시할당량(Time slice, 예, QNX 4ms)만큼 실행 후 같은 우선순위의 쓰레..
쓰레드 사용 시 늘 생각해 볼 부분은 바로 쓰레드의 취소(종료)이다. 좀 더 정확히 말하면 종료 후 아래의 경우에 해당하는 쓰레드의 뒷정리일 것이다. 쓰레드에서 동적 자원을 할당하여 사용할 경우, 종료 후 메모리 누수 (Memory Leakage) 뮤텍스 등의 동기화 메커니즘이 사용된 경우, 다른 쓰레드의 데드락 (Deadlock between Threads) 쓰레드가 어떤 상태를 설정하고 그 상태가 다른 쓰레드 또는 메인 쓰레드에서 참조될 경우, 애플리케이션 상에서 상태 회복 불가능 (Unrecoverable state in an application) 1. 쓰레드 취소 포직스 쓰레드에서는 아래 두 가지의 취소 모드를 제공하는데, 이는 쓰레드의 취소 요청을 어떠한 시점에 처리할지를 결정하게 된다. 지연..
속성 객체 쓰레드 속성 예전 포스트에 이어 뮤텍스와 조건변수 속성을 알아보자. 뮤텍스 속성 포직스에서는 기본적으로 아래의 멤버를 속성으로 정의하고 있지만, 의무적으로 구현해야 하는 속성이 아니므로 사용하는 운영체제에 따라 속성 지원 여부가 상이할 수 있다. pshared(process-shared) : 뮤텍스의 접근 영역 지정 PTHREAD_PROCESS_SHARED : 뮤텍스가 할당된 메모리 공간에 접근할 수 있는 모든 스레드(다른 프로세스에서 생성된)들의 뮤텍스 사용을 허가함 PTHREAD_PROCESS_PRIVATE : 뮤텍스를 초기화한 동일 프로세스 내에서 생성된 스레드들에게만 뮤텍스 사용을 허가함 protocol : 스케줄링 프로토콜 지정 PTHREAD_PRIO_INHERIT : 하나의 쓰레드가..
포직스 쓰레드 속성 객체 (Attributes Objects) 1 - pthread_attr_t 쓰레드 프로그래밍에서 쓰레드, 뮤텍스 또는 조건 변수를 사용할 때, 쉽게는 아래와 같이 속성 값을 나타내는 두 번째 인자에 NULL값을 전달하여 시스템상에 정의된 기본값으로 각 객체들을 초기화하여 사용할 수 있다. [기본 사용 예제] pthread_create(&threadId, NULL, client_Thread, NULL); 출처: https://autosw.tistory.com/8?category=932055 [Automotive Software] 필요에 따라 객체를 세부적으로 사용하기 위해서는 객체별 속성값을 설정할 수 있으며, 해당 속성 값을 읽어 올 수도 있다. 포직스에서 이러한 설정 및 읽기 동작..
접속 클라이언트 수가 다중 쓰레드에 의해 공유되고, 서버의 첫 구동 시 한 번만 초기화되어 현재까지 접속한 클라이언트의 수를 나타내고 싶을 때, 당연히 생성 쓰레드마다 클라이언트 수를 증가시키겠지만, 증가 전 이 접속 클라이언트 수의 초기화 여부를 어떻게 확인할 것인가? 다중 쓰레드 환경에서 간단한? 방법은... 하나의 초기화 상태 변수를 선언하고 이 변수를 보호할 뮤텍스를 하나 정적으로 선언한 후 그 뮤텍스 보호하에 그 상태 변수의 값을 확인한 후 초기화 여부를 결정 하는 방법일 것이다. 하지만, 뮤텍스를 사용하기 위해 이 뮤텍스 넘을 초기화하기 위한 pthread_mutex_init()을 호출해야 하는데, 이 함수 역시 한 번만 호출되어야 하므로, 다시금 상기 절차를 재귀적(recursively)으로..