컴퓨터 공부/Advanced UNIX System Programming

[5월 12일 2교시] 시스템V IPC - 공유메모리, 쓰레드

려리군 2009. 5. 12. 10:35

공유메모리

프로세스 간에 공유 메모리를 설정하여 커널 버퍼 경유를 없앰.

동기화 방법 필요(메모리를 계속 읽을 경우 CPU 오버헤드가 심함)


#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/shm.h>


int shmget(key_t key, int size, int shmflag);

key값과 관련된 공유 메모리 세그먼트(size만큼)의 식별자를 리턴한다.

shmflag 

 - IPC_CREAT : 해당 키의 공유메모리를 생성.

 - IPC_EXCL : 이 값이 설정되어 있고 대응되는 키 값이 있으면 EEXIST 오류를 리턴.


void *shmat(int shmid, const void *shmaddr, int shmflag);

리턴 : 성공시 붙여진 공유 메모리 세그먼트의 주소, 실패시 (void*)-1

호출한 프로세스의 주소 공간으로 shmid를 확인하여 공유 메모리 세그먼트를 붙인다.

붙일 주소는 shmaddr로 설정할 수 있고 만약 NULL이면 시스템이 적당한 주소 공간을 찾아준다.


int shmdt(char *shmaddr);

리턴 : 성공시 0, 실패시 -1

호출한 프로세스의 주소 공간으로 부터 shmaddr의 주소의 공유 메모리 세그멘트를 땐다.

shmat에 리턴된 값과 같은 값을 사용해야 한다.


int shmctl(int shmid, int cmd, struct shmid_ds *buff);

리턴 : 성공시 0, 실패시 -1

shmid에 해당하는 공유 메모리 세그먼트에 cmd값을 통해 제어 명령을 수행한다. 


쓰레드

Fork : 복제를 하기 때문에 오버헤드가 큼.

쓰레드 : file descriptor, 전역 메모리 등 공유.

쓰레드의 고유 정보

쓰레드 ID, 레지스터 집합, 스택, Errno


#include<pthread.h> // OS 레벨의 쓰레드 -> OS가 스케쥴링.

int pthread_create(pthread_t restrict *tid, const pthread_attr_t *restrict attr, void*(*func)(void*), void *restrict arg);

쓰레드를 생성한다. 쓰레드 실행 루틴이 리턴을 하면 묵시적으로 pthread_exit()가 호출된 효과가 난다.

리턴 : 성공시 0, 실패시 오류 번호

tid : 이 아이디로 참조되는 위치에서 생성된 쓰레드의 ID를 보관함.

attr : 쓰레드의 속성. NULL이면 기본 속성이 사용됨.

func : 쓰레드가 실행할 실행 루틴.

arg : 쓰레드에 넘길 인자값.


int pthread_join(pthread_t tid, void **status);

원하는 쓰레드가 멈출 때까지 호출한 쓰레드를 일시 정지 시킨다.

tid : 이 아이디로 참조되는 위치에서 생성된 쓰레드의 ID를 보관함.

status : pthread_exit()에 발생할 종료 코드값.


pthread_t pthread_self();

쓰레드의 ID를 리턴한다.


int pthread_detach(pthread_t tid);

쓰레드를 떼어낸다. 때어낼 경우 해당 쓰레드가 종료될 경우 pthread_join을 호출하지 않아도 즉시 모든 자원이 해제된다.

리턴 : 성공시 0, 실패시 오류 코드


void pthread_exit(void *status);

호출한 쓰레드(함수 내에서 사용)를 끝낸다. 

status : 종료 코드