AdaでC10K

少なくともPOSIX上のAdaのTaskはカーネルスレッドとして実装されているらしい。

% uname -a
Linux ***** 2.6.18-92.1.18.el5 #1 SMP Wed Nov 12 09:19:49 EST 2008 x86_64 x86_64 x86_64 GNU/Linux
% /usr/local/gcc4.3/bin/gnat --version
GNAT 4.3.2
% /lib64/libc-2.5.so
GNU C Library stable release version 2.5, by Roland McGrath et al.

こんな感じの環境で試してみたところ、NPTLでスレッドが増えている様に見える。

試しにTaskを10K個作ってみた。

procedure C10K is
   Client_Max : constant := 10_000;

   task type Client is
      entry Die;
   end Client;


   task body Client is
   begin
      accept Die do
         null;
      end Die;
   end Client;

   Clients : array (1 .. Client_Max) of Client;

begin
   null;
end C10K;

結論から言うと、死んだ。

AdaもC10Kに対応するならばepollなり何なりを使わないとダメなようだ。