0

공유 리소스는 두 응용 프로그램 프로세스 A와 프로세스 B에서 사용됩니다. 경쟁 조건을 피하기 위해 공유 리소스 비활성화 컨텍스트 전환을 처리하는 코드 부분을 실행하고 다시 활성화 할 때 프로세스의 공유 부분을 종료 한 후 프로세스 스위칭. 리눅스에서 공유 리소스에 대한 응용 [프로세스] 전환 피하기

그러나 다른 프로세스에 프로세스 전환을 방지하는 방법을 모르는 공유 리소스 부분을 실행하고 다시 프로세스의 공유 부분을 종료 한 후 공정 전환을 활성화 할 때.

경쟁 조건을 피하는 더 좋은 방법이 있습니까?

감사합니다,
모든 사용자 공간 응용 프로그램에 대한 학습자

+0

사용자 모드에서 그렇게하지 않으므로 더 좋은 아이디어를 내놓을 필요가 있습니다. –

+0

할 생각이 있습니까? –

+0

다른 프로세스가 중요한 작업을 완료 할 때까지 실행해서는 안되는 프로세스로 * 전환 *하는 것을 방지하기 위해 바쁜 프로세스 (허용되지 않음)에서 컨텍스트 전환 * 자리 비움 *을 방지하는 대신에주의하십시오. 해당 프로세스가 계속 될 준비가 될 때까지 리턴하지 않는 동기화 메커니즘에 대한 블로킹 호출이 작동해야합니다. –

답변

1

공유 리소스 부분을 실행할 때 프로세스가 다른 프로세스로 전환되는 것을 방지하고 프로세스의 공유 부분을 종료 한 후에 프로세스 전환을 다시 활성화하는 방법을 모릅니다.

직접이 작업을 수행 할 수 없습니다. 너 수 있습니다 커널 도움말 원하는대로하십시오. 예를 들어, 뮤텍스 (Mutex)를 기다리거나 IPC (프로세스 간 통신)를 수행하는 다른 방법 중 하나.

"충분 함"이 아니라면 원하는 의미의 커널 드라이버를 만들 수도 있습니다. 커널은 "sleeping"과 "running"사이에서 프로세스를 이동할 수 있습니다. 그러나 자신의 커널 드라이버를 작성하기 전에 기존 방법이 작동하지 않는 데는 충분한 이유가 있습니다.

또는 경쟁 조건을 피하기 위해 더 나은 방법이있다? 경쟁 조건을 방지

모두 장단점에 관한 것입니다. 커널은 서로 다른 특성을 지닌 여러 가지 IPC 방법을 가지고 있습니다. IPC에 대한 훌륭한 책을 얻고 Postgres와 같은 것들이 많은 프로세서로 확장 될 수 있는지 살펴보십시오.

0

및 커널 코드의 대부분, 당신이 컨텍스트 스위칭을 사용하지 않도록 설정할 수 있다는 유효합니다. 그 이유는 컨텍스트 스위칭이 애플리케이션의 책임이 아니라 운영 시스템의 책임이기 때문입니다.

언급 한 시나리오에서 뮤텍스를 사용해야합니다. 모든 프로세스는 공유 리소스에 액세스하기 전에 뮤텍스를 획득하고 공유 리소스 액세스를 완료 한 후에 뮤텍스를 릴리스한다는 규칙을 따라야합니다.

는 애플리케이션 따라서 공유 리소스 처리의인가를 정지, 즉 운영 체제 실행 컨텍스트 스위치를 상기 공유 자원 뮤텍스를 취득한 액세스 및 공유 자원의 일부의 처리를 수행하고, 말하게한다. OS는 공유 리소스에 액세스하려는 다른 프로세스를 예약 할 수 있지만 대기 상태에 있으며 뮤텍스가 릴리스 될 때까지 대기하며 이러한 프로세스는 공유 리소스를 사용하지 않습니다. 컨텍스트 스위치의 특정 번호 후에, OS는 다시 공유 자원의 처리를 계속하는 원래 응용 프로그램을 예약합니다. 원래 응용 프로그램이 마지막으로 뮤텍스를 릴리스 할 때까지이 작업이 계속됩니다. 그런 다음 다른 프로세스는 설계대로 순서대로 공유 리소스에 액세스하기 시작합니다.

더 권위 있고 자세한 뭐죠의 설명과 유사한 시나리오의 이유들을 원하는 경우에

, 당신은 예를 들어, this MIT lesson을 볼 수 있습니다.

희망이 도움이됩니다.

+0

그건 내 통제하에있는 응용 프로그램에 대한 확인입니다. 리눅스 시스템을 제공한다고 가정 해 봅시다. 사용자는 내가 사용하고있는 것과 동일한 공유 리소스를 사용하고있는 자신의 응용 프로그램을 설치할 수 있습니다. 따라서 공유 리소스 액세스를 피할 수있는 컨트롤이 없습니다. 어떻게 경쟁 조건에서 벗어날 수 있습니까? –

0

명명 된 세마포어를 살펴 보도록 제안합니다. sem_overview (7). 이렇게하면 critcal 섹션에서 상호 배제를 보장 할 수 있습니다.