タグ付けされた質問 「io」

システムとのデータの入出力。これは通常、ファイルストレージまたはネットワーク通信を意味しますが、ユーザーインターフェイスを介したユーザーとの対話を意味する場合もあります。

5
IOモナドが世界で動作する状態モナドと見なされているという批判
IOHaskellではモナドは、多くの場合、状態は世界でStateモナドとして説明します。したがって、IO aモナド型の値はのようなものと見なされますworldState -> (a, worldState)。 しばらく前に、私はこの見解を批判し、それが正しくない理由をいくつか示した記事(またはブログ/メーリングリストの投稿)を読みました。しかし、記事も理由も思い出せません。誰もが知っていますか? 編集:記事は失われたようですので、ここからさまざまな議論を集めましょう。 私は物事をより面白くするための賞金を始めています。 編集:私が探していた記事は、厄介な部隊への取り組みです:サイモンペイトンジョーンズによるHaskellでのモナド入力/出力、同時実行、例外、および外国語呼び出し。(TacTicsの回答に感謝します。)

6
なぜI / Oを待たなければならないのですか?
ディスク操作が遅いことは常に知られており、それらが遅い理由はわかっています。ここでの質問は、なぜI / Oを待たなければならないのか、なぜIOWaitなどのようなものがあるのか​​ということです。 バックグラウンドでいくつかのI / Oタスクを実行しているとき、コンピューターが基本的にかなり遅くなることに気づいたことを意味します。Linuxを使用している場合、より長いI / Oタスクを実行している場合は特に、OSは完了するまでほとんど使用できなくなります。 確かに、私は記事でもこのトピックを見つけました、スニペットがあります: I / O待機は12.1%です。このサーバーには8つのコアがあります(cat / proc / cpuinfoを使用)。これは非常に近い(1/8コア= 0.125) つまり、基本的にはコンピューターの速度がかなり低下しているということです。なぜですか?つまり、通常のコンピューターは少なくとも2コアであり、ハイパースレッディングなどの理由で4コア以上である場合もあります。しかし今、問題はCPUが実際にそこに留まらなければならない理由であり、実際にはIOを待つ以外に何もしませんか?私はプロセス管理の基本的なアイデアやアーキテクチャを意味しますが、今ではそれがOSに起因するのか、それともハードウェアの部分に起因するのかわかりませんが、CPUが待機したり、定期的にチェックし、実際には他の多くのタスクを実行し、準備ができたときにのみIOプロセスに戻ります。確かに、それがそのような困難なタスクであり、CPUが待たなければならないのであれば、なぜ ハードウェアによってより効率的に管理されていますか?たとえば、ある種のミニCPUがあり、それを待って、プロセスに戻ったらすぐにデータのごく一部を実際のCPUに配信します。そのため、プロセスが繰り返されます。実際にデータコピープロセスにCPUコア全体を捧げる...または、この種のものを発明し、そのためにノーベル賞を受賞すべきだろうか?:S さてさて、私は今、オブザーバーの観点から実際にそれを入れています、そして私は本当にそのトピックに深く入っていませんが、CPUがHDDの速度で動作しなければならない理由を本当に理解していません別のことをして、準備ができたらHDDに戻ってください。そのアイデアは、そのIO操作またはコピープロセスなどを必要とするアプリケーションを高速化することではありませんが、その操作の実行中にCPU消費に最小限の影響を与え、OSが他のプロセスおよびユーザーに利用できるようにすることですコピー操作を行うときに一般的なコンピューターの遅延を感じる必要はありません...
28 cpu  io  operations 

2
Pythonでユニバーサル改行モードが非推奨になったのはなぜですか?
私はちょうどことに気づいユニバーサル改行ファイル操作の機能は、その方法アウトになるようです。 Python 3.5 openのmodeパラメーターのドキュメントには、非推奨であることが示されています。 'U' ユニバーサル改行モード(非推奨) 少なくともPython 3.2までさかのぼりopen、mode引数の使用法を文書化するときに、同様の「後方互換性のみ」の警告が含まれています。 'U' ユニバーサル改行モード(後方互換性のため。新しいコードでは使用しないでください) Python 2.7でも、同様の警告がのドキュメントに記載されていますio.open。 この理由は何ですか?
26 python  io  deprecation 

