getpid는 어떻게 작동하나요?

getpid는 어떻게 작동하나요?

시스템 getpid호출은 호출 프로세스의 프로세스 ID를 반환합니다. 커널은 어떤 프로세스가 시스템 호출을 호출하는지 어떻게 결정합니까?

답변1

커널은 작업 스케줄링을 수행하고 시스템 호출을 제공합니다.

프로세스가 실행되면 커널은 런타임을 예약하고(특히 PID를 할당) 이 정보는 커널 주소 공간(예: 작업 구조) 내의 데이터 구조에 저장됩니다.

따라서 프로세스가 getpid()시스템 호출을 호출할 때 커널은 다음 사항만 필요합니다.작업 구조 보기호출(즉, 현재 실행 중인) 프로세스의

답변2

시스템 호출이 실행되면 실행 코드가 사용자 모드 코드에서 금지하는 더 많은 명령을 수행하고 데이터에 액세스할 수 있도록 허용하는 권한 스위치가 있습니다.

그러나 프로세스 컨텍스트 전환이 없으므로 커널 코드는 호출 프로세스의 컨텍스트에서 계속 실행됩니다. 이는 커널이 어떤 프로세스가 자신을 호출하는지 검색할 필요가 없으며 이미 알고 있음을 의미합니다. getpid 시스템 호출 코드는 자체 프로세스/스레드 특정 정보를 포함하는 내부 구조에 대한 포인터에서 프로세스 ID를 검색합니다. 이 구조는 운영 체제 구현에 따라 다릅니다.

예를 들어 Illumos(OpenSolaris)의 경우 구조 이름은 proc입니다. http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/sys/proc.h#131

답변3

단일 CPU 시스템에는 실행 중인 프로세스나 현재 스레드의 proc 구조를 가리키는 전역 변수가 있습니다. proc 구조에는 프로세스 ID가 포함되어 있습니다.

다중 CPU 시스템에서 각 CPU는 유사한 포인터를 갖거나 MMU 컨텍스트를 사용하여 시스템 호출에 대한 전역 변수를 설정합니다.

int64_t 
getpid(void) 
{ 
        rval_t  r; 
        proc_t  *p; 

        p = ttoproc(curthread); 
        r.r_val1 = p->p_pid; 

이 예에서는 curthread가 사용된 전역 변수입니다.

관련 정보