SlideShare a Scribd company logo
Magic Ring Buffer
@urakarin
Profile
warawara@bug.co.jp
Twitter : @urakarin
mocomocolab.com
Fujiwara Takeshi (40)
Documents
codezine
 2008 : JPEGを散歩する(色の世界, 人間の特性を生かした色表現)
http://codezine.jp/article/detail/3749
slideshare
 2009 : 身の回りの圧縮
 2009 : 色を認識する仕組み&色空間
 2009 : スケジューラから見たOSの話
http://www.slideshare.net/urakarin
社内 (BUG-LAPIN 左の社内ゼミメニュー)
 H.264, JPEGほか
http://zeppeli.bug.co.jp/xoops/
“UDP受信時 の一時バッファ”
“動画再生  の一時バッファ”
“シリアル送信の一時バッファ”
を作ってください。
Today’s theme
...なんてときに必要なものは
共通項
共通項
FIFO
First In First Out (FIFO)
Queue, Pipe
What is FIFO ?
First In First Out (FIFO)
Queue, Pipe
What is FIFO ?
First In First Out (FIFO)
Queue, Pipe
What is FIFO ?
First In First Out (FIFO)
Queue, Pipe
First In Last Out (FILO)
Stack
What is FIFO ?
First In First Out (FIFO)
Queue, Pipe
First In Last Out (FILO)
Stack
What is FIFO ?
Memory
FIFO Buffer Implementation
Memory
data
address
FIFO Buffer Implementation
memcpy
Memory
FIFO Buffer Implementation
memcpy
Memory
FIFO Buffer Implementation
Memory
FIFO Buffer Implementation
memmove
Memory
FIFO Buffer Implementation
Memory
FIFO Buffer Implementation
Memory
!?
FIFO Buffer Implementation
Memory
!? memmove ... orz
FIFO Buffer Implementation
Memory
FIFO Buffer Implementation 2
memcpy
Memory
FIFO Buffer Implementation 2
memcpy
Memory
FIFO Buffer Implementation 2
Memory
FIFO Buffer Implementation 2
memcpy
Memory
FIFO Buffer Implementation 2
Memory
FIFO Buffer Implementation 2
!?
Memory
FIFO Buffer Implementation 2
!?
Memory
・バッファをどんなに大きくしてもデータ列の位置が
進んでいくので解決しない
FIFO Buffer Implementation 2
!?
Memory
・バッファをどんなに大きくしてもデータ列の位置が
進んでいくので解決しない
バッファのお尻と頭をくっつけて、輪にしてしまおう!
FIFO Buffer Implementation 2
!?
Memory
FIFO Buffer Implementation 2
!?
Memory
Ring Buffer
(Circular Buffer)
FIFO Buffer Implementation 2
!?
Memory
Ring Buffer
(Circular Buffer)
FIFO Buffer Implementation 2
Memory
Ring Buffer
(Circular Buffer)
FIFO Buffer Implementation 2
memcpymemcpy
Memory
Ring Buffer
(Circular Buffer)
FIFO Buffer Implementation 2
memcpymemcpy
Memory
FIFO Buffer Implementation 2
memcpymemcpy
Memory
・メモリの端に到達するかどうかを毎回判定しながら、端に
到達した場合は、memcpyを2回に分けて処理する
 →ラッピング処理 (Wrap around)
