MI_SWITCH(9)

명칭
mi_switch, cpu_switch - 별의 프로세스 문맥에의 스윗치

서식
<sys/param.h> <sys/proc.h> void mi_switch(void) void cpu_switch(struct proc *p)

해설
mi_switch() 함수는 머신비의존인 프로세스 콘텍스트 스위칭의 사전 처리를 실장하고 있습니다. 횡령 불가능한 커널 모드 실행의 방침의 결과로서, 커넬내의 얼마 안되다 구별된 장소로부터 마셔 불려 갑니다. 3 개(살)의 주된 mi_switch 의 사용은 이하로 거론됩니다.

1.  sleep(9) 및 tsleep(9) 중에서, 어느 리소스가 이용 가능하게 되는 것을 기다리기 위해서(때문에) 현재의 프로세스가 자발적으로 CPU 를 방폐할 때.

2.  트랩 (예를 들면, 시스템 콜, 디바이스 세치기) 의 취급의 다음에, 커널이 유저 모드 실행을 위해서(때문에) 돌아올 준비 때. 통상 이 경우는, 현재의 프로세스의 시그널 배치안의 변화의 검출의 후에 머신 의존의 트랩 핸들링 코드에 의해 취급되는지, 보다 높은 우선도의 프로세스가 실행 가능하게 되었을지도 모를 때입니다. 후자의 이벤트는 머신 정의의 need_resched() 의 호출에 의한 머신비의존의 스케줄링 routine에 의해 전달됩니다.

3.  시그널 핸들러 코드 ((issignal) 9 (을)를 참조) 중(안)에서, 프로세스를 정지시키는 시그널이 도착되었을 경우.

mi_switch() (은)는 프로세스 구조체안에 현재의 프로세스가 실행된 시간량을 기록해, 그 프로세스에 할당라고 있는 CPU 의 시간 제한 ((getrlimit) 2 (을)를 참조)에 비추어 이 값을 검사합니다. 소프트 제한의 초과는 그 프로세스에 SIGXCPU 시그널이 전달되는 결과를 불러, 한편 하드 제한의 초과는 SIGKILL (을)를 일으킵니다. 이러한 관리상의 일이 완료한 다음에, mi_switch() (은)는 실제로 프로세스 콘텍스트 스위칭을 행하는 머신 의존 routine cpu_switch() 에 제어를 인도합니다.

cpu_switch() (은)는 우선도 큐 데이터 구조에 대해, 실행 준비가 되어 있는 프로세스중에서 선택합니다. 우선도 큐는, 큐 선두 구조체인 배열 qs[NQS] (으)로 구성됩니다. 개개의 큐 선두 구조체에 의해, 같은 우선도의 실행 가능한 프로세스의 리스트를 식별합니다 (<sys/proc.h> (을)를 참조). 단일의 말 whichqs (은)는, 하늘이 아닌 큐를 알 수 있는 비트 마스크를 포함해, 재빠르게 프로세스를 선택하는 것을 돕습니다. cpu_switch() (은)는 가장 높은 우선도를 가지는 큐상의 리스트 (qs 안의 낮은 인데크스가 높은 우선도를 나타낸다) (으)로부터 최초의 프로세스를 삭제하지 않으면 안되어, 글로벌 변수 curproc 에 그 프로세스 구조체의 주소를 할당 없으면 안됩니다. 실행 큐상에 이용 가능한 프로세스가 없는 경우에는, cpu_switch() 하 “idle” 루프로 이행하게 되어 있습니다. idle 루프는 세치기를 허가할 필요가 있습니다. 이것에 의해, 이윽고 프로세스가 실행 큐상에 다시 나타납니다. cpu_switch() 하지만 이 발생을 기다리고 있는 동안은 변수 curproc 하 NULL (이어)여야 합니다.

mi_switch() 및 당연 cpu_switch() (은)는 splhigh()로 불려 가야 하는 것인 것에 주의해 주세요.

관련 항목
issignal(9), spl(9), tsleep(9), wakeup(9)