Drivers do Linux e filas de eventos
Modele como um driver guarda em buffer os eventos que chegam antes que um consumidor os trate.
- 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 XPSeja 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/4A single-threaded model of a driver event queue. Real kernel producer and consumer code needs the documented synchronization and memory-ordering rules.
head=0 · tail=0 · count=0/4
Producer adds an event; consumer handles the oldest event.
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}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.
Processe um fluxo limitado de eventos
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
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…