2017-02-14 5 views
1

멀티 코어 CPU에서 다음과 같은 경우를 고려하면 간단하게 리눅스 커널을 사용할 수 있습니다.OS에서 2 개의 I/O 차단 프로세스 및 키스트 로크 이벤트

wait_char() 
{ 
    while (1) 
    { 
     ch = readchar(); 
     putchar(ch); 
    } 
} 
  1. 나는 두 터미널 A와 B를 열어 처리 A와 처리 B 모두 차단 및 키보드 대기 I/O 큐에 넣어
  2. 각각 오는 인터럽트에 wait_char() 코드를 실행할 . A는
  3. 가 지금은 터미널 특히 B 입력
  4. CPU가 커널 모드에서 키보드 인터럽트 서비스 루틴을 실행하는 내 키보드에서 키를 선택하는 큐에 앞서 B의이다, 말할 수 것은 물론
  5. I는 입력 키를 볼 수 있습니다 콘솔에 에코.

이제 커널이 B (누가 I/O 대기열에 있었는지)에 대해 어떻게 알았습니까?

+0

내가 100 % 확신하지는 않지만 나는 추측 할 것이다. bash는 당신이 입력 한 프로그램에'fork'와'execv'를합니다. 자식 프로세스와 부모 프로세스는'stdin'과'stdout'을 포함한'PD' 테이블의 모든 엔트리를 공유합니다. 처음에 프로그램 A를 실행 한 bash에서 키를 입력하고 입력을 입력하면 bash가 중단되어 OS가 해당 입력을 처리합니다. 프로그램 A와 bash는 그 입력을 받았습니다. 프로그램 B가 아니고 두 번째로 열린 bash. –

답변

0

프로세스가 입출력을 대기중인 대기열에 없습니다. 터미널 B에 무엇인가를 입력하면 장치 드라이버는 터미널 B에서 온 것으로 인식합니다. 장치가 인터럽트를 트리거 할 가능성이 있습니다. 그러면 OS가 터미널 B에서 보류중인 읽기 요청이있는 사용자에게 데이터를 보냅니다.

터미널 B에서 두 개의 프로세스를 읽는 경우 임의의 문자를 가져 오는 것은 임의적입니다.