운영체제 프로세스간의 통신
본 자료는 3페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
해당 자료는 3페이지 까지만 미리보기를 제공합니다.
3페이지 이후부터 다운로드 후 확인할 수 있습니다.

목차

SYSTEM CALL: pipe();

SYSTEM CALL: dup();

SYSTEM CALL: dup2();

LIBRARY FUNCTION: popen();

LIBRARY FUNCTION: pclose();

Named pipe - 이름 있는 파이프

-FIFO 만들기

LIBRARY FUNCTION: mknod();

FIFO 동작

FIFO의 동작 차단

Message queue - 메시지 큐

SYSTEM CALL: msgget();

SYSTEM CALL: msgsnd();

SYSTEM CALL: msgrcv();

SYSTEM CALL: msgctl();

Semaphore - 세마포어

SYSTEM CALL: semget();

SYSTEM CALL: semop();

SYSTEM CALL: semctl();

Shared Memory - 공유 메모리

SYSTEM CALL: shmget();

SYSTEM CALL: shmat();

SYSTEM CALL: shmctl();

SYSTEM CALL: shmdt();

본문내용

s sleep(2);
printf("process v(semid);
printf("process exit(0);
}
void main() {
if(fork() == 0) handlesem(SEMKEY);
if(fork() == 0) handlesem(SEMKEY);
if(fork() == 0) handlesem(SEMKEY);
}
위의 소스에서 initsem 은 세마포어를 초기화 하고, p 와 v 함수는 세마포어 연산을 수행한다. 이 세 개의 함수는 서로 독립적으로 설계되어 있다. 위에서의 handlesem 과 같은 함수에서는 semkey 의 값을 가지고 initsem을 실행시켜 semid 를 얻고, 이 후에 p 와 v 함수를 수행하고 있다. 실제의 코드에서도 이와 비슷한 모양으로 사용이 될 것입니다. main 에서는 세 개의 자식 프로세스를 생성하여 동일한 handlesem 함수를 동일한 세마포어 키를 사용하여 실행시키고 있다. 하지만, fork 로 생성된 자식 프로세스는 비록 이후의 동일한 코드를 수행하지만 각자의 데이터 영역은 각자 가지므로 (부모 프로세스에서 복사해서 사용하므로) handlesem에서 어떤 지역적인 변수를 사용하여 프로세스의 실행횟수를 기록한다던지 하는 것 은 불가능하다.
Shared Memory - 공유 메모리
보통, 프로세스는 자신만의 독자적인 메모리 세그먼트를 가지게 된다. fork 로 생성된 자식 프로세스의 경우에도 대부분의 부모의 정보를 복사하게 되며 자신만의 메모리 주소공간을 확보하게 된다. 물론 쓰레드(경량 프로세스)같은 경우에는 각 쓰 레드별 주소공간을 공유할 수도 있다. 아울러 프로세스에서도 공유 라이브러리 나 프로그램 코드는 공유될 수도 있다. 물론 이러한 경우에도 데이터 영역은 각자 보유하게 되며, 코드영역은 읽기만 가능할 것이기 때문에 일반적인 프로세스의 개념에서 '원하기만 하면 모든 프로세스들이 메모리상의 일정 주소공간을 공유 하여 읽기 쓰기를 할 수 있다.'는 '공유메모리 세그먼트'의 개념은 혁신적인 것임에 틀림없다. 경우에 따라 응용 프로그램에서 아주 유용하게 사용될 수 있다. 일반적으로, 온라인 통신망의 '대화방' 시스템에서 공유메모리를 활용하는 경우가 많으며, '폰트공유' 시스템의 구성도 가능하다. 물론 그 필요성은 프로세스간의 대용량 데이터 교환 시에나, 시스템에서의 많은 프로세스들이 일정한 메모리를 공유하는 것이 필요하다거나, 이렇게 하는 것이 효율적일 경우에 사용할 수 있다.
SYSTEM CALL: shmget();
PROTOTYPE: int shmget ( key_t key, int size, int shmflg );
shmget()의 첫 번째 아규먼트는 키 값이다. 이 키 값은 커널 안에 존재하는 다른 공유 메모리 세그먼트의 키 값과 비교되어진다. 이때, 열기 나 접근 동작은 shmflg 아규먼트의 내용에 달려있다.
SYSTEM CALL: shmat();
PROTOTYPE: int shmat ( int shmid, char *shmaddr, int shmflg);
addr 아규먼트가 제로(0)이면, 커널은 매핑되지 않은 지역을 찾으려고 한다. 이것은 추천방법이다. 주소는 지정될 수 있지만, 전통적으로 독점적으로 하드웨어를 이용하거나 다른 응용프로그램과의 충돌을 피하기 위해 사용된다. SHM_RND 플래그는 넘겨진 주소에 페이지를 정렬(align)시키는 첫번째 아규먼트에 OR될 수 있다.(가장 근접한 페이지 크기로 줄여서)
게다가, SHM_RDONLY 플래그가 플래그 아규먼트에 OR되면, 공유 메모리 세그먼트는 매핑되어지지만, 읽기전용(readonly)로 표시된다.
SYSTEM CALL: shmctl();
PROTOTYPE: int shmctl ( int shmqid, int cmd, struct shmid_ds *buf );
이 특별한 호출은 메세지 큐의 msgctl 호출 이후 직접적으로 모델이 된다.
SYSTEM CALL: shmdt();
PROTOTYPE: int shmdt ( char *shmaddr );
공유 메모리 세그먼트가 프로세스에 의해 더 이상 필요가 없어진 후에, 이 시스템 호출을 호출하여 분리(detach)되어져야 한다. 앞에서도 말했듯이, 이것은 커널로부터 세그먼트를 제거하는 것과는 다르다. 분리(detach)가 성공적으로 이루어진 후, shmid_ds 구조체에 연관된 shm_nattch 멤버는 1씩 감소된다. 이값이 제로(0)에 이를때, 커널은 물리적으로 세그먼트를 제거한다.
#include
#include
#include
#include
#include
#define KEY 0x10
#define PERM 0660
#define SIZE 20
void main() {
int shmid;
char *memptr;
if((shmid= shmget(KEY, SIZE, PERM|IPC_CREAT|IPC_EXCL)) < 0) {
perror("shmget");
exit(1);
}
if((memptr= shmat(shmid, (char *)0, 0)) == (char *)(-1)) {
perror("shmat");
exit(1);
}
strcpy(memptr, "Linux is Best!");
printf("shmkey = %d, shmid = %d\n" ,KEY,shmid );
printf("memptr = %p : %s\n", memptr, memptr);
sleep(1);
printf("\nAfter shmget...\n");
system("ipcs -m");
if(shmdt(memptr) < 0) {
perror("shmdt");
exit(1);
}
if(shmctl(shmid, IPC_RMID, (struct shmid_ds *)0) < 0) {
perror("shmctl");
exit(1);
}
printf("\nAfter remove...\n");
system("ipcs -m");
}
  • 가격2,000
  • 페이지수11페이지
  • 등록일2004.08.11
  • 저작시기2004.08
  • 파일형식한글(hwp)
  • 자료번호#263039
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니