スレッドの(というか並行処理の)歴史

Twitterから転載

ふとスレッドっていつ発明されたんだろうと調べてみたけどよくわからない。Linuxカーネルスレッドをサポートしたのが2.6からで2003年とか意外と新しい??もちろんユーザレベルのスレッドはもっと古いんだろうけど、いつからだろう。

hideaki_t: NeXTSTEP(Mach 2.0?)にはcthreadがありました。

atsuoishimoto: 私がスレッドって用語初めて聞いたのは、たしか'90年代初頭のOS/2だったかなぁ?

これが2004年の話か>NetBSD 2.x+, and DragonFly BSD implement LWPs as kernel threads (1:1 model)

shidocchi: 私は院の研究室でMachのソースリーディングをやってた頃知った。

これが2001年 > October 2, 2001 Mac OS X v10.1…real-time threads, thread management,

シングルタスク→協調的マルチタスクプリエンプティブマルチタスク(だけど1プロセス1スレッド)→だからUnixはパイプでプロセスを繋いだ→でも共有するデータが大きいと大変ね→(データを共有できる)プロセスの中にもっと細かい実行単位つくろう→ユーザスレッド→カーネルスレッド、という流れだと思っているナウ

koyama41: pthreadが1995でSolarisのlibthreadが1993、UNIX的起源はその頃かと http://download.oracle.com/docs/cd/E19253-01/819-0390/mtintro-75924/index.html

Simulaが67年でSmalltalkを挟んでアクターモデルが73年か

ホーアがコンカレントパスカルで導入したモニタの概念が、Javaに採用されたことで広く普及したが、その結果適材適所でない使われ方もされるようになって、アーランやスカラによってアクターモデルに再び注目が集まる様になった、という理解。あとクロージャはなんかよくわからないことに挑戦中。

(この辺、スレッドの起源が見つからないので並行性に話が広がっている)

Tweetしてなかったけど、タイムシェアリングシステムの提案が1957年、MITによるタイムシェアリングシステムの実現可能性を示すデモが1961年、IBMによる商用のタイムシェアリングシステム採用OSのリリースが1967年。
ダイクストラによるセマフォが1965年、アクターモデルが1973年、ホーアのモニタが1974年、Javaのリリースが1995年。pthreadも95年。だいたいそんな感じの時間の流れらしい。スレッドって意外と若いな〜と思った。

TODO: ハードウェア割り込みはいつ発明されたのか?



追記:

ksmakoto: 「軽量プロセス」って呼んでた時代が

kosaki55tea: プロセスよりもスレッドの方が古いと思うんですよ。文献さがせないけど。仮想空間管理がないOSとかだと自動的にスレッドしかないわけで

AkioHoshi @kosaki55tea @nishio 横から失礼します。Machオペレーティングシステムの基本コンセプトに「タスクとスレッド」があって、1987年頃に日本で開かれたDECUSで萩谷昌己さんが紹介しています。UNIXのネイティブスレッドはその後から。

uebayasi: ググッたらすぐfaqs.orgが出てきたんですけど、Usenetなんて古すぎてご存じないですよね。。。orz

[2.2.3] The history of threads http://www.faqs.org/faqs/os-research/part1/section-10.html

terazzo ぐぐったところ「軽量のプロセスをほいほい作れるの重要」ってアイデアhttp://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.41.3458&rep=rep1&type=pdfによるとTHOTH(http://cseweb.ucsd.edu/classes/wi08/cse221-a/papers/cheriton79.pdf) あたりから来たらしい



The history of threads http://www.faqs.org/faqs/os-research/part1/section-10.html のざっくり訳:

処理の流れを「スレッド」と呼ぶのはいつからか?遅くとも1965年にはBerkeley Timesharing Systemでと呼んでいた。しかしそれまでに並行性の概念がなかったのではなく、当時は「プロセス」と呼ばれていた。(ダイクストラの65年の論文でも) この「プロセス」は(いまUnix的な意味で想像するプロセスと違って)共有メモリを持ったりセマフォを使って排他したりしてた。

1970年にMax SmithがMultics上でスレッドのプロトタイプを作っていて、これは1つの重量プロセスに複数のスタックを持たせる試みだった。

プログラミング言語における「スレッド」の創始者はおそらくIBMによるPL/I(1965〜)で、これは`CALL XXX (A, B) TASK;'という構文を持っていた。これはXXX用にスレッドをforkする。この機能を実装したコンパイラがあったのかどうかはわからない。Multicsがどう設計されているのかをよく調べて作られていた。たとえばTASKコールはプロセスにマップされないし、スレッド間どうしはメモリが丸見え。しかしMulticsは方向を変え、IBMはTASKの機能をPL/Iから削除した。

そしてUnixが出現する。Unixは「プロセス」という言葉を「スレッド+仮想アドレス空間」の意味に使った。(ちなみにUnixのこの記法はMulticsから直接継承されたものだ) そういうわけで、Unix的な意味での「プロセス」は仮想アドレス空間の切り替えを伴う重たいものになってしまった。プロセスはそれぞれが個別にアドレス空間を持ってるからメモリを共有することはできないが、パイプやシグナルを使って相互作用することはできた。共有メモリの機能が追加されるのはもっと後の話。

しばらくたって、Unixユーザは昔の「メモリを共有できるプロセス」を懐かしむようになった。これがいわゆる「スレッド」の発明の引き金を引いた。スレッドとは、一つのUnixプロセスが持っている仮想アドレス空間を共有する「オールドスタイルのプロセス」のことなんだ。Unixプロセスが重たいことと対比して「軽量プロセス」という表現もなされた。この「軽量プロセス」「重量プロセス」という区別は70年代後半から80年代前半、最初の「マイクロカーネル」まで遡ることができる。