Rumah Tutorial sistem LINUX Bagaimana untuk berkongsi memori antara proses Linux

Bagaimana untuk berkongsi memori antara proses Linux

Jun 02, 2024 am 09:18 AM
linux tutorial linux Topi Merah sistem linux arahan linux pensijilan linux linux topi merah video linux

Prinsip IPC ingatan bersama

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:

Bagaimana untuk berkongsi memori antara proses Linux

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 */
};
Salin selepas log masuk

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 */
Salin selepas log masuk
Pengurusan memori dikongsi Linux
1 Cipta memori bersama
#include <sys> #include <sys></sys></sys>
Salin selepas log masuk
Salin selepas log masuk

/*
* 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);
Salin selepas log masuk
2. Kawalan memori dikongsi
#include <sys> #include <sys></sys></sys>
Salin selepas log masuk
Salin selepas log masuk

/*
* 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);
Salin selepas log masuk
3. Memetakan objek memori yang dikongsi

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>
Salin selepas log masuk
Salin selepas log masuk

/*
* 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);
Salin selepas log masuk
4. Tanggalkan objek memori yang dikongsi

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>
Salin selepas log masuk
Salin selepas log masuk

/*
* Parameter ialah alamat pertama memori kongsi yang diperuntukkan
*/

int shmdt(const void *shmaddr);
Salin selepas log masuk
Konvensyen diikuti dengan perkongsian memori antara proses ibu bapa dan anak

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.

Contoh Program

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>
Salin selepas log masuk

/* Mohon untuk ingatan bersama */

shm_id = shmget((key_t)1004, SHM_SIZE, IPC_CREAT | 0600);
Salin selepas log masuk

/* 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);
Salin selepas log masuk

/* Nyahpeta */

shmdt(ptr);
Salin selepas log masuk

/* Padam memori kongsi */

shmctl(shm_id, IPC_RMID, 0);
}

return 0;
}
Salin selepas log masuk

Hasil keluaran:

Bagaimana untuk berkongsi memori antara proses Linux

Atas ialah kandungan terperinci Bagaimana untuk berkongsi memori antara proses Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1664
14
Tutorial PHP
1266
29
Tutorial C#
1239
24
Seni Bina Linux: Melancarkan 5 Komponen Asas Seni Bina Linux: Melancarkan 5 Komponen Asas Apr 20, 2025 am 12:04 AM

Lima komponen asas sistem Linux adalah: 1. Kernel, 2. Perpustakaan Sistem, 3. Utiliti Sistem, 4. Antara Muka Pengguna Grafik, 5. Aplikasi. Kernel menguruskan sumber perkakasan, Perpustakaan Sistem menyediakan fungsi yang telah dikompilasi, utiliti sistem digunakan untuk pengurusan sistem, GUI menyediakan interaksi visual, dan aplikasi menggunakan komponen ini untuk melaksanakan fungsi.

Cara memeriksa alamat gudang git Cara memeriksa alamat gudang git Apr 17, 2025 pm 01:54 PM

Untuk melihat alamat repositori Git, lakukan langkah -langkah berikut: 1. Buka baris arahan dan navigasi ke direktori repositori; 2. Jalankan perintah "Git Remote -V"; 3. Lihat nama repositori dalam output dan alamat yang sepadan.

Apr 16, 2025 pm 07:39 PM

Walaupun Notepad tidak dapat menjalankan kod Java secara langsung, ia dapat dicapai dengan menggunakan alat lain: menggunakan pengkompil baris arahan (Javac) untuk menghasilkan fail bytecode (fileName.class). Gunakan Java Interpreter (Java) untuk mentafsir bytecode, laksanakan kod, dan output hasilnya.

Apakah tujuan utama Linux? Apakah tujuan utama Linux? Apr 16, 2025 am 12:19 AM

Penggunaan utama Linux termasuk: 1. Sistem Operasi Pelayan, 2. Sistem Terbenam, 3. Linux cemerlang dalam bidang ini, menyediakan kestabilan, keselamatan dan alat pembangunan yang cekap.

Cara menjalankan luhur setelah menulis kod Cara menjalankan luhur setelah menulis kod Apr 16, 2025 am 08:51 AM

Terdapat enam cara untuk menjalankan kod di Sublime: melalui hotkeys, menu, sistem membina, baris arahan, menetapkan sistem binaan lalai, dan arahan membina adat, dan menjalankan fail/projek individu dengan mengklik kanan pada projek/fail. Ketersediaan sistem membina bergantung kepada pemasangan teks luhur.

Kod pemasangan Laravel Kod pemasangan Laravel Apr 18, 2025 pm 12:30 PM

Untuk memasang Laravel, ikuti langkah -langkah berikut dalam urutan: Pasang komposer (untuk macOS/linux dan windows) Pasang pemasang Laravel Buat aplikasi akses perkhidmatan permulaan projek baru (URL: http://127.0.0.1:8000) Sediakan sambungan pangkalan data (jika diperlukan)

pemasangan perisian git pemasangan perisian git Apr 17, 2025 am 11:57 AM

Memasang Perisian Git Termasuk langkah -langkah berikut: Muat turun pakej pemasangan dan jalankan pakej pemasangan untuk mengesahkan pemasangan pemasangan git git git (Windows Only)

Cara Menetapkan Hartanah Global Konfigurasi Git Penting Cara Menetapkan Hartanah Global Konfigurasi Git Penting Apr 17, 2025 pm 12:21 PM

Terdapat banyak cara untuk menyesuaikan persekitaran pembangunan, tetapi fail konfigurasi GIT global adalah salah satu yang paling mungkin digunakan untuk tetapan tersuai seperti nama pengguna, e -mel, editor teks pilihan, dan cawangan terpencil. Berikut adalah perkara penting yang perlu anda ketahui mengenai fail konfigurasi GIT global.

See all articles