Magic Ring Buffer@urakarin
Profilewarawara@bug.co.jpTwitter : @urakarinmocomocolab.comFujiwara Takeshi (40)
Documentscodezine 2008 : JPEGを散歩する(色の世界, 人間の特性を生かした色表現)http://codezine.jp/article/detail/3749slideshare 2009 : 身の回りの圧縮 200...
“UDP受信時 の一時バッファ”“動画再生  の一時バッファ”“シリアル送信の一時バッファ”を作ってください。Today’s theme
...なんてときに必要なものは
共通項
共通項FIFO
First In First Out (FIFO)Queue, PipeWhat is FIFO ?
First In First Out (FIFO)Queue, PipeWhat is FIFO ?
First In First Out (FIFO)Queue, PipeWhat is FIFO ?
First In First Out (FIFO)Queue, PipeFirst In Last Out (FILO)StackWhat is FIFO ?
First In First Out (FIFO)Queue, PipeFirst In Last Out (FILO)StackWhat is FIFO ?
MemoryFIFO Buffer Implementation
MemorydataaddressFIFO Buffer Implementation
memcpyMemoryFIFO Buffer Implementation
memcpyMemoryFIFO Buffer Implementation
MemoryFIFO Buffer Implementation
memmoveMemoryFIFO Buffer Implementation
MemoryFIFO Buffer Implementation
Memory!?FIFO Buffer Implementation
Memory!? memmove ... orzFIFO Buffer Implementation
MemoryFIFO Buffer Implementation 2
memcpyMemoryFIFO Buffer Implementation 2
memcpyMemoryFIFO Buffer Implementation 2
MemoryFIFO Buffer Implementation 2
memcpyMemoryFIFO Buffer Implementation 2
MemoryFIFO Buffer Implementation 2
!?MemoryFIFO Buffer Implementation 2
!?Memory・バッファをどんなに大きくしてもデータ列の位置が進んでいくので解決しないFIFO Buffer Implementation 2
!?Memory・バッファをどんなに大きくしてもデータ列の位置が進んでいくので解決しないバッファのお尻と頭をくっつけて、輪にしてしまおう!FIFO Buffer Implementation 2
!?MemoryFIFO Buffer Implementation 2
!?MemoryRing Buffer(Circular Buffer)FIFO Buffer Implementation 2
!?MemoryRing Buffer(Circular Buffer)FIFO Buffer Implementation 2
MemoryRing Buffer(Circular Buffer)FIFO Buffer Implementation 2
memcpymemcpyMemoryRing Buffer(Circular Buffer)FIFO Buffer Implementation 2
memcpymemcpyMemoryFIFO Buffer Implementation 2
memcpymemcpyMemory・メモリの端に到達するかどうかを毎回判定しながら、端に到達した場合は、memcpyを2回に分けて処理する →ラッピング処理 (Wrap around)FIFO Buffer Implementation 2
Ring Buffer 完成 !!完
あれ? “Magic” は?
あれ? “Magic” は?Wrap aroundの排除 !!
そのまえに...
iPhone5物理メモリ 1GB仮想メモリ4GB0x0000 0000 ∼ 0xFFFF FFFF 0x0000 0000 ∼ 0x3FFF FFFF仮想アドレスと物理アドレス0xFFFF FFFF0x0000 00000x3FFF FFFF
物理メモリ 1GB仮想メモリ4GBiPhone5SystemFramework他Appでの確保メモリ※ アドレスサイズや位置などかなり適当仮想アドレス物理アドレス仮想アドレスと物理アドレスPage size (4KB)単位での割当
物理メモリ 1GBiPhone5仮想アドレスと物理アドレス・物理アドレスが足りなくなったらどうするの?
物理メモリ 1GBiPhone5仮想アドレスと物理アドレス・物理アドレスが足りなくなったらどうするの?→HDDにPage単位で退避する(Swap out)→iPhoneはSwap outはしないので、Read onlyのpageを破棄したり、他...
iPhone50x0000 00000x0000 20000x2F00 40000x8000 2000 0x2F00 40000x4000 2000 0x0000 2000... ...仮想アドレス→物理アドレス変換0xFFFF FFFF0x0...
0x8000 2000 0x2000 0000... ...0x8000 20000x8000 20000x8000 2000 0x2F00 4000... ...0x2000 00000x2F00 4000別アプリから同じアドレスを指定されて...
0x4000 2000 0x0000 2000... ...0x4000 2000 0x0000 2000... ...同じ物理アドレスを指すことで共有ができる!0x4000 2000 0x4000 20000x0000 2000MMUのすごい...
0x4000 2000 0x0000 2000... ...0x4000 2000 0x0000 2000... ...同じ物理アドレスを指すことで共有ができる!0x4000 2000 0x4000 20000x0000 2000MMUのすごい...
0x8000 2000 0x2F00 4000... ...0x8000 2000 0x2F00 4000... ...MMUのすごいところ 30x8000 20000x2F00 40000x2000 00000x8000 2000 0x200...
MMUのすごいところ 40x8000 20000x2000 0000callocしたときに0 fillしたように見せて実はしていないk0x1000 0000仮想メモリ 物理メモリ0x8000 30000x8000 40000x8000 5000w...
そして
MMUのすごいところ 5Ring Buffer用にMirroringk仮想メモリ0x8000 5000 memory_object40x8000 4000 memory_object30x8000 3000 memory_object20x80...
実際のコード
buffer->length = round_page(length); // We need whole page sizesvm_address_t bufferAddress;kern_return_t result = vm_alloc...
void *ptr = 0;while (!ptr && num_retries-- != 0){void * target_addr = VirtualAlloc(0, ring_size * 2, MEM_RESERVE, PAGE_NOA...
char path[] = "/dev/shm/ring-buffer-XXXXXX";int file_descriptor;void *address;int status;file_descriptor = mkstemp (path);...
Demo(Linuxの場合で)
KeywordsMMUPaging sizePTE (Page Table Entry)TLB (Translation Look aside buffer)MMIO (Memory Mapped I/O)Demand pagingSandbo...
Upcoming SlideShare
Loading in …5
×

Magic Ring Buffer

1,456 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,456
On SlideShare
0
From Embeds
0
Number of Embeds
23
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Magic Ring Buffer

  1. 1. Magic Ring Buffer@urakarin
  2. 2. Profilewarawara@bug.co.jpTwitter : @urakarinmocomocolab.comFujiwara Takeshi (40)
  3. 3. Documentscodezine 2008 : JPEGを散歩する(色の世界, 人間の特性を生かした色表現)http://codezine.jp/article/detail/3749slideshare 2009 : 身の回りの圧縮 2009 : 色を認識する仕組み&色空間 2009 : スケジューラから見たOSの話http://www.slideshare.net/urakarin社内 (BUG-LAPIN 左の社内ゼミメニュー) H.264, JPEGほかhttp://zeppeli.bug.co.jp/xoops/
  4. 4. “UDP受信時 の一時バッファ”“動画再生  の一時バッファ”“シリアル送信の一時バッファ”を作ってください。Today’s theme
  5. 5. ...なんてときに必要なものは
  6. 6. 共通項
  7. 7. 共通項FIFO
  8. 8. First In First Out (FIFO)Queue, PipeWhat is FIFO ?
  9. 9. First In First Out (FIFO)Queue, PipeWhat is FIFO ?
  10. 10. First In First Out (FIFO)Queue, PipeWhat is FIFO ?
  11. 11. First In First Out (FIFO)Queue, PipeFirst In Last Out (FILO)StackWhat is FIFO ?
  12. 12. First In First Out (FIFO)Queue, PipeFirst In Last Out (FILO)StackWhat is FIFO ?
  13. 13. MemoryFIFO Buffer Implementation
  14. 14. MemorydataaddressFIFO Buffer Implementation
  15. 15. memcpyMemoryFIFO Buffer Implementation
  16. 16. memcpyMemoryFIFO Buffer Implementation
  17. 17. MemoryFIFO Buffer Implementation
  18. 18. memmoveMemoryFIFO Buffer Implementation
  19. 19. MemoryFIFO Buffer Implementation
  20. 20. Memory!?FIFO Buffer Implementation
  21. 21. Memory!? memmove ... orzFIFO Buffer Implementation
  22. 22. MemoryFIFO Buffer Implementation 2
  23. 23. memcpyMemoryFIFO Buffer Implementation 2
  24. 24. memcpyMemoryFIFO Buffer Implementation 2
  25. 25. MemoryFIFO Buffer Implementation 2
  26. 26. memcpyMemoryFIFO Buffer Implementation 2
  27. 27. MemoryFIFO Buffer Implementation 2
  28. 28. !?MemoryFIFO Buffer Implementation 2
  29. 29. !?Memory・バッファをどんなに大きくしてもデータ列の位置が進んでいくので解決しないFIFO Buffer Implementation 2
  30. 30. !?Memory・バッファをどんなに大きくしてもデータ列の位置が進んでいくので解決しないバッファのお尻と頭をくっつけて、輪にしてしまおう!FIFO Buffer Implementation 2
  31. 31. !?MemoryFIFO Buffer Implementation 2
  32. 32. !?MemoryRing Buffer(Circular Buffer)FIFO Buffer Implementation 2
  33. 33. !?MemoryRing Buffer(Circular Buffer)FIFO Buffer Implementation 2
  34. 34. MemoryRing Buffer(Circular Buffer)FIFO Buffer Implementation 2
  35. 35. memcpymemcpyMemoryRing Buffer(Circular Buffer)FIFO Buffer Implementation 2
  36. 36. memcpymemcpyMemoryFIFO Buffer Implementation 2
  37. 37. memcpymemcpyMemory・メモリの端に到達するかどうかを毎回判定しながら、端に到達した場合は、memcpyを2回に分けて処理する →ラッピング処理 (Wrap around)FIFO Buffer Implementation 2
  38. 38. Ring Buffer 完成 !!完
  39. 39. あれ? “Magic” は?
  40. 40. あれ? “Magic” は?Wrap aroundの排除 !!
  41. 41. そのまえに...
  42. 42. iPhone5物理メモリ 1GB仮想メモリ4GB0x0000 0000 ∼ 0xFFFF FFFF 0x0000 0000 ∼ 0x3FFF FFFF仮想アドレスと物理アドレス0xFFFF FFFF0x0000 00000x3FFF FFFF
  43. 43. 物理メモリ 1GB仮想メモリ4GBiPhone5SystemFramework他Appでの確保メモリ※ アドレスサイズや位置などかなり適当仮想アドレス物理アドレス仮想アドレスと物理アドレスPage size (4KB)単位での割当
  44. 44. 物理メモリ 1GBiPhone5仮想アドレスと物理アドレス・物理アドレスが足りなくなったらどうするの?
  45. 45. 物理メモリ 1GBiPhone5仮想アドレスと物理アドレス・物理アドレスが足りなくなったらどうするの?→HDDにPage単位で退避する(Swap out)→iPhoneはSwap outはしないので、Read onlyのpageを破棄したり、他のアプリにメモリの解放を求める
  46. 46. iPhone50x0000 00000x0000 20000x2F00 40000x8000 2000 0x2F00 40000x4000 2000 0x0000 2000... ...仮想アドレス→物理アドレス変換0xFFFF FFFF0x0000 00000x4000 20000x8000 2000Memory Management UnitMMUの持つ機能のうちの一つがアドレス変換
  47. 47. 0x8000 2000 0x2000 0000... ...0x8000 20000x8000 20000x8000 2000 0x2F00 4000... ...0x2000 00000x2F00 4000別アプリから同じアドレスを指定されても混ざらない!(他のアプリの仮想アドレス空間にはアクセスできない)MMUのすごいところ 1
  48. 48. 0x4000 2000 0x0000 2000... ...0x4000 2000 0x0000 2000... ...同じ物理アドレスを指すことで共有ができる!0x4000 2000 0x4000 20000x0000 2000MMUのすごいところ 2
  49. 49. 0x4000 2000 0x0000 2000... ...0x4000 2000 0x0000 2000... ...同じ物理アドレスを指すことで共有ができる!0x4000 2000 0x4000 20000x0000 2000MMUのすごいところ 2共有ライブラリ、共有メモリ
  50. 50. 0x8000 2000 0x2F00 4000... ...0x8000 2000 0x2F00 4000... ...MMUのすごいところ 30x8000 20000x2F00 40000x2000 00000x8000 2000 0x2000 0000... ...fork (プロセス複製) .. iOSではできないけど..write大きなメモリ領域をコピーするときに、コピーしたように見せて、実は書込みがあるまでコピーしない。= COW (Copy On Write)仮想アドレスは用意されるが、実体(物理メモリ)は確保されないforkkwrite
  51. 51. MMUのすごいところ 40x8000 20000x2000 0000callocしたときに0 fillしたように見せて実はしていないk0x1000 0000仮想メモリ 物理メモリ0x8000 30000x8000 40000x8000 5000writecalloc直後writecalloc(4, PAGE_SIZE)0x8000 2000 0x1000 00000x8000 3000 0x1000 00000x8000 4000 0x1000 00000x8000 5000 0x1000 00000x8000 2000 0x2000 00000x8000 3000 0x1000 00000x8000 4000 0x1000 00000x8000 5000 0x1000 0000あらかじめ用意された0 fill済みの1 page (4KB)
  52. 52. そして
  53. 53. MMUのすごいところ 5Ring Buffer用にMirroringk仮想メモリ0x8000 5000 memory_object40x8000 4000 memory_object30x8000 3000 memory_object20x8000 2000 memory_object10x8000 3000 memory_object20x8000 2000 memory_object10x8000 5000 memory_object20x8000 4000 memory_object10x8000 3000 memory_object20x8000 2000 memory_object1物理メモリ物理メモリの予約はとってあるが、未割当状態0x8000 20000x8000 4000? ? ?
  54. 54. 実際のコード
  55. 55. buffer->length = round_page(length); // We need whole page sizesvm_address_t bufferAddress;kern_return_t result = vm_allocate(mach_task_self(),&bufferAddress,buffer->length * 2,VM_FLAGS_ANYWHERE); // allocate anywhere itll fitresult = vm_deallocate(mach_task_self(),bufferAddress + buffer->length,buffer->length);vm_address_t virtualAddress = bufferAddress + buffer->length;result = vm_remap(mach_task_self(),&virtualAddress, // mirror targetbuffer->length, // size of mirror...mach_task_self(), // same taskbufferAddress, // mirror source... );https://github.com/michaeltyson/TPCircularBuffer/blob/master/TPCircularBuffer.cDarwinの場合
  56. 56. void *ptr = 0;while (!ptr && num_retries-- != 0){void * target_addr = VirtualAlloc(0, ring_size * 2, MEM_RESERVE, PAGE_NOACCESS);if (target_addr) {VirtualFree(target_addr, 0, MEM_RELEASE);// is ring_size a multiple of 64k? if not, this wont ever work!if ((ring_size & 0xffff) != 0)return 0; // try to allocate and map our spacesize_t alloc_size = ring_size * 2;HANDLE mapping;if (!(mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE,(unsigned long long)alloc_size >> 32,alloc_size & 0xffffffffu, 0)) ||!(ptr = (char *)MapViewOfFileEx(mapping, FILE_MAP_ALL_ACCESS, 0, 0,ring_size, target_addr)) ||!MapViewOfFileEx(mapping, FILE_MAP_ALL_ACCESS, 0, 0,ring_size, (char *)target_addr + ring_size)){// something went wrong - clean up... UnmapViewOfFile(), CloseHandle()}}}return ptr;https://gist.github.com/rygorous/3158316Windowsの場合
  57. 57. char path[] = "/dev/shm/ring-buffer-XXXXXX";int file_descriptor;void *address;int status;file_descriptor = mkstemp (path);status = unlink (path);buffer->count_bytes = 1UL << order;buffer->write_offset_bytes = 0;buffer->read_offset_bytes = 0;status = ftruncate (file_descriptor, buffer->count_bytes);buffer->address = mmap (NULL, buffer->count_bytes << 1, PROT_NONE,MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);address = mmap (buffer->address,buffer->count_bytes, PROT_READ | PROT_WRITE,MAP_FIXED | MAP_SHARED, file_descriptor, 0);address = mmap (buffer->address + buffer->count_bytes,buffer->count_bytes, PROT_READ | PROT_WRITE,MAP_FIXED | MAP_SHARED, file_descriptor, 0);status = close (file_descriptor);http://en.wikipedia.org/wiki/RingbufferLinuxの場合
  58. 58. Demo(Linuxの場合で)
  59. 59. KeywordsMMUPaging sizePTE (Page Table Entry)TLB (Translation Look aside buffer)MMIO (Memory Mapped I/O)Demand pagingSandbox...

×