세마포는 이미 잠겨 있으므로 sem_trywait() 작업(sem_trywait()만 으로 즉시 잠글 수 없습니다. sem_wait, sem_timewait, sem_trywait – 세마포를 잠급니다 sem_trywait() 및 sem_wait() 함수는 호출 프로세스가 sem에 의해 지정된 세마포에 세마포 잠금 작업을 성공적으로 수행한 경우 0을 반환합니다. 호출에 실패한 경우 세마포의 상태는 변경되지 않으며 함수는 -1 값을 반환하고 오류를 나타내기 위해 errno를 설정해야 합니다. sem_trywait(3RT)를 사용하여 카운트가 0보다 큰 경우 sem으로 가리키는 세마포의 개수를 원자적으로 감소시키려고 합니다. 이 함수는 sem_wait()의 비차단 버전입니다. 즉, 실패하면 즉시 반환됩니다. 또 다른 (바이너리) 세마포어 쌍은 뮤텍스와 동일한 역할을 하며, 여러 생산자와 여러 개의 빈 버퍼 슬롯이 있을 때, 그리고 여러 소비자와 여러 개의 전체 버퍼 슬롯이 있을 때 버퍼에 대한 액세스를 제어합니다. 뮤텍스는 여기서 더 잘 작동하지만 세마포 사용의 좋은 예를 제공하지는 않습니다. sem_wait() 함수는 해당 세마포에서 세마포 잠금 작업을 수행하여 sem에서 참조하는 세마포를 잠급니다. 세마포 값이 현재 0이면 호출 스레드는 세마포를 잠그거나 신호에 의해 호출이 중단될 때까지 sem_wait()에 대한 호출에서 반환되지 않습니다.

sem_trywait() 함수는 세마포가 현재 잠겨 있지 않은 경우에만 sem에서 참조하는 세마포를 잠급니다. 즉, 세마포 값이 현재 양수인 경우입니다. 그렇지 않으면 세마포를 잠그지 않습니다. sem_trywait() 함수는 해당 세마포가 현재 잠겨 있지 않은 경우에만 지정된 세마포를 잠급니다. 즉, 세마포 값이 현재 양수인 경우입니다. 그렇지 않으면 세마포를 잠그지 않습니다. sem_trywait()는 sem_wait()와 동일하지만, 감소가 즉시 수행될 수 없는 경우 를 제외하고, 호출은 차단 대신 오류(errno set)를 반환합니다. 실시예 4-14의 데이터 구조는 조건 변수 예제에 사용되는 것과 유사합니다(예제 4-11 참조). 두 개의 세마포어는 전체 버퍼와 빈 버퍼의 수를 나타내며 생산자가 빈 버퍼가 있을 때까지 기다려야 하고 소비자가 전체 버퍼가 있을 때까지 기다려야 합니다. sem_trywait() 및 sem_wait() 함수는 신호 전달이 sem_wait() 함수를 방해할 수 있는 경우 실패합니다.

sem_timewait() 함수는 sem_wait() 함수에서와 같이 sem에서 참조하는 세마포를 잠그습니다. 그러나 sem_post(를 호출하여 세마포의 잠금을 해제하기 위해 다른 프로세스 나 스레드를 기다리지 않고 세마포를 잠글 수 없는 경우 지정된 시간 지정이 만료되면 대기가 종료됩니다. . 신호 처리기는 sigaction(2) SA_RESTART 플래그의 사용에 관계없이 항상 이러한 함수 중 하나에 대한 차단된 호출을 중단합니다. 시간 초과는 abs_timeout에 의해 지정된 절대 시간이 경과할 때( 즉, 해당 시계값이 abs_timeout과 같거나 초과하는 경우) 시간 초과가 기준으로 측정된 경우 또는 abs_timeout에서 지정한 절대 시간이 이미 경과된 경우 만료됩니다. 통화 할 때. 시간 시간은 CLOCK_REALTIME 시계를 기반으로 합니다. 명명된 세마포에 대한 자세한 내용은 sem_open(3RT), sem_getvalue(3RT), sem_close(3RT) 및 sem_unlink(3RT)를 참조하십시오. 실시간 응용 프로그램은 세마포를 사용할 때 우선 순위 반전이 발생할 수 있습니다. 우선 순위가 높은 스레드 “locks”(즉, 대기 중)가 우선 순위가 낮은 스레드에 의해 “잠금 해제”(즉, 게시됨)가 될 예정이지만 우선 순위가 낮은 스레드는 중간 우선 순위 스레드에 의해 선점될 때 문제가 발생합니다. 이 시나리오는 우선 순위 반전으로 이어집니다. 우선 순위가 높은 스레드는 무제한 기간 동안 우선 순위가 낮은 스레드에 의해 차단됩니다.

시스템 설계 중에 실시간 프로그래머는 이러한 종류의 우선 순위 반전 가능성을 고려해야 합니다. 세마포어에 의해 보호되는 중요한 섹션이 높은 우선 순위로 실행되도록 하는 등 여러 가지 방법으로 처리하여 중요한 섹션에서 실행하는 동안 스레드를 선점할 수 없도록 할 수 있습니다.

Read all articles in Uncategorized