Виділення пам’яті, пов’язаної з певним процесором

У сучасних операційних системах широко використовуються дані, повязані з певними процесорами (per-CPU data) Це дані, які є унікальними для кожного процесора Дані, повязані з процесорами, зберігаються в масиві Кожен елемент масиву відповідає своєму процесору системи Номер процесора є індексом в цьому масиві Таким чином була реалізована робота з даними, повязаними з певним процесором, в ядрах серії 24 У такому підході немає нічого поганого, тому значна частина коду ядра в серії 26 все ще використовує цей інтерфейс Дані оголошуються наступним чином,

unsigned long my_percpu[NR_CPUS]

Доступ до цих даних виконується, як показано нижче

int cpu

cpu = get_cpu () / * Отримати номер поточного процесора і заборонити витіснення в режимі ядра * /

my_percpu[cpu]++

printk (значення даних процесора cpu =% d дорівнює% ld \ n, cpu, my_percpu [cpu])

put_cpu () / * Дозволити витіснення в режимі ядра * /

Зверніть увагу, що не потрібно використовувати жодних блокувань, тому що дані унікальні для кожного процесора Оскільки ніякої процесор, крім поточного, не може звернутися до відповідного елементу даних, то не може виникнути і жодних проблем з конкурентним доступом, а отже, поточний процесор може безпечно звертатися до даних без блокувань

Можливість витіснення процесів в режимі ядра-єдине, через що можуть виникнути проблеми У преемптівном ядрі можуть виникнути такі дві проблеми

• Якщо виконується код витісняється і пізніше планується для виконання на іншому процесорі, то значення змінної cpu більше не буде дійсним, тому що ця змінна буде містити номер іншого процес-

pa (З тієї ж причини, після отримання номера поточного процесора, не можна переходити в стан очікування)

• Якщо деякий інший код витіснить поточний, то він може паралельно звернутися до змінної my_percpu на тому ж процесорі, що відповідає стану гонок за ресурс

Проте всі побоювання марні, тому що виклик функції getcp u (), яка повертає номер поточного процесора, також забороняє витіснення в режимі ядра Відповідний виклик функції put_cpu () дозволяє витіснення коду в режимі ядра Зверніть увагу, що функція smp_processor_icl (), яка також дозволяє отримати номер поточного процесора, не забороняє витіснення коду в режимі ядра, тому для безпечної роботи слід використовувати вказаний вище метод

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*