4
文字列を連結して1回呼び出すよりも、println()を頻繁に呼び出すのはどれほど悪いでしょうか?
この質問は、Software Engineering Stack Exchangeで回答できるため、Code Review Stack Exchangeから移行されました。 5年前に移行され ました。 コンソールへの出力はコストのかかる操作であることは知っています。コードを読みやすくするために、長いテキスト文字列を引数として使用するのではなく、関数を呼び出してテキストを2回出力する方がよい場合があります。 たとえば、どれだけ効率が悪いのか System.out.println("Good morning."); System.out.println("Please enter your name"); 対 System.out.println("Good morning.\nPlease enter your name"); 例では、違いは1回の呼び出しのみprintln()ですが、それ以上の場合はどうなりますか? 関連するメモでは、印刷するテキストが長い場合、ソースコードを表示しているときにテキストの印刷に関連するステートメントが奇妙に見えることがあります。テキスト自体を短くすることができないと仮定すると、何ができますか?これは、複数のprintln()呼び出しが行われる場合ですか?誰かがコード行を80文字(IIRC)を超えてはならないと言っていたので、どうしますか System.out.println("Good morning everyone. I am here today to present you with a very, very lengthy sentence in order to prove a point about how it …
23 java  c++  performance  c  io 

5
どの時点でディスクI / Oの非同期読み取りが同期より効率的ですか?
複数のコンシューマー向けにファイルを読み取るコードが少しあり、ファイルのサイズは任意であると仮定します。ファイルを非同期で読み取る方がどのサイズで効率がよくなりますか?別の言い方をすれば、同期的に読み取るためだけにファイルを高速化するには、ファイルをどれだけ小さくする必要がありますか? 私は、非常に小さなファイルを読み取るとき、同期(特に.NET)よりも非同期で読み取るのに時間がかかることに気付きました(そしておそらく私は間違っています)。これは、I / O完了ポート、スレッドなどのセットアップ時間に関係していると思います。 ここに役立つ経験則はありますか?それとも、システムと環境に依存していますか?
22 efficiency  async  io 

4
Cで変数のデータ型を指定する必要があるのはなぜですか
通常、Cでは、変数宣言でデータの種類をコンピューターに伝える必要があります。たとえば、次のプログラムでは、2つの浮動小数点数XとYの合計を出力します。 #include<stdio.h> main() { float X=5.2; float Y=5.1; float Z; Z=Y+X; printf("%f",Z); } 変数Xの型をコンパイラーに伝える必要がありました。 コンパイラXはそれ自身で型を決定できませんか? はい、これを行うとできます: #define X 5.2 コンパイラーに次のようなタイプを伝えることなく、プログラムを作成できるようになりXました。 #include<stdio.h> #define X 5.2 main() { float Y=5.1; float Z; Z=Y+X; printf("%f",Z); } したがって、C言語には何らかの種類の機能があり、それを使用してデータのタイプを独自に判別できることがわかります。私の場合、それXはfloat型であると判断されました。 main()で何かを宣言するとき、なぜデータのタイプに言及しなければならないのですか?なぜコンパイラは、自身の中に変数のデータ型を判断することはできませんmain()、それはでませんよう#define。

2
DMAコントローラーはどのように機能しますか?
セクション5.1.4からのダイレクトメモリアクセスアンドリュー・タネンバウム、ハーバート・ボス、2014年までに近代オペレーティングシステム、 説明を簡単にするために、図5-4に示すように、CPU、メモリ、I / Oデバイスを接続する単一のシステムバスを介して、CPUがすべてのデバイスとメモリにアクセスすると仮定します。 DMAがどのように機能するかを説明するために、DMAが使用されていないときにディスク読み取りがどのように発生するかをまず見てみましょう。 最初に、ディスクコントローラは、ブロック全体がコントローラの内部バッファに格納されるまで、ブロック(1つまたは複数のセクタ)をドライブからビットごとにシリアルに読み取ります。 次に、チェックサムを計算して、読み取りエラーが発生していないことを確認します。次に、コントローラーが割り込みを発生させます。オペレーティングシステムが実行を開始すると、ループを実行することで、コントローラーのバッファーからディスクブロックを一度に1バイトまたは1ワードずつ読み取り、各反復でコントローラーデバイスレジスタから1バイトまたは1ワードを読み取り、メインメモリに格納できます。 Q:2番目のステップでは、 データは「コントローラーのバッファー」からメインメモリーに転送されませんか?「コントローラのバッファから」と「コントローラデバイスのレジスタから」の両方が表示されるのはなぜですか? 2番目のステップでは、コントローラーはCPUに割り込むことなく、OSを再度関与させることなく、バッファーからメインメモリにデータを転送できますか? DMAを使用する場合、手順は異なります。 まず、CPUはレジスタを設定してDMAコントローラーをプログラムし、何をどこに転送するかを認識します(図5-4のステップ1)。 また、ディスクから内部バッファーにデータを読み取り、チェックサムを検証するように指示するコマンドをディスクコントローラーに発行します。 有効なデータがディスクコントローラーのバッファーにある場合、DMAを開始できます。DMAコントローラは、バス経由でディスクコントローラに読み取り要求を発行することにより、転送を開始します(ステップ2)。この読み取り要求は他の読み取り要求のように見え、ディスクコントローラーは、それがCPUから来たのかDMAコントローラーから来たのかを知りません(または気にしません)。通常、書き込み先のメモリアドレスはバスのアドレスライン上にあるため、ディスクコントローラーは内部バッファーから次のワードをフェッチするときに、書き込み先を認識します。メモリへの書き込みは、別の標準バスサイクルです(ステップ3)。 書き込みが完了すると、ディスクコントローラーは確認応答信号をDMAコントローラーにバス経由で送信します(ステップ4)。DMAコントローラは、使用するメモリアドレスをインクリメントし、バイトカウントをデクリメントします。バイトカウントがまだ0より大きい場合、カウントが0に達するまで手順2〜4が繰り返されます。 その時点で、DMAコントローラーはCPUに割り込み、転送が完了したことを知らせます。オペレーティングシステムは、起動時にディスクブロックをメモリにコピーする必要はありません。すでにそこにあります。 Q:2番目のステップで、DMAコントローラーはディスクコントローラーにデータをディスクコントローラーのバッファーからメインメモリに転送するように要求します。最初のステップで、CPUはディスクコントローラにコマンドを発行し、ディスクから内部バッファにデータを読み込むように指示します。同時に、ディスクコントローラーがディスクからディスクコントローラーのバッファーへのデータの転送を完了したときに、CPUがディスクコントローラーのバッファーからメインメモリにデータを転送するようにディスクコントローラーに指示できるので、 DMAコントローラーは、ディスクコントローラーのバッファーからメインメモリにデータを転送するようにディスクコントローラーに指示しますか?(ディスクとメインメモリ間のデータ転送にDMAコントローラーが必要な理由が理解できないので、見積もりを理解するために重要な何かを見逃していると思います)。 デバイスのデバイスコントローラーは、デバイスを制御し、デバイスで操作を実行します。DMAコントローラーはどのデバイスで操作を制御および実行しますか? ありがとう!


2
準備完了と完了非同期IOメモリ使用量
Rustでの非同期IOの実装に関するこの講演を見ていましたが、Carlは2つの潜在的なモデルに言及しています。準備と完了。 準備モデル: ソケットから読み取ることをカーネルに指示します しばらく他のことをする… カーネルは、ソケットの準備ができたときに通知します あなたが読む(バッファを埋める) 必要なことは何でもしてください バッファーを解放します(Rustで自動的に発生します) 完了モデル: カーネルが満たすようにバッファを割り当てます しばらく他のことをする… カーネルは、バッファがいっぱいになると通知します データで必要なことを何でもする バッファを解放する レディネスモデルを使用するCarlの例では、使用可能なメモリを反復処理して、グローバルバッファを埋め、解放することで、メモリの使用量を大幅に減らすことができます。 今私の仮定: ソケットが「準備完了」であると言われる内部(カーネル空間内)では、データは既に存在します。ネットワーク経由で(またはどこからでも)ソケットに入り、OSはデータを保持しています。 そのメモリ割り当てがレディネスモデルで魔法のように行われないというわけではありません。OSがそれをあなたから抽象化しているだけです。完了モデルでは、OSは、データが実際に流入する前にメモリを割り当てるように求めており、何が起きているかが明らかです。 準備モデルの修正版は次のとおりです。 ソケットから読み取ることをカーネルに指示します しばらく他のことをする… 修正:データはOSに送られます(カーネルメモリの一部) カーネルは、ソケットの準備ができたことを通知します 読み取ります(上記のカーネルバッファーとは別のバッファーを埋めます(または、ポインターを取得しますか?)) 必要なことは何でもしてください バッファーを解放します(Rustで自動的に発生します) /私の仮定 私はたまたまユーザースペースプログラムを小さく保つのが好きですが、実際にここで何が起こっているのかを明確にしたかったのです。1つのモデルが本質的に少ないメモリを使用したり、より高いレベルの同時IOをサポートしたりすることはありません。私はこれについての考えとより深い説明を聞きたいです。
12 async  io 

7
TDDを読み取り/書き込み機能に適用するにはどうすればよいですか?
鶏と卵の問題のようです。 何らかのデータストアに書き込み関数を書き込むことはできますが、テスト済みの読み取り関数がなければ適切に保存したことを知ることはできません。 読み取り関数をデータストアから読み取ることができますが、テストされた書き込み関数なしで、データストアにデータを読み込むにはどうすればよいですか? 編集: SQLデータベースに接続してトランザクションを作成し、使用するオブジェクトを保存およびロードしています。DBが提供するアクセス関数をテストする意味はありませんが、このようなDB関数をラップしてオブジェクトをシリアル化/逆シリアル化します。DBとの間で適切なものを正しく読み書きしていることを確認したいと思います。 @snowmanが言及しているように、追加/削除とは異なります。私が書いた内容が正しいことを知りたいのですが、それには十分にテストされた読み取り機能が必要です。読んだときに、書いたものと同等のオブジェクトが正しく読まれたことを確認したい。ただし、十分にテストされた書き込み関数が必要です。
10 tdd  io 

3
Linuxで書き込み中にファイルを読み取る
私が理解しているように、ファイルが書き込まれているとき、ファイルへの書き込みプロセスは排他ロックを取得します。したがって、他のプロセスはこのファイルにアクセスして読み取ることができません。 上記の知識があるため、ブラウザがまだビデオをダウンロードしているときに、メディアプレーヤーでビデオを再生する方法を理解できません。
9 linux  io  locks 

5
成功するまで繰り返し、失敗を処理するループを構築する方法
私は独学のプログラマーです。私は約1.5年前にプログラミングを始めました。今、私は学校でプログラミングクラスを始めました。プログラミングクラスは1/2年間ありましたが、今はもう半分あります。 クラスでは、C ++でプログラミングする方法を学びます(これは、始める前に、私がすでにかなりよく使用することを知っていた言語です)。 このクラスでは何の問題もありませんでしたが、明確な解決策を見つけることができなかった問題が繰り返し発生しています。 問題は次のようになります(疑似コード): do something if something failed: handle the error try something (line 1) again else: we are done! これはC ++の例です このコードはユーザーに数値の入力を求め、入力が有効になるまで入力を続けます。cin.fail()入力が無効かどうかを確認するために使用します。ときcin.fail()であるtrue私が呼び出す必要がありますcin.clear()し、cin.ignore()ストリームからの入力を取得し続けることができるように。 このコードはをチェックしないことを知っていますEOF。私たちが書いたプログラムは、そうすることを期待されていません。 これが私が学校での課題の1つでコードを書いた方法です。 for (;;) { cout << ": "; cin >> input; if (cin.fail()) { cin.clear(); cin.ignore(512, '\n'); continue; } break; } 私の先生は、私はこれを使うべきではないbreakとcontinue言っていました。彼は代わりにレギュラーwhileかdo ... whileループを使うべきだと提案しました。 …

5
Cでデータのタイプをprintf()に通知する必要があるのはなぜですか?
このCコードを考えてみましょう: #include <stdio.h> main() { int x=5; printf("x is "); printf("%d",5); } これで、私たちが書いたときに整数であるint x=5;ことをコンピューターに伝えましたx。コンピュータはそれxが整数であることを覚えておく必要があります。しかし、xin の値を出力するときは、整数であるprintf()ことをコンピューターに再度通知する必要xがあります。何故ですか? なぜコンピュータはそれxが整数だったことを忘れるのですか?
8 c  io  type-safety 

3
JavaのファイルI / Oには何が適していますか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 4年前休業。 三人のうち BufferedReader / Writer バイナリストリーム チャンネル JavaでのファイルI / Oの現実において どちらがより好ましいのですか?それはなぜですか? バイナリデータをファイルに入れたり読み取ったりするためのチャネルと、文字列データ用のBufferedReader / Writerを好みます
8 java  io 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.