Carregando
0x110Lição 18 de 20

Drivers do Linux e filas de eventos

Modele como um driver guarda em buffer os eventos que chegam antes que um consumidor os trate.

28 min Questionário com 4 perguntas 1 exercício de código
Ao final desta lição, você saberá
  • Diferenciar código de kernel de um programa em C do espaço de usuário
  • Acompanhar head, tail e count numa fila circular limitada
  • Tratar os estados de cheia e vazia sem sobrescrever dados

O kernel do Linux usa C nos serviços centrais e nos drivers de dispositivos. Um driver pode receber dados do dispositivo mais rápido do que um consumidor consegue processá-los, então ele guarda os eventos em buffer. O guia de buffers circulares do kernel descreve uma fila de tamanho fixo com índices de produtor e consumidor; a documentação de platform drivers explica como os drivers se ligam aos dispositivos. Uma fila circular é um bom primeiro modelo antes de estudar as APIs do kernel e a concorrência.

Experimente

Até 15 XP

Seja o driver e o consumidor

Produza A e B e depois consuma-os em ordem. Observe head e tail enquanto eles andam pelas posições fixas. Tente consumir de uma fila vazia.

Mission 1: Queue event A.

Pontuação 0/4

A single-threaded model of a driver event queue. Real kernel producer and consumer code needs the documented synchronization and memory-ordering rules.

slot 0empty
slot 1empty
slot 2empty
slot 3empty

head=0 · tail=0 · count=0/4

Producer adds an event; consumer handles the oldest event.

Queue invariant in ordinary C
1#include <stdio.h>
2#define CAPACITY 4
3int main(void) {
4    int slots[CAPACITY] = {0};
5    int head = 0, tail = 0, count = 0;
6    slots[head] = 42;
7    head = (head + 1) % CAPACITY;
8    count++;
9    printf("queued=%d head=%d tail=%d count=%d\n", slots[tail], head, tail, count);
10    return 0;
11}
Saída
queued=42 head=1 tail=0 count=1

Este exemplo no navegador é C do espaço de usuário, e não um módulo do kernel. Drivers reais do kernel usam cabeçalhos do kernel, ferramentas de build, APIs de dispositivos e regras de sincronização; eles não podem usar diretamente o programa com stdio deste executor. Para código concorrente de produtor e consumidor, use as regras de buffer circular e ordenação de memória documentadas pelo kernel. O exercício abaixo modela de propósito uma fila com uma única thread, para você primeiro dominar a lógica dos índices e de cheia/vazia.

Principais conclusões

  • Uma fila circular mantém um armazenamento fixo e avança os índices módulo a capacidade.

  • Verifique se está cheia antes do push e se está vazia antes do pop.

  • O código de kernel tem APIs e requisitos de sincronização diferentes de um exemplo portável do espaço de usuário.

Quiz da aula

4 perguntas · aprovação com 3 acertos · até 50 XP

Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.

Pratique: escreva código em C

Estes exercícios rodam de verdade. Escreva o programa, clique em “Executar testes” e leia o que o compilador informa: aprender a ler as mensagens do compilador é metade do aprendizado de C.

Exercício 1

Processe um fluxo limitado de eventos

+25 XP

Implemente uma fila de inteiros com quatro posições. Leia comandos até o EOF: P n insere n, C consome e imprime o n mais antigo. Imprima FULL se uma inserção não couber e EMPTY se um consumo não tiver nada. Use head, tail e count; não sobrescreva valores não lidos.

  • Ordem FIFO
  • Cheia e volta ao início
main.c
Carregando editor…

Seu código é compilado com gcc 14 (-Wall -Wextra) e executado no Compiler Explorer (godbolt.org), um serviço público gratuito.

Dúvidas sobre esta lição

Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.

Carregando publicações…