🎚️

スレッドについて

2024/02/03に公開

🔌スレッドとは?

プログラム内で実行される一連の命令の流れのことを指します。スレッドはプロセス内の最小の実行単位で、各スレッドは独自のレジスタセットとスタックを持ちますが、同じプロセス内の他のスレッドとヒープメモリ、グローバル変数、ファイルなどのリソースを共有します。

マルチスレッドプログラミングでは、複数のスレッドが並行して(または同時に)実行されます。これにより、CPUの利用率を向上させたり、I/O操作を待つ間に他のタスクを実行したりすることが可能になります。

しかし、マルチスレッドプログラミングは複雑さを増す可能性があります。例えば、複数のスレッドが同じリソースに同時にアクセスしようとすると、データの整合性が保たれない可能性があります。これを防ぐためには、適切な同期メカニズム(ミューテックス、セマフォなど)を使用する必要があります。

参考になったサイトの表現だとこんな解説ですね。

プログラムが起動してから処理を実行し終えるまでの一連の流れのこと

シングルスレッドとマルチスレッド

最近、サーバーサイドの開発でTypeScriptを使ったが、シングルスレッドで実行されるから向かないと聞いた。そもそもどういう意味か?

1️⃣シングルスレッドは1つの処理しか実行できないらしい?

シングルスレッドは処理系統が1本だけで、全ての処理を一つずつ順番にこなしていきます。二つの処理を同時に実行することはできません。

🎛️マルチスレッドは複数の処理を実行できる!

一方マルチスレッドは、必要に応じてメインスレッドから別のスレッドが枝分かれして複数の処理を平行してこなしていきます。

特性 シングルスレッドの言語(例:JavaScript, PHP, Ruby マルチスレッド対応の言語(例:Java, C#, Go, Rust
スレッド管理 一度に一つのタスクしか処理できない。しかし、非同期I/Oやイベントループを利用して並行処理を実現する。 複数のタスクを同時に処理することが可能。スレッドの生成、同期、終了などを直接制御する。
パフォーマンス CPU密集型のタスクには向かないが、I/O密集型のタスクには適している。 CPU密集型のタスクにもI/O密集型のタスクにも適している。
メモリ使用量 各タスクが同じメモリ空間を共有する。 各スレッドが独自のスタックを持つが、ヒープメモリは共有する。
デッドロック 一般的には発生しない。 スレッド間のリソース共有により、デッドロックが発生する可能性がある。
開発の複雑さ シングルスレッドなので、状態の管理が比較的簡単。 スレッド間の通信やデータの同期など、マルチスレッドプログラミングは複雑になりがち。

これらの特性を理解し、プロジェクトの要件に最も適した言語を選択することが重要です。Go言語やJavaの方が良いということか?

I/Oとは、Input/Outputの略だそうです。

参考になったサイトから引用:

I/Oとは、Input/Outputの略で「入出力」を意味しています。
コンピュータは情報を入力(Input)し、計算結果を出力(Output)するという処理を行なっていますが、これらの処理を総称してI/Oと呼んでいます。

まとめ

Web開発やアプリの開発でもコンピューターの専門用語が出てきて、最近混乱します💦
元々ITじゃない企業だと意識しないですが、ソフトウェアを作っているSierとかSESのような大きい会社だと深掘りするので、この辺の理解が必要ですね。

参考になったサイト:
https://fourm.jp/web/what-is-main-thread/
https://www.idcf.jp/words/io.html

Discussion