Termux 開発コミュニティによる libandroid-shmem.so を Debian noroot 環境に導入する (2)

公開日:2018-11-26
最終更新:2019-02-03
※この記事は外部サイト(https://qiita.com/z80oolong/items/47ec2fde...)からのクロス投稿です

追記 (2018/12/10)

本稿及び “Termux 開発コミュニティによる libandroid-shmem.so を Debian noroot 環境に導入する“ を纏めた上で加筆修正して、下記の通り Qiita 半島に投稿しました。今後は、本稿に関する追記及び訂正は、 “Termux 開発コミュニティによる libandroid-shmem.so を Debian noroot 環境に導入する - Qiita“ にて行いますので、どうか御了承下さい。

はじめに

本稿では、先日投稿した “Termux 開発コミュニティによる libandroid-shmem.so を Debian noroot 環境に導入する“ において、 Debian noroot 環境に移植した Termux の開発コミュニティ版の libanddroid-shmem.so と、 pelya 氏による Debian noroot 環境オリジナルの libandroid-shmem.so とのパフォーマンスを比較するために、後述するテストプログラムを実行した結果について述べます。

テストプログラムについて

本稿では、テストプログラムとして、 Termux の開発コミュニティ版の libanddroid-shmem.so に同梱されている以下のプログラムを使用しました。

なお、これらのテストプログラムは、 Termux の開発コミュニティ版の libanddroid-shmem.so の git リポジトリ内test/ ディレクトリ以下の Makefile を用いてコンパイル及び実行することが出来ます。

コンパイル及び実行結果について

まず最初に、 pelya 氏による Debian noroot 環境オリジナルの libandroid-shmem.so を用いて、次のようにしてテストプログラムをコンパイルし実行すると以下の結果を得ることが出来ました。

  $ cd libandroid-shmem/test  
  $ LD_PRELOAD="/libandroid-shmem.so" make -i  
  cc -Wall -Wextra -Werror -std=c99 -DSYSV_ASHMEM_TEST_SYSTEM error-codes.c -o test-error-codes  
  ./test-error-codes  
  shmat: shmid 3039 shmaddr (nil) shmflg 0  
  ...(略)...  
  shmget: ID 0 shmid 57d70001 FD 4 size 4096  
  cc -Wall -Wextra -Werror -std=c99 -DSYSV_ASHMEM_TEST_SYSTEM ipc-private.c -o test-ipc-private  
  ./test-ipc-private  
  shmget: key 0 size 30 flags 01666 (flags are ignored)  
  shmget: bound UNIX socket /dev/shm/000057e5  
  ...(略)...  
  shm_find_id: cannot find shmid 57e50002  
  shmat: shmid 57e50002 does not exist  
  shmat-parent-from-child: Invalid argument  
  Makefile:19: recipe for target 'testcase-ipc-private' failed  
  make: [testcase-ipc-private] Error 1 (無視されました)  
  cc -Wall -Wextra -Werror -std=c99 -DSYSV_ASHMEM_TEST_SYSTEM with-key.c -o test-with-key  
  ./test-with-key  
  shmget: key 369240251 size 30 flags 01666 (flags are ignored)  
  shmget: key 369240251 != IPC_PRIVATE,  this is not supported  
  shmget: Invalid argument  
  Makefile:19: recipe for target 'testcase-with-key' failed  
  make: [testcase-with-key] Error 1 (無視されました)  
  cc -Wall -Wextra -Werror -std=c99 -DSYSV_ASHMEM_TEST_SYSTEM at-memory.c -o test-at-memory  
  ./test-at-memory  
  shmget: key 0 size 30 flags 01666 (flags are ignored)  
  shmget: bound UNIX socket /dev/shm/00005800  
  ...(略)...  
  shmat: shmid 58000001 shmaddr 0xe7afc000 shmflg 0  
  shmat: shmaddr != NULL not supported  
  shmat-child-2: Invalid argument  
  child-exit  
  Makefile:19: recipe for target 'testcase-at-memory' failed  
  make: [testcase-at-memory] Error 1 (無視されました)  
  cc -Wall -Wextra -Werror -std=c99 -DSYSV_ASHMEM_TEST_SYSTEM after-fork.c -o test-after-fork  
  ./test-after-fork  
  shmget: key 0 size 30 flags 01666 (flags are ignored)  
  shmget: bound UNIX socket /dev/shm/0000580d  
  ...(略)...  
  shmdt: unmapped addr 0xf478a000 for FD 6 ID 0 shmid 580d0001  
  shmdt: deleting shmid 580d0001  
  ./cleanup-shared-memory.sh  
  $

以上の実行結果から以下のことが判りました。

  • テストプログラム ipc-private.c において、子プロセスから親プロセスの共有メモリを shmat でメモリマッピングを行う時点でプログラムの実行が失敗する。
  • テストプログラム with-key.c において、引数 keyIPC_PRIVATE が使用できないためにプログラムの実行が失敗する。
  • テストプログラム at-memmory.c において、引数 shmaddrNULL 以外が使用できないためにプログラムの実行が失敗する。

そして、 Debian noroot 環境に移植した Termux の開発コミュニティ版の libanddroid-shmem.so を用いて、同様にテストプログラムをコンパイルし実行すると以下の結果を得ることが出来ました。

  $ cd libandroid-shmem/test  
  $ LD_PRELOAD="../libandroid-shmem-termux.so" make -i  
  cc -Wall -Wextra -Werror -std=c99 -DSYSV_ASHMEM_TEST_SYSTEM error-codes.c -o test-error-codes  
  ./test-error-codes  
  [shmem] ashv_find_local_index: cannot find shmid 3039  
  [shmem] shmat: shmid 00003039 does not exist  
  ...(略)...  
  [shmem] ashmem_create_region: name `/dev/shm/000058ca-0` size 4096  
  [shmem] shmget: ID 0 shmid 58ca0001 FD 5 size 4096  
  cc -Wall -Wextra -Werror -std=c99 -DSYSV_ASHMEM_TEST_SYSTEM ipc-private.c -o test-ipc-private  
  ./test-ipc-private  
  [shmem] shmget: bound UNIX socket /dev/shm/000058d8 in pid=22744  
  [shmem] ashv_thread_function: thread started  
  ...(略)...  
  [shmem] shmat: mapped addr 0xecc24000 for FD 11 ID 1  
  [shmem] ashv_thread_function: send FD 10 key 00000000  
  cc -Wall -Wextra -Werror -std=c99 -DSYSV_ASHMEM_TEST_SYSTEM with-key.c -o test-with-key  
  ./test-with-key  
  [shmem] shmget: bound UNIX socket /dev/shm/000058e5 in pid=22757  
  [shmem] ashv_thread_function: thread started  
  ...(略)...  
  [shmem] shmdt: unmapped addr 0xf13da000 for FD 7 ID 0 shmid 58e50001  
  [shmem] shmdt: deleting shmid 58e50001  
  cc -Wall -Wextra -Werror -std=c99 -DSYSV_ASHMEM_TEST_SYSTEM at-memory.c -o test-at-memory  
  ./test-at-memory  
  [shmem] shmget: bound UNIX socket /dev/shm/000058f4 in pid=22772  
  [shmem] shmget: key = 00000000 (is IPC_PRIVATE)  
  ...(略)...  
  [shmem] shmdt: deleting shmid 58f40001  
  [shmem] ashv_thread_function: send FD 6 key 00000000  
  cc -Wall -Wextra -Werror -std=c99 -DSYSV_ASHMEM_TEST_SYSTEM after-fork.c -o test-after-fork  
  ./test-after-fork  
  [shmem] shmget: bound UNIX socket /dev/shm/00005904 in pid=22788  
  [shmem] shmget: key = 00000000 (is IPC_PRIVATE)  
  ...(略)...  
  [shmem] shmdt: unmapped addr 0xef3b0000 for FD 6 ID 0 shmid 59040001  
  [shmem] shmdt: deleting shmid 59040001  
  ./cleanup-shared-memory.sh  
  $

以上の実行結果から、 Termux の開発コミュニティ版の libanddroid-shmem.so を用いた場合、全てのテストプログラムについて問題無くコンパイルとプログラムの実行が可能であることが判りました。

実行速度について

まず最初に、 pelya 氏による Debian noroot 環境オリジナルの libandroid-shmem.so を用いて、テストプログラム after-fork.c をベンチマークとして、以下のようにしてテストプログラムの実行時間を計測した所、以下の結果を得ることが出来ました。

  $ cd libandroid-shmem/test  
  $ time (for i in `seq 1 200`; do LD_PRELOAD="/libandroid-shmem.so" ./test-after-fork; done)  
  ...(略)...  
  shmat:  mapped addr 0xf31f0000 for FD 6 ID 0  
  shmdt: unmapped addr 0xf31f0000 for FD 6 ID 0 shmid 776a0001  
  shmdt: deleting shmid 776a0001  

  real    0m4.765s  
  user    0m0.190s  
  sys     0m1.370s  
  $ time (for i in `seq 1 200`; do LD_PRELOAD="/libandroid-shmem.so" ./test-after-fork; done)  
  ...(略)...  
  real    0m4.704s  
  user    0m0.250s  
  sys     0m1.180s  
  $ time (for i in `seq 1 200`; do LD_PRELOAD="/libandroid-shmem.so" ./test-after-fork; done)  
  ...(略)...  
  real    0m5.236s  
  user    0m0.150s  
  sys     0m1.200s  
  $

そして、 Debian noroot 環境に移植した Termux の開発コミュニティ版の libanddroid-shmem.so を用いて、同様にテストプログラム after-fork.c をベンチマークとしてテストプログラムの実行時間を計測した所、以下の結果を得ることが出来ました。

  $ cd libandroid-shmem/test  
  $ time (for i in `seq 1 200`; do LD_PRELOAD="../libandroid-shmem-termux.so" ./test-after-fork; done)  
  ...(略)...  
  [shmem] shmdt: shmaddr 0xe8582000  
  [shmem] shmdt: unmapped addr 0xe8582000 for FD 6 ID 0 shmid 1950001  
  [shmem] shmdt: deleting shmid 1950001  

  real    0m5.473s  
  user    0m0.160s  
  sys     0m1.070s  
  $ time (for i in `seq 1 200`; do LD_PRELOAD="../libandroid-shmem-termux.so" ./test-after-fork; done)  
  ...(略)...  
  real    0m5.015s  
  user    0m0.150s  
  sys     0m1.030s  
  $ time (for i in `seq 1 200`; do LD_PRELOAD="../libandroid-shmem-termux.so" ./test-after-fork; done)  
  ...(略)...  
  real    0m5.075s  
  user    0m0.140s  
  sys     0m0.970s

以上の結果から、 Debian noroot 環境に移植した Termux の開発コミュニティ版の libanddroid-shmem.so を用いた場合の方が僅かに実行時間が長くなるものの、双方の実行時間の計測を更に複数回繰り返した結果を比較すると、実行時間の差に有意差が無い事が判りました。

結論

以上のテストプログラムの実行結果及び実行速度の計測の結果から、 pelya 氏による Debian noroot 環境オリジナルの libandroid-shmem.so を用いた場合と Termux の開発コミュニティ版の libanddroid-shmem.so を用いた場合では、実行時間に有意差は現れなかったものの、 pelya 氏による Debian noroot 環境オリジナルの libandroid-shmem.so を用いた場合では、標準ライブラリ関数 shmget(3), shmat(3) 等の動作に問題が発生する場合が有り、 Termux の開発コミュニティ版の libanddroid-shmem.so を用いると、共有メモリ関連の標準ライブラリ関数の動作が安定することが判りました。

記事が少しでもいいなと思ったらクラップを送ってみよう!
18
+1
こちらは、Z.OOL.ネット信託統治領 Qrunch 諸島です。

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする