CafeM0ca

[C]공유메모리 본문

Programming/System Programming

[C]공유메모리

M0ca 2017. 12. 6. 05:03
반응형

공유메모리는 프로세스가 메모리를 공유해서 쓰는 메모리다. 그럼 누가 메모리를 연결 시켜주는가? 이 문제는 통신 문제로 넘어가서 서버와 클라이언트의 관계에 놓인다. a프로세스가 공유메모리를 사용할 수 있도록 열어주고(서버) b프로세스가 공유메모리에 접근한다(클라이언트)

장점: 자원을 공유해서 쓸 수 있다. (ex: 쓰레드)  

단점: 같은 자원을 공유해서 쓰다 보니까 항상 경쟁 상태다. -> 교착 상태 발생 가능성 있음


잘 쓰면 금이고 잘못 쓰면 독이 되니 메모리 관리 잘 하면서 써야된다.

공유메모리는 shm로 생겼는데 처음에 쉬므라 읽었는데 곰곰히 생각해보니 share memory로 읽는게 맞는 듯 하다.(shmget 쉐어 메모리 겟)



생성->첨부->사용->때어냄->제거


shmget(key_t,size,shmflg)   : 공유메모리 생성

성공 0 ,실패 -1반환 

key_t에 size(byte)만큼의 크기를 shmflg 따라 처리 

shmflg

-IPC_CREAT :새로운 영역할당

-IPC_EXCL:영역이 있는지 확인, 존재하면 에러 리턴 


shmat(shmid,shmaddr,shmflg) : 만든 공유메모리를 프로세스가 사용할 수 있게(첨부) 

shmid(공유메모리식별자)

shmaddr(공유메모리주소, 보통 NULL)

shmflg(옵션)

-SHM_RDONLY(read only):읽기전용

-SHM_RND:shmaddr이 NULL이 아닌 값일 때,시스템이 메모리세그먼트,프로세스 내부 주소를 관리하도록 함


shmdt(shmaddr) :공유메모리 삭제

shmaddr(주소)를 지운다. 성공시 0, 실패시 -1 반환


shmctl(shmid,cmd,shmid_ds *buf) : 프로세스에 첨부된 공유메모리 때어냄 

shmid(공유메모리식별자)

cmd(제어명령)

shmid_ds(공유메모리 정보 구조체)

성공시 0,실패시 -1


server.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<sys/ipc.h> 
#include<sys/shm.h> 
#include<stdlib.h>
#include<stdio.h>
const int SHSIZE=1024;
int main(void)
{
    int shmid;
    char *shmaddr,ch;
    key_t key=7530//공유 메모리를 구분하는 구조체
 
    //key값의 공유메모리 생성
    if((shmid=shmget(key,SHSIZE,IPC_CRAETE))==-1){
        perror("공유메모리 생성실패"); //에러 메시지를 띄우는 함수 stdin에 정의
        exit(1); //프로세스 강제종료 stdlib에 정의 
    
    //공유메모리 첨부
    if((shmaddr=shmat(shmid,NULL,0))==(char *)-1){
        perror("공유메모리 첨부실패");
        exit(1);
    }
    
    //공유메모리에 내용 삽입
    for(ch='a';ch<='z';ch++)
        *shmaddr++=ch; //공유메모리 시작주소부터 하나씩 넣으면서 증가
    
    while(*shmaddr=='*'){ //클라이언트가 공유메모리에서 작업을 한 뒤 *을 입력해 주기를 기대
        printf("공유 메모리에 *이 입력되기를 기다리는 중\n");
        sleep(1000);
    }
    return 0;
}
cs


client.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
 
const int SHMSIZE=1024;
int main()
{
    char *shmaddr,*c;
    key_t key=7530;
    int shmid;
 
    //공유메모리 생성, 있으면 그대로 아무 일 안함
    if((shmid=shmget(key,SHMSIZE,IPC_CREAT))==-1){ 
        perror("fail making share memory");
        exit(1);
    }
 
    //공유 메모리를 프로세스에 첨부
    if((shmaddr=shmat(shmid,NULL,0))==(char *)-1){
        perror("fail attach prosess");
        exit(1);
    }
    //공유메모리 시작지점부터 끝나는 지점점까지 출력 정확히는 *c<=shmaddr+SHMSIZE
    for(c=shmaddr;*c!='\0';c++)
        printf("%c",*c);
    putchar('\n');
    return 0;
}
 
cs


클라이언트가 *을 입력해주지 않았으므로 공유메모리는 떨어지고,소멸되지 않는다.


직접 써보니까 잘만 쓰면 좋은 프로그램이 되는데 한 몫 할 듯하다.

반응형

'Programming > System Programming' 카테고리의 다른 글

[C]소켓프로그래밍  (0) 2018.02.02
Comments