comp.lang.ada
 help / color / mirror / Atom feed
From: Hadrien Grasland <hadrien.grasland@gmail.com>
Subject: Re: RFC: Prototype for a user threading library in Ada
Date: Fri, 24 Jun 2016 14:06:58 -0700 (PDT)
Date: 2016-06-24T14:06:58-07:00	[thread overview]
Message-ID: <f4c3e42a-1aa1-4667-83d7-de6f81a8fdd2@googlegroups.com> (raw)
In-Reply-To: <nkfeqn$nl8$1@franka.jacob-sparre.dk>

Le jeudi 23 juin 2016 03:42:50 UTC+2, Randy Brukardt a écrit :
> "Hadrien Grasland" wrote :
> ...
> >I agree that implementation support for coroutines would be extremely 
> >valuable, if it
> >were available at the language level (as in Python, C#, Go...) or even in 
> >specific
> >implementations (as in Visual C++).
> 
> Coincidentally, we just spent quite substantial portion of the most recent 
> ARG meeting discussing this. (See AI12-0197-1; there are proposed 
> alternatives as well but those won't get posted for a few weeks - probably 
> along with the minutes.)

Count me pleasantly surprised!


> The problem with such proposals is that they are quite expensive to 
> implement, and they don't seem to buy that much above the existing Ada 
> tasking model. [Especially as the proposal explicitly does not support any 
> concurrency; one has to use POs/atomics in the normal way if concurrency is 
> needed.] (After all, if you really want coroutines in Ada, just use 
> Janus/Ada and regular tasks as it implements all tasks that way. :-)
> 
> The problem with the Janus/Ada implementation is the inability to use 
> threads to implement that; that's fixable but I'd need a customer to help 
> support the work. (I'd use a scheme internal to the task supervisor similar 
> to your "events" rather than trying to assign tasks to threads.)

I would be happy to beta-test that feature if you also integrated Ada 2012 support along the way! :)

That aside, let me explain what I think coroutines are good for. When people turn to threads, they usually look for some of the following things:

1. Exploiting the concurrent processing abilities of modern hardware (multicore, hyper-threading)
2. Providing the illusion of simultaneously running tasks to their users, in a fashion that extends beyond actual hardware concurrency.
3. Hide various kinds of latencies (IO, decision-making) by doing other processing in the meantime.
4. Handle IO-heavy workloads, the typical example being a web server going through millions of requests per second.

Unfortunately, no single threading implementation can be good at all of these. And outside the embedded world, the average modern OS is optimized to provide the best possible illusion of infinite multitasking through round-robin thread scheduling, and managing threads at the kernel level so that the kernel may quickly switch between them on clock interrupts instead of delegating that task to user processes.

Sadly, this setup is terrible for concurrent application performance, as can be easily tested by running a multithreaded computation with overcommitted CPU resources. If you allocate even just 2 times as many OS threads as you have hardware threads, you observe a huge performance drop. Why? Because instead of leaving computations alone, your OS keeps switching between threads during execution, each time doing a round trip through the kernel and trashing the CPU cache. There is no such thing as free concurrent lunch.

For IO-heavy applications, the situation is even worse: you will pay the aforementioned overhead not only at the scheduling rate of your round-robin algorithm (typically ~1 kHz), but every single time your application blocks for IO. This is why no web server application that allocates one OS thread per connection can scale to more than a couple thousand connections per second.

So if you don't desire the illusion of perfect multitasking, it is better to give up on the user convenience of round robin and use some batch-derived task scheduling algorithm instead. Which, because asking your customers to modify their OS kernel configuration is not usually acceptable, entails only allocating as many OS threads as there are hardware threads, and managing the remainder of your concurrency in user mode. Ergo, we need user threads, which are easiest to implement on top of language-level coroutine support.


> ...
> >However, I think that as it stands, we are just about as likely to see it 
> >happening in Ada as we are to get lambdas ...
> 
> We also talked about limited lambdas in Pisa: see AI12-0190-1. So you're 
> obviously right. ;-)

I stand once again pleasantly corrected, then :) Though I have to admit that in an Ada context, I miss first-class functions more than I miss lambdas: you can relatively easily replace a lambda with an expression function declared at the appropriate scope, but you need an awful lot of function-specific boilerplate in order to produce a standalone function object that can be easily transmitted to an outer scope after capturing some local state.


