Mekanisme komunikasi antara proses memori dikongsi digunakan terutamanya untuk memindahkan sejumlah besar data antara proses Rajah berikut menunjukkan gambarajah skema menggunakan memori dikongsi untuk memindahkan sejumlah besar data antara proses:
Memori dikongsi ialah ruang memori yang dibuka secara berasingan dalam memori Ruang memori ini mempunyai struktur datanya yang tersendiri, termasuk kebenaran akses, saiz dan masa akses terkini. Struktur data ditakrifkan seperti berikut:
from /usr/include/linux/shm.h struct shmid_ds { struct ipc_perm shm_perm; /* operation perms 操作权限 */ int shm_segsz; /* size of segment (bytes) 段长度大小 */ __kernel_time_t shm_atime; /* last attach time 最近attach时间 */ __kernel_time_t shm_dtime; /* last detach time 最近detach时间 */ __kernel_time_t shm_ctime; /* last change time 最近change时间 */ __kernel_ipc_pid_t shm_cpid; /* pid of creator 创建者pid */ __kernel_ipc_pid_t shm_lpid; /* pid of last operator 最近操作pid */ unsigned short shm_nattch; /* no. of current attaches */ unsigned short shm_unused; /* compatibility */ void *shm_unused2; /* ditto - used by DIPC */ void *shm_unused3; /* unused */ };
Sebelum dua proses menggunakan ruang memori kongsi ini, mereka perlu mewujudkan sambungan antara ruang alamat proses dan ruang memori kongsi, iaitu, lekapkan ruang memori kongsi ke dalam proses.
Sistem ini mengenakan sekatan berikut pada memori yang dikongsi:
#define SHMMAX 0x2000000 /* max shared seg size (bytes) 最大共享段大小 */ #define SHMMIN 1 /* min shared seg size (bytes) 最小共享段大小 */ #define SHMMNI 4096 /* max num of segs system wide */ #define SHMALL (SHMMAX/getpagesize()*(SHMMNI/16)) #define SHMSEG SHMMNI /* max shared segs per process */
#include <sys> #include <sys></sys></sys>
/*
* Parameter pertama ialah nilai kunci, biasanya dijana oleh fungsi ftok()
* Parameter kedua ialah saiz segmen memori kongsi yang akan dibuat (dalam bait)
* Parameter ketiga digunakan untuk mengenal pasti pengecam penciptaan segmen memori kongsi
*/
int shmget(key_t key, size_t size, int shmflg);
#include <sys> #include <sys></sys></sys>
/*
* Parameter pertama ialah pengecam memori kongsi yang akan dikendalikan
* Parameter kedua ialah operasi yang akan dilakukan
* Parameter ketiga ialah maklumat pembolehubah memori dikongsi sementara bagi struktur shmid_ds
*/
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
Fungsi panggilan sistem shmat() memetakan segmen memori yang dikongsi ke segmen data proses panggilan dan mengembalikan alamat pertama ruang memori Fungsinya diisytiharkan seperti berikut:
#include <sys> #include <sys> </sys></sys>
/*
* Parameter pertama ialah pengecam memori kongsi yang akan dikendalikan
* Parameter kedua digunakan untuk menentukan alamat yang dipetakan bagi memori yang dikongsikan Jika ia bukan 0, parameter ini akan diperuntukkan oleh sistem
* Parameter ketiga digunakan untuk menentukan kebenaran akses dan keadaan pemetaan segmen memori kongsi
*/
void *shmat(int shmid, const void *shmaddr, int shmflg);
Selepas menggunakan ruang memori yang dikongsi, anda perlu menggunakan panggilan fungsi shmdt() untuk memisahkannya daripada proses semasa. Pengisytiharan fungsi adalah seperti berikut:
#include <sys> #include <sys> </sys></sys>
/*
* Parameter ialah alamat pertama memori kongsi yang diperuntukkan
*/
int shmdt(const void *shmaddr);
1. Selepas menggunakan fungsi fork() untuk mencipta proses anak, proses itu mewarisi memori kongsi yang dipasang oleh proses induk.
2 Jika exec() dipanggil untuk melaksanakan program baharu, semua memori kongsi yang dipasang akan dinyahlekap secara automatik.
3 Jika fungsi exit() dipanggil dalam proses, semua memori kongsi yang dipasang akan diputuskan sambungan daripada proses semasa.
Mohon untuk memori yang dikongsi, proses induk menyimpan integer pada alamat pertama, dan proses anak membacanya.
#include #include <sys> #include <sys> #include <sys> #include #include #define SHM_SIZE 1024 int main() { int shm_id, pid; int *ptr = NULL; </sys></sys></sys>
/* Mohon untuk ingatan bersama */
shm_id = shmget((key_t)1004, SHM_SIZE, IPC_CREAT | 0600);
/* Petakan memori yang dikongsi untuk memproses ruang alamat */
ptr = (int*)shmat(shm_id, 0, 0); printf("Attach addr is %p \n", ptr); *ptr = 1004; printf("The Value of Parent is : %d \n", *ptr); if((pid=fork()) == -1){ perror("fork Err"); exit(0); } else if(!pid){ printf("The Value of Child is : %d \n", *ptr); exit(0); }else{ sleep(1);
/* Nyahpeta */
shmdt(ptr);
/* Padam memori kongsi */
shmctl(shm_id, IPC_RMID, 0); } return 0; }
Hasil keluaran:
Atas ialah kandungan terperinci Bagaimana untuk berkongsi memori antara proses Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!