C 언어 구현 프로 세 스 간 통신 원리 분석

최근 에 운영 체제 의 병발 을 배 웠 다.다음은 프로 세 스 간 의 병발,통신 에 관 한 두 가지 방법 이다.

1:파 이 프 를 이용 하여 프로 세 스 간 통신
다음 함수 사용
  • pipe() from unistd.h
  • sleep()
  • write(), read()
  • fork(); //하위 프로 세 스
  • 만 들 기
    파 이 프 는 친연 관 계 를 가 진 프로 세 스 에 만 사용 할 수 있 습 니 다.파일 로 볼 수 있 지만 일반 파일 과 달리 파 이 프 는 한 번 에 한 프로 세 스 에 만 접근 할 수 있 고 서로 배척 할 수 있 습 니 다.
    pipe(int fd[])의 매개 변 수 는 길이 가 2 인 int 배열 로 각각 읽 기 단 fd[0],쓰기 단 fd[1]를 대표 하고 파 이 프 를 만 든 후에 f d[0],fd[1]는 파일 설명자 가 됩 니 다.
    파이프 한쪽 fd[1]의 데 이 터 를 기록 합 니 다.파이프 의 다른 한쪽 fd[0]에서 프로 세 스 가 읽 을 수 있 습 니 다(read).
    코드
    2:공유 메모리 로 통신 실현,신 호 량 상호 배척 실현
    공유 메모리 에 다음 함 수 를 사 용 했 습 니 다:
    int  shm_open (const char *name, int oflag, mode_t mode);  //공유 메모 리 를 만 들 거나 열 고 파일 설명 자 를 되 돌려 줍 니 다.
    int  ftruncate (int fd, off_t FILE_SIZE);  //공유 메모리 공간 크기 조정
    void*  mmap  ( void * addr , size_t len , int prot , int flags , int fd , off_t offset)//프로 세 스 의 주소 공간 에 파일 을 비 추고 주소 공간 을 가리 키 는 지침 을 되 돌려 줍 니 다.
    int  munmap (void *start, size_t length); //주소 맵 해제
    int  shm_unlink (const char *name); //shm 삭제open()생 성 된 공유 메모리
    함수 의 구체 적 인 용법 을 보면 링크 를 볼 수 있 고 상세 하 게 설명 할 수 있 습 니 다.
    구체 적 인 사고:
    1.프로 세 스 간 의 통신 을 실현 하 는 것 은 각 프로 세 스 간 의 데이터 교류,전송 일 뿐 입 니 다.
    1、shm_open()함 수 는 존재 하 는 공유 메모 리 를 만 들 거나 열 고 파일 설명 자 를 되 돌려 주 는 것 입 니 다.파일 을 만 들 거나 열 었 다 고 볼 수 있 습 니 다.표현 이 다 를 뿐 입 니 다.
    2.ftruncate()함수 가 파일(fd)의 크기 를 지정 하 는 데 사 용 됩 니 다.
    3.관건 적 인 절 차 는 mmap()입 니 다.지정 한 파일(fd)이나 다른 대상 을 메모리 에 투사 하여 직접 조작 할 수 있 는 포인터 대상 을 얻 습 니 다.write,read 등 을 호출 하지 않 아 도 됩 니 다.
    4.그 다음 에 사용 이 완료 되면 맵 을 해제 하고 생 성 된 공유 메모리(name)shm 를 삭제 해 야 합 니 다.unlink(),; 공유 메모리 열기 작업 을 하 는 프로 세 스에 도 이 작업 을 수행 해 야 합 니 다(1,2,3,4)
    2.그 다음 에 신 호 량 으로 상호 배척 을 실현 한다.
    서로 배척 하 는 뜻 은 프로 세 스 가 임계 구역 에서 공유 자원 에 접근 할 때 다른 프로 세 스 는 이 임계 구역 에 들 어가 공유 자원 에 접근 할 수 없다 는 것 이다.
    임계 구역 대표 프로 세 스 가 공유 자원 의 코드 에 접근 할 것 입 니 다.
    우리 가 공유 구역 에 데 이 터 를 기록 할 때,분명히 여러 프로 세 스 가 동시에 접근 하고 싶 지 않다.왜냐하면 불필요 한 번 거 로 움 을 초래 할 수 있 기 때문에,이러한 상호 배척 메커니즘 을 실현 하기 위해 신 호 량 이 필요 하 다.
    sem_t * sem_open (const char *name,int oflag, mode_t mode,unsigned int value)  //존재 하 는(name)신 호 량 을 만 들 거나 엽 니 다.
    int  sem_wait (sem_t*sem)//신 호 량(value)을 1 로 줄 이 고 신 호 량 이 0 보다 적 으 면 semwait()를 실행 하 는 프로 세 스 를 차단 합 니 다.
    임계 구역 코드 는 일반적으로 이 두 호출 사이 에 존재 합 니 다.예 를 들 어 현재 프로 세 스 는 공유 구역 에 데 이 터 를 씁 니 다.예 를 들 어 semwait 차단,자원 이 다 떨 어 졌 거나 다른 프로 세 스 가 접근 하고 있 음 을 표시 합 니 다.기 다 려 야 합 니 다.
    int  sem_post (sem_t*sem)//현재 프로 세 스 가 임계 구역 을 떠 날 때 신 호 량(value)을 1 추가 합 니 다.
    int  sem_unlink(count char*name)//신 호 량 삭제
    함수 의 구체 적 인 용법 을 보면 링크 를 볼 수 있 고 상세 하 게 설명 할 수 있 습 니 다.
    코드
    주의해 야 할 것 은:
    1:공유 메모리 와 신 호 량 을 사용 할 때 주의해 야 합 니 다.어떤 호출 은 공유 메모리 와 신 호 량 을 사용 하 는 name 이지 만,어떤 호출 은 그들의 반환 값(fd 와 semt*)
    2:하위 프로 세 스 가 생 성 되 기 전에 부모 프로 세 스 가 공유 메모리 나 신 호 량 을 만 들 었 다 면 하위 프로 세 스 는 열 필요 가 없 으 며 직접 사용 할 수 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기