過去ログ
ふとスレッドっていつ発明されたんだろうと調べてみたけどよくわからない。
(この辺、スレッドの起源が見つからないので並行性に話が広がっている)
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年代前半、最初の「マイクロカーネル」まで遡ることができる。
無害なおっさん: いわゆるスレッドはMachよりV(1981~)のほうが先ですね。
soda