スレッドとは
スレッドは、オペレーティングシステムが操作のスケジューリングを実行できる最小の単位です。ほとんどの場合、これはプロセスに含まれ、プロセスの実際の操作単位です。スレッドとは、プロセス内の単一の順次制御フローを指します。プロセス内で複数のスレッドを同時に実行でき、各スレッドは異なるタスクを並行して実行します。
一部のシステムでは、スレッドは軽量プロセスとも呼ばれます。軽量プロセスは通常、カーネルスレッドを指します。
プロセスには処理するスレッドが多数ある可能性があり、各スレッドは異なるタスクを並行して実行します。プロセスに完了するタスクがたくさんある場合は、多くのスレッドが必要になり、多くのコアが呼び出されます。したがって、マルチコアCPUでマルチスレッドプログラミングを使用すると、CPUをより効率的に使用できます。
マルチスレッドの例:
@Test
public void testThread() {
Thread thread1 = new Thread(() -> funA(),"Thread-1");
Thread thread2 = new Thread(() -> funB(),"Thread-2");
Thread thread3 = new Thread(() -> funC(),"Thread-3");
thread1.start();
thread2.start();
thread3.start();
}
public void funA() {
System.out.println("A1");
System.out.println("A2");
System.out.println("A3");
}
public void funB() {
System.out.println("B1");
System.out.println("B2");
System.out.println("B3");
}
public void funC() {
System.out.println("C1");
System.out.println("C2");
System.out.println("C3");
}
演算結果:
A1
C1
C2
C3
B1
A2
A3
B2
B3
スレッドスケジューリングの概略図:
スレッドの切り替え
上の図に示すように、スレッドはタスクにバインドされ、タスクはCPUで実行されます。WindowsやLinxなどのシステムでは、タスクのスケジューリングはタイムスライスプリエンプション呼び出しメソッドを使用します。タスクのステータスは、実行ステータスと準備完了ステータスに分けられます。たとえば、タスク1が準備完了状態に達すると、割り込み処理を実行し、現在のタスクに関連する実行情報(メモリに保存)を保存します。オペレーティングシステムカーネルは、次に実行できるタスクを割り当てます。タスク3に割り当てられたものが実行されます。タスク3が中断されると、タスク2にジャンプするか、タスク1に戻って、保存された実行情報を読み取り、実行を続行する場合があります。
3つのスレッド間で前後にスイッチがあります。
スレッドブロッキングスイッチは、オペレーティングシステムのカーネルをオンにする必要があり、ユーザーモードからカーネルモードへの切り替えがあります。
コルーチンとスレッド
上記のように、スレッド内のタスクのスケジューリングはカーネルによって操作され、ユーザースペースからカーネルスペースへの飛躍があり、システムパフォーマンスに貢献しないことがわかっています。そして、賢いプログラマーは、タスク間のスケジューリングを制御する一連のプログラムを作成して、タスクのスケジューリングがユーザー空間で制御されるようにしないのではないかと考えました。
コルーチンについては、ウィキペディアのコルーチンの紹介を見てみましょう。
「「コルーチンはスレッドと非常によく似ています。ただし、コルーチンは協調マルチタスクであり、スレッドは通常、プリエンプティブマルチタスクです。これは、コルーチンが並列処理ではなく並行処理を提供することを意味します。スレッドと比較して、コルーチンには、ハードリアルタイムコンテキストで使用できるという利点があり(コルーチン間の切り替えには、システムコールやブロッキング呼び出しは含まれません)、キーブロックの同期原理を保護する必要はありません。ミューテックス、セマフォなどの言語(プリミティブ)であり、オペレーティングシステムからのサポートを必要としません。先制的にスケジュールされたスレッドを使用して、呼び出し元のコードに対して透過的な方法でコルーチンを実装することは可能ですが、いくつかの利点が失われます(特に、ハードリアルタイム操作の適合性とそれらの間の比較的安価な切り替え)。
」
スレッドは協調マルチタスクの軽量スレッドであり、基本的にコルーチンと同じ概念を説明します。違いは、言わなければならない場合、コルーチンは制御フローの形式と見なすことができる言語レベルの構造であり、スレッドは発生するスレッドと見なすことができるシステムレベルの構造であるということです。並行して実行しないようにします。これらの2つの概念が優先されるかどうかは、議論の余地があります。スレッドは、コルーチンの実装と見なすことができるか、コルーチンの実現の基礎と見なすことができます。
プロセスとスレッド
スレッドは実際にサブルーチンを実行しますが、サブルーチンとは何ですか?
サブルーチンは、Javaの関数およびメソッドです。funAがfunBを呼び出し、funBがfunCを呼び出す場合、最初にfunCを実行し、次にfunBを実行し、最後にfunAを実行する必要があります。
サブルーチン全体の内部呼び出しは、スタックを介して実装されます。
では、コルーチンとサブルーチンの関係は何ですか?
実際、コルーチンもサブルーチンですが、サブルーチンの実行中に、サブルーチンの内部を中断して他のサブルーチンを実行し、次に戻って現在のサブルーチンを実行することができます。
これはCPU割り込みに少し似ていますか?
コードの一部を見てみましょう:
funA() {
println("A1");
println("A2");
println("A3");
}
funB() {
println("B1");
println("B2");
println("B3");
}
funC() {
println("C1");
println("C2");
println("C3");
}
上記のコードがコルーチンによって実行された場合、funAが実行されたときに内部的に中断され、funBが実行されたり、funCが実行されたりする可能性があります。最終結果は次のようになります。
A1
A2
C1
C3
A3
B3
B2
C2
B1
ここで、3つの関数は相互に呼び出さないことに注意してください。ここでの表示はマルチスレッドテクノロジーを使用していませんが、実行に1つのスレッドのみを使用しています。
マルチスレッドも上記の機能を実現できるのに、なぜコルーチンが誕生するのでしょうか。
コルーチンでは、サブルーチンの切り替えはスレッド間の切り替えではなく、プログラム自体によって制御されます。したがって、マルチスレッドと比較して、スレッド間を行ったり来たりするオーバーヘッドはありません。特にスレッド数が多い場合。
マルチスレッドで共有リソースを操作する必要がある場合は、ロックを使用する必要があります。さまざまなレベルのロックを使用する場合があり、オペレーティングシステムレベルのロックを使用する場合もあります。コルーチン内にある場合は、ロックを使用する必要はありません。
一般に、コルーチンはプログラム実行の効率を向上させます。システムがマルチコアの場合、マルチコアとコルーチンを使用してシステムパフォーマンスを最大化できます。
コルーチンの開発履歴について
コルーチンの概念は1990年代に最初に生まれましたが、スレッドの概念は1980年代にのみ提案されました。使用法に関する限り、コルーチンの使用はスレッドよりもはるかに広範ではありません。
近年、プログラミング言語の一部の新興企業であるGoとKotlinは、コルーチンの言語機能を導入しました。これにより、コルーチンの概念は、誰もが頻繁に視野に入れるのは非常に馴染みがないように見えます。
Java開発に携わっているプログラマーにとっては、コルーチンのことを聞いたことがないのが普通だと思います。インターネットでTencentのインタビューガイドも見て、コルーチンがあることに気づきました。
マスターする言語がGo、Kotlin、またはPythonの場合は、コルーチンについて学ぶ必要があります。大廠はこれらのことをインタビューすることを好みます。
さて、誰かがコルーチンとは何かと尋ねた場合、あなたは言うことができます:コルーチンは軽量のスレッドです。
参照
1.コルーチン-ウィキペディア、無料の百科事典(wikipedia.org)-https://zh.wikipedia.org/wiki/coroutine
2.マルチスレッド-ウィキペディア、無料の百科事典(wikipedia.org)-https://zh.wikipedia.org/wiki/Multithreading
3.コルーチン-LiaoXuefengの公式ウェブサイト(liaoxuefeng.com)-https://www.liaoxuefeng.com/wiki/897692888725344/923057403198272
過去におすすめ
QRコードをスキャンして、よりエキサイティングになります。または、WeChatでLvshen_9を検索すると、返信してバックグラウンドで情報を取得できます