Google เป„เบ”เป‰เป€เบฅเบตเปˆเบกเป€เบ›เบตเบ”เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบฎเบนเบšเปเบšเบšเบเบฒเบ™เป„เบซเบผ M:N

เบเบนเป‚เบ เปเบ™เบฐเบ™เปเบฒ เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบงเบกเบขเบนเปˆเปƒเบ™ Linux kernel เบŠเบธเบ”เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡ patches เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡ M: N threading model. เบ‚เปเป‰เบฅเบดเป€เบฅเบตเปˆเบกเบ‚เบญเบ‡ Google เปเบกเปˆเบ™เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ” API เบ—เบตเปˆเบžเบฑเบ”เบ—เบฐเบ™เบฒเบขเบนเปˆเบซเบฅเบฑเบ‡เบ›เบฐเบ•เบนเบ›เบดเบ” เบชเบฐเบซเบผเบฑเบšเป„เบ› เบชเปเบฒเบฅเบฑเบš Linux kernel, เป€เบŠเบดเปˆเบ‡เบชเบฐเบซเบ™เบญเบ‡เบฅเบฐเบšเบปเบšเบเปˆเบญเบเบซเบผเบฒเบเบเบฐเบ—เบนเป‰เบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเปƒเบŠเป‰เบฎเบนเบšเปเบšเบš M: N threading. เบฅเบฐเบšเบปเบšเบเปˆเบญเบเบ–เบทเบเปƒเบŠเป‰เป‚เบ”เบ Google เป€เบžเบทเปˆเบญเปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒเปœเป‰เบญเบเบ—เบตเปˆเบชเบธเบ”. เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเปเบฅเบฐเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบฒเบ™เปเบˆเบเบขเบฒเบเบเบฐเบ—เบนเป‰เปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰, เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบซเบผเบธเบ”เบฅเบปเบ‡เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบเบ‚เบญเบ‡เบชเบฐเบซเบผเบฑเบšเบชเบฐเบžเบฒเบšเบเบฒเบ™เป‚เบ”เบเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบš.

เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบเปˆเบญเบเบ™เบตเป‰, SwitchTo API เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบš Linux kernel, เบชเบฐเป€เบซเบ™เบตเบชเบฒเบกเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™ - เบฅเปเบ–เป‰เบฒ, เบชเบทเบšเบ•เปเปˆเปเบฅเบฐ swap (เบชเบฐเบซเบผเบฑเบš). เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบงเบกเบขเบนเปˆเปƒเบ™ kernel, เบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ FUTEX_SWAP เปƒเบซเบกเปˆเปเบกเปˆเบ™เบชเบฐเป€เบซเบ™เบต, เป€เบชเบตเบก. FUTEX_WAIT เปเบฅเบฐ FUTEX_WAKE, เปเบฅเบฐเบชเบฐเบซเบ™เบญเบ‡เบเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบซเบผเบฒเบเบเบฐเบ—เบนเป‰. FUTEX_SWAP เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบฅเบฐเบซเบงเปˆเบฒเบ‡เบซเบ™เป‰เบฒเบงเบฝเบ, เบ„เป‰เบฒเบเบ„เบทเบเบฑเบš RPC. เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™, เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™, เป€เบžเบทเปˆเบญเป‚เบญเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบฅเบฐเบซเบงเปˆเบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™, เบ•เป‰เบญเบ‡เบกเบตเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบชเบตเปˆเบเบฒเบ™เป‚เบ—เป„เบ›เบซเบฒ FUTEX_WAIT เปเบฅเบฐ FUTEX_WAKE, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ FUTEX_SWAP เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบซเบ™เบถเปˆเบ‡เบชเปเบฒเป€เบฅเบฑเบ”เป„เบงเบ‚เบถเป‰เบ™ 5-10 เป€เบ—เบปเปˆเบฒ.

Google เป„เบ”เป‰เป€เบฅเบตเปˆเบกเป€เบ›เบตเบ”เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบฎเบนเบšเปเบšเบšเบเบฒเบ™เป„เบซเบผ M:N

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เบฎเบนเบšเปเบšเบšเบเบฒเบ™เป„เบซเบผ 1: 1 เปเบฅเบฐ N: 1 เบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เบฎเบนเบšเปเบšเบš 1: 1 เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™ NPTL (เบเบฐเบ—เบนเป‰ POSIX) เปเบฅเบฐ LinuxThreads, เปเบฅเบฐเบซเบกเบฒเบเป€เบ–เบดเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆเป‚เบ”เบเบเบปเบ‡เบ‚เบญเบ‡เบเบฐเบ—เบนเป‰เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบเบฑเบšเบซเบปเบงเบ‚เปเป‰ (เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”) เปƒเบ™เบฅเบฐเบ”เบฑเบš kernel. เบฎเบนเบšเปเบšเบš N:1 เบ–เบทเบเบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™ GNU Pth, เป€เบญเบปเบฒเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒ thread เบเบฑเบš user-space เปเบฅเบฐเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰ N user-space threads เบœเบนเบเบกเบฑเบ”เบเบฑเบš thread เบ”เบฝเบงเปƒเบ™ kernel, เป‚เบ”เบเบ—เบตเปˆ kernel เบฎเบนเป‰เบเปˆเบฝเบงเบเบฑเบš user-threads.

เบ‚เปเป‰เป€เบชเบเบซเบผเบฑเบเบ‚เบญเบ‡เปเบšเบšเบˆเปเบฒเบฅเบญเบ‡ 1:1 เปเบกเปˆเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เบšเปเบฅเบดเบšเบปเบ”เบญเบฑเบ™เปƒเบซเบเปˆเบซเบผเบงเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡ kernel เปเบฅเบฐเบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰. เบฎเบนเบšเปเบšเบš N:1 เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰, เปเบ•เปˆเบชเป‰เบฒเบ‡เปƒเบซเบกเปˆ - เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ thread เปƒเบ™ kernel เป€เบ›เบฑเบ™เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เปเบเบเป„เบ”เป‰, threads เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบ–เบทเบเบœเบนเบเบกเบฑเบ”เบเบฑเบš thread เบ”เบฝเบงเปƒเบ™ kernel เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เป‰เบฒเบก CPU cores เปเบฅเบฐเบ–เบทเบเบœเบนเบเบกเบฑเบ”เบเบฑเบš. เบซเบผเบฑเบ CPU เบ”เบฝเบง.

เบฎเบนเบšเปเบšเบš M:N เป€เบ›เบฑเบ™เปเบšเบšเบ›เบฐเบชเบปเบก เปเบฅเบฐเปเบเป‰เป„เบ‚เบ‚เปเป‰เป€เบชเบเบ—เบฑเบ‡เปเบปเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เป‚เบ”เบเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆ N userspace threads เบเบฑเบš M kernel threads, เบ—เบฑเบ‡เบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบชเบฐเบซเบผเบฑเบšเบชเบฐเบžเบฒเบšเบเบฒเบ™ overhead เปเบฅเบฐ scaling เบ—เบปเปˆเบง CPU cores. เบฅเบฒเบ„เบฒเบ‚เบญเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เบญเบฑเบ™เปƒเบซเบเปˆเบซเบผเบงเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบเบฐเบ—เบนเป‰เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เปเบฅเบฐเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เบเบปเบ™เป„เบเบเบฒเบ™เบ›เบฐเบชเบฒเบ™เบ‡เบฒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฑเบšเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเปเบเปˆเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: opennet.ru

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™