Компания Google за включване в състава на ядрото на Linux първият набор от пачове с реализация на компоненти, необходими за осигуряване на работа на модела на потоките M:N. Инициативата на Google е свързана с откритие на API, който се развиваше зад затворени врати за ядрото на Linux, осигуряващо работа на реализираната в пространството на потребителя многопоточна подсистема, използваща модела на потоките M:N. Подсистемата се използва от Google за осигуряване на услуги, изискващи минимални закъснения. Планирането и управлението на разпределението на потоките се извършва изцяло в пространството на потребителя, което позволява значително намаляване на броя на операциите за превключване на контекста чрез минимизиране на системните повиквания.
За осигуряване на работата на посочената подсистема на ниво ядро Linux е реализиран API SwitchTo, предлагащ три основни операции — wait, resume и swap (превключване). За вграждане в ядрото е предложен код на нова операция FUTEX_SWAP, който допълва , и предоставяща основа за създаване на многопоточни библиотеки в пространството на потребителя. FUTEX_SWAP може да се използва и за предаване на съобщения между задачи, по аналогия с RPC. Например, в момента за предаване на съобщение между задачи е необходимо да се извършат най-малко четири повиквания на FUTEX_WAIT и FUTEX_WAKE, използването на FUTEX_SWAP ще позволи да се справим с една операция, която ще бъде извършена 5-10 пъти по-бързо.
В момента на практика се използват основно моделите на потоките 1:1 и N:1. Модел 1:1 се използва в (POSIX потоци) и , и предполага директно съответствие между поток в пространството на потребителя и поток (единица за планиране на изпълнението) на ниво ядрото. Моделът N:1 е реализиран в , при който диспетчеризацията на потоките е изведена в пространството на потребителя и позволява N потока в пространството на потребителя да бъдат свързани с един поток в ядрото, като самото ядро няма информация за потребителските потоци.
Основният недостатък на модел 1:1 са високите разходи за превключване на контекста между ядрото и потребителското пространство. Моделът N:1 решава този проблем, но създава нов — тъй като потокът в ядрото е неделима единица за планиране на изпълнението, то потребителските потоци, свързани с един поток в ядрото на операционната система, не могат да се мащабират по ядра на CPU и остават привързани към едно ядро на CPU.
Моделът M:N е хибриден и елиминира всички описани по-горе недостатъци, като съпоставя N потока в потребителското пространство с M потока в ядрото на ОС, което позволява както да се намалят разходите за смяна на контекста, така и да се осигури мащабиране по ядра на CPU. Цената на този вариант е значителното усложнение на реализацията на планировчика на потоци в потребителското пространство и необходимостта от механизми за координация на действията с планировчика на ядрото.

Източник: opennet.ru
