Проект FreeBSD Symmetric MultiProcessing (SMP), часто именуемый как SMPng (SMP следующего поколения), направлен на реализацию поддержки SMP до уровня мелких структур в ядре FreeBSD. Впервые эта поддержка появилась в январе 2003 года в 5.0-RELEASE. По историческим причинам развития FreeBSD, это было похоже на попытку протиснуть квадратный ящик через круглую дыру, и поэтому промежуточные результаты не были столь хороши по многим параметрам. Мы целенаправленно не пытаемся ни переписать ядро с нуля, ни изменить все архитектурные особенности, имеющиеся в ядре. Этот проект направлен на практическую реализацию, а не теоретические исследования.
На этой Web-странице содержится информация, относящаяся к попыткам улучшить поддержку SMP во FreeBSD. В целом проект использует всё возможное из разрабатываемого ядра BSD/OS 5.0, и повторно реализует то, что нельзя использовать напрямую, из-за различий в основном коде.
Как и для любого некоммерческого проекта, разработка детального плана работ невозможна. Мы ожидаем получить значительного улучшения производительности и стабильности, проблемы с которыми должны быть решены в течение первых нескольких месяцев работы над проектом, хотя все возможные усилия будут прилагаться и к сохранению работоспособности -current.
Перечень задач ниже не претендует на полноту, но представляет набор имеющих отношение к делу и/или важных компонентов общей работы. Поле "Ответственный" указывает на разработчика, который изъявил желание отвечать за завершение определённой задачи; это не исключает участия других, но предполагает соответствующую координацию работ с ответственным лицом, чтобы исключить дублирование работ и максимально их ускорить. При начале работ в незанятой или новой области значительного объёма стоит отправить письмо по электронной почте в адрес списка рассылки FreeBSD по SMP, для определения того, сделано ли какое-то движение.
Смысл поля даты варьируется в зависимости от состояния работы. Для выполненных задач оно обозначает дату завершения или сообщения о завершении. Для выполняемых задач оно обозначает дату последнего обновления. Для заброшенных задач оно обозначает дату объявления об этом. Для новых задач оно обозначает дату добавления задачи к списку.
Процесс приведения к механизму блокировки отдельных драйверов устройств отслеживается на Web-странице преобразования драйверов busdma и SMPng.
Информация о блокировке стека сетевых протоколов размещена на Web-странице netperf Роберта Уотсона и Web-странице Netperf Web-сайта FreeBSD.org.
Задачи отсортированы сначала по состоянию, затем по дате.
Основное обсуждение SMP проходит в списке рассылки freebsd-smp. Вы можете узнать больше о списках рассылки в главе об электронных ресурсах Руководства FreeBSD.
Стив Пассе (Steve Passe) поддерживает страницу проекта SMP, на которой содержится дополнительная информация и более глубоко отражает историю вопроса, чем эта Web-страница.
Robert Watson поддерживает страницу проекта Netperf, в рамках которого ведутся работы, связанные с производительностью сети в SMP. Кроме того, у него есть персональная Web-страница с протоколом изменений и другой информацией.
Страницы справочной системы, описывающие примитивы для работы с синхронизацией на уровне ядра и тредами можно найти здесь:
Кроме того, интерес может представлять старая справочная страница по SPL, описывающая ранее используемую модель синхронизации SMP.
Страница правил ядра для синхронизации SMP Хитена Панди.
Matt Dillon поддерживает Web-страницу, на которой он документирует свою работу над проектом SMP.
Работа к USENIX "Locking in the Multithreaded FreeBSD Kernel", которую написал John Baldwin.
Работа к BSDCon'03 "Reasoning about SMP in FreeBSD", которую написал Jeffrey Hsu.
Работа к BSDCon'03 "ULE: A Modern Scheduler for FreeBSD", которую написал Jeff Roberson.
Это неполный перечень высокоуровневых подсистем ядра и тех, кто активно работает над архитектурой SMP и её стабильностью.
Подсистема | Состояние | Последнее обновление | Разработчики |
---|---|---|---|
Newbus | Выполняется | 5 октября 2003 | Warner Losh |
VM | Выполняется | 4 октября 2003 | Alan L. Cox |
Кэш-буфер | Выполняется | 4 октября 2003 | Jeff Roberson, Poul-Henning Kamp |
VFS | Выполняется | 4 октября 2003 | Jeff Roberson |
Процессы и операции с потоками | Выполняется | 5 мая 2003 | John Baldwin |
Планировщик | Выполняется | 23 апреля 2004 | John Baldwin, Jeff Roberson |
GEOM | Выполнено | 5 февраля 2003 | Poul-Henning Kamp |
Файловые дескрипторы | Выполнено | 5 февраля 2003 | Alfred Perlstein, Seigo Tanimura Robert Watson |
Подсистема TTY | Выполняется | 24 июля 2004 | Poul-Henning Kamp |
Конвейерные IPC | Выполнено | 4 октября 2003 | Alfred Perlstein |
Структуры сокетов и системные вызовы | Выполнено | 25 ноября 2004 | Sam Leffler, Robert Watson |
KQueue | Выполнено | 24 ноября 2004 | John-Mark Gurney, Brian Feldman |
IPv4, IPv6 | Выполняется | 23 апреля 2004 | Jennifer Yang, Jeffrey Hsu, Sam Leffler, Robert Watson, George V. Neville-Neil |
IPX/SPX | Выполняется | 23 апреля 2004 | Roman Kurakin, Robert Watson |
netatalk | Выполняется | 24 ноября 2004 | Robert Watson |
Инфраструктура сетевого стека | Выполняется | 4 октября 2003 | Jeffrey Hsu, Sam Leffler, Robert Watson, Max Laier, Luigi Rizzo, Maurycy Pawlowski-Wieronski <maurycy@fouk.org>, Brooks Davis, Roman Kurakin |
Клиент NFS | Не начиналось | 23 апреля 2004 | |
Сервер NFS | Выполняется | 24 ноября 2004 | Robert Watson |
Далее следует неполный перечень работ общего характера.
Задача | Ответственный | Последнее обновление | Состояние |
---|---|---|---|
Преобразовать giant-блокировки от типа spinning к blocking, добавить блокировку планировщика и простаивающие процессы для каждого процессора. | Matt Dillon | 25 июня 2000 | Выполнено |
Перенос примитивов блокировки из BSD/OS (i386). | Jake Burkholder | 3 июля 2000 | Выполнено |
Реализовать тяжёлые потоки выполнения для прерываний (i386). | Greg Lehey | 3 августа 2000 | Выполнено |
Переписать низкоуровневый код прерываний (i386 UP). | Greg Lehey | 3 августа 2000 | Выполнено |
Добиться достаточной стабильности (построение полной системы на самом хосте) (i386 UP). | разработчики -smp | 12 августа 2000 | Выполнено |
Перенос примитивов блокировки из BSD/OS (alpha). | Doug Rabson | 24 августа 2000 | Выполнено |
Заменить заглушками (отключить) вызовы spl(). | Greg Lehey | 30 августа 2000 | Выполнено |
Перенос кода ktr из BSD/OS. | Greg Lehey, John Baldwin | 30 августа 2000 | Выполнено |
Переписать низкоуровневый код обработки прерываний (i386 SMP). | John Baldwin | 1 сентября 2000 | Выполнено |
Добиться достаточной стабильности (построение полной системы на самом хосте) (i386 SMP). | -smp developers | 6 сентября 2000 | Выполнено |
Добиться достаточной стабильности (построение полной системы на самом хосте) (alpha). | -smp developers | 6 сентября 2000 | Выполнено |
Сделать malloc и сопутствующие функции работающими с потоками выполнения. | Jason Evans | 10 сентября 2000 | Выполнено |
Реализовать обработчик msleep(), сделать tsleep() обработчиком msleep(). | Jake Burkholder | 11 сентября 2000 | Выполнено |
Сделать драйвер fxp работающим с потоками выполнения. | Chuck Paterson | 17 сентября 2000 | Выполнено |
Сделать mbuf работающими с потоками выполнения. | Bosko Milekic | 29 сентября 2000 | Выполнено |
Переработать менеджер блокировок. | Jason Evans | 3 октября 2000 | Выполнено |
Реализовать тяжёлые потоки прерываний (alpha). | John Baldwin, Doug Rabson | 5 октября 2000 | Выполнено |
Переписать низкоуровневый код обработки прерываний (alpha). | Doug Rabson, John Baldwin | 5 октября 2000 | Выполнено |
Сбор статистику по процессу. | Tor Egge, John Baldwin | 5 октября 2000 | Выполнено |
Сделать драйверы ethernet работающими с потоками. | Bill Paul | 15 октября 2000 | Выполнено |
Сделать заголовочные файлы для семафоров в основном машинно-независимыми. | John Baldwin | 20 октября 2000 | Выполнено |
Переименовать SMP_DEBUG в MUTEX_DEBUG. | John Baldwin | 20 октября 2000 | Выполнено |
Выделить каждому программному прерыванию собственный поток выполнения. | Chuck Paterson | 25 октября 2000 | Выполнено |
Сделать sf_bufs (sendfile(2)) работающим с потоками. | Bosko Milekic | 5 ноября 2000 | Выполнено |
Заставить фиксирующий код работать корректно. | John Baldwin | 18 ноября 2000 | Выполнено |
Отделить специфичный для ktr код от db_interface.c. | John Baldwin | 15 декабря 2000 | Выполнено |
Преобразовать драйвер sio к использованию spin-семафора. | John Baldwin | 18 декабря 2000 | Выполнено |
Реализовать условные переменные. | Jake Burkholder, Jason Evans | 15 января 2001 | Выполнено |
Добавить флаг к mtx_init() (MTX_RECURSE), который отмечает, можно ли использовать семафор рекурсивно. | Bosko Milekic | 19 января 2001 | Выполнено |
Сделать зонный распределитель работающим с потоками. | Dag-Erling Smorgrav | 21 января 2001 | Выполнено |
Преобразовать простые блокировки к семафорам. | Jason Evans | 24 января 2001 | Выполнено |
Сделать ядро вытесняющим в отношении прерываний. | Jake Burkholder | 31 января 2001 | Выполнено |
Вычистка API для семафоров. | Bosko Milekic | 8 февраля 2001 | Выполнено |
Удалить COM_LOCK. | Mark Murray | 11 февраля 2001 | Выполнено |
Объединить различные классы планирования в одну очередь выполнения. Модифицировать планировщик для поддержки вытесняющего ядра. | Jake Burkholder | 11 февраля 2001 | Выполнено |
Заставить распространение приоритетов работать корректно. | Jake Burkholder | 11 февраля 2001 | Выполнено |
Сделать код треда обработки прерываний машинно-независимым и совместно используемым между программными и аппаратными прерываниями. | John Baldwin | 18 февраля 2001 | Выполнено |
Добавить защиту к структуре jail и функциональности, связанной с jail. | Robert Watson | 20 февраля 2001 | Выполнено |
Реализация блокировок sx (совместные/эксклюзивные). | Jason Evans | 5 марта 2001 | Выполнено |
Обобществление/улучшение фиксации для обработки более сложных примитивов блокировки (mtx, sx). | John Baldwin | 28 марта 2001 | Выполнено |
Преобразование блокировок allproc и proctree от блокировок lockmgr к блокировкам sx. | John Baldwin | 28 марта 2001 | Выполнено |
В системе mbuf использовать условные переменные вместо msleep()/wakeup(). | Bosko Milekic | 2 апреля 2001 | Выполнено |
Удалить включаемые файлы <sys/mutex.h> из других включаемых файлов ядра, таких, как <vm/vm_zone.h>, <sys/resourcevar.h>, <sys/ucred.h> и <sys/mbuf.h>. | Mark Murray | 15 мая 2001 | Выполнено |
Зачистка различных файлов mp_machdep.c, унификация различных API для SMP, например, доставка IPI и так далее. | John Baldwin | 15 мая 2001 | Выполнено |
Сделать большинство функций forward_* и forwarded_* машинно независимыми. | John Baldwin | 15 мая 2001 | Выполнено |
Закончить машинно-зависимую часть поддержки SMP на платформе Alpha. | Andrew Gallatin, Doug Rabson, John Baldwin | 15 мая 2001 | Выполнено |
Преобразовать select() к использованию условных переменных. | Seigo Tanimura | 15 мая 2001 | Выполнено |
Добавить блокировку "giant" вокруг подсистемы VM. | Alfred Perlstein | 13 июня 2001 | Выполнено |
Создать изменённый slab-распределитель для подсистемы mbuf. | Bosko Milekic | 21 июня 2001 | Выполнено |
Добавить функцию witness_assert() для обработки добавлений блокировок. | John Baldwin | 27 июня 2001 | Выполнено |
Расширить блокировки sx для поддержки операций по попытке блокирования. | John Baldwin | 27 июня 2001 | Выполнено |
Задокументировать KTR. | John Baldwin | 28 июня 2001 | Выполнено |
Сделать fork_return, fork_exit, ast и userret машинно-независимыми. | John Baldwin | 29 июня 2001 | Выполнено |
Сделать свойство savecrit из sched_lock процесса сохраняемым и восстанавливаемым в mi_switch и инициализируемым в fork_exit. | John Baldwin | 30 июня 2001 | Выполнено |
Создать цикл ast(). | John Baldwin | 10 августа 2001 | Выполнено |
Добавить операции upgrade/downgrade блокировки sx. | Alexander Kabaev, Jason Evans | 13 августа 2001 | Выполнено |
Реализовать семафоры. | Jason Evans | 14 августа 2001 | Выполнено |
Добавить поддержку upgrade/downgrade в witness. | John Baldwin | 23 августа 2001 | Выполнено |
Сделать основной объём cpu_wait() и cpu_exit() машинно-независимым. | Peter Wemm | 9 сентября 2001 | Выполнено |
Разделить NFS на клиентскую и серверную части. | Peter Wemm | 18 октября 2001 | Выполнено |
Отделить taskqueues. | Andrew Reiter, John Baldwin | 25 октября 2001 | Выполнено |
Добавить ссылку на ucred в каждый тред. | John Baldwin | 25 октября 2001 | Выполнено |
Сделать большинство связанного с процессорами машинно-независимым. | John Baldwin | 11 декабря 2001 | Выполнено |
Сделать в критическом разделе сохраняемым состояние для каждого треда, вместо для каждой блокировки, чтобы межблокировочный цикл блокировки работал корректно. | John Baldwin | 17 декабря 2001 | Выполнено |
Заменить специфичный для APIC imen_mtx на машинно-независимый icu_lock для защиты контроллеров прерываний и связанных данных в ядре для i386 и alpha. | John Baldwin | 20 декабря 2001 | Выполнено |
Использовать в критическом разделе для каждого треда вложенный уровень в мьютексе и код треда прерывания для автоматического определения, когда не нужно вытеснять задачу. Это делает флаги MTX_NOSWITCH, SWI_SWITCH и SWI_NOSWITCH ненужными, так как ядро сможет само определить своё правильное поведение. | John Baldwin | 5 января 2002 | Выполнено |
Отделить структуры filedesc и file. | Seigo Tanimura, Alfred Perlstein | 12 января 2002 | Выполнено |
Блокировка структур pgrp, session и sigio. | Seigo Tanimura | 23 февраля 2002 | Выполнено |
Блокировка реализации конвейера, но не sigio/fown и взаимодействия с VM | Alfred Perlstein | 27 февраля 2002 | Выполнено |
Перейти к явному подсчёту ссылок на программные vnode. | Poul-Henning Kamp | 8 марта 2002 | Выполнено |
Инициализация пула мьютексов заранее, чтобы блокировки sx можно было использовать для VM. | Brian Feldman | 14 марта 2002 | Выполнено |
Поместить глобальную блокировку (sellock) вокруг структур selinfo, чтобы исправить различные обратные последовательности блокировок, и сделать select() работающим с MP. | Alfred Perlstein, Chad David | 14 марта 2002 | Выполнено |
Избавиться от Giant в системных вызовах read, write, pread, pwrite, выделяя Giant на уровне файловых операций на каждую подсистему для сокетов, VFS и так далее. | Alfred Perlstein | 15 марта 2002 | Выполнено |
Отделить структуры модулей ядра. | Andrew Reiter | 18 марта 2002 | Выполнено |
Отделить глобальные данные компоновщика ядра. | Andrew Reiter | 18 марта 2002 | Выполнено |
Переписать распределитель памяти ядра, чтобы он стал slab-распределителем, использующим кэши каждого процессора. | Jeff Roberson | 21 марта 2002 | Выполнено |
Заменить неправильное использование машинно-зависимый критический раздел API на отключение прерываний при помощи специального API по их выключению. | Warner Losh, Doug Rabson, Benno Rice, John Baldwin | 21 марта 2002 | Выполнено |
Отделить доступ к совместно используемой структуре "параметров процесса" через соответствующую защиту этой структуры и ссылок на неё. | Jonathan Mini | 31 марта 2002 | Выполнено |
Перейти от блокировок flags/tsleep на блокировки sx для защиты дерева sysctl от обновлений во время выполнения sysctl-операций. | Jonathan Mini | 1 апреля 2002 | Выполнено |
Создать/перенести пользовательский инструмент для управления дампами по KTR-событиям. | Jake Burkholder | 1 апреля 2002 | Выполнено |
Создать макросы MTX_SYSINIT и SX_SYSINIT, которые разрешены для инициализации блокировок, независящих от подсистемы. | Andrew Reiter | 2 апреля 2002 | Выполнено |
Отделить глобальную переменную уровня безопасности. | Andrew Reiter | 2 апреля 2002 | Выполнено |
Сделать grow_stack() машинно-независимой. Возможно, даже макросом или встраиваемой функцией. | Alan L. Cox | 6 апреля 2002 | Выполнено |
Блокировка использования p_fd, что в противном случае приводит к разрушению p_fd и аварийному завершению при большой нагрузке. Начать с глобальной и перейти к блокировке на уровне процесса. | Alfred Perlstein, Seigo Tanimura | 8 апреля 2002 | Выполнено |
Блокировка структуры pargs. | Jonathan Mini | 9 апреля 2002 | Выполнено |
Сделать {o,}sigreturn() MPSAFE. | Alan L. Cox | 11 апреля 2002 | Выполнено |
Переписать распределитель памяти ядра, чтобы Giant не требовался для операций malloc() или free(). | Jeff Roberson | 2 мая 2002 | Выполнено |
Заменить комплексную схему блокировки shared/exclusive в VM-системе на полностью эксклюзивную схему lockmgr, упрощая блокировку и удаление потенциальные случаи livelock/deadlock. | Brian Feldman, Alan L. Cox | 3 мая 2002 | Выполнено |
Отказаться от Giant в системных вызовах readv/writev в стиле read/write/pread/pwrite, как только malloc больше не потребуется Giant при обработке структур iovec для uio. | Alan L. Cox | 9 мая 2002 | Выполнено |
Отказаться от Giant в mprotect(), minherit() и madvise(), чтобы он больше не выделялся и не освобождался напрямую. | Alan L. Cox | 18 мая 2002 | Выполнено |
Обновить API для suser() и p_can*() API, чтобы принимать треды вместо процессов. | John Baldwin | 18 мая 2002 | Выполнено |
Широкий переход к td_ucred от p_ucred, как только появятся все зависимости от KSE. | John Baldwin | 18 мая 2002 | Выполнено |
Добавить проверку witness_sleep() к uma_zalloc() для отслеживания кода, вызывающего malloc() или uma_zalloc() при удержании неоткладываемых блокировок. | John Baldwin | 20 мая 2002 | Выполнено |
Оптимизировать поддержку UP, заменив циклы блокировки на одну, выполняющую только вход в критичный раздел и выходы. | John Baldwin | 21 мая 2002 | Выполнено |
Заставить спящие мьютексы повернуться, если текущий держатель блокировки выполняется на другом процессоре. | John Baldwin | 21 мая 2002 | Выполнено |
Добавить поддержку для pause-инструкции IA32 для передвижения циклов в блокировках. | John Baldwin | 21 мая 2002 | Выполнено |
Сделать KTRACE пишущим в трассировочные файлы асинхронно. | John Baldwin | 7 июня 2002 | Выполнено |
Избавиться от Giant в modnext(2), modfnext(2), modstat(2) и modfind(2). | Andrew Reiter | 25 июня 2002 | Выполнено |
Исправить синхронизацию очистки TLB и invlpg() на x86 SMP. | Peter Wemm | 12 июля 2002 | Выполнено |
Сделать cpu_coredump машинно-независимым. | Peter Wemm | 7 сентября 2002 | Выполнено |
Добавить блокировку подсистемы в коду сбора статистики. | Andrew Reiter | 11 сентября 2002 | Выполнено |
Исправить SIGXPU и другие вещи типа #if 0 в mi_switch(). | John Baldwin | 30 сентября 2002 | Выполнено |
Отделение реализации MAC из TrustedBSD. | Robert Watson | 11 ноября 2002 | Выполнено |
Блокировка обработчиков событий. | Mike Smith, Jonathan Mini, John Baldwin | 11 марта 2003 | Выполнено |
Исправить PHOLD(), чтобы она блокировалась для гарантированного PS_INMEM. | John Baldwin | 22 апреля 2003 | Выполнено |
Исправить различные procfs_machdep.c, которые не должны использовать sched_lock. | John Baldwin | 22 апреля 2003 | Выполнено |
Блокировка всех ссылок на полномочия процессов и удалить Giant из системных вызовов, связанных с полномочиями процессов. | John Baldwin | 1 мая 2003 | Выполнено |
Объединить структуры procsig и sigacts, перенести новую структуру sigacts из U-области о добавить соответствующую блокировку. | John Baldwin | 13 мая 2003 | Выполнено |
Удалить Giant из системных вызовов kill() и killpg(). | John Baldwin | 13 мая 2003 | Выполнено |
Улучшить реализацию пула мьютексов, разрешив создание и использование нескольких динамически распределяемых пулов с настраиваемыми размерами пулов и параметрами мьютексов. | Don Lewis | 16 июля 2003 | Выполнено |
Создать инструмент профилирования мьютексов для ядра, чтобы замерять использование и поведение мьютексов ядра. | Eivind Eklund, Dag-Erling Smorgrav | 31 марта 2002 | Выполнено |
Отделить реализацию конвейеров: оптимизации VM. | 4 октября 2003 | Выполнено | |
Повторно реализовать код прерываний i386 и SMP, чтобы SMP-ядра работали на UP-машинах и SMP можно было включить в GENERIC. | John Baldwin | 3 ноября 2003 | Выполнено |
Реализовать общие подходы для использования при блокировках без ожиданий. | John Baldwin | 11 ноября 2003 | Выполнено |
Разделение witness_lock() на witness_checkorder() и witness_lock(). witness_checkorder() должна вызываться до получения блокировки, чтобы увеличить вероятность обнаружения неправильного порядка следования блокировок и выдачи предупреждения об этом до возникновения ситуации взаимной блокировки. witness_lock() будет просто обновлять внутреннее состояние witness, отражающее факт получения блокировки. | John Baldwin | 24 января 2004 | Выполнено |
Блокировка ограничений ресурсов по каждому процессу. | Mike Makonnen, John Baldwin | 4 февраля 2004 | Выполнено |
Реализовать абстракцию очереди пауз для использования как в msleep(), так и условных переменных. Эта новая абстракция должна использовать хэш-таблицу очередей пауз с перемещаемой блокировкой в каждой цепочке очереди пауз, похожей на проходные цепочные блокировки, чтобы сделать sched_lock проще. | John Baldwin | 27 февраля 2004 | Выполнено |
Удаление Giant из jail(2). | Andrew Reiter, Robert Watson | 23 апреля 2004 | Выполнено |
Добавить блокировки для подсистем NFSv2, сервера NFSv3, позволяющие выполнять обращения к вышестоящему уровню и другим элементам, связанным с сетью, без Giant. | Robert Watson | 24 июля 2004 | Выполнено |
Реализовать ядро полностью с вытесняемой многозадачностью. | John Baldwin | 24 ноября 2004 | Выполнено |
Блокировка реализации конвейера: проблемы связаны с sigio/fown | Alfred Perlstein | 24 ноября 2004 | Выполнено |
Блокировка кода SysV IPC. | Alfred Perlstein | 24 ноября 2004 | Выполнено |
Блокировать инструмент замера конфликтов для замера влияния различных блокировок, в том числе Giant, и разрешить более управляемую оптимизацию стратегий производительности и блокировки. | Robert Watson | 24 ноября 2004 | Выполнено |
Блокировка структуры proc. | John Baldwin | 20 февраля 2001 | Выполняется |
Отделение подсистемы tty. | Dick Garner, Jeremy Scofield, Thomas Moestl, Poul-Henning Kamp | 24 июля 2004 | Выполняется |
Исправить блокировку часов, которая должна быть одинаковой на всех платформах. | John Baldwin | 16 ноября 2001 | Выполняется |
Использовать блокировку процесса и счётчики ссылок на процесс для защиты интерфейсов отладки (и procfs). | John Baldwin | 27 февраля 2002 | Выполняется |
Использовать блокировку процессов для защиты sysctl-вызовов мониторинга процесса, включая те, что используются 'ps' и сопутствующими инструментами. | John Baldwin | 27 февраля 2002 | Выполняется |
Отделить инфраструктуру newbus для поддержки точного управления драйверами. | Warner Losh | 28 февраля 2002 | Выполняется |
Удалить флаг совместимости системного вызова с MP из таблицы системных вызовов, и добавить исключительные mtx_lock/unlock для Giant ко всем системным вызовам. | Matt Dillon, Maxime Henrion, Robert Watson | 24 июля 2004 | Выполняется |
Документирование архитектуры SMPng. | John Baldwin, Robert Watson | 28 февраля 2002 | Выполняется |
Переход к совместной блокировке VOP_GETATTR() для уменьшения блокировки во время выполнения частых простых операций с VFS. Модификация namei() в целях предоставления флага LOOKUP_SHARED, который показывает, что требуемая блокировка может быть совместной, а не исключительной. | Jeff Roberson | 11 марта 2002 | Выполняется |
Отделение иерархии sysctl и методов доступа. | Jonathan Mini | 9 апреля 2002 | Выполняется |
Документирование существующей блокировки vm_map и проверка её корректности. | Alan L. Cox | 18 мая 2002 | Выполняется |
Документирование существующей блокировки vm_object и проверка её корректности. | Alan L. Cox | 4 мая 2002 | Выполняется |
Отделение структур linker_file_t в компоновщике ядра. | Andrew Reiter | 19 июня 2002 | Выполняется |
Пересмотр стратегии блокировки и корректности операций VFS, исправление различных режимов сбоев, связанных с включением добавлений VFS-вызовов. | Jeff Roberson | 10 декабря 2002 | Выполняется |
Документирование стратегии блокировки внутри vnode, её вычистка, удаление внутренних блокировок, переключение на sx-блокировки. | Jeff Roberson | 10 декабря 2002 | Выполняется |
Реализовать упрощённое переключение треда прерываний (обмен контекстами) на i386. | Bosko Milekic, Alexander Kabaev | 10 декабря 2002 | Выполняется |
Реализовать упрощённое переключение треда прерываний (обмен контекстами) на sparc64. | Jake Burkholder | 10 декабря 2002 | Выполняется |
Переход от использования lockmgr в VM к использованию мьютекса или исключительного sxlock. Избавиться от Giant во всех VM, кроме для компонентов vm_object/VFS и vm_page/pmap. | Alan L. Cox | 10 декабря 2002 | Выполняется |
Модификация API драйверов устройств, чтобы разрешить драйверам более просто делить код на "в контексте прерывания" и "в треде прерывания" для более быстрого подтверждения прерываний. Это уменьшит латентность обработки прерываний. | Peter Wemm | 4 октября 2003 | Выполняется |
Создать механизм в структуре cdevsw для защиты драйверов, не принимающих во внимание треды. | John Baldwin | 15 мая 2001 | Заброшено |
Сделать printf() безопасной для вызова практически в любом месте во избежание патовых блокировок. | Chuck Paterson | 15 мая 2001 | Заброшено |
Удалить параметр приоритетности из tsleep(), msleep() и cv_*wait*(). | 12 января 2001 | Не начиналось | |
Повторно реализовать kqueue при помощи условных переменных. | 15 марта 2001 | Не начиналось | |
Сделать атомарные операции в SMP-коде условными, что используется для статистики в целях отладки. | Peter Wemm | 15 марта 2001 | Не начиналось |
Добавить новую регулярную проверку для существующих процессов на предмет отсутствия блокировок. | John Baldwin | 13 июня 2001 | Не начиналось |
Задание приоритетов для условных переменных, семафоров и sx-блокировок. | 7 сентября 2001 | Не начиналось | |
Убрать максимум schedcpu(), предпочтя обновления по событиям. | 7 сентября 2001 | Не начиналось | |
Исправить *hold (например, crhold) на возврат ссылки на объект. | 7 сентября 2001 | Не начиналось | |
Добавить регулярную проверку на блокировки lockmgr. | 7 сентября 2001 | Не начиналось | |
Добавить сдвигаемые блокировки ICU на ia64. | 4 января 2002 | Не начиналось | |
Быстрое избавление от Giant для VOP_READ() и VOP_WRITE(). | 25 февраля 2002 | Не начиналось | |
Перенос забора Giant в системные вызовы Linux i386 ABI. | 25 февраля 2002 | Не начиналось | |
Перенос захвата Giant в системные вызовы Linux AXP ABI. | 25 февраля 2002 | Не начиналось | |
Перенос захвата Giant в системные вызовы SVR4 i386 ABI. | 25 февраля 2002 | Не начиналось | |
Перенос захвата Giant в системные вызовы OSF/1 AXP ABI. | 25 февраля 2002 | Не начиналось | |
Перенос захвата Giant в системные вызовы IBCS i386 ABI. | 25 февраля 2002 | Не начиналось | |
Расширение инструмента профилирования мьютексов на профилирование также и sx-блокировок. | Eivind Eklund, Dag-Erling Smorgrav | 1 апреля 2002 | Не начиналось |
Реализовать atomic_fetchadd() для данных int и long с версиями acq и rel. | 23 мая 2002 | Не начиналось | |
Реализовать простой API счётчика ссылок, использующий атомарные операции, для замены блокировок, которые всего лишь защищают счётчики ссылок. | 23 мая 2002 | Не начиналось | |
Добавить проверку witness_sleep() для copyin/out() и s/fuword(). | John Baldwin | 7 июня 2002 | Не начиналось |
В этой таблице перечислены подзадачи, которые нужно выполнить для того, чтобы сделать стек сетевых протоколов многопоточным.
Задача | Ответственный | Последнее обновление | Состояние |
---|---|---|---|
Защитить очереди сетевых интерфейсов. | Jonathan Lemon | 24 ноября 2000 | Выполнено |
Отделение IP. | Jennifer Yang, Jeffrey Hsu | 10 июня 2002 | Выполнено |
Отделение TCP. | Jennifer Yang, Jeffrey Hsu, Sam Leffler, Robert Watson | 24 ноября 2004 | Выполнено |
Отделение UDP. | Jennifer Yang, Jeffrey Hsu, Robert Watson | 24 ноября 2004 | Выполнено |
Отделение счётчиков ссылок ifaddr. | Jeffrey Hsu | 18 декабря 2002 | Выполнено |
Отделение списка ifnet. | Jeffrey Hsu | 21 декабря 2002 | Выполнено |
Отделение деревьев radix. | Jeffrey Hsu | 23 декабря 2002 | Выполнено |
Отделение ARP. | Jeffrey Hsu | 16 января 2003 | Выполнено |
Блокировка raw IP. | Sam Leffler, Robert Watson | 24 июля 2004 | Выполнено |
Отделение сокетов divert. | Sam Leffler | 4 октября 2003 | Выполнено |
Отделение ipfw2. | Sam Leffler | 4 октября 2003 | Выполнено |
Отделение DUMMYNET. | Sam Leffler | 4 октября 2003 | Выполнено |
Отделение моста ethernet. | Sam Leffler | 4 October 2003 | Выполнено |
Отделение очередей фрагментирования IP. | Robert Watson | 4 октября 2003 | Выполнено |
Отделение таблиц маршрутизации. | Sam Leffler | 4 октября 2003 | Выполнено |
Отделение FAST_IPSEC. | Sam Leffler | 4 октября 2003 | Выполнено |
Разрешить параллельные записи в обработке isr. | Robert Watson, Sam Leffler | 11 октября 2003 | Выполнено |
Блокировка "интерфейса сброса" if_disc. | Robert Watson | 9 марта 2004 | Выполнено |
Блокировка "интерфейса передачи IPv6-to-IPv4 TCP" if_faith. | Sam Leffler, Robert Watson | 9 марта 2004 | Выполнено |
Блокировка "общего интерфейса туннелирования" if_gif. | Robert Watson | 9 марта 2004 | Выполнено |
Пересмотр поддержки туннеля ECN (ip_ecn.c). | Robert Watson | 9 марта 2004 | Выполнено |
Блокировка if_tap глобально и на уровне softc. | Robert Watson | 23 апреля 2004 | Выполнено |
Блокировка if_tun глобально и на уровне softc. | Robert Watson | 23 апреля 2004 | Выполнено |
Блокировка netatalk/aarp.c. | Robert Watson | 23 апреля 2004 | Выполнено |
Кэширование MAC-метки сокета в метке inpcb сокетов IPv4, чтобы эта метка могла безопасно использоваться на уровне inet без блокировок самого сокета. | Robert Watson | 23 апреля 2004 | Выполнено |
Подпрограммы инкапсуляции IP (ip_encap.c). | Robert Watson | 23 апреля 2004 | Выполнено |
Блокировка globals в loopback-интерфейсе (if_loop.c). | Robert Watson | 23 апреля 2004 | Выполнено |
Использование m_tags в if_gif для ограничения замкнутых конфигураций, вместо статического счётчика, не совместимого с MPSAFE. | Ruslan Ermilov | 23 апреля 2004 | Выполнено |
Блокировка netatalk DDP PCB. | Robert Watson | 23 апреля 2004 | Выполняется |
Разрешить выполнение маршрута передачи IP без Giant. | Sam Leffler | 1 декабря 2003 | Выполнено |
Блокировка протоколов домена UNIX® и fifofs. | Sam Leffler, Robert Watson | 24 июля 2004 | Выполнено |
Giant-блокировка NFS-сервера для исключения so_upcall() без Giant | Robert Watson | 24 июля 2004 | Выполнено |
Блокировка мета-данных клонирования интерфейсов. | Brooks Davis | 24 июля 2004 | Выполнено |
Применение комбинации блокировок сокета и его буфера, кэширования меток для меток MAC в сокетах, так чтобы их можно было безболезненно использовать без Giant. | Robert Watson | 24 июля 2004 | Выполнено |
При диспетчеризации сообщений сокета маршрутизации использовать netisr для избежания повторного входа в код сокета из кода маршрутизации, решив вопросы последовательности блокировок. | Robert Watson | 24 июля 2004 | Выполнено |
Введение блокировки accept для защиты от подтверждения неполных и полных очередей на сокетах, ждущих соединения. | Robert Watson | 24 июля 2004 | Выполнено |
Разбиение операций wakeup, append с буфером сокета, изменения состояния сокета, резервирования буфера сокета, его очистки и так далее на _locked() и неблокированные версии, устранить условную блокировку. | Robert Watson | 24 июля 2004 | Выполнено |
Блокировка AARP, AppleTalk Address Resoluton Protocol. | Robert Watson | 24 июля 2004 | Выполнено |
Исправление проблем с синхронизацией данных кэша pull/push в sosend(), soreceive(), позволив им работать без Giant. | Robert Watson | 24 июля 2004 | Выполнено |
Защитить глобальные счетчики/лимиты сокета и номера генерации мьютексом. | Robert Watson | 24 июля 2004 | Выполнено |
Блокировка выделения отдельных мета-данных в модулях netgraph, связанных с интерфейсом. | Robert Watson | 24 июля 2004 | Выполнено |
Блокировка полей OOB буфера сокета в TCP/IP и IPX. | Robert Watson | 24 июля 2004 | Выполнено |
Добавить MSG_NBIO, чтобы fifofs могла избежать манипуляций с SO_NBIO, связанных с риском. | Don Lewis | 24 июля 2004 | Выполнено |
Защитить все использования so_count блокировкой сокета. | Robert Watson | 24 июля 2004 | Выполнено |
Перенести состояние, связанное с буфером сокета, из so_state в sb_state, чтобы оно могло быть блокировано мьютексом буфера сокета. | Robert Watson | 24 июля 2004 | Выполнено |
Ввести временную глобальную блокировку для блокирования поля if_label, используемого в технологии MAC. | Robert Watson | 24 июля 2004 | Выполнено |
Выделить поведение, специфичное для VFS, из fdrop_locked(), и получать Giant в пообъектных методах fo_close, а не в fdrop_locked(), чтобы конвейеры и сокеты могли работать с fo_close() без Giant. | Robert Watson | 24 июля 2004 | Выполнено |
Перенос захвата Giant в операцию статистики дескриптора файла fo_stat(), а не забирать его в fstat(), чтобы вызовы fstat() с сокетами и конвейерами работали без Giant. | Robert Watson | 24 июля 2004 | Выполнено |
Не удерживать блокировки сокета в течение входа в методы переключения протокола, позволяя методам протокола вызывать блокировки сокета после блокировок протоколов в порядке блокировки. | Robert Watson | 24 июля 2004 | Выполнено |
Портирование блокировки inpcb мьютексом и его установок из IPv4 в IPv6 | Robert Watson | 8 августа 2004 | Выполнено |
Добавление IFF_NEEDSGIANT, чтобы позволить if_start использовать Giant при работе с определёнными интерфейсами. Отложить if_start в очередь задач. | Robert Watson | 8 августа 2004 | Выполнено |
Отказаться от Giant в функциях stat(), fo_stat() для обеспечения работы stat для конвейеров и сокетов без Giant. | Robert Watson | 8 августа 2004 | Выполнено |
Добавить захваты блокировок TCP. | Robert Watson | 24 ноября 2004 | Выполнено |
Блокировка уровня сокетов. | Sam Leffler, Robert Watson | 24 ноября 2004 | Выполнено |
Пересмотр кода таймера TCP. | Robert Watson | 24 ноября 2004 | Выполнено |
Анализ и снижение накладных расходов на сбор случайной информации в критических сетевых вызовах. | Robert Watson, Mark Murray | 24 ноября 2004 | Выполнено |
Позволить коду декларировать NET_NEEDS_GIANT(), принудительно устанавливающий Giant в сетевом стеке, если этот код вкомпилирован в ядро. | Robert Watson | 28 августа 2004 | Выполнено |
Отключить Giant в сетевом стеке в конфигурации по умолчанию. | Robert Watson | 28 августа 2004 | Выполнено |
Переход к использованию счётчика ссылок на дескриптор файла вместо счётчика ссылок на сокет для системных вызовов для работы с сокетами, во избежание излишних операций со счётчиком ссылок. | Robert Watson | 24 октября 2004 | Выполнено |
Блокировка syncache. | Jeffrey Hsu, Sam Leffler | 10 ноября 2003 | Выполняется |
Блокировка IPv6. | Sam Leffler, Robert Watson, Hajimu UMEMOTO, Max Laier | 8 августа 2004 | Выполняется |
Глобальная блокировка if_ppp для каждого softc | Robert Watson, Maurycy Pawlowski-Wieronski <maurycy@fouk.org> | 23 апреля 2004 | Выполняется |
Блокировка структуры ifnet. | Max Laier, Luigi Rizzo, Maurycy Pawlowski-Wieronski <maurycy@fouk.org> | 23 апреля 2004 | Выполняется |
Блокировка списка адресов IPv4, IPv6 и atalk сетевых интерфейсов. | Max Laier, Robert Watson | 8 августа 2004 | Выполняется |
Блокировка пользователей кода сжатия BSD compress (bsd_comp.c) для защиты состояния процесса сжатия. | Robert Watson | 23 апреля 2004 | Выполняется |
Блокировка глобальных состояний и состояний softc для преобразователя 6-в-4 (if_stf.c). | Robert Watson | 23 апреля 2004 | Выполняется |
Разблокировка состояния global и softc для SLIP (if_sl.c). | Robert Watson | 23 апреля 2004 | Выполняется |
Блокировка состояний global и softc для SPPP (if_sppsubr.c). | Roman Kurakin, Robert Watson | 23 апреля 2004 | Выполняется |
Блокировка IGMP. | Robert Watson | 23 апреля 2004 | Выполняется |
Дополнительная трассировка KTR для UMA, вызовов, прерываний и событий сети. | Robert Watson | 8 августа 2004 | Выполняется |
Уменьшение действий перед блокировкой буфера сокета за счёт замены функций tsleep() и wakeup() на условную переменную. | Seigo Tanimura | 21 апреля 2002 | Не начиналось |
Блокировка драйвера "кадров ethernet" if_ef. | 9 марта 2004 | Не начиналось | |
Блокировка IP ID. | Robert Watson | 23 апреля 2004 | Не начиналось |
Проблема | Последнее обновление | Состояние |
---|---|---|
Время холостой работы процессора не передаётся процессам холостой работы. | 20 сентября 2000 | Решено |
microuptime нарушает обратную совместимость. | 4 октября 2000 | Решено |
microuptime() требует обратной совместимости | 4 October 2000 | Решено |
Учёт процессов неточен (чем больше процессоров, тем ближе точность). | 5 октября 2000 | Решено |
M_DEVBUF, вероятно, неправильный пул памяти для прерываний, и мы должны подумать о создании нового пула выделения памяти для этого. | 9 февраля 2001 | Решено |
Отключение ПК-адаптера вызывает аварийное завершение из-за условных ошибок в коде треда обработки прерываний. | 15 марта 2001 | Решено |
Машины SMP x86 видят прерывания NCPU * 100 clk и прерывания NCPU * 128 rtc. | 15 мая 2001 | Решено |
Проверка будет бесконечно рекурсивной при получении Giant после паузы с блокировкой с возможностью установки паузы. | 27 июня 2001 | Решено |
Последовательный gdb не работает, если заданы параметры boot_ddb и boot_gdb. | 14 июля 2002 | Решено |
Последовательный gdb не работает на скорости 115200. | 14 июля 2002 | Решено |
Последовательный gdb никогда не получает управление обратно, если был введён 'cont'. | 14 июля 2002 | Решено |
Профилирование не работает. | 20 февраля 2001 | Не решено |
Оставшаяся часть страницы структурирована в виде журнала с обратной хронологией записи.
28 августа 2004Greg Lehey послал на сингапурскую конференцию Asian Enterprise Open Source Conference свою работу FreeBSD SMPng. В докладе представлен исторический обзор разработки SMPng, начиная с 2001 года, хотя опущено обсуждение последних достижений проекта SMPng, таких, как постоянное улучшение производительности в результате значительного отказа от блокировок в подсистемах хранения, VM и основных подсистем IPC.
Состояние работ было опубликовано в списке рассылки -smp.
Greg Lehey опубликовал свой доклад для USENIX, который будет представлен в Бостоне в конце июня.
В списке рассылки -smp было опубликовано состояние работ.
В списке рассылки -smp было опубликовано состояние работ.
В списке рассылки -smp было опубликовано состояние работ.
В списке рассылки -smp было опубликовано состояние работ.
John Baldwin и Chuck Paterson выступили с предварительным перечнем правил, которым нужно следовать при работе над синхронизацией в ядре.
Выполнен коммит SMP-кода. Вся дальнейшая работа будет выполняться в cvs, а не при помощи патчей.
Доступен для загрузки обновлённый патч. Он, вероятнее всего, содержит то, что будет перенесено в дерево исходных текстов.
Доступен для загрузки обновлённый патч. Этот патч делает rtc быстрым прерыванием, использует инструкции блокировки для мьютексов в MP-ядрах и корректирует связку с mtx_*() внутри модулей.
Большей частью ведётся работа над кодом для i386 (UP и MP). Для alpha всё ещё необходимо дополнительное кодирование, которые теперь сделано.
Для i386 и alpha доступны обновлённые патчи, которые находятся здесь.
Здесь находятся обновлённые патчи для i386. Учёт процессов всё ещё работает неправильно, однако сделано множество других улучшений.
Патчи с функционирующими тяжёлыми тредами для платформы i386 доступны здесь. Имеется несколько небольших проблем с этим набором патчей. А именно неправильная работа учёта процессов.
Sheldon Hearn подготовил справочную страницу по mutex(9) на основе BSD/OS, которая доступна здесь.
Jake Burkholder поместил обновлённый патч здесь.
У Jake Burkholder имеется рабочий код блокировки BSD/OS, и он объединён с соответствующими частями патчей Matt Dillon (простаивающие процессы, некоторые изменения в блокировках планировщика и так далее). Его набор патчей доступен здесь.
Chuck Paterson предоставил PostScript-версии своих слайдов презентации для первого и второго дня обсуждения SMP.
Вот копия итогов обсуждения SMP, которая была опубликована в списке рассылки -smp.
Вот копия анонса проекта SMP, который был опубликован в списке рассылки -current.