Table des matières
1. Blocage du flux de traitement des E/S dans le pilote" >1. Blocage du flux de traitement des E/S dans le pilote
2. Initialisez la liste d'attente" >2. Initialisez la liste d'attente
3. 等待队列处理" >3. 等待队列处理
4. 阻塞进程处理" >4. 阻塞进程处理
5. 唤醒处理" >5. 唤醒处理
Maison Tutoriel système Linux Le mécanisme de traitement pour bloquer les processus d'E/S dans les pilotes Linux

Le mécanisme de traitement pour bloquer les processus d'E/S dans les pilotes Linux

Feb 11, 2024 pm 04:45 PM
linux linux教程 linux系统 linux命令 shell脚本 overflow Débuter avec Linux apprentissage Linux

Nous devons réfléchir à la manière de réagir face à une situation dans laquelle le conducteur ne peut pas répondre immédiatement à la demande. Normalement, le processus appelant ne se soucie pas du statut du pilote, nous devons donc le gérer en conséquence dans le pilote. Une approche courante consiste à bloquer les requêtes adressées au processus.

Le blocage des E/S signifie que si les ressources requises ne peuvent pas être obtenues lors de l'exécution des opérations sur l'appareil, le processus en cours sera suspendu jusqu'à ce que les conditions opérationnelles soient remplies avant d'effectuer l'opération. Le processus suspendu se met en veille et est supprimé de la file d'attente d'exécution du planificateur jusqu'à ce que les conditions d'attente soient remplies. Au contraire, les E/S non bloquantes ne suspendent pas le processus lorsque l'opération du périphérique ne peut pas être effectuée, mais choisissent d'abandonner ou de continuer l'interrogation jusqu'à ce que l'opération puisse être effectuée.

«

La file d'attente est un mécanisme classique pour gérer le blocage des E/S.

1. Blocage du flux de traitement des E/S dans le pilote

En résumé, le flux de traitement des E/S bloquantes comprend 4 parties. Tout d’abord, initialisez la liste d’attente, qui stocke les processus qui doivent être bloqués. Initialisez ensuite une file d'attente et ajoutez le processus qui doit actuellement être bloqué à la liste chaînée de la file d'attente. Ensuite, définissez le processus pour qu'il soit interruption et empêchez le processus de dormir. Enfin, lorsque certaines conditions sont remplies, c'est-à-dire que des ressources sont disponibles, les processus en file d'attente sont réveillés.
La figure suivante décrit le flux de traitement des E/S bloquantes :

Le mécanisme de traitement pour bloquer les processus dE/S dans les pilotes Linux

2. Initialisez la liste d'attente

Avant d'initialiser la liste chaînée de la file d'attente, nous devons d'abord définir une wait_queue_head_t的变量。例如在RK3399的ISP驱动中数据结构struct rkisp1_stream包含了wait_queue_head_t done;。通过调用调用init_waitqueue_head(&stream->done);pour l'opération d'initialisation.

void rkisp1_stream_init(struct rkisp1_device *dev, u32 id)
{
 struct rkisp1_stream *stream = &dev->stream[id];

 memset(stream, 0, sizeof(*stream));
 stream->id = id;
 stream->ispdev = dev;

 INIT_LIST_HEAD(&stream->buf_queue);
 init_waitqueue_head(&stream->done);
 spin_lock_init(&stream->vbq_lock);
 ...
}
Copier après la connexion

wait_queue_head_t变量的原型是__wait_queue_head, comme indiqué ci-dessous :

struct __wait_queue_head {
 spinlock_t  lock;
 struct list_head task_list;
};
Copier après la connexion

init_waitqueue_head()真正执行的函数是__init_waitqueue_head(), sa fonction est définie comme suit :

void __init_waitqueue_head(wait_queue_head_t *q, const char *name, struct lock_class_key *key)
{
 spin_lock_init(&q->lock);
 lockdep_set_class_and_name(&q->lock, key, name);
 INIT_LIST_HEAD(&q->task_list);
}
Copier après la connexion

