Clause
← All dokumentation

Översatt från det engelska originalet · 06042fa · 2026-10-09 · Läs på engelska

Processer

Plan 11 step 43 (2026-10-08): startade processer på en kooperativ exekutor; step 44: exitorsaker och felrapporter; step 45: sändning av meddelanden; step 46: selektiv receive; step 47: tidsgränser för receive; step 48: länkar och exitsignaler; step 49: monitorer; step 50: registrerade namn; step 53: portar (inga); step 56: schemaläggarens arbetstrådar; step 57: väckningar mellan arbetstrådar och nedstängning.

Exekutor

En runtime kör sina processer på sina schemaläggares arbetstrådar (arbetstrådar, exekveringsmodell). Vid uppstart görs anropet av ingångsfunktionen till den första processen, huvudprocessen, och exekutorn körs tills den avslutas:

Arbetstrådar

Plan step 56 (2026-10-08). Exekutorn kör processer på RuntimeOptions::schedulers arbetstrådar: tråden som startade programmet och ytterligare en tråd per extra arbetstråd. Program tar antalet från --schedulers N (1 till 1 024, runtime-alternativ); standardvärdet är en arbetstråd per logisk processor, som OTP:s +S.

Väckningar och nedstängning (plan step 57) behöver ingen ytterligare mekanism, eftersom varje ändring av en process schemaläggningstillstånd sker under exekutorns mutex:

Avslut

En annan process än huvudprocessen avslutas med en exitorsak, som i OTP (detail::exit_reason, process/exits). Exitsignaler bär den till länkade processer (länkar) och 'DOWN'-meddelanden till övervakande (monitorer); felrapporter visar den.

Hur processen avslutasExitorsakFelrapport
Dess första anrop returnerarnormalIngen
exit(Reason) (även normal, kill)ReasonIngen
Ett fel (error/1,2,3, badarith, {badmatch, V}, undef, ...){Reason, Stack}Ja
Ett ofångat throw(Value){{nocatch, Value}, Stack}Ja
En exitsignal avslutar den (exitsignaler)Signalens orsak, killed för exit(Pid, kill)Ingen

En felrapport skrivs på stderr när processen avslutas, efter att standard-utdata har tömts, i formatet för OTP:s standardhanterare för loggning:

=ERROR REPORT==== 8-Oct-2026::03:42:15.983000 ===
Error in process <0.8.0> with exit value:
{boom,[{crash_reports,'-main/1-fun-6-',0,[]}]}

Huvudet innehåller lokal tid; orsaken formateras som ~p gör. Huvudprocessen skriver ingen: dess ofångade undantag är programmets (körbara filer).

Meddelanden

Dest ! Msg och erlang:send(Dest, Msg) (plan step 45) evaluerar Dest först och returnerar Msg.

DestEffekt
En pid för en levande processMsg kopieras in i mottagarens heap (kopiering mellan heapar) med bevarad delning och läggs till sist i dess signalinkorg
En pid för en process som har avslutatsIngenting; sändningen lyckas
Ett registrerat namnSom för dess pid; badarg när ingen levande process har namnet
{Name, nonode@nohost} av två atomerSom för den pid som är registrerad som Name; ingenting när det inte finns någon
{Name, Node} för någon annan nodIngenting (det finns inga andra noder)
Allt annatbadarg

Receive

receive (plan steps 46–47) väljer bland sina klausuler som case, över meddelandena i brevlådan:

Plan step 48. En länk förbinder två processer i båda riktningarna (Signals i varje kontext: de länkade pid:arna i länkordning och flaggan trap_exit).

Monitorer

Plan step 49. En monitor är enkelriktad: den övervakande processen håller den (via referens, i Signals) och den övervakade processen behåller referensen och den övervakande pid:en, så att den kan skicka meddelandet när den avslutas.

Registrerade namn

Plan step 50. Exekutorn har en tabell från namn (atomer) till pid:ar, och varje process sitt eget namn (Signals::name).

Exitsignaler

Varje exitsignal kommer från en körande process (exit/2, exit_signal/2, link/1) eller från slutet av en process. Exekutorn hanterar den direkt när dess mål inte körs på en annan arbetstråd, annars när målets tidsskiva har tagit slut (arbetstrådar, scheduler/signals): ett avslutat mål lämnar körkön eller sin väntan och slutförs (dess länkar signaleras, dess felrapport skrivs, dess kontext frigörs) innan den sändande inbyggda funktionen returnerar. En lång länkad kedja avslutas process för process utan rekursion.

Signal till en processFångar inte exitsFångar exits
exit(Pid, kill), exit_signal(Pid, kill)Avslutas med orsaken killedAvslutas med orsaken killed
Orsaken normal (från en länk, eller skickad till en annan process)IngentingMeddelandet {'EXIT', From, normal}
exit(self(), normal)Avslutas med orsaken normal (OTP:s egenhet)Meddelandet {'EXIT', Self, normal}
exit_signal(self(), normal)IngentingMeddelandet {'EXIT', Self, normal}
Varje annan orsak, inklusive kill från en länkAvslutas med den orsakenMeddelandet {'EXIT', From, Reason}

Portar

Portar (plan steps 57A–57F) specificeras i portar: en port är länkad till den som öppnade den, deltar i länkar, monitorer, exitsignaler och registrerade namn som en process och kommunicerar med sin anslutna process via meddelanden. Step 57B tillhandahåller identiteter, porttabellen, portarnas inbyggda funktioner och {fd, In, Out}-portar som endast skriver utdata.

Inbyggda funktioner

Inbyggd funktionBeteende
spawn(Fun)badarg om inte Fun är en fun; annars anropar en ny process Fun() och kastar {badarity, {Fun, []}} i den processen för en annan aritet
spawn(M, F, Args)badarg om inte M och F är atomer och Args en äkta lista; annars anropar en ny process M:F(Args...) och kastar undef i den processen när ingen modul exporterar den och ingen inbyggd funktion har det namnet
spawn_link(Fun), spawn_link(M, F, Args)Som spawn, och den nya processen länkas till anroparen (länkar)
is_process_alive(Pid)badarg om inte Pid är en pid; sant så länge dess process inte har avslutats
spawn_monitor(Fun), spawn_monitor(M, F, Args)Som spawn, och returnerar {Pid, Ref} för en ny monitor
link(Pid), unlink(Pid)badarg om inte Pid är en pid (länkar)
monitor(process, Item)badarg för en annan typ eller ett annat objekt; en referens (monitorer); Item är en pid eller ett registrerat namn
register(Name, Pid), unregister(Name), whereis(Name), registered()Se registrerade namn; Name måste vara en atom
demonitor(Ref), demonitor(Ref, Options)badarg om inte Ref är en referens och Options en äkta lista av flush och info
exit(Dest, Reason), exit_signal(Dest, Reason)badarg om inte Dest är en pid eller referens; true efter exitsignalen
process_flag(trap_exit, Bool)Den tidigare inställningen; badarg för en annan flagga eller ett icke-booleskt värde
erlang:send(Dest, Msg), Dest ! MsgMsg, efter att det har skickats (meddelanden); send/2 importeras inte automatiskt

Den nya processen köas bakom varje körbar process; spawn returnerar dess pid direkt.