FIFO Buffer Implementation 2
Ring Buffer 完成 !!
完
あれ? “Magic” は?
あれ? “Magic” は?
Wrap aroundの排除 !!
そのまえに...
iPhone5
物理メモリ 1GB仮想メモリ4GB
0x0000 0000 ∼ 0xFFFF FFFF 0x0000 0000 ∼ 0x3FFF FFFF
仮想アドレスと物理アドレス
0xFFFF FFFF
0x0000 0000
0x3FFF FFFF
物理メモリ 1GB仮想メモリ4GB
iPhone5
System
Framework他
Appでの
確保メモリ
※ アドレスサイズや位置などかなり適当
仮想アドレス
物理アドレス
仮想アドレスと物理アドレス
Page size (4KB)単位での割当
物理メモリ 1GB
iPhone5
仮想アドレスと物理アドレス
・物理アドレスが足りなくなったらどうするの?
物理メモリ 1GB
iPhone5
仮想アドレスと物理アドレス
・物理アドレスが足りなくなったらどうするの?
→HDDにPage単位で退避する(Swap out)
→iPhoneはSwap outはしないので、Read onlyのpageを
破棄したり、他のアプリにメモリの解放を求める
iPhone5
0x0000 0000
0x0000 2000
0x2F00 4000
0x8000 2000 0x2F00 4000
0x4000 2000 0x0000 2000
... ...
仮想アドレス→物理アドレス変換
0xFFFF FFFF
0x0000 0000
0x4000 2000
0x8000 2000
Memory Management Unit
MMUの持つ機能のうちの
一つがアドレス変換
0x8000 2000 0x2000 0000
... ...
0x8000 20000x8000 2000
0x8000 2000 0x2F00 4000
... ...
0x2000 0000
0x2F00 4000
別アプリから同じアドレスを指定されても混ざらない!
(他のアプリの仮想アドレス空間にはアクセスできない)
MMUのすごいところ 1
0x4000 2000 0x0000 2000
... ...
0x4000 2000 0x0000 2000
... ...
同じ物理アドレスを指すことで共有ができる!
0x4000 2000 0x4000 2000
0x0000 2000
MMUのすごいところ 2
0x4000 2000 0x0000 2000
... ...
0x4000 2000 0x0000 2000
... ...
同じ物理アドレスを指すことで共有ができる!
0x4000 2000 0x4000 2000
0x0000 2000
MMUのすごいところ 2
共有ライブラリ、共有メモリ
0x8000 2000 0x2F00 4000
... ...
0x8000 2000 0x2F00 4000
... ...
MMUのすごいところ 3
0x8000 2000
0x2F00 4000
0x2000 00000x8000 2000 0x2000 0000
... ...
fork (プロセス複製) .. iOSではできないけど..
write
大きなメモリ領域をコピーするときに、コピーしたように
見せて、実は書込みがあるまでコピーしない。
= COW (Copy On Write)
仮想アドレスは用意されるが、実体
(物理メモリ)は確保されない
fork
k
write
MMUのすごいところ 4
0x8000 2000
0x2000 0000
callocしたときに0 fillしたように見せて実はしていない
k
0x1000 0000
仮想メモリ 物理メモリ
0x8000 3000
0x8000 4000
0x8000 5000
write
calloc直後
write
calloc(4, PAGE_SIZE)
0x8000 2000 0x1000 0000
0x8000 3000 0x1000 0000
0x8000 4000 0x1000 0000
0x8000 5000 0x1000 0000
0x8000 2000 0x2000 0000
0x8000 3000 0x1000 0000
0x8000 4000 0x1000 0000
0x8000 5000 0x1000 0000
あらかじめ用意された
0 fill済みの1 page (4KB)
そして
MMUのすごいところ 5
Ring Buffer用にMirroring
k
仮想メモリ
0x8000 5000 memory_object4
0x8000 4000 memory_object3
0x8000 3000 memory_object2
0x8000 2000 memory_object1
0x8000 3000 memory_object2
0x8000 2000 memory_object1
0x8000 5000 memory_object2
0x8000 4000 memory_object1
0x8000 3000 memory_object2
0x8000 2000 memory_object1
物理メモリ
物理メモリの予約はとってあ
るが、未割当状態
0x8000 2000
0x8000 4000
? ? ?
実際のコード
buffer->length = round_page(length); // We need whole page sizes
vm_address_t bufferAddress;
kern_return_t result = vm_allocate(mach_task_self(),
&bufferAddress,
buffer->length * 2,
VM_FLAGS_ANYWHERE); // allocate anywhere it'll fit
result = 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 target
buffer->length, // size of mirror
...
mach_task_self(), // same task
bufferAddress, // mirror source
... );
https://github.com/michaeltyson/TPCircularBuffer/blob/master/TPCircularBuffer.c
Darwinの場合
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 won't ever work!
if ((ring_size & 0xffff) != 0)
return 0; 
// try to allocate and map our space
size_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/3158316
Windowsの場合
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/Ringbuffer
Linuxの場合
Demo
(Linuxの場合で)
Keywords
MMU
Paging size
PTE (Page Table Entry)
TLB (Translation Look aside buffer)
MMIO (Memory Mapped I/O)
Demand paging
Sandbox
...

