2017-03-09 7 views
2

이전 시험을 통해 운영 체제 관련 시험을 준비하고 있습니다. 이것은 Unix 시스템, C 프로그래밍 언어에 관한 것이고, POSIX에 대해서는 많이 언급하고 있으므로 여기에서이 질문을하는 것이 가장 좋습니다.세마포어에는 syscalls이 필요합니까?

문제는 :

간단한 스핀 락 및/또는 세마포어의 세 가지 단점을 부여합니다. 각각의 다른 메커니즘이 어떻게 문제를 개선하는지 설명하십시오. 스레드가 바로 진행할 수있는 경우

세마포어도 시스템 호출이 필요합니다 + 설명 주어진 3 단점

하나는 이것이다. (0.5 P) 반면에 스핀 록은 사용자 공간에서 완벽하게 구현 될 수 있으며 syscall을 필요로하지 않습니다. 짧은 대기 시간에는 매우 효율적입니다. (0.5P)

왜 세마포어에는 syscalls이 필요합니까? 커널 공간에 있어야합니까? 특권 명령의 실행이 필요한가?

단일 프로세서 및 다중 프로세서 시스템을 고려해야합니다.

+0

나는 세마포어 란 무엇이며 어떻게 구현 될 수 있는지 힌트를 줄 것이다. 나는 당신이 그 주제에 관심이 있다면 적어도 그것들을 이해하려고 시도하고 대답을 암기하지 말 것을 조언한다. –

+0

@RuiFRibeiro 나는 주제에 흥미가 있으며 사용자 공간에서이를 구현하는 방법과 커널 공간에서 구현하는 방법을 모두 생각할 수있다. 나는 시스템 호출이 필요하다는 것을 이해한다. ** 만약 세마포어에서'wait()'를 호출하는 프로세스가 기다려야한다면 (예를 들어 세마포어가 완전히 사용된다면) 그리고 ** ** 일대일 쓰레드 모델이 양보하는 데 사용됩니다. 그러나 그 외에도 OS가 왜 개입해야하는지 알지 못합니다. "세마포어는 스레드가 즉시 진행될 때에도 시스템 호출이 필요합니다." ** 시험은 내일 **이므로 빠른 답변을 부탁드립니다. –

+0

세마포어를위한 특별한 시스템 호출이 있습니다. http://www.tldp.org/LDP/lpg/node51.html 또는 가난한 사람 세마포어로 파일이나 심지어 공유 메모리의 변수까지 가질 수 있습니다. 나는 종종 그 주제에 대한 특별한 해석을하고 교수님의 의견에 대해 더 많은 것을 알려주기 때문에 교수님들과 명확히해야 할 의혹에 대해 조언 해 주실 것입니다. –

답변

2

일부 역사적 맥락은 더 명확하게 해줍니다. 세마포어는 원래 POSIX IPC가 중요하기 전에 시스템 V 프로세스 간 통신 패키지 (System V IPC)의 일부였습니다. 이름은 아마 당신에게 물건이 향하고있는 곳에 관해서 단서를 준다; 원래의 사용 사례는 협력 프로세스가 공유하는 잠금이었습니다. (필자는 상당 기간 IPC 이전 스레드를 99.99 % 확률로 사용하고 있습니다.)

POSIX 세마포어는 OS 또는 스레드와 함께 작동하므로 OS가 개입합니다. 문맥은 세마포어의 추상 개념이 아니라 표준 세마포어 구현에 대한 대답이기 때문에 여기에서 중요합니다.

0

예, 세마포어는 매우 특별한 경우를 제외하고는 시스템 호출이 필요합니다. 세마포어는 다른 경쟁자가 리소스를 확보 할 때까지 기다릴 수 있어야합니다. 대기 중이면 시스템 호출이 필요합니다.

잠금 장치의 경쟁자가 공유 메모리 공간에 액세스 할 수 있고 서로가 동일한 프로세스의 스레드간에 잠금이있는 경우와 같이 세마포어 프로토콜을 존중하도록 서로 신뢰하는 경우 잠금은 항상 시스템 호출이 필요합니다. 즉, 권한이없는 프로세서 지침을 사용하여 잠금 상태를 검사하고 변경할 수 있습니다. 이렇게하면 잠금을 확보 할 수 있고 잠금을 해제 할 수 있지만 잠금을 무료로 기다리는 것은 또 다른 문제입니다.

스핀 록은 잠금이 해제 될 때까지 계속 사용 ("스핀")합니다. 잠금을 위해 경합하는 스레드가 다른 CPU에서 실행되는 것으로 알려진 경우 이는 유효한 전략 일 수 있습니다. 스레드가 동일한 CPU에서 실행될 수 있다면 잠금을 기다리는 스레드는 다른 스레드가 실행될 수있게해야하므로 생성해야합니다. 유저 랜드 쓰레드를 사용하면 시스템 호출없이이 작업을 수행 할 수 있습니다.

세마포어는 잠금 장치가 준비 될 때까지 잠자기 상태입니다. 현실 세계에서, 방적으로자는 것은 거의 받아 들일 수 없습니다. Sleeping은 거의 항상 시스템 호출을 필요로합니다. 커널은 대기중인 스레드를 스케줄러의 준비 목록에서 세마포어 객체의 대기 목록으로 이동시킵니다.