производителност на споделена памет и защита от други процеси

Опитвам се да внедря JIT компилатор (имам много маниакални хобита).

Бих искал да имам един основен процес, който пази някои постоянни променливи, и втори процес (който е компилиран точно навреме), който прави някои изчисления и може да осъществява достъп и да пише върху постоянните променливи.

Вторият процес може да се променя и прекомпилира, но постоянните променливи трябва да останат същите между две изпълнения на втория процес.

Първият ми въпрос е: споделената памет правилният инструмент ли е за това? (Също и по отношение на производителността, защото искам изпълнението да е възможно най-бързо.)

Вторият ми въпрос е: ако използвам споделена памет, както е описано в shm_overview.7, струва ми се, че всеки друг процес със същия uid има достъп до него. Как мога да го предотвратя? Бих искал само двата горни процеса да имат достъп до тази споделена памет.


person Oli    schedule 13.06.2015    source източник


Отговори (3)


Алтернативна архитектура, която може да обмислите, е динамичното зареждане. Вместо 2 процеса, имате само първия; той използва dlopen() за зареждане на вашия новокомпилиран код. Той извиква входната точка на тази "библиотека" и кодът има достъп до цялото пространство, включително постоянните променливи. На връщане разтоварвате библиотеката, готова за следващото „бягане“.

Създаването на такава зареждаема библиотека и нейното извикване е доста просто и по-бързо от изпълнението на изцяло нов процес. Няма проблеми с разрешенията, тъй като вашият единствен процес решава какво да зареди и стартира.

person meuh    schedule 13.06.2015

  1. Да, споделената памет е подходящ инструмент за това. Той ще действа (разглеждайки голямата картина) донякъде като файл, от който процесите могат да четат и да пишат, с разликите, че:

    • shared memory will be more efficient, and
    • споделената памет няма да оцелее след рестартиране.
  2. Не знам за някакъв железен начин за ограничаване на сегмент от споделена памет само до избрани процеси, изключвайки други със същия UID. Като цяло, ако притежавате нещо, вие имате пълен контрол върху него и процесите със същия UID имат идентичен достъп*. Но ако създадете сегмент от споделена памет с shmget с помощта на IPC_PRIVATE като ключ, ще бъде малко по-трудно да го намерят несвързани процеси. Той ще бъде достъпен само чрез своя id (идентификатор), който shmget връща. За да може някой друг процес да намери id, ще трябва да изпълни ipcs и да анализира изхода. Ще ви е необходим обаче начин да направите id достъпен за вашия втори процес (този, който е бил компилиран точно навреме); може би като параметър или променлива на средата.
    _______________
    *  с изключение на разликите в достъпа, причинени от различни GID или групови членства

person G-Man Says 'Reinstate Monica'    schedule 13.06.2015

Бих искал само двата горни процеса да имат достъп до тази споделена памет.

Това наистина не е възможно. Освен ако не прибягвате до някаква допълнителна рамка за сигурност (grsecurity, SELinux и техните приятели), привилегиите, определени от стандартната UNIX среда, са такива, че друг процес, работещ със същия UID, може да контролира напълно вашите процеси, включително спиране/рестартиране, убиване, проследяване, изследване и модифициране на пълната памет на процеса. Така че, дори ако успеете да скриете споделената памет от стандартен SHM достъп по някакъв начин, не можете напълно да предотвратите намесата на другите ви процеси.

person Laszlo Valko    schedule 13.06.2015