2016년 5월 22일 일요일

뇌자극 TCP_IP 프로그래밍 11강 요약 2

너무 내용이 길어서 3개씩 끊었다.

4. 공유 메모리

프로세스 간에 정보 교환 외에 정보 자체를 공유하는 경우가 있을 것이다.

공동으로 사용할 공간을 마련하고 이 공간에 정보를 넣어 공유하는 방식이다.

공유 메모리 생성

#include <sys/types.h>
#include <sys/shm.h>
int shmget(key_t key, int size, int shmfla);

key : 공유 메모리는 커널에서 관리한다. 각 프로세스는 이를 이용해 접근할 공유 메모리를 식별한다.

size : 커널에 요청할 공유 메모리 공간의 크기다.
shmflg : 공유 메모리 접근 방식과 권한을 결정하기 위해 사용한다.
   - IPC_CREATE : 공유 메모리를 새로 생성한다.
   - IPC_EXCL : IPC_CREAT와 함께 사용한다. key 값을 가지는 공유 메모리 영역이 이미 전조하면 에러를 확인 할 수 있다.

공유 메모리 첨부와 분리하기


공유 메모리를 사용하기 위해서는 커널의 공유 메모리 공간을 프로세스에 첨부해줘야 한다.
1) 공유 메모리 공간을 생성한다
2) 프로세스 A가 공유 메모리 공간을 첨부한다.
3) 프로세스 B가 공유 메모리 공간을 첨부한다.
4) 이제 A와 B는 첨부된 공유 메모리 공간으로 데이터를 공유할 수 있다.

int shmdt(const void *shmaddr);


shmaddr : 분리할 공유 메모리를 가리키는 포인터로 shmat에서 사용했던 shmaddr을 그대로 사용한다.


공유 메모리 관리


shmctl 함수로 공유 메모리를 관리할 수 있다.
관리 요소는 공유 메모리 정보 가져오기, 권한설정, 공유 메모리 삭제 등이 있다.

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


shmid : 공유 메모리 식별자

cmd : 공유 메모리 제어 값이다. 다음과 같은 값들이 있다.
    -IPC_STAT : 공유 메모리 정보를 가져온다.
    -IPC_SET : 공유 메모리 공간의 권한 변경을 위해 사용
    -IPC_SMID : 공유 메모리 공간을 삭제한다.
buf : 공유 메모리 정보를 저장한다.

공유 메모리의 장점

-빠른 수행 속도 : 공유 메모리는 데이터 저장을 위한 공간으로 메모리를 사용한다.
-효율성 : 여러 프로세스 간의 데이터 공유에 효율적이다.
-접근성 : key 이름만 알고 있으면 어떤 프로세스든 접근할 수 있다.

5. 세마포어

메모리를 공유하다 보면 읽고 쓰는데 동기화 문제가 일어날 수 있다.
동시에 여러 프로세스가 접근하지 못하도록 임계 영역을 만들어 간섭을 막을 수 있다.
세마포어는 커널에서 관리하는 자원으로 프로세스가 임계 영역을 진입하게 되고,
그렇지 못한 프로세스는 키가 반환되어 사용할 수 있을 때까지 기다려야 한다.

세마포어의 생성과 관리

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);

key : 커널 관리 자원과 마찬가지로 key 값으로 생성하고 접근 할 수 있다.

nsems: 세마포어는 배열로 만들어지는데, 세마포어 집합의 크기를 결정하기 위해 사용한다.
semflg : 세마포어의 생성 방식을 결정한다.
    -IPC_CREAT : 커널에 key 값의 세마포어가 없다면 새로 생성한다.
    -IPC_EXCL : IPC_CREAT와 함께 사용한다. key 값의 세마포어가 이미 존재한다면 에러 값을 반환한다.

세마포어의 임계영역은 semop 함수로 관리한다.

int semop(int semid, struct sembuf *sops, unsigned nsops);

semid : semget 함수로 생성한 세마포어 식별자이다.

sops : 세마포어 제어를 위해 사용하는 세마포어 구조체이다.
nosps : 세마포에 집합의 개수이다. 하나의 프로세스만 진입하려면 1을 사용한다.

6. 시그널

시그널은 프로세스에게 비동기적인 사건을 알려주거나 혹은 사건을 동기화 시키는데 사용한다.

다양한 시그널

SIGHUP : 터미널에서 잃어버렸을 때 발생한다. 콘솔창을 닫을 때 발생한다.
SIGABRT : 프로그램의 비정상 종료시 발생한다
SIGINT : 컨트롤 + c를 입력할 때 발생한다. SIGINT 시그널이 프로세스로 전달되면 프로세스가 종료된다.
SIGIO : 비동기적인 입출력이 발생했을 때 사용한다.
SIGKILL : 프로세스를 강제로 죽이기 위해 사용한다
SIGEGV : 운영체제가 프로세스를 강제로 종료시킬 때 사용한다.
SIGSTOP : 프로세스를 일시 중단 할 때 사용한다.
SIGCONT : 멈춘 프로세스를 다시 움직일 때 사용한다.

시그널의 기본 행동 

종료 : 프로세스를 종료한다.
무시 : 기본적으로 무시되는 시그널은 없다고 봐도 된다. 하지만 개발자는 특정 시그널을 무시하도록 할 수 있다.
함수 실행 : 특정 시그널을 받았을 때 이를 처리할 함수를 호출할 수 있다.

시그널 함수를 이용해서 시그널 제어하기

#include <signal.h>
sighandler_t signal(int signum, sighandler_t handler);

signum : 제어하기 원하는 시그널의 번호다.
handler :  signum 번호를 가지는 시그널이 발생 했을 때, 실행한 시그널 핸들러다.
   -SIG_IGN : 시그널을 무시한다. SIGKILL 과 SIGSTOP는 무시할 수 없다.
   -SIG_DFL : 시그널의 기본 행동을 한다.

역시 위의 내용은 각각 소스코드가 있다.
나의 깃허브에서 다운 받아서 해보길...;;;

소스 코드 받기

댓글 없음:

댓글 쓰기