3. 等待队列处理

调用DECLARE_WAITQUEUE(wait, current)将当前进程初始化为等待队列。注意,这里的等待队列和等待队列链表头可不是一个东东。

#define DECLARE_WAITQUEUE(name, tsk)     \
 wait_queue_t name = __WAITQUEUE_INITIALIZER(name, tsk)
Copier après la connexion

等待队列的定义如下:

struct __wait_queue {
 unsigned int  flags;
 void   *private;
 wait_queue_func_t func;
 struct list_head task_list;
};
Copier après la connexion

等待队列和等待队列链表头是通过add_wait_queue()结合到一起的。

init_waitqueue_head(&delay_wait);
add_wait_queue(&delay_wait, &wait);
Copier après la connexion

以上代码是将等待队列进程加入到等待队列链表中:

static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new)
{
 list_add(&new->task_list, &head->task_list);
}
Copier après la connexion

4. 阻塞进程处理

阻塞进程处理包括两部分内容,首先设置进程的睡眠状态,包括TASK_INTERRUPTIBLETASK_UNINTERRUPTIBLE两种。前者用于可中断睡眠,后者用于不可中断睡眠。然后,将当前进程退出调度器让出CPU的使用权。

set_current_state(TASK_INTERRUPTIBLE);
schedule();
Copier après la connexion

5. 唤醒处理

唤醒处理通常位于中断处理函数或某些动作成功执行之后,特定条件满足时,唤醒通过阻塞队列睡眠的进程。例如:

void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long sectors,
       int success, int behind)
{
 if (!bitmap)
  return;
 if (behind) {
  if (atomic_dec_and_test(&bitmap->behind_writes))
   wake_up(&bitmap->behind_wait);
  pr_debug("dec write-behind count %d/%lu\n",
    atomic_read(&bitmap->behind_writes),
    bitmap->mddev->bitmap_info.max_write_behind);
 }
...
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Entrée de la version Web Deepseek Entrée du site officiel Deepseek Entrée de la version Web Deepseek Entrée du site officiel Deepseek Feb 19, 2025 pm 04:54 PM

Entrée de la version Web Deepseek Entrée du site officiel Deepseek

Android TV Box obtient une mise à niveau non officielle d'Ubuntu 24.04 Android TV Box obtient une mise à niveau non officielle d'Ubuntu 24.04 Sep 05, 2024 am 06:33 AM

Android TV Box obtient une mise à niveau non officielle d'Ubuntu 24.04

Comment installer Deepseek Comment installer Deepseek Feb 19, 2025 pm 05:48 PM

Comment installer Deepseek

Adresse de téléchargement de l'application de portefeuille BitPie Bitpie Adresse de téléchargement de l'application de portefeuille BitPie Bitpie Sep 10, 2024 pm 12:10 PM

Adresse de téléchargement de l'application de portefeuille BitPie Bitpie

Installation officielle du site officiel de Bitget (Guide du débutant 2025) Installation officielle du site officiel de Bitget (Guide du débutant 2025) Feb 21, 2025 pm 08:42 PM

Installation officielle du site officiel de Bitget (Guide du débutant 2025)

Zabbix 3.4 Installation de la compilation du code source Zabbix 3.4 Installation de la compilation du code source Sep 04, 2024 am 07:32 AM

Zabbix 3.4 Installation de la compilation du code source

Explication détaillée : commande de paramètre de jugement variable du script Shell Explication détaillée : commande de paramètre de jugement variable du script Shell Sep 02, 2024 pm 03:25 PM

Explication détaillée : commande de paramètre de jugement variable du script Shell

Le package d'installation OUYI OKX est directement inclus Le package d'installation OUYI OKX est directement inclus Feb 21, 2025 pm 08:00 PM

Le package d'installation OUYI OKX est directement inclus

See all articles