공유메로리 질문!!

vilinux의 이미지

공유 메로리에 대해 잘모르겠습니다.

지금 fork 생성해서 부모하고 자식하고 따로 프로그램을 돌리거든요.
근데 전역 변수로 선언하고도 각각 프로세서간에 공유가 안되네요.

공유 메로를 써서 부모에서쓰면 자식에서 그걸 참조 하는형식의
간단한 Test프로그램이라도 좀 부탁합니다.
이런 게시판에 이렇게 올리면 안되지만 초짜라서 책을 봐도 이해가 안가네요!
너무 힘들당.......
짧은 지식이라도 좀....부탁드려용~~~~^^;

progcom의 이미지

전역 변수라는건 각각의 '프로세스'가 가지고 있는 것이므로 공유가 안됩니다. 단지 하나의 소스 파일 안에서 함수로 넘기지 않으면서 쓸 수 있다는 것일 뿐입니다.

공유 메모리 쓰는건 간단합니다.
shm_open으로 열어서 mmap으로 매핑하고, shm_unlink로 닫으면 됩니다.
일반 파일 가지고 놀듯이 read, write 콜로 읽고 쓰면 끝입니다.

(각 함수에 관한 설명은 man 페이지를 읽어보세요)

purewell의 이미지

^^ 닫는 거는 close, 메모리 객체를 삭제하는게 shm_unlink일 겁니다.
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

익명 사용자의 이미지

fork해서 사용하려면 굳이 shm 쓸 필요 없이 /dev/zero를 mmap해서 사용하시면 편합니다. (이렇게 하면 부모-자식 사이에 메모리 영역을 공유할 수 있습니다.)

자세한 것은 man mmap이나 Stevens의 Advanced Programming in the Unix Environment를 참조하세요.

gamdora의 이미지

혹시 지금 만들어 놓은 풀그림 크기가 작다면

fork를 쓰는 다중 프로세스를

pthread를 쓰는 다중 쓰레드로 바꾸는 건 어떠세요?

다중 쓰레드는 메모리 영역을 공유하기 때문에

따로 공유 메모리 객체를 만들 필요가 없습니다.

powerson의 이미지

지금 말씀하시는 공유메모리가 system V에서 말하는 IPC에 대한 내용을 말씀하시는건지 아니면 단지 변수들에 대한 공유를 말씀하시는건지 모르겠습니다. 암튼 우선 system V에서 말하는 IPC는 어떠한 부분의 메모리를 공유메모리로 설정을 해서 process들간에 메모리 공유를 하여서 통신을 하도록 해놓은 매커니즘입니다. 만약 이게 아니라 단순히 변수들에 대한 공유는 fork를 사용하시면 안되고, thread 구조로 가셔야만 확인하실 수 있습니다. 왜냐하면 fork는 모든 process context를 복사를 하는것이지 공유를 하는 구조가 아닙니다. 즉 forking된 child process의 전역변수와 parent process의 전역변수의 메모리는 서로 틀린 곳이라는 겁니다. 하지만, thread에서는 서로 틀린 곳이 아니라 동일 메모리 영역을 access하기 때문에 공유한다라고 하는 겁니다. 그래서 multi thread 프로그래밍 할 경우에는 전역변수 등과 같이 공유되는 메모리는 locking을 사용해서 공유 메모리에 대해서 memory coherency를 보장하도록 프로그램 알고리즘을 짜야 합니다. 또는 가급적 local 변수를 사용해서 공유하지 않는 방식으로 구성하는게 좋습니다.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.