Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии 


В этой строке описывается указатель на голову очереди запросов.




Строка 276

Это последний запрос, помещенный в очередь ожидания.

Строка 277

Функция планировщика (elevator) используется для обработки очереди запросов. Это может быть стандартный планировщик ввода-вывода (безоперационный,


Устройства



предельный или предварительный) или новый тип планировщика, специально разработанный для данного блочного устройства.

Строка 282

request_list - это структура, состоящая из двух wait_queue: одной для очереди чтения блочного устройства и одной для очереди записи.

include/linux/blkdev.h 283

284 request_fn_proc *request_fn;

285 merge_request_fn *back_ merge_fn;

286 merge_request_fn *front_merge__fn;

287 merge_requests_fn *merge_requests_fn;

288 make_request_fn *make_request_fn;

289 prep_rq_fn *prep_rq_fn;
2 90 unplug_fn *unplug_fn;

2 91 merge__bvec_fn *merge_bvec__fn;

292 activity_fn *activity_fn;
293

Строки 283-293

Специальные функции планировщика (лифта) могут быть определены для управле­ния тем, как обрабатываются запросы для блочных устройств.

include/linux/blkdev.h

294 /*

2 95 * Условие автоматического отключения

296 */

297 struct timer_list unplug_timer;

298 int unplug_thresh; /* После такого количества запросов */

299 unsigned long unplug_delay; /* После такой задержки*/

300 struct work_struct , unplug__work; 301

3 02 struct backing_dev_info backing_dev_infо;
303

Строки 294-303

Эти функции используются для изъятия функции планировщика ввода-вывода, ис­пользуемых для блочного устройства. Подключение (plugging)связано с ожидани­ем, пока очередь запросов заполнится и можно будет выбрать алгоритм планиров­щика для упорядочения и сортировки запросов ввода-вывода, оптимизируя время, необходимое для выполнения запросов ввода-вывода. Например, жесткий диск под-



Глава 5* Ввод-Вывод


ключает несколько запросов на чтение в ожидании того, что после поступления еще нескольких запросов придется меньше перемещать головку. Скорее всего, чтение удастся отсортировать последовательно или даже кластеризовать в одну более длин­ную операцию чтения. Отключение (unplugging)связано с методом, когда устрой­ство решает больше не ожидать и обрабатывать запросы, в зависимости от возмож­ных будущих оптимизаций. (См. более подобную информацию в Documenta-tion/block/biodoc. txt.)

include/linux/blkdev. h

304 /* Владелец очереди может использовать эту информацию

305 * по своему усмотрению.

306 * Это не касается ll_rw_blk.

307 */

3 08 void *queuedata;

310 void *activity_data;

Строки 304-311

Как следует из комментариев, эти строки обрабатывают очередь запросов с помо­щью определенного устройства и/или драйвера устройства.

include/linux/blkdev. h

312 /*

313 * Для страниц за этими пределами очереди нужны страницы раскачки.

314 */-.-.

315 unsigned long bounce__pfn;

316 int bounce_gfp; 317

Строки 312-317

Подпрыгивание (bouncing)означает принятый в ядре перенос буфера ввода-вывода из верхней памяти в буфер в нижней памяти. В Linux 2.6 ядро позволяет устройству самостоятельно обрабатывать необходимый ему буфер в буфере в верх­ней памяти. Сейчас подпрыгивание обычно используется только в тех случаях, ко­гда устройство не может обработать буфер в верхней памяти.


Устройства



include/linux/blkdev.h

318 /*

319 * см. ниже в QUEUE_* различные флаги очереди

320 */

321 unsigned long queue_flags; 322

Строки 318-321

Переменная queue_flags хранит один или несколько флагов, приведенных в табл. 5.1 (см. include/linux/blkdev.h, строки 368-375).

Таблица 5.1. queue Jlags


Флаг


Функция


QUEUE_FLAG_CLUSTER Несколько сегментов кластера в 1

QUEUE__FLAG__QUEUED Используется обобщенный код очереди

QUEUE__FLAG_STOPPED Очередь остановлена

QUEUE_FLAG_READFULL Очередь чтения заполнена

QUEUE_FLAG_WRITEFULL Очередь записи заполнена

QUEUE_FLAG_DEAD Очередь отменена

QUEUE_FLAG__REENTER Избегание повторных вхождений

QUEUE_FLAG_PLUGGED Подключение очереди


include/linux/blkdev.h

323 324 325 326 327 328 329 330 331 332 333 334 335 336

/*

* защита структур очереди от повторных вхождений
*/

spinlock_t *queue_lock;

/*

* kobject очереди
*/

struct kobject kobj;

* настройки очереди

*/

unsigned long nr__requests; /* Максимальный номер запроса */



Глава 5* Ввод-Вывод


337 unsigned int nr__congestion_on;

338 unsigned int nr_congestion_off; 339

 

