애플리케이션 간에 메모리 공유하기
이 예제에서는 공유 파일을 쓰고 읽는 방법을 통해 서로 통신하는 두 개의 개별 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):
answer
는 send
의 메시지를 읽어옵니다.
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.