Main Content

애플리케이션 간에 메모리 공유하기

이 예제에서는 공유 파일을 쓰고 읽는 방법을 통해 서로 통신하는 두 개의 개별 MATLAB® 프로세스를 구현하는 방법을 보여줍니다. 두 프로세스는 메모리 공간의 일부를 파일 내 공통 위치에 매핑하는 방법으로 파일을 공유합니다. 첫 번째 프로세스에 속하여 메모리 맵에 수행된 쓰기 연산을 두 번째 프로세스에 속하는 맵에서 읽어들일 수 있고, 그 반대도 가능합니다.

한 MATLAB 프로세스(send.m 실행)가 메모리 맵을 통해 파일에 메시지를 씁니다. 이에 더해 파일의 1바이트에 메시지의 길이도 씁니다. 이는 상대 프로세스에 사용 가능한 메시지가 있음을 알리는 수단으로 기능합니다. 두 번째 프로세스(answer.m 실행)가 1바이트를 모니터링하다 이 값이 설정된 것을 보는 순간 수신된 메시지를 표시하고, 대문자로 변환하고, 전송자에게 메시지를 에코합니다.

이 예제를 실행하기 전에 send 함수와 answer 함수를 현재 작업 디렉터리에 있는 send.m 파일과 answer.m 파일에 복사하십시오.

send 함수

이 함수는 사용자로부터 텍스트 입력을 받은 다음 메모리 매핑을 사용하여 이 텍스트를 answer 함수를 실행하고 있는 다른 MATLAB 인스턴스에 전달합니다.

function send
% Interactively send a message to ANSWER using memmapfile class.
 
filename = fullfile(tempdir, 'talk_answer.dat');
 
% Create the communications file if it is not already there.
if ~exist(filename, 'file')
    [f, msg] = fopen(filename, 'wb');
    if f ~= -1
        fwrite(f, zeros(1,256), 'uint8');
        fclose(f);
    else
        error('MATLAB:demo:send:cannotOpenFile', ...
              'Cannot open file "%s": %s.', filename, msg);
    end
end
 
% Memory map the file.
m = memmapfile(filename, 'Writable', true, 'Format', 'uint8');
 
while true
    % Set first byte to zero, indicating a message is not
    % yet ready.
    m.Data(1) = 0;
 
    str = input('Enter text (or RETURN to end): ', 's');
 
    len = length(str);
    if (len == 0)
        disp('Terminating SEND function.')
        break;
    end
    
    % Warn if the message is longer than 255 characters.
    if len > 255
        warning('ml:ml','SEND input will be truncated to 255 characters.');
    end
    str = str(1:min(len,255));  % Limit message to 255 characters.
    len = length(str); % Update len if str has been truncated. 
    
    % Update the file via the memory map.
    m.Data(2:len+1) = str;
    m.Data(1)=len;
   
 
    % Wait until the first byte is set back to zero, 
    % indicating that a response is available.
    while (m.Data(1) ~= 0)
        pause(.25);
    end
    
    % Display the response.
    disp('response from ANSWER is:')
    disp(char(m.Data(2:len+1))')
   
end

answer 함수

answer 함수는 메모리 매핑을 사용하여 send에서 수신되는 메시지를 모니터링하는 서버를 시작합니다. 메시지가 수신되면 answer는 메시지를 대문자 버전으로 대체한 후 새 메시지를 send로 돌려보냅니다. answer를 사용하려면 입력값 없이 호출하십시오.

function answer
% Respond to SEND using memmapfile class.

disp('ANSWER server is awaiting message');

filename = fullfile(tempdir, 'talk_answer.dat');

% Create the communications file if it is not already there.
if ~exist(filename, 'file')
    [f, msg] = fopen(filename, 'wb');
    if f ~= -1
        fwrite(f, zeros(1,256), 'uint8');
        fclose(f);
    else
        error('MATLAB:demo:answer:cannotOpenFile', ...
              'Cannot open file "%s": %s.', filename, msg);
    end
end

% Memory map the file.
m = memmapfile(filename, 'Writable', true, 'Format', 'uint8');

while true
    % Wait until the first byte is not zero.
    while m.Data(1) == 0
        pause(.25);
    end
    
    % The first byte now contains the length of the message.
    % Get it from m.
    msg = char(m.Data(2:1+double(m.Data(1))))';

    % Display the message.
    disp('Received message from SEND:')
    disp(msg)
    
    % Transform the message to all uppercase.
    m.Data(2:1+double(m.Data(1))) = upper(msg);
   
    % Signal to SEND that the response is ready.
    m.Data(1) = 0;
end

예제 실행하기

예제가 어떤 식으로 실행되는지 보려면 먼저 동일한 컴퓨터 시스템에서 2개의 개별 MATLAB 세션을 시작하십시오. 한 MATLAB 세션에서는 입력값 없이 send 함수를 호출합니다. 다른 세션에서는 answer 함수를 호출하여 양쪽 프로세스 메모리에서 공통 파일로 맵을 생성합니다.

첫 번째 MATLAB 세션에서 send를 실행합니다.

send
Enter text (or RETURN to end):

두 번째 MATLAB 세션에서 answer를 실행합니다.

answer
ANSWER server is awaiting message

다음으로, send 함수에 의해 표시되는 프롬프트에 메시지를 입력합니다. 그러면 MATLAB이 이 메시지를 공유 파일에 씁니다. answer 함수를 실행하는 두 번째 MATLAB 세션이 공유 파일의 1바이트에 대해 루프를 실행하여 모니터링하다 send에 의해 이 바이트에 값이 쓰이면 answer가 메모리 맵을 통해 파일에서 메시지를 읽어옵니다. 그런 다음 answer 함수가 메시지를 대문자로 변환하고 파일에 쓰면 응답을 대기 중이던 send가 메시지를 읽어와서 표시합니다.

send는 메시지를 쓰고 대문자로 된 응답을 읽어옵니다.

Hello. Is there anybody out there?
response from ANSWER is:
HELLO. IS THERE ANYBODY OUT THERE?
Enter text (or RETURN to end): 

answersend의 메시지를 읽어옵니다.

Received message from SEND:
Hello.  Is there anybody out there?

send 함수에 의해 표시되는 프롬프트에 두 번째 메시지를 입력합니다. 그러면 send가 두 번째 메시지를 파일에 씁니다.

I received your reply.
response from ANSWER is:
I RECEIVED YOUR REPLY.
Enter text (or RETURN to end):

answer가 두 번째 메시지를 읽어와서 대문자로 변환하고 이 메시지를 파일에 씁니다.

Received message from SEND:
I received your reply.

첫 번째 MATLAB 인스턴스에서 Enter 키를 눌러 예제를 종료합니다.

Terminating SEND function.