340 unsigned short max_sectors;

341 unsigned short max_phys_segments;

342 unsigned short max_Jiw_segments;

343 unsigned short hardsect_size;

344 unsigned int max_segment_size; 345

 

346 unsigned long seg__boundary_mask;

347 unsigned int dma_alignment; 348

349 struct blk_queue__tag *queue_tags;

351 atomic_t refcnt;

353 unsigned int in_flight;

355 /*

356 * sg stuff

sg_timeout; sg__reserved_size;

357 */
3 58 unsigned int



359 unsigned int

360 };


Строки 323-360

Эти переменные определяют управляемые ресурсы для очереди запросов, такие, как блокировка (строка 326) и объекты ядра (строка 331). Также присутствуют специ­альные настройки очереди, такие, как максимальное число запросов (строка 336) и физическое содержимое блочного устройства (строки 340-347). Кроме этого, можно определить атрибуты SCSI (строки 355-359), если они применимы к данному блочному устройству. Если вы хотите использовать управляемые командные очере­ди, используйте структуру queue_tags (строка 349). Поля refcnt и in_f light (строки 351 и 353) считают количество обращений к очереди (обычно используются для блокировки) и количество запросов, которые обрабатываются «на лету».

Очереди запросов, используемые блочными устройствами, инициализируются в ядре

Linux 2.6 простым вызовом следующей функции в функции__ init устройства. Внутри

этой функции мы можем увидеть анатомию очереди запроса и связанные с ней вспомога­тельные функции. В ядре Linux 2.6 каждое блочное устройство управляет собственной блокировкой в отличие от более ранних версий Linux и передает циклическую блокировку в качестве второго аргумента. Первый аргумент - это функция запроса, предоставляемая драйвером блочного устройства.


Устройства



drivers /block/ ll_rw__blk. с

1397 request_queue_t *blk_init_queue (request__fn_proc *rfn,

spinlock_t *lock)

1398 {

13 99 request__queue_t *q;

1400 static int printed;
1401

1402 q = blk_alloc_queue(GFP_KERNEL);

1403 if (!q)

1404 return NULL; 1405

1406 if (blk_init_free_list(q))

1407 goto out_init;
1408

1409 if (Iprinted) {

1410 printed = 1;

1411 printk("Using %s io scheduler\n",

chosen__elevator->elevator_name) ;

1412 }
1413

1414 if (elevator_init(q, chosen__elevator))

1415 goto out_elv;
1416

1417 q->request_fn = rfn;

1418 q->back__merge_fn = ll_back_merge_fn;

1419 q->front_merge_fn = ll_front_merge_fn;

1420 q->merge_requests_fn = ll_merge_requests_fn;

1421 q->prep_rq_fn = NULL;

1422 q->unplug_fn = generic_unplug__device;

1423 q->queue_flags = (1 « QUEUE_FLAG_CLUSTER) ;

1424 q->queue_lock = lock; 1425

1426 blk_queue_segment_boundary(q, Oxffffffff);
1427

1428 blk_queue_make_request(q, _ make_request);

1429 blk__queue_max_segment_size(q/ MAX_SEGMENT__SIZE) ; 1430

 

1431 blk_queue_max_hw_segments (q, MAX_HW_SEGMENTS) ;

1432 blk_queue_max_phys_segments (q, MAX_PHYS_SEGMENTS) ; 1433

1434 return q;

1435 out_elv:

1436 b1k_c1eanup_queue(q);

1437 out_init:



Глава 5 • Ввод-Вывод


1438 kmem_cache_free(requestq__cachep, q);

1439 return NULL;

1440 }

Строка 1402





Рекомендуемые страницы:


Читайте также:

  1. Am Ende der Reihe (в конце очереди)
  2. III. Местоимения: личные, притяжательные, вопросительные, указательные, неопределенные, отрицательные.
  3. В любом следующем в этой встрече случае сомнения в правильности подачи того же игрока или его партнера по паре, по той же или иной причине, принимающему присуждают очко.
  4. В своём реферате я расскажу о развитии волейбола в мире и в нашей стране, о правилах этой игры, о её технике и тактике.
  5. Вопрос 111. Как описывается в Коране разворачивание свитков?
  6. Выделение очереди из памяти ядра и обнуление ее содержимого.
  7. Где же причина этой длительной болезни, повергающей одних в уныние, других в отчаяние?
  8. Девять советов, как извлечь наибольшую пользу из этой книги.
  9. Доблестные отцы поднимают голову
  10. Если ваш ребенок проявил большой интерес к этой игре, постарайтесь посмотреть вместе с ним какой-нибудь фильм о животных.
  11. Если задать по этой области вопрос- ответ короткий, однозначный.




Последнее изменение этой страницы: 2016-03-25; Просмотров: 606; Нарушение авторского права страницы


lektsia.com 2007 - 2021 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.027 с.) Главная | Обратная связь