More Related Content

What's hot

Flashup 12 Basic Training of Away3D
Flashup 12 Basic Training of Away3DFlashup 12 Basic Training of Away3D
Flashup 12 Basic Training of Away3DKatsushi Suzuki
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
Flashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3DFlashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3DKatsushi Suzuki
 
Flashup14 Away3d basic material setting
Flashup14 Away3d basic material settingFlashup14 Away3d basic material setting
Flashup14 Away3d basic material settingKatsushi Suzuki
 
Processing.jsでおうちハック
Processing.jsでおうちハックProcessing.jsでおうちハック
Processing.jsでおうちハックsonycsl
 
並列化による高速化
並列化による高速化 並列化による高速化
並列化による高速化 sakura-mike
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo StringsearchAkio Ishida
 
イチからはじめるLuarida-マイコン
イチからはじめるLuarida-マイコンイチからはじめるLuarida-マイコン
イチからはじめるLuarida-マイコン三七男 山本
 
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Masataka Motokurumada
 
「自動化...か、かっこいいタル」(憧れ)から始める自動化
「自動化...か、かっこいいタル」(憧れ)から始める自動化「自動化...か、かっこいいタル」(憧れ)から始める自動化
「自動化...か、かっこいいタル」(憧れ)から始める自動化Hirokazu Kutsu
 
Processing workshop v3.0
Processing workshop v3.0Processing workshop v3.0
Processing workshop v3.0Wataru Kani
 

What's hot (16)

Flashup 12 Basic Training of Away3D
Flashup 12 Basic Training of Away3DFlashup 12 Basic Training of Away3D
Flashup 12 Basic Training of Away3D
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
Flashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3DFlashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3D
 
Flashup14 Away3d basic material setting
Flashup14 Away3d basic material settingFlashup14 Away3d basic material setting
Flashup14 Away3d basic material setting
 
コルーチンの使い方
コルーチンの使い方コルーチンの使い方
コルーチンの使い方
 
Altanative macro
Altanative macroAltanative macro
Altanative macro
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
実用Brainf*ckプログラミング
実用Brainf*ckプログラミング実用Brainf*ckプログラミング
実用Brainf*ckプログラミング
 
Processing.jsでおうちハック
Processing.jsでおうちハックProcessing.jsでおうちハック
Processing.jsでおうちハック
 
並列化による高速化
並列化による高速化 並列化による高速化
並列化による高速化
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo Stringsearch
 
計算機理論入門09
計算機理論入門09計算機理論入門09
計算機理論入門09
 
イチからはじめるLuarida-マイコン
イチからはじめるLuarida-マイコンイチからはじめるLuarida-マイコン
イチからはじめるLuarida-マイコン
 
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料
 
「自動化...か、かっこいいタル」(憧れ)から始める自動化
「自動化...か、かっこいいタル」(憧れ)から始める自動化「自動化...か、かっこいいタル」(憧れ)から始める自動化
「自動化...か、かっこいいタル」(憧れ)から始める自動化
 
Processing workshop v3.0
Processing workshop v3.0Processing workshop v3.0
Processing workshop v3.0
 

Similar to Magic Ring Buffer

そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>エピック・ゲームズ・ジャパン Epic Games Japan
 
A story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kA story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kKenji Aoyama
 
coma Study Room vol.2 Arduino Workshop
coma Study Room vol.2 Arduino Workshopcoma Study Room vol.2 Arduino Workshop
coma Study Room vol.2 Arduino WorkshopEto Haruhiko
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesTakeshi Komiya
 
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオンAzure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオンYasuaki Matsuda
 
BtoCでバインド変数
BtoCでバインド変数BtoCでバインド変数
BtoCでバインド変数Yoshito Ueki
 
