[질문] 간단한 공유메모리 관련 질문 입니다^^

toughguy의 이미지

안녕하세요~
공유메모리에 대해 열씸히 공부하는 중입니당~

근데 궁금한것이, 공유메모리에 Linked List 처럼 동적으로 변하는 메모리의 영역도 공유메모리에 올릴 수 있는지 궁금합니다.

가능하다면, 메모리 공간은 어떻게 잡아 줘야 하나요 ..??

소중한 답변 기다리겠습니다^^

cmoh1110의 이미지

man shmat shmget 등을 해보시면 될 거 같습니다.
동적으로 변한다고 특별히 모양새가 달라진다거나 그럴 거는 없을 듯 합니다.
동기화가 필요할 거 같긴 한데요.

toughguy의 이미지

shmat은 공유메모리 주소 가져 오는 것이고,
shmget은 sm id 가져 오는 것이지요~?

그럼 내가 공유할 List 의 첫번째 주소를 공유하면, 해당 List를 모두 가져 올 수 있는건가요~?

GENIUS의 이미지

리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축

공유메모리를 이용하여 시스템 리눅스 기반 웹 hmi 시스템을 개발했지요.
핵심커널로 공유메모리를 사용하고 있습니다.
라이브러리로 만들어서 사용하고 있고, 오래되어서 많은 내용을 생각나지 않는 군요.

다만 공유 메모리를 생성하기 위해서는 메모리의 고유 키가 필요 합니다. 고유키를 기준으로 메모리의
스타트 부분을 잡습니다.
키를 이용하여 여러개의 같은 메모리의 페이지를 구성할수도 있습니다.
이것은 같은 스트럭처를 가지고 있는 여러개의페이지를 구성하여 보고 싶을때 접근하는 방법이지요. 몇개까지의 페이지가 생성되는지는
알수 없습니다.
그리고

두개의 프로그램이 같은 스트럭처함수를 공유하여 컴파일한후 이스트럭처를 가지고 같은 키로 공유메모리를 생성하면
두 프로그램은 같은 메모리를 공유 할수 있습니다.
쓰고 읽기를 할수가 있지요.

동시에 같은 메모리에 접근하여 읽고 쓰는 것을 방지하기 위해서 아~~~세마포를 사용할수도 있지요. 비몽사몽간이라 생각이 잘아나네요.

...

ubiquitous@webmon.co.kr

그럼 이만.

리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축

toughguy의 이미지

음.. 그런데 공유메모리를 계속 공부하고 있는데
클래스는 공유메모리에 올릴 수 없는 건가요...

아래는 간단한 예제 코드 입니다.

int nSharedMem = shmget((key_t)9999 , sizeof(CPacket *) , 0666 | IPC_CREAT );
void * pGetData = shmat(nSharedMem,(void*)0,0);

CPacket * newPacket = new CPacket;
newPacket = (CPacket*)data;

newPacket->InsertServerName("MyServer");

void * pGetData_1 = shmat(nSharedMem,(void*)0,0);
CPacket * getPacket;
getPacket = (CPacket*)pGetData_1;

cout getPacket->GetServerName() endl;

이렇게 하면,
출력에서 MyServer가 나올거라 예상했는데, 아무것도 출력되지 않네요 ㅜㅜ
공유메모리론, 클래스를 공유할 수 없는건가요 ㅠㅠ

sunyzero의 이미지

공유메모리에서 주어지는 주소값은 페이지맵핑을 통해서 리턴되어진 가상 주소일뿐입니다.

모든 프로세스에서 보는 주소값이 같을 수는 없습니다.

따라서 정상적인 방법으로 포인터값(address)를 이용하는 공유메모리상의 linked list 는 구현할 수 없습니다. 정히 구현할려면 포인터값을 직접 대입하는게 아니라 인덱스값을 가지고 있어서 시작 주소번지에 곱해서 알아낸다든지 하는 변환을 사용해야 합니다.

꼭 기억해두실것이 공유메모리의 주소값은 맵핑하는 순간 결정되는 것이므로
모든 프로세스에서 동일한 주소가 얻어지는 것은 아니라는 점만 기억해두시면 됩니다.
========================================
* 부분이 전체를 대변하는 하나의 속성일때 진리이다.
영속적이지 못한 것은 전체가 될 수 없다.

========================================
* The truth will set you free.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.