2012-02-01 2 views
1

사용자 프로세스가 시스템 호출을 수행하면 커널 프로세스가 호출됩니다. 이제 어떻게하면 으로 바꾸면 컨텍스트 전환이 발생합니까? 커널 프로세스 은 사용자 프로세스와 다른입니다. 아니면 (시스템 호출에 의해 호출 된) 커널 루틴과 사용자 프로세스가 같은 프로세스에 속한다고 잘못 말하고있는 것입니까?사용자 프로세스는 컨텍스트 전환을 거치지 않고 시스템 호출을 어떻게 수행합니까?

답변

2

'사용자 프로세스가 시스템 호출을 수행하면 커널 프로세스가 호출됩니다. 실제로는 커널 코드가 호출되지 않습니다. 모든 시스템 호출은 필연적으로 보호 컨텍스트 변경 (링주기)을 초래합니다. 이것이 얼마나 깊게되는지는 통화에 달려 있습니다. 호출이 링 0에 도달하면 커널 코드는 모든 사용자 및 커널 스레드에 액세스 할 수 있으므로 일반적으로 커널 코드는 '프로세스'로 설명 할 수 없습니다.이 프로세스는 메모리 관리/보안 컨텍스트를 제공합니다 보호. 일반적으로 링 0/링 0은 2000+ CPU주기를 소비합니다 (독일어 오페라에서는 3 일이 소요됩니다). 이 오버 헤드는 시스템 호출이 스레드 컨텍스트 전환 및/또는 프로세스 컨텍스트 전환을 야기하는지 여부와 상관없이 절대적으로 필요합니다.

시스템 호출로 인해 실행중인 스레드 세트가 변경되는 경우 스레드 컨텍스트 전환에 추가 오버 헤드가 발생합니다. 특히 다른 프로세서에서 실행중인 스레드의 선점이 필요한 경우 특히 그렇습니다.

새로 실행중인 스레드가 선점 된 스레드와 다른 프로세스에 속하면 프로세스 컨텍스트 전환의 오버 헤드가 훨씬 커집니다.

+0

사용자 프로세스의 이진/실행 가능 이미지의 커널 코드 부분도 마찬가지입니까? 커널 코드는 링크하는 동안 사용자 프로세스 바이너리 파일의 일부가됩니까? –

+1

OS 링크의 세부 사항은 OS에 따라 다릅니다. 일반적으로 런타임에 OS 액세스를 제공하는 빌드 타임 라이브러리가 링크되어 있습니다 (예 : DLL과 동적으로 링크됩니다. 따라서 커널에 액세스하는 코드는 이진 실행 파일의 일부가되며 실제 커널 코드는 모든 프로세스에서 공유됩니다. –

+0

시원한 .. 이것은 내가 알 필요가있는 것이다! :) 감사 :) –