shmat () возвращает другой "shmaddr" для того же " shmkey"



Вот моя установка...



/* Bounded Buffer item structure */
struct item {
int id; /* string index value */
char str[80]; /* string value */
};

/* Structure for the shared memory region */
typedef struct {
int debug; /* debug flag */
int in; /* index of next empty slot */
int out; /* index of next full slot */
char MUTEXname[32]; /* name of the MUTEX semaphore */
char EMPTYname[32]; /* name of the EMPTY semaphore */
char FULLname[32]; /* name of the FULL semaphore */
struct item buff[BUFFSIZE]; /* circular buffer for producer/consumer items*/
char strarray[MAX_STRINGS][80]; /* shared array of strings for consumers */
} shr_mem_t;

/* Values for obtaining a shmid key via ftok() */
#define KEYPATH "."
#define KEYPROJ 4520


Main: (развилит () процессы "производитель" и "потребитель")



/* Use ftok() to get a value for a key to identify a shared memory segment */
shm_key = ftok(KEYPATH, KEYPROJ);

/* Create the shared memory segment */
shmid = shmget(shm_key, sizeof(shr_mem_t), IPC_CREAT | IPC_EXCL | 0660);

/* Attach shared memory segment to the parent process */
shmptr = shmat(shmid, NULL, 0);


Продюсер:



/* Use ftok() to get value for the key to identify the shared memory segment */
shm_key = ftok(KEYPATH, KEYPROJ);

/* Get the ID of the existing shared memory segment */
shmid = shmget(shm_key, sizeof(shr_mem_t), 0660);

/* Attach the shared memory segment */
shmptr = shmat(shmid, NULL, 0);


Потребитель:



/* Use ftok() to get value for the key to identify the shared memory segment */
shm_key = ftok(KEYPATH, KEYPROJ);

/* Get the ID of the existing shared memory segment */
shmid = shmget(shm_key, sizeof(shr_mem_t), 0660);

/* Attach the shared memory segment */
shmptr = shmat(shmid, NULL, 0);


Проверка ошибок: (для краткости...)



if (shmid == -1) {
perror("shmget failed in __________");
exit(1);
} else {
sprintf(errString, "<*> __________ shared memory id: %i ", shmid);
perror(errString);
}

if(shmptr == (void *)(-1)) {
perror("shmat failed in __________");
exit(1);
} else {
sprintf(errString, "<*> __________ attaching to shared memory address: %p ", shmptr);
perror(errString);
}


Вывод:



<*> Main creating shared memory id: 101376 : No such file or directory
<*> Main attaching to shared memory address: 16000 : No such file or directory
Creating the producer and consumer processes...
<*> Producer located shared memory id: 101376 : Successful
<*> Consumer located shared memory id: 101376 : Successful
<*> Producer attaching to shared memory address: 10000 : Successful
<*> Consumer attaching to shared memory address: 10000 : Successful


Что происходит с адресом общей памяти? Как Main и Prod/Cons процессы получают разные shmaddr, когда они присоединяются, когда у них один и тот же shmid?



Заранее спасибо,



Z@K!

613   3  

3 ответов:

Здесь задействованы два набора адресов. "Адреса ОЗУ чипа", то есть аппаратные, физические, реальные или супервизорные адреса, начинаются с первого чипа ОЗУ в 0 и перемещаются вверх. Однако во всех" истинно многозадачных "операционных системах каждый процесс получает свою собственную "виртуальную память"."Процессор и ОС сотрудничают, чтобы дать каждому процессу "иллюзию", что он один на своей собственной машине, со своим собственным адресным пространством, с таблицей (в ядре и процессоре, в зависимости от архитектуры) отображения из "виртуальные" (для каждого процесса) адреса к" реальным/аппаратным/супервизорным " адресам.

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

Аналогичным образом, при загрузке библиотеки общих объектов (.so) она может быть отображена в различное адресное пространство в каждом процессе.

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

Когда процесс вызывает shmat (), он возвращает виртуальный адрес общей памяти. виртуальный адрес-это место в памяти, видимое текущим процессом. различные процессы могут сопоставлять общую память с различными виртуальными адресами. в процессе адресное пространство и, следовательно, различные возвращаемые значения вызова shmat() для различных процессов.

Прекрасное графическое описание того, что я только что сказал выше. http://poshmodule.sourceforge.net/posh/html/node3.html

Comments

    Ничего не найдено.