annotate python/doc/design.rst @ 272:e64bae57cda8

refactor ir
author Windel Bouwman
date Sat, 31 Aug 2013 17:58:54 +0200
parents
children 6b3a874edd6e
rev   line source
272
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
1
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
2 = processes / threads =
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
3
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
4 Processes are completely seperated and fully pre-emptive.
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
5 This means a process can be unscheduled at any moment.
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
6
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
7 Threads are co-operative. This means they yield control
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
8 voluntary. This means that mutexes and locks are not required.
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
9 This is done with the built-in language feature called tasks.
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
10
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
11 If some heavy duty task must be performed, either way spawn
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
12 a new process, or yield frequently from this hard labour.
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
13
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
14 = tasks =
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
15
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
16 Consider the following::
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
17
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
18 --
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
19 function int insanemath(int a)
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
20 {
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
21 while (a > 0)
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
22 {
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
23 a = a -1;
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
24 resume agent1;
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
25 }
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
26 return a - 1;
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
27 }
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
28
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
29 task agent1()
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
30 {
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
31 start agent2;
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
32 }
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
33
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
34 task agent2()
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
35 {
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
36 insanemath(55);
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
37 insanemath(44);
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
38 }
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
39
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
40 task main()
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
41 {
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
42 start agent1;
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
43 join agent1;
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
44 }
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
45 --
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
46
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
47 Say to tasks are running in concurrent / parallel.
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
48
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
49
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
50
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
51 Stack layout for tasks.
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
52 ||
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
53 ||
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
54 \/
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
55 +---------+
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
56 | return address
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
57 | locals
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
58 |
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
59 +------
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
60 | return address
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
61 | locals
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
62 |
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
63 +---
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
64
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
65 Assembly code for the functions above:
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
66
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
67 .code
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
68 insanemath:
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
69 L1:
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
70 load r0, sp - 4
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
71 cmp r0, 0
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
72 jl L2
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
73 dec r0
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
74 store r0, sp - 4
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
75 jmp L1
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
76 L2:
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
77 ret
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
78
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
79 agent1:
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
80 hlt?
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
81
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
82 agent2:
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
83 hlt?
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
84
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
85 main:
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
86 jmp agent1
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
87
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
88 .data
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
89 agent1_task:
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
90 dd 0
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
91 agent2_task:
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
92 dd 0
e64bae57cda8 refactor ir
Windel Bouwman
parents:
diff changeset
93