Universidad de Magallanes

Investigación


Dirección de Investigación


facebook twitter youtube
02 de agosto del 2019

리눅스 큐 예제

첫 번째 문서의 코드 예제에서는 공유 저장소를 사용하는 IPC의 경합 조건(파일 기반 또는 메모리 기반)의 위협을 인정했습니다. 문제는 자연스럽게 채널 기반 IPC에 대한 안전한 동시성에 대해 발생, 이 문서에서 다룰 것입니다. 파이프 및 메모리 큐에 대한 코드 예제는 POSIX 승인 스탬프가 있는 API를 사용하며 POSIX 표준의 핵심 목표는 스레드 안전입니다. 위의 출력은 발신자와 수신기가 동일한 터미널에서 시작할 수 있음을 보여줍니다. 또한 출력은 보낸 사람이 큐를 만들고, 큐에 쓰고, 종료한 후에도 메시지 큐가 지속됨을 보여 준다. 큐는 수신기 프로세스가 msgctl: POSIX 메시지 큐 API를 완전히 보여 주는 작은 테스트 프로그램을 사용하여 명시적으로 제거한 후에만 사라집니다. 진행 내용을 완전히 이해하기 위해 각 호출에 대한 설명을 확인해야 합니다. 서버는 항공편의 좌석 번호또는 이와 유사한 토큰 번호를 관리합니다. 요청 시 클라이언트에 토큰 번호를 제공하는 것은 서버의 작업입니다.

일반적인 시나리오에서는 서버에 토큰 번호를 요청하는 클라이언트가 여러 개 있을 수 있습니다. 서버의 메시지 큐 이름은 클라이언트에 알려져 있습니다. 각 클라이언트에는 서버가 응답을 게시하는 자체 메시지 큐가 있습니다. 클라이언트가 요청을 보내면 해당 메시지 큐 이름을 보냅니다. 서버는 클라이언트의 메시지 큐를 열고 응답을 보냅니다. 클라이언트는 메시지 큐에서 응답을 선택하고 해당 클라이언트의 토큰 번호를 읽습니다. 프로세스 아키텍처는 다음과 같습니다. 이름에서 알 수 있듯이 메시지 큐는 메시지 시퀀스이며 각 메시지는 두 부분으로 구성됩니다. 다음은 필수 구성 조건 : 프로세스 간 통신 메시지 큐는 커널 내에 저장되고 메시지 큐 식별자로 식별된 메시지의 연결된 목록입니다.

새 큐가 만들어지거나 msgget()에 의해 열린 기존 큐가 만들어집니다. 새 메시지는 msgsnd()에 의해 큐의 끝에 추가됩니다. 모든 메시지에는 양수 긴 정수 형식 필드, 음수가 아닌 길이 및 실제 데이터 바이트(길이에 해당)가 있으며, 모두 메시지가 큐에 추가될 때 msgsnd()에 지정됩니다. 메시지는 msgrcv()에 의해 큐에서 가져옵니다. 메시지를 선착순으로 가져올 필요가 없습니다. 대신 해당 형식 필드에 따라 메시지를 가져올 수 있습니다. mq_notify는 mqdes가 참조하는 빈 큐에 메시지가 도착했다는 비동기 알림을 등록하거나 등록 취소하기 위한 것입니다. 그림: 서버와 두 클라이언트를 보여주는 스크린샷은 Linux의 터미널에서 실행됩니다. 네 번째 터미널은 /dev/mqueue 디렉터리에서 서버 및 클라이언트 큐에 대한 파일을 표시합니다. 컴파일하려면 프로그램에 헤더 파일이 포함되어야 합니다. 이 헤더 파일은 /usr/include 디렉토리에서 찾을 수 있습니다. 예제 프로그램이 처음 실행될 때 출력은 다음과 같이 되어야 합니다: MT-Safe(다중 스레드용 MT 포함)는 mq_open 함수가 스레드 안전성을 의미하며, 이는 프로세스 안전을 의미합니다.

스레드가 실행되고 동일한 프로세스의 스레드 간에 경합 조건이 발생할 수 없는 경우 다른 프로세스의 스레드 간에 이러한 조건이 발생할 수 없습니다. MT-Safe 특성은 mq_open 호출에서 경합 조건이 발생하지 않음을 보장합니다. 일반적으로 채널 기반 IPC는 동시 안전하지만 다음 예제에서는 주의 사항도 제기됩니다.

inicio atrás arriba

DESTACADOS

  • LINKS


  • Dirección de Investigación

    Investigación • Avenida Bulnes 01890 • Punta Arenas • Chile
    Teléfono: +56 61 2 209 397 • Email: dir.investigacion@umag.cl