初期のJDK 1.0から7前後までJava VMのソースコードを読んでいましたが、java.lang.Object はその第1フィールドに「private Class _class」のようなフィールドを概念的に持っています。これは他の JVM でも同様だと思います。そしてオブジェクト(java.lang.Object)が生成される時に、_classフィールドに Class オブジェクトの参照が fill されるように動作します。 # Hotspot VM の実際の実装は _class に相当するフィールドはもっと複雑な構造をしていますが。
java.lang.Object → java.lang.Class → java.lang.ClassLoader という参照関係があり、オブジェクト指向で言うところの「A has B」という関係があるの「オブジェクトはクラスに所属し、クラスはクラスローダ―に所属する」と言えると考えています。
こう書くと java.lang.Object を継承しているはずの java.lang.Class や java.lang.ClassLoader は、そのオブジェクト生成時に Class も ClassLoader もないのにどうやって生成できるのか疑問に思われると思いますが、クラスファイルを読み込んで作られるのではなく JVM 起動時に自動生成されます。そういう点も踏まえて「Bootstrap Class Loader」という特別なクラスローダ―が用意されているわけです。
これでよければsedでできますね。 sed -n 's/^.*<version>\([0-9]\+\.[0-9]\+\.[0-9]\+\)-[0-9]\+<\/version>.*$/\1/gp' pom.xml でいいのではないでしょうか。 -n でデフォルトの出力を抑制して、sコマンドの p オプションで、マッチした行だけを出力させています。
int nlz(int x) { int c = 0; if (x == 0) return 32; if (x & 0xffff0000) { x &= 0xffff0000; c |= 0x10; } if (x & 0xff00ff00) { x &= 0xff00ff00; c |= 0x08; } if (x & 0xf0f0f0f0) { x &= 0xf0f0f0f0; c |= 0x04; } if (x & 0xcccccccc) { x &= 0xcccccccc; c |= 0x02; } if (x & 0xaaaaaaaa) { c |= 0x01; } return c ^ 31; }
中村さん初めまして、色々参考にさせてもらってます。 numofbits5 を見て思いついたんですけど int int nlz5(int b) { if(b==0)return 32; int c = (b&0xAAAAAAAA)?0x01:0; if(b&0xCCCCCCCC)c|=0x02; if(b&0xF0F0F0F0)c|=0x04; if(b&0xFF00FF00)c|=0x08; return (b&0xFFFF0000)?c|0x10:c; } とかしてみるとちょっと早くなるかなとか numofbits5のマスクそのまま使うと左から何番目とかも できたりとかいかがでしょうか
スタンフォード大学の懸賞金付きbit操作ハック集
https://graphics.stanford.edu/~seander/bithacks.html
で紹介されている方法では、
bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
で共通するマスク処理を別々に行うのではなく、
bits = (bits + (bits >> 4)) & 0x0f0f0f0f;
因数分解っぽい要領で括り出すことで、マスク演算命令を節約しています。
ただし、最初の2bit塊毎,4bit塊毎のカウント処理では、下位bit塊からの繰り上がりが上位bit塊にまで及んでしまうので、この方法は使えませんが。
最初の2bit塊毎の処理では、2bit目からの繰り下がりによりマスク操作を節約する方法を、上記サイトは紹介しています。
bits = bits - (bits >> 1 & 0x55555555);
さらに、
ビットカウントする高速アルゴリズムをPythonで実装しながら詳しく解説してみる - Qiita
https://qiita.com/zawawahoge/items/8bbd4c2319e7f7746266
では、最終的に必要なのは最下位の8bit塊だけであることに注目し、以降のマスク操作を最低限のものにしています。
結果として、こんな感じになります。
int numofbits5_stanford(long bits)
{
bits = bits - (bits >> 1 & 0x55555555);
bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333); //ここは変わらない
bits = (bits + (bits >> 4)) & 0x0f0f0f0f;
bits = bits + (bits >> 8);
return (bits + (bits >>16)) & 0x3f; //32bitの場合。
}
Javaの文法上のクラスはjava.lang.Classのオブジェクトと1対1に対応しているので、私は「文法上のクラス=java.lang.Classのインスタンス」と考えています。そう考えると異なるクラスローダ―上にある同名のクラスの扱いがうまく整理できるからです。
初期のJDK 1.0から7前後までJava VMのソースコードを読んでいましたが、java.lang.Object はその第1フィールドに「private Class _class」のようなフィールドを概念的に持っています。これは他の JVM でも同様だと思います。そしてオブジェクト(java.lang.Object)が生成される時に、_classフィールドに Class オブジェクトの参照が fill されるように動作します。
# Hotspot VM の実際の実装は _class に相当するフィールドはもっと複雑な構造をしていますが。
java.lang.Object → java.lang.Class → java.lang.ClassLoader という参照関係があり、オブジェクト指向で言うところの「A has B」という関係があるの「オブジェクトはクラスに所属し、クラスはクラスローダ―に所属する」と言えると考えています。
こう書くと java.lang.Object を継承しているはずの java.lang.Class や java.lang.ClassLoader は、そのオブジェクト生成時に Class も ClassLoader もないのにどうやって生成できるのか疑問に思われると思いますが、クラスファイルを読み込んで作られるのではなく JVM 起動時に自動生成されます。そういう点も踏まえて「Bootstrap Class Loader」という特別なクラスローダ―が用意されているわけです。
大変参考になりました。ありがとうございます。
一点だけ、
「オブジェクト(java.lang.Object) がクラス(java.lang.Class) に所属するように」
ObjectがClassに属しているのでしょうか?私が知っている限りでは、ClassはJVMがクラスをロードするときにそのクラスのClassオブジェクトを生成している役割ですが・・
とても参考になりました。ありがとうございました。
分けましょうか
旧端末Win2000SP4にインストールしてあるソフトを利用したい関係で、どうしても最新のPC環境へ移行利用したく参考に拝見させていただきました。 今からの移行作業にあって、VMwareマイアカウント登録はしているのですが、旧ソフトツールが利用できない為、困っております。
ページ内で記載されております以下ソフトを分けていただけませんでしょうか。
1.VMware-converter-4.0.1-161434.exe
2.sp4DeployTools.exe
大変恐縮ですが、お願いできますでしょうか。
よろしくお願いいたします。
ありがとうございます。
sed 1コマンドのワンライナーで抽出ができました。
およよ、入力時は問題なかったと思うんですが、コメント表示されると \ が増殖してしまいました。^^;
これでよければsedでできますね。
sed -n 's/^.*<version>\([0-9]\+\.[0-9]\+\.[0-9]\+\)-[0-9]\+<\/version>.*$/\1/gp' pom.xml
でいいのではないでしょうか。
-n でデフォルトの出力を抑制して、sコマンドの p オプションで、マッチした行だけを出力させています。
再度すみません、いつもありがとうございます。
やはり、ここ1か月ほど、うまく動作していないようです。
厚かまいお願いで恐れ入りますが、またご確認頂ければ幸甚です。
こんにちは、いつも重宝させて頂いております。
恐れ入りますが、ここ1か月ほど、うまく動作していないようです。(以前と同様、結果が返ってきません。。。)
お手数ですが、ご確認頂ければ幸甚です。
ご指摘ありがとうございます。
修正しました。
「比較操作」節の表に間違いがあります。11bの場合の擬似コード
if (Operand2[k] == Operand1[j]) {
で「==」は「!=」が正しいと思います。
2箇所typoがありました。
誤 STATIC_IF_INLNIE
正 STATIC_IF_INLINE
6.2 SQ に Send Work Request を投入する
次に送信側が Send WR を SQ に投入する。 これには ibv_post_send() を使う。 ibv_post_send() も 1 回の呼び出しで、を数珠繋ぎにした複数の Receive WR を登録できるが、この例では 1 個だけを登録している。
ーーーーーーー
"複数の Receive WR”じゃなくて、”複数の Send WR" ではないでしょうか?
ご指摘ありがとうございます。確かに BEA は関係ありませんでいsた。
御指摘ありがとうございます。
近日中に修正します。
「2. Teiid とは」に、「BEA 社の JBoss Enterprise Application Server (EAP) 上」とありますが、BEAではなくJBoss Inc.ですよね。
いつも重宝させて頂いております。恐れ入りますが、ここ2週間くらい、うまく動作していないようです。
(結果が返ってきません)
お手数ですが、ご確認頂ければ幸甚です。
初めまして、情報処理の勉強をしております。
メモリ保護について、学ばせていただきました。
ありがとうございます!
ご指摘ありがとうございます。
日記の内容を修正しました。
例の
if (-1 >= v && v >= 200)
は
if (v >= -1 && v >= 200)
ですよね?
googleで「sigaction linux SEGV_MAPERR」の検索をしてずいぶん前の記事をみつけたのですが、あまりに面白いのでここまで読んできて上記間違いを見つけました。
linux mmap SEGV
下位ビットの影響を受けてしまうので、消してあげないといけないですね。
int
nlz(int x)
{
int c = 0;
if (x == 0) return 32;
if (x & 0xffff0000) { x &= 0xffff0000; c |= 0x10; }
if (x & 0xff00ff00) { x &= 0xff00ff00; c |= 0x08; }
if (x & 0xf0f0f0f0) { x &= 0xf0f0f0f0; c |= 0x04; }
if (x & 0xcccccccc) { x &= 0xcccccccc; c |= 0x02; }
if (x & 0xaaaaaaaa) { c |= 0x01; }
return c ^ 31;
}
さささんのnlz5は正しく動かないようです。
入力値bを2のべき乗に切り下げて(ハッカーのたのしみで言うところのflip2)
最後のreturnを下記のように変更すれば意図通り動くと思います。
return 31-((b&0xFFFF0000)?c|0x10:c);
はじめまして。とても勉強になります。
有難うございました!
音楽が多い結婚式でした。
非常に良い結婚式だったね!
さささんコメントありがとうございます。
Core i5-2400 での測定では POPCNT や浮動小数点のトリックを使わないやり方では、さささんのアルゴリズムが一番高速でした。
記事を書き直しました。
中村さん初めまして、色々参考にさせてもらってます。
numofbits5 を見て思いついたんですけど
int int nlz5(int b)
{
if(b==0)return 32;
int c = (b&0xAAAAAAAA)?0x01:0;
if(b&0xCCCCCCCC)c|=0x02;
if(b&0xF0F0F0F0)c|=0x04;
if(b&0xFF00FF00)c|=0x08;
return (b&0xFFFF0000)?c|0x10:c;
}
とかしてみるとちょっと早くなるかなとか
numofbits5のマスクそのまま使うと左から何番目とかも
できたりとかいかがでしょうか
非常にわかりやすく、理解できました。ありがとうございました!
>>NTZ は比較的簡単である。 x&(-x) を行うと左側から最初に 1 が立っているアドレスのみを残して
>「右側」では?
左側は私のミスです。ページを修正しておきます。
>NTZ は比較的簡単である。 x&(-x) を行うと左側から最初に 1 が立っているアドレスのみを残して
「右側」では?
proxy_arp の設定や ip alias を用いてNWを構築しているなかで妙な現象が現れて困惑していたところ、こちらのページにたどり着き、一発で解決しました!
助かりました〜
> @koieさん
確かに例題のプログラムだとmemory orderingは関係ないですね。
実際に問題を起こしたコードはアセンブラレベルで確認して確かにmemory orderingが原因だった記憶があるのですが、簡略化したサンプルを作るうちに変わってしまったのだと思います。
ただどういう問題だったかすでに記憶があやふやで思い出せません。
volatile指定が必要なだけ?
SEGVは同期シグナルなのでメモリオーダーの問題ではないような気がします。もしそうなら
*p = a;
pause();
b = *p;
assert (a == b);
さえもあやしいということになってしまいませんか?
この情報、本当に助かりました!
はい、KENWOOD や SANYO のボイスレコーダーはかなり私の条件に近いです。
ただ soda さんもおっしゃるように登録できる mp3 ファイルやフォルダ数、プレイリストの制限が厳しいんですよね。ICレコーダーは音楽を聞くのがメインではないので仕方ない制限ですが。
あ、あと(旧機種ですが)リスト機能で選曲中は再生が止まるっていうのもちょっと不便でした。忘れてました。
条件1〜5のうち、3だけは満たしませんし、商品カテゴリもDAPじゃないんですが、ICR-PS401RM のようなICレコーダという選択肢もあるかと思います。個人的に条件5(というかエネループが使えて、電池切れになったらすぐ予備電池と交換したい)が必須なので、これの旧製品を使ってます。欠点は M3U ファイルの登録曲数の限界が99曲×5つのM3Uファイルと、少ないところでしょうか。
> uzakadeuさん
[2]のコメントでスタックと呼んだのは First-In First-Out の配列を想定していました。カーネルはスレッドスタックのサイズに制限があるので再帰関数呼び出しを使うのは難しいと思われます。
このスタックに red-black tree の各段の操作中のノードのポインタを保持しておくつもりでした。しかしよく考えると「rb_right と rb_left の両方が NULL なら free して親ノードに戻り、親側から自分を削除する」という処理を繰り返せばスタックも不要ですね。
言われてみれば、巡回する方がずっとシンプルですね。失礼しました。
「スタック〜」とは再帰を使うということでしょうか?
確認してませんが、解放するだけならループでいけそうに思えます。
> uzakadeuさん
はい。struct mytype 構造体に struct list_head を入れて「red-black tree のノード間の双方向リンク」を作っておいて、一括削除はそちらを使うという方法に逃げました。これだと計算量が O(N) のオーダーですし。
ただ最終的には black-red tree を巡回してリーフノードから削除するルーチンにしようと思っています。これも O(N) オーダーに収まりますし、余分なメモリ消費が押さえられますから。ツリーの深さ分のスタックが必要になりますが。
各ノードをツリー以外の方法(配列,リスト,etc)で“も”管理しておいて、そちらを使って解放するのはどうですか?
超亀レスだけどたまたま見かけたので一言。
RockBox入れなよ。公式ファームとは桁違いに性能が上がるから。
たとえiHPが壊れても他の対応機種にライブラリごと移行できるし。
ありがとうございます。
> なんらかの方法でパイプラインを巻き戻しているようだ。
大半のプロセッサは分岐予測と同様に、ロードも予測ミスした命令から再フェッチしているはずです。
Pentium4はリオーダバッファに細工がしてありそこから再実行すべき命令が供給されていたと思うのですが(Selective Replay)、P4とP6系ではそのへんの構造がまったく異なりますから、不採用かもしれません。
マイクロアーキテクチャ的にもP6ではP4での時ほどの効果は出ないはずですし。
> ふるかわさん
情報ありがとうございます。
Core 系はアドレスが決まったものはロードもストアも投機的に issue し、、後で memory ordering buffer が調停するようです。
実際テストプログラムを書いても 48 ロード & 32 ストアまできっちり out-of-order 実行されています。
選択的再実行そのものは原理的にはメモリデータフローの予測ミスにも使えるはずですが、L1-L2の予測ミスだけであれば、固定サイクルだけバブルを挿入するというシンプルな実装もありえます。
(そうするとメモリデーターフローのような非同期的なイベントは扱えません)
Pentium4にはSelective Replayという、ロードレイテンシを予測ミスした場合、依存する命令だけを再実行する機構がついていました。(常に1次キャッシュにヒットすると予測するんだったかな)
この例のようにメモリデータフロー依存がある場合についての動作はわかりません。
Core iがどうなっているのかもわかりません。
icysnowさん情報ありがとうございます。
製品版よりもフリーの方が対応状況が良いようですね。
製品版だとサポート対応OSでは全てテストが必要ですし、Microsoft の end of life が近づいているものは切り捨てられるのでしょうね。