공유 메모리 (아래)
1. 시스템 V 공유 메모리 원리
프로 세 스 간 에 공유 해 야 할 데 이 터 는 IPC 공유 메모리 영역 이라는 곳 에 놓 여 있 습 니 다. 공유 영역 에 접근 해 야 하 는 모든 프로 세 스 는 이 공유 영역 을 이 프로 세 스 의 주소 공간 에 표시 해 야 합 니 다.시스템 V 공유 메모 리 는 shmget 을 통 해 IPC 공유 메모리 영역 을 얻 거나 만 들 고 해당 하 는 식별 자 를 되 돌려 줍 니 다.커 널 은 shmget 에서 공유 메모리 구역 을 얻 거나 만 들 고 공유 메모리 구역 에 해당 하 는 shmid 를 초기 화 합 니 다.kernel 구조 주 는 특수 파일 시스템 shm 에서 같은 이름 의 파일 을 만 들 고 열 며 메모리 에 해당 하 는 dentry 및 inode 구 조 를 만 들 것 입 니 다. 새로 열 린 파일 은 프로 세 스 에 속 하지 않 습 니 다 (모든 프로 세 스 가 공유 메모리 에 접근 할 수 있 습 니 다).이 모든 것 은 시스템 호출 shmget 으로 이 루어 졌 습 니 다.
주: 모든 공유 메모리 구역 에 제어 구조 struct shmid 가 있 습 니 다.kernel,shmid_kernel 은 공유 메모리 영역 에서 매우 중요 한 데이터 구조 로 저장 관리 와 파일 시스템 이 결 합 된 교량 입 니 다. 정 의 는 다음 과 같 습 니 다.
struct shmid_kernel /* private to the kernel */
{
struct kern_ipc_perm shm_perm;
struct file * shm_file;
int id;
unsigned long shm_nattch;
unsigned long shm_segsz;
time_t shm_atim;
time_t shm_dtim;
time_t shm_ctim;
pid_t shm_cprid;
pid_t shm_lprid;
};
이 구조 에서 가장 중요 한 도 메 인 은 shmfile, 매 핑 된 파일 의 주 소 를 저장 합 니 다.모든 공유 메모리 구역 의 대상 은 특수 파일 시스템 shm 의 파일 에 대응 합 니 다. 일반적인 상황 에서 특수 파일 시스템 shm 의 파일 은 read (), write () 등 방법 으로 접근 할 수 없습니다. 공유 메모리 방식 으로 그 중의 파일 을 프로 세 스 주소 공간 에 투사 한 후에 직접 메모리 에 접근 할 수 있 습 니 다.
여기 서 우 리 는 [1] 의 도 표를 이용 하여 시스템 V 공유 메모리 와 관련 된 데이터 구 조 를 제시 합 니 다.
메시지 큐 와 신호등 처럼 커 널 은 데이터 구조 struct ipcids shm_ids 유지보수 시스템 의 모든 공유 메모리 영역 입 니 다.위의 그림 의 shmids. entries 변 수 는 ipc 를 가리 키 고 있 습 니 다.id 구조 배열, 각 ipcid 구조 배열 중 하나 가 kern 을 가리 키 고 있 습 니 다.ipc_perm 구조의 지침.여기까지 독자 들 은 잘 알 것 같 습 니 다. 시스템 V 공유 메모리 구역 에 있어 kernipc_perm 의 숙주 는 shmidkernel 구조, shmidkernel 은 공유 메모리 영역 을 설명 하 는 데 사 용 됩 니 다. 커 널 은 시스템 의 모든 공유 영역 을 제어 할 수 있 습 니 다.동시에 shmidkernel 구조의 file 형식 포인터 shmfile 은 파일 시스템 shm 에 해당 하 는 파일 을 가리 키 며 공유 메모리 영역 은 shm 파일 시스템 의 파일 과 대응 합 니 다.
공유 메모리 영역 을 만 든 후에 프로 세 스 주소 공간 에 표시 하고 시스템 에서 shmat () 를 호출 하여 이 기능 을 완성 합 니 다.shmget () 을 호출 할 때 파일 시스템 shm 의 같은 이름 의 파일 이 공유 메모리 영역 과 대응 하기 때문에 shmat () 를 호출 하 는 과정 은 파일 시스템 shm 의 같은 이름 의 파일 을 매 핑 하 는 과정 에 해당 하 며 원 리 는 mmap () 와 대동소이 합 니 다.
페이지 맨 위
2. 시스템 V 공유 메모리 API
시스템 V 공유 메모리 에 대해 서 는 주로 다음 과 같은 몇 가지 API 가 있 습 니 다. shmget (), shmat (), shmdt () 와 shmctl ().
#include <sys/ipc.h>
#include <sys/shm.h>
shmget () 은 공유 메모리 영역의 ID 를 가 져 오 는 데 사 용 됩 니 다. 지정 한 공유 영역 이 존재 하지 않 으 면 해당 영역 을 만 듭 니 다.shmat () 는 공유 메모리 영역 을 호출 프로 세 스 의 주소 공간 에 표시 하면 프로 세 스 가 공유 영역 에 편리 하 게 접근 할 수 있 습 니 다.shmdt () 호출 은 공유 메모리 영역 에 대한 프로 세 스 의 맵 을 해제 하 는 데 사 용 됩 니 다.shmctl 공유 메모리 영역 에 대한 제어 작업 을 실현 합 니 다.여기 서 우 리 는 이런 시스템 호출 에 대해 구체 적 인 소 개 를 하지 않 고 독 자 는 해당 하 는 수첩 페이지 를 참고 할 수 있 으 며 뒤의 범례 는 그들의 호출 방법 을 제시 할 것 이다.
주: shmget 의 내부 실현 은 많은 중요 한 시스템 V 공유 메모리 메커니즘 을 포함한다.shmat 는 공유 메모리 영역 을 프로 세 스 공간 에 표시 할 때 프로 세 스 의 페이지 표를 진정 으로 바 꾸 지 않 습 니 다.프로 세 스 가 처음으로 메모리 맵 영역 에 접근 할 때 물리 적 페이지 표 의 배분 이 없어 서 페이지 가 부족 한 이상 을 초래 한 다음 에 커 널 은 해당 하 는 저장 관리 체제 에 따라 공유 메모리 맵 영역 에 해당 하 는 페이지 표를 분배 합 니 다.
페이지 맨 위
3. 시스템 V 공유 메모리 제한
/ proc / sys / kernel / 디 렉 터 리 에 시스템 V 공유 메모리 의 한 계 를 기록 하고 있 습 니 다. 예 를 들 어 공유 메모리 구역 의 최대 바이트 수 shmmax, 시스템 범위 내 최대 공유 메모리 구역 식별 자 수 shmmni 등 은 수 동 으로 조정 할 수 있 지만 추천 하지 않 습 니 다.
[2] 에서 이러한 제한 적 인 테스트 방법 을 제시 하여 더 이상 군말 하지 않 았 다.
페이지 맨 위
4. 시스템 V 공유 메모리 범례
이 부분 은 시스템 V 공유 메모리 API 의 사용 방법 을 제시 하고 시스템 V 공유 메모리 체제 와 mmap () 가 일반 파일 을 비 추어 공유 메모리 간 의 차 이 를 비교 분석 할 것 입 니 다. 먼저 두 프로 세 스 가 시스템 V 를 통 해 메모리 통신 을 공유 하 는 범례 를 제시 합 니 다.
/***** testwrite.c *******/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
typedef struct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
char temp;
people *p_map;
char* name = "/dev/shm/myshm2";
key = ftok(name,0);
if(key==-1)
perror("ftok error");
shm_id=shmget(key,4096,IPC_CREAT);
if(shm_id==-1)
{
perror("shmget error");
return;
}
p_map=(people*)shmat(shm_id,NULL,0);
temp='a';
for(i = 0;i<10;i++)
{
temp+=1;
memcpy((*(p_map+i)).name,&temp,1);
(*(p_map+i)).age=20+i;
}
if(shmdt(p_map)==-1)
perror(" detach error ");
}
/********** testread.c ************/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
typedef struct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
people *p_map;
char* name = "/dev/shm/myshm2";
key = ftok(name,0);
if(key == -1)
perror("ftok error");
shm_id = shmget(key,4096,IPC_CREAT);
if(shm_id == -1)
{
perror("shmget error");
return;
}
p_map = (people*)shmat(shm_id,NULL,0);
for(i = 0;i<10;i++)
{
printf( "name:%s/n",(*(p_map+i)).name );
printf( "age %d/n",(*(p_map+i)).age );
}
if(shmdt(p_map) == -1)
perror(" detach error ");
}
testwrite. c 는 시스템 V 공유 메모리 영역 을 만 들 고 포맷 된 데 이 터 를 기록 합 니 다.testread. c 는 같은 시스템 V 공유 메모리 에 접근 하여 포맷 된 데 이 터 를 읽 습 니 다.각각 두 프로그램 을 test write 및 test read 로 컴 파일 하여 선후 로 실행 합 니 다. / test write 및. / test read 는... / test read 출력 결 과 는 다음 과 같 습 니 다.
name: b age 20; name: c age 21; name: d age 22; name: e age 23; name: f age 24;
name: g age 25; name: h age 26; name: I age 27; name: j age 28; name: k age 29;
시험 결과 에 대한 분석 을 통 해 시스템 V 와 mmap () 의 일반 파일 을 비교 하여 공유 메모리 통신 을 실현 하면 다음 과 같은 결론 을 얻 을 수 있다.
1. 시스템 V 는 메모리 의 데 이 터 를 공유 하고 실제 디스크 파일 에 기록 하지 않 습 니 다.mmap () 를 통 해 일반 파일 을 비 추 는 공유 메모리 통신 은 디스크 파일 에 언제 데 이 터 를 기록 할 지 지정 할 수 있 습 니 다.주: 앞에서 말 했 듯 이 시스템 V 공유 메모리 체 제 는 실제 적 으로 특수 파일 시스템 shm 의 파일 을 매 핑 하여 이 루어 집 니 다. 파일 시스템 shm 의 설치 점 은 교환 구역 에 있 고 시스템 이 다시 유도 한 후에 모든 내용 을 잃 어 버 렸 습 니 다.
2. 시스템 V 공유 메모 리 는 커 널 에 따라 지 속 됩 니 다. 공유 메모리 에 접근 하 는 모든 프로 세 스 가 정상적으로 종료 되 었 더 라 도 공유 메모리 구역 은 존재 합 니 다 (공유 메모리 를 명시 적 으로 삭제 하지 않 는 한). 커 널 이 다시 유도 하기 전에 이 공유 메모리 구역 의 모든 변경 작업 은 계속 유 지 됩 니 다.
3. mmap () 를 호출 하여 일반 파일 을 매 핑 하여 프로 세 스 간 통신 을 할 때 프로 세 스 가 언제 통신 에 미 치 는 영향 을 고려 해 야 합 니 다.시스템 V 공유 메모 리 를 통 해 통신 을 실현 하 는 프로 세 스 는 그렇지 않다.주: shmctl 의 사용 사례 가 없습니다. 원 리 는 메시지 대기 열 과 대동소이 합 니 다.
페이지 맨 위
결론:
공유 메모리 에 서 는 두 개 이상 의 프로 세 스 가 주어진 저장 소 를 공유 할 수 있 습 니 다. 데 이 터 는 복사 할 필요 가 없 기 때문에 가장 빠 른 프로 세 스 간 통신 체제 입 니 다.공유 메모 리 는 mmap () 를 통 해 일반 파일 (특수 한 경우 익명 맵) 체 제 를 매 핑 할 수도 있 고 시스템 V 공유 메모리 체 제 를 통 해 이 루어 질 수도 있다.응용 인터페이스 와 원 리 는 매우 간단 하고 내부 메커니즘 이 복잡 하 다.보다 안전 한 통신 을 위해 신호등 등 동기 화 체제 와 함께 사용 하 는 경우 도 많다.
공유 메모 리 는 저장 관리 와 파일 시스템 등 분야 의 지식 과 관련 되 고 내부 체 제 를 깊이 이해 하 는 데 어느 정도 어려움 이 있 으 며 관건 은 커 널 이 사용 하 는 중요 한 데이터 구 조 를 꽉 잡 아야 한다.시스템 V 공유 메모 리 는 특수 파일 시스템 shm 에 파일 형식 으로 구성 되 어 있 습 니 다.shmget 을 통 해 공유 메모리 의 식별 자 를 만 들 거나 얻 을 수 있 습 니 다.공유 메모리 식별 자 를 가 져 온 후, shmat 를 통 해 이 메모리 영역 을 이 프로 세 스 의 가상 주소 공간 에 표시 해 야 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.