Вопрос

Я собираюсь написать многопоточную систему обмена сообщениями с общей памятью для сверхвысокообъемной доставки сообщений между процессами.Сообщения будут исходить из рабочих потоков веб-сервера.Я бы хотел использовать локальность кэша процессора, которую совместно используют ядра одного и того же процессора.Так что, когда я пробуждаю рабочий поток на принимающей стороне этой IPC-системы, я пробуждаю поток на том же процессоре.

Мне нужны для Linux (предпочтительно POSIX в genaral) и Windows вызовы API и битовая маска, которые мне нужно выполнить, чтобы извлечь информацию, которая позволит мне классифицировать идентификатор выполняющегося потока - из контекста указанного потока - используя следующую структуру:

struct thread_core_id
{
    uint16_t cpu_Id;
    uint16_t core_Id;
};

Функции для обеих платформ будут высоко оценены.Я надеюсь, что это можно сделать без системных вызовов, то есть переключения контекста.

-- редактировать --

В данный момент я фокусируюсь на x86, но были бы полезны и другие архитектуры.

Это было полезно?

Решение

В частности, для Linux вы должны быть в состоянии получить необходимую информацию из /proc/cpuinfo и /sys/devices/system/cpu/cpu*/cache и используйте это с sched_{s|g}etaffinity() звонки.Взгляните на Что каждый программист должен знать о памяти, если вы еще этого не сделали, обратитесь к разделу 5.3.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top