10分で作るクラスライブラリ
10分で作るクラスライブラリ10分で作るクラスライブラリ
10分で作るクラスライブラリ_norin_
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
オープンソース開発と、 あるフレームバッファコンソールの話 ~名古屋応用編~
オープンソース開発と、あるフレームバッファコンソールの話~名古屋応用編~オープンソース開発と、あるフレームバッファコンソールの話~名古屋応用編~
オープンソース開発と、 あるフレームバッファコンソールの話 ~名古屋応用編~nullnilaki
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めYou&I
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2Kuniaki Igarashi
 
Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうksk sue
 
全脳型アーキテクチュアHandout
全脳型アーキテクチュアHandout全脳型アーキテクチュアHandout
全脳型アーキテクチュアHandoutSeiji Koide
 
20201028 Visual IoTLT vol.5 kitazaki
20201028 Visual IoTLT vol.5 kitazaki20201028 Visual IoTLT vol.5 kitazaki
20201028 Visual IoTLT vol.5 kitazakiAyachika Kitazaki
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたことMITSUNARI Shigeo
 
201104016 osc2011 kobe
201104016 osc2011 kobe201104016 osc2011 kobe
201104016 osc2011 kobeYamauchi isamu
 
How To Build Last Fm For I Phone
How To Build Last Fm For I PhoneHow To Build Last Fm For I Phone
How To Build Last Fm For I PhoneKeisuke Hata
 

Similar to Magic Ring Buffer (20)

そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
 
A story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kA story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88k
 
coma Study Room vol.2 Arduino Workshop
coma Study Room vol.2 Arduino Workshopcoma Study Room vol.2 Arduino Workshop
coma Study Room vol.2 Arduino Workshop
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfes
 
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオンAzure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオン
 
Open VZ
Open VZOpen VZ
Open VZ
 
BtoCでバインド変数
BtoCでバインド変数BtoCでバインド変数
BtoCでバインド変数
 
10分で作るクラスライブラリ
10分で作るクラスライブラリ10分で作るクラスライブラリ
10分で作るクラスライブラリ
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
Zigbee Study
Zigbee StudyZigbee Study
Zigbee Study
 
Storyboard
StoryboardStoryboard
Storyboard
 
オープンソース開発と、 あるフレームバッファコンソールの話 ~名古屋応用編~
オープンソース開発と、あるフレームバッファコンソールの話~名古屋応用編~オープンソース開発と、あるフレームバッファコンソールの話~名古屋応用編~
オープンソース開発と、 あるフレームバッファコンソールの話 ~名古屋応用編~
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2
 
Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃう
 
全脳型アーキテクチュアHandout
全脳型アーキテクチュアHandout全脳型アーキテクチュアHandout
全脳型アーキテクチュアHandout
 
20201028 Visual IoTLT vol.5 kitazaki
20201028 Visual IoTLT vol.5 kitazaki20201028 Visual IoTLT vol.5 kitazaki
20201028 Visual IoTLT vol.5 kitazaki
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
 
201104016 osc2011 kobe
201104016 osc2011 kobe201104016 osc2011 kobe
201104016 osc2011 kobe
 
How To Build Last Fm For I Phone
How To Build Last Fm For I PhoneHow To Build Last Fm For I Phone
How To Build Last Fm For I Phone
 

More from Takeshi Fujiwara

More from Takeshi Fujiwara (6)

2015圧縮ゼミ
2015圧縮ゼミ2015圧縮ゼミ
2015圧縮ゼミ
 
Scheduler2014
Scheduler2014Scheduler2014
Scheduler2014
 
Scheduler2012
Scheduler2012Scheduler2012
Scheduler2012
 
スケジューラからみたOSの話
スケジューラからみたOSの話スケジューラからみたOSの話
スケジューラからみたOSの話
 
色を認識する仕組みと色空間
色を認識する仕組みと色空間色を認識する仕組みと色空間
色を認識する仕組みと色空間
 
身の回りの圧縮
身の回りの圧縮身の回りの圧縮
身の回りの圧縮
 

Magic Ring Buffer