> The problem I have with the library approach (and the coroutines and the 
> like intended to support it) is that it does seem to solve any problems. I 
> understand why such approaches get used in languages that don't have a real 
> tasking model, but Ada hasn't had that problem since day 1. And the reasons 
> that writing tasking code in Ada is too hard aren't getting addressed by 
> these schemes (that is, race conditions, deadlocks [especially data 
> deadlocks], and the like).
>
> I'd prefer to concentrate on language features that make it as easy to write 
> (restricted and correct) parallel code as it is to write sequential code. I 
> don't see how libraries or coroutines or lambdas are getting us any closer 
> to that.
>
> I'd like to understand better the motivations for these features, so if you 
> (or anyone else) wants to try to explain them to me, feel free. (But keep in 
> mind that I tend to be hard to convince of anything these days, so don't 
> bother if you're going to give up easily. ;-)

See above. Being able to easily write highly concurrent code is of limited use if said code ends up running with terrible performance because modern OSs are not at all optimized for this kind of workload. We shouldn't need to worry about how our users' OS kernels are setup, and user threading and coroutines are a solution to this problem.

Not that I am against also providing abstractions that make concurrent code easier to write, mind you. I actually have plenty of ideas in that direction. It is just that I think this is something that can largely be done at the library level, without requiring too much help from the underlying programming language.


  parent reply	other threads:[~2016-06-24 21:06 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-17  9:44 RFC: Prototype for a user threading library in Ada Hadrien Grasland
2016-06-17 16:18 ` Niklas Holsti
2016-06-17 16:46   ` Dmitry A. Kazakov
2016-06-18  8:16     ` Hadrien Grasland
2016-06-18  8:47       ` Dmitry A. Kazakov
2016-06-18  9:17         ` Hadrien Grasland
2016-06-18 11:53           ` Dmitry A. Kazakov
2016-06-20  8:23             ` Hadrien Grasland
2016-06-20  9:22               ` Dmitry A. Kazakov
2016-06-23  1:42       ` Randy Brukardt
2016-06-23  8:39         ` Dmitry A. Kazakov
2016-06-23 22:12           ` Randy Brukardt
2016-06-24  7:34             ` Dmitry A. Kazakov
2016-06-24 23:00               ` Randy Brukardt
2016-06-25  7:11                 ` Dmitry A. Kazakov
2016-06-26  2:02                   ` rieachus
2016-06-26  6:26                     ` Dmitry A. Kazakov
2016-06-24  0:38           ` rieachus
2016-06-25  6:28             ` Dmitry A. Kazakov
2016-06-26  1:34               ` rieachus
2016-06-26  3:21               ` Randy Brukardt
2016-06-26  6:15                 ` Dmitry A. Kazakov
2016-06-28 20:44                   ` Anh Vo
2016-07-02  4:13                   ` Randy Brukardt
2016-07-02 10:25                     ` Dmitry A. Kazakov
2016-07-05 21:53                       ` Randy Brukardt
2016-07-06  9:25                         ` Dmitry A. Kazakov
2016-07-07  0:32                           ` Randy Brukardt
2016-07-07  6:08                             ` Niklas Holsti
2016-07-08  0:03                               ` Randy Brukardt
2016-07-08  7:32                                 ` Dmitry A. Kazakov
2016-07-11 19:40                                   ` Randy Brukardt
2016-07-12  8:37                                     ` Dmitry A. Kazakov
2016-07-12 21:31                                       ` Randy Brukardt
2016-07-08 20:17                                 ` Niklas Holsti
2016-06-24 21:06         ` Hadrien Grasland [this message]
2016-06-26  3:09           ` Randy Brukardt
2016-06-26  6:41             ` Dmitry A. Kazakov
2016-07-02  4:21               ` Randy Brukardt
2016-07-02 10:33                 ` Dmitry A. Kazakov
2016-07-05 21:24                   ` Randy Brukardt
2016-07-06 13:46                     ` Dmitry A. Kazakov
2016-07-07  1:00                       ` Randy Brukardt
2016-07-07 14:23                         ` Dmitry A. Kazakov
2016-07-07 23:43                           ` Randy Brukardt
2016-07-08  8:23                             ` Dmitry A. Kazakov
2016-07-11 19:44                               ` Randy Brukardt
2016-06-26  9:09             ` Hadrien Grasland
2016-07-02  4:36               ` Randy Brukardt
2016-07-02  5:30                 ` Simon Wright
2016-07-05 21:29                   ` Randy Brukardt
2016-07-02 11:13                 ` Hadrien Grasland
2016-07-02 13:18                   ` Dmitry A. Kazakov
2016-07-02 16:49                     ` Hadrien Grasland
2016-07-02 21:33                       ` Niklas Holsti
2016-07-03 20:56                         ` Hadrien Grasland
2016-07-02 17:26                   ` Niklas Holsti
2016-07-02 21:14                   ` Niklas Holsti
2016-07-03  7:42                     ` Hadrien Grasland
2016-07-03  8:39                       ` Dmitry A. Kazakov
2016-07-03 21:15                         ` Hadrien Grasland
2016-07-04  7:44                           ` Dmitry A. Kazakov
2016-07-05 21:38                   ` Randy Brukardt
2016-06-21  2:40     ` rieachus
2016-06-21  7:34       ` Dmitry A. Kazakov
2016-06-18  7:56   ` Hadrien Grasland
2016-06-18  8:33 ` Hadrien Grasland
2016-06-18 11:38 ` Hadrien Grasland
2016-06-18 13:17   ` Niklas Holsti
2016-06-18 16:27   ` Jeffrey R. Carter
2016-06-20  8:42 ` Hadrien Grasland
2016-07-10  0:45 ` rieachus
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox