출력이 준비되었거나 입력이 완료되었음을 나타내는 데 인터럽트가 사용됩니까?

출력이 준비되었거나 입력이 완료되었음을 나타내는 데 인터럽트가 사용됩니까?

운영 체제 개념은 다음과 같습니다.

I/O 중에 다양한 장치 컨트롤러가 서비스를 제공할 준비가 되면 인터럽트를 발생시킵니다. 이러한 중단은 다음을 의미합니다.

  • 출력이 완료되었거나
  • 입력 데이터를 사용할 수 있거나
  • 오류가 감지되었습니다.

출력이 준비되었거나 입력이 완료되었음을 나타내는 데 인터럽트가 사용됩니까?

그렇지 않다면 다른 방식으로 표현해야 합니까?

답변1

대답이 '예'이기 때문에 제목에 또는을 넣는 것이 좋습니다.

즉, 정확한 대답은 귀하가 요구하는 정확한 인터럽트에 따라 다릅니다. SPI 포트와 DMA를 예로 들어 보겠습니다. SPI는 양방향 직렬 인터페이스입니다.

예를 들어, DMA 인터럽트가 소위 수위를 표시하는 것이 일반적입니다. DMA 버퍼가 꽉 찼을 때, "거의 꽉 찼을 때"(예: 3/4), "거의 비어 있음"(예: 1/4), 완전히 비어 있을 때 인터럽트를 생성합니다.

SPI 포트의 경우 두 개의 DMA 채널이 있습니다. 한 채널은 외부 장치의 데이터를 처리하고 다른 채널은 컴퓨터에서 장치로 전송된 데이터를 처리합니다.
따라서 출력 DMA 채널 인터럽트가 버퍼가 비어 있음을 나타내면 출력이 완료되었음을 의미합니다. 입력 DMA 채널 인터럽트가 버퍼가 비어 있지 않음을 나타내는 경우 이는 입력 데이터를 사용할 수 있음을 의미합니다.

답변2

출력이 완료되었거나

출력이 준비되었음을 나타내는 데에도 인터럽트가 사용됩니까?

예.

직렬 포트 장치에 쓰는 것을 고려하십시오. 장치에는 소량의 데이터(예: 16바이트)를 저장하는 데 사용되는 FIFO라는 수신 버퍼가 있습니다.

두 경우 모두 중단이 발생할 수 있습니다.

  1. 버퍼가 비어지고 출력은 다음과 같습니다.충분히. 이는 tcdrain()Linux에서 구현됩니다. "이 기능은 출력에 영향을 미치는 매개변수를 변경할 때 사용해야 한다"고 합니다. 예를 들어, 직렬 포트의 "보드 속도"(주파수)를 변경하려는 경우 이를 사용하여 버퍼링된 모든 데이터가 현재 보드 속도를 사용하여 전송될 때까지 기다릴 수 있습니다.
  2. 버퍼에서 바이트가 전송되었습니다. 이제 공간을 사용할 수 있습니다. 장치는 지금준비해CPU는 또 다른 바이트를 버퍼에 푸시합니다.

입력 데이터를 사용할 수 있거나

입력이 완료되었음을 나타내는 데 인터럽트도 사용됩니까?

아마도. 하지만 적어도 내 경우에는 여기에 두 가지 다른 것이 있는지 잘 모르겠습니다.

직렬 포트 장치에서 읽는 것을 고려하십시오. 장치에는 소량의 데이터(예: 16바이트)를 저장하는 데 사용되는 FIFO라는 전송 버퍼가 있습니다.

FIFO가 입력에서 최소 1바이트를 수집하면 장치는 인터럽트를 보냅니다. 예를 들어 CPU에 연결된 선의 전압이 낮은 전압에서 높은 전압으로 바뀔 수 있습니다.

CPU는 IO 포트나 IO 메모리에서 읽어 버퍼의 바이트를 소비할 수 있습니다.

참고 사항: 이 유형의 트랜잭션은 시스템 RAM에서 읽는 것보다 시간이 더 오래 걸릴 수 있습니다. 이를 위해서는 IO 장치가 버스에 "대기 상태"를 삽입해야 합니다. 즉, IO 장치가 "데이터 준비" 비트를 설정하기 전에 여러 버스 주파수 사이클이 걸릴 수 있는 짧은 핸드셰이크가 있습니다. 대기 상태는 IO 포트/IO 메모리에 쓸 때도 적용됩니다. 그러나 대기 상태는 서로 다른 장치 간의 작동 빈도/지연 시간의 알려진 차이를 처리하는 데에만 사용됩니다. 외부 입력이나 출력을 기다리는 데 사용되지 않습니다. 이는 CPU가 계속 실행되는 것을 방지하기 때문입니다.아무것다른 것.

따라서 입력이 가능해지면 인터럽트 신호가 발생합니다. 원하는 경우 CPU가 입력 바이트를 읽을 때 입력이 "완료"되었다고 말할 수 있습니다. 그러나 신호를 보내는 데 인터럽트가 필요하지 않습니다. 메모리 읽기가 완료되었음을 알리는 데 인터럽트가 필요하지 않은 것과 같습니다.

입력 버퍼가 가득 찬 상태는 실제로는 오류 상태와 유사해 보입니다. 즉, 버퍼 오버플로를 나타냅니다. 이 조건은 실제로 장치에 의해 기록되어 운영 체제에서 오류를 감지할 수 있습니다. 그러나 오버플로를 위해 특별히 인터럽트를 보낼 이유가 없습니다. 입력이 가능하면 장치가 인터럽트를 보냈을 수 있기 때문입니다.

답변3

대부분의 최신 장치는 중요한 이벤트가 발생할 때 중단을 발생시킵니다.

그러나 중단으로 인해 비용이 많이 들 수 있습니다. 프로세서가 현재 수행 중인 작업을 차단하여 인터럽트를 처리하도록 합니다. 너무 많은 인터럽트를 받으면 실제로나머지귀하의 운영 체제. 블루투스 인터럽트가 너무 많아(예: 초당 700,000회 이상) 문제가 있었습니다.

암흑기 Apple 2에서는 방해가 전혀 없었습니다. 모든 것은 여론조사 방식의 계획을 통해 이루어집니다. I/O 포트를 읽고 개별 비트를 기반으로 새 데이터를 읽을지 여부를 알 수 있습니다. 예를 들어, 플로피 디스크에서 바이트를 로드하려면 바이트가 음수가 될 때까지(비트 7이 설정됨) 루프를 반복합니다.

$1
  LDA 0xC030
  BPL $1

Intel 프로세서(및 기타 프로세서)에서는 인터럽트가 심각하게 과부하됩니다. 즉, VBL 인터럽트, USB 포트 인터럽트 또는 새로운 SSD 드라이브에서 인터럽트를 수신하든 모두 인터럽트 0x20을 사용할 수 있습니다. 그런 다음 어떤 서비스를 서비스해야 하는지 결정하는 것은 CPU의 임무입니다. 마지막 경우에는 여러 장치가 동일한 인터럽트를 발생시킵니다.동시에, 다른 인터럽트가 발생하지 않으므로 돌아오기 전에 모두 서비스되었는지 확인해야 합니다(즉, 대부분의 장치는 서비스하기 전에는 반복하지 않는 인터럽트 신호를 보냅니다).

더 자세한 점은 하나의 인터럽트가 처리되는 동안 CPU가 더 많은 인터럽트를 차단한다는 것입니다(/인텔 프로세서의 경우 STI). CLI이는 현재 인터럽트에 대한 모든 작업을 수행할 수 있으며 결국에는 다른 인터럽트를 처리해야 함을 의미합니다. 이는 I/O 데이터 처리의 직렬화를 보장합니다. 이것이 바로 우리가 장치에서 상대적으로 적은 양의 데이터를 얻는 이유입니다. 이를 통해 데이터를 사용자 공간에 배치한 다음 원하는 수의 스레드에서 처리할 수 있습니다. 최신 CPU에서는 각각의 특정 인터럽트를 별도의 CPU에서 처리할 수 있습니다. 이를 통해 여러 인터럽트를 병렬로 처리할 수 있습니다. 하지만 지금까지 내가 본 바에 따르면 어떤 CPU가 어떤 인터럽트를 처리할지 미리 결정해야 합니다. CPU 간에 "핑퐁"이 이루어지지 않습니다.

관련 정보