giantneco’s blog

技術メモ

システムプログラミング会

システムプログラミング会に参加してきました

7/2のシステムプログラミング会に参加してきました。

募集期間が非常に短かったのですが、たまたま TL を覗いた時に見つけたのでなんとか参加申込することができてラッキーでした。

時間切れのため途中で帰ってしまったのですが、懇親会を含めると結構長い時間やっていたようです。

以下メモ。

New LLD Linker for ELF by Rui Ueyama (@rui314)

  • windows 上でもリンクできるようにしたい
    • もともとのモチベーション
  • コンパイラとかデバッガとか移植しないといけない
    • 作ってみたら意外とうまくいって、オープンソースなのでUNIXに移植しようということになった
  • 現在 GNU でないといけないのはリンカぐらいしかない
    • BSDGNU LD から移行したい
    • 現時点で BUILD WORLD とかは動く
  • MIPSに対応
  • icf オプション
    • identify content folding
      • ふつうは名前でまとめるが、このオプションをつけるとコンテンツをま とめてフォールディングする
      • 基本的にはグループ分けして内容が違ったら分割、リロケーションがさしている先が同じだったらまとめる
      • 平衡に達したらマージ可能なグループになる
  • LLD の設計としては、余計なことをしないことを主眼においている
  • GNU LD のシンボル解決
    • 引数の順序によってリンクのされ方が異なるという問題があった
    • LLDではかなり変えていて、ファイル渡す順序によらずシンボルを解決している
  • ファイルサイズはかなり小さくできている。
    • C++ で10,000行ぐらい。
  • リンク時の名前解決
    • ハッシュ使用
      • 少なくとも1回はハッシュを使う 名前解決のため ハッシュに名前を入れるのも結構時間がかかる
      • C++だと関数が 50 バイトくらいなっていたり 名前の変更がポインタの変更になっている
    • 別のファイルを読んだときに、すでにハッシュキーがあったらその先を書き換えて内容を変えたことにする
    • wrapの利用
      • ld で wrap オプションを渡すと、malloc__wrap_mallock にリンカされる。
        • もとのmalloc__real_malloc で参照可能になる
  • LLVM
    • Link Time Optimization (LTO)
      • グローバルなビューをリンカはもっている。
      • LLVMバイトコードをもっているので、リンカが名前解決をするときに そのバイトコードを使ってネイティブコードに落とす (よくわからん)
  • 今後の目標。 FreeBSDで普通に使う。カーネルのビルド。
  • ハッシュ関数
    • 早くするために何かしているか?
      • 普通のハッシュ関数を使っている
      • はやくしたらというアイディアはある
      • キーはヌル終端なものなので、strlen で結構時間を食っている
        • 長さを渡してあげれば?あるいは sha1 でできないかなど

          感想

          GNU LD についても知っているようで知らなかった話が結構聞けてよかった。

現状の GNU LD のことを考えると、案外あっさり置き換えられたりするのかも。

Kati @shinh

LLVMC++コンパイラフロントエンドつくった @Lind_pp

感想

LLVM 使うとやっぱりこういう風になりそうな気はする。

質問タイムであったように最適化とかをやりたいというような用途には向いていないっぽい。

なんかトレースする話 @nalsh

Programming TCP for responsiveness by Kazuho Oku (@kazuho)

  • http://www.slideshare.net/kazuho/programming-tcp-for-responsiveness
  • H2O HTTPサーバ
  • レスポンスのために、データが CWND を超えてTCPパケットを送信できるようになったらすぐ送信できるようにしたい
  • データは TCP send buffer と BIO buffer にためられる
  • BIO buffer は TCP send buffer からあふれた分
    • poll して SOCKET_IS_READY になった段階で書、残り 6 bit をき込むことで BIOとしてめずに済む
    • それでもまだ poll が SOCKET_IS_READY になる閾値は CWND より大きい
    • socket オプションの TCP_NOTSENT_LOWAT を 1 に設定
      • 0 だといろいろ問題が起きてしまう
    • これで CWND + 1 になったときにデータを送れるようになった
  • ただし send buffer が小さくなったことでの弊害もあり

感想

実をいうと、最初聞いたときはあんまりよくわからなかった。

あと HTTP2 もよくわかっていない。つらい。

Fron IA-32 to AVX-512

感想

ここら辺はトイレに行っていて半分くらい聞けてなかった。

ASTをXMLで表現する、というのは仕事でやったことがあるが、あんまりやらないほうがいいのかも。

L1キャッシュ @kumagi

  • Radix Sort
  • SoftWare Write Combining
    • CPU の書き込み先メモリアドレスを絞り、L1キャッシュに乗せられるよう にする
    • Intel のマニュアルに書いてある

      感想

      この話は面白かったが、あまりついていけてない。資料が公開されいたら読みたかったがなさそう。 とりあえず Intel のマニュアルと、Radix ソートについては調べておきたい

      StackExchangeでみたシステムプログラミング案件 by @hogegashi

  • https://docs.google.com/presentation/d/1Y62OO574mcnaKItgAFIO49jCkZ4lOnUY0sMyUgAwQMs/edit#slide=id.p
  • StackExchange は面白い
  • 実行中にシステムコールを全く行わないUNIXコマンドはあるか?
  • システムコールなしでシグナルをどれだけ呼び出せるか?

    感想

    ここも案外知っているつもりで知らないことが多かった。 普通のコマンドではかならずexit()が呼ばれる、というのも、言われてみればそうだがあんまり意識したことはなかったし、結構盲点を突かれた感じ。

俺々OS用スケジューラの設計と実装 by @yitabashi

  • オレオレOSスケジューラをつくったという話

REMarks by @mkasahara

  • 実行したコマンドを自動的に記録して、再度コマンドを実行する Makefile? を生成する
  • LD_PRELOAD を使用して open を入れ替えて、開いたファイルを記録
  • LD_PRELOAD でライブラリを読み込んだときに、ライブラリが procfs を open をしていたので、/proc 下を無視する必要があった

    Out-of-thin-air by @yamasa

  • メモリモデル作成の歴史
    • Double-checked loading の記事が発端
    • data race で undefined な挙動になるなら、そもそもそれを考えずに最適化してもいい(C,C++)の場合