home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / m / mod2tutr.zip / CHAP15.TXT < prev    next >
Text File  |  1989-01-18  |  19KB  |  411 lines

  1.  
  2.                                                     Chapter 15
  3.  
  4.                                                    CONCURRENCY
  5.  
  6.  
  7.  
  8. PREREQUISITES FOR THIS MATERIAL
  9. ______________________________________________________________
  10.  
  11. In order to understand this material you should have a good
  12. grasp of the material in Part I of this tutorial, and at least
  13. a cursory knowledge of the material in chapter 14 concerning
  14. the pseudo module SYSTEM and especially the ADR and SIZE
  15. functions.
  16.  
  17.  
  18. WHAT IS CONCURRENCY
  19. ______________________________________________________________
  20.  
  21. True concurrency is when two processes are taking place at
  22. exactly the same time with neither affecting the other in a
  23. degrading way.  This is possible in many areas of your life,
  24. such as when the grandfather clock is running at the same time
  25. as the furnace and the television set.  These are different
  26. processes all running at the same time.  In the field of
  27. computers, true concurrency requires at least two separate
  28. processors that are running completely separate programs or
  29. different parts of the same program.
  30.  
  31. Usually, when computers are said to be running concurrent
  32. processes, reference is being made to a time sharing situation
  33. in which two or more programs are swapped in and out of the
  34. computer at a rapid rate, each getting a small slice of time,
  35. a few milliseconds being typical.  Each process appears to be
  36. running constantly but is in fact only running a small part
  37. of the time, sort of stuttering.  The swapping in and out is
  38. taking place so fast that, to the casual user, it appears that
  39. the entire computer is working on only his program.
  40. Concurrent programs must deal with asynchronous events that
  41. occur at arbitrary times.
  42.  
  43.  
  44.  
  45. WHAT IS MODULA-2 CONCURRENCY?
  46. ______________________________________________________________
  47.  
  48. Most literature about Modula-2 uses the term concurrency to
  49. discuss the topic of two or more processes operating at the
  50. same apparent time, but the term coprocessing is more
  51. descriptive and will be used in this tutorial.  Coprocessing
  52. can be defined as two or more asynchronous processes happening
  53. in such a way that they interact in some way, so that some
  54. level of coordination must be carried on between them.  An
  55. example would be a text processor that is busy updating the
  56. video monitor between input keystrokes.
  57.  
  58.                                                           15-1
  59.  
  60.                                       Chapter 15 - Concurrency
  61.  
  62. Modula-2 provides the necessary constructs to implement
  63. coprocesses.  We will define and illustrate most of them in
  64. this chapter but we will begin with a short example program
  65. as we have with all new topics.
  66.  
  67.  
  68. OUR FIRST COROUTINE
  69. ______________________________________________________________
  70.  
  71. Examine the program named COROUT.MOD for      ================
  72. our first look at this new technique.            COROUT.MOD
  73. Without lots of explanation, there are        ================
  74. several new items imported and a few
  75. variables defined, the most interesting being the three
  76. variables declared that are of type PROCESS.  These will be
  77. the three process variables we will use in this example, and
  78. we will say more about the process type variable later.  There
  79. are two procedures defined in lines 13 through 36 which define
  80. what the processes will do.  It must be noted that these
  81. procedures must be parameterless, no formal parameters
  82. allowed.  Many of the details of these procedures will be
  83. explained in the next few paragraphs.  Finally we come to the
  84. main program which is where we will start to define how to use
  85. the two processes.
  86.  
  87. In the main program, we call the procedure NEWPROCESS which
  88. loads a new process without running it.  We give it the name
  89. of the procedure where the process can be found, in this case
  90. MainProcess, and give the system a workspace by assigning a
  91. previously defined array to it.  This is done by giving the
  92. system the address and the size of the array in the next two
  93. actual parameters.  Finally, we give it the name of the
  94. process variable.  Note that the workspace must be sufficient
  95. for the new process to store all of its variables, so give the
  96. process a generous workspace.  In this case, we give the
  97. workspace 300 words.  If it is too small, a runtime error will
  98. be generated.  We then load a second process in preparation
  99. for running the program by calling NEWPROCESS again with
  100. different formal parameters for the other process named
  101. SubProcess.
  102.  
  103.  
  104. WHAT DID NEWPROCESS DO?
  105. ______________________________________________________________
  106.  
  107. Each time we call NEWPROCESS, it loads a copy of the procedure
  108. named in the first actual parameter into the address space of
  109. the system at the location specified by the second actual
  110. parameter.  It also stores a copy of the starting address of
  111. this procedure in the process variable named in the fourth
  112. actual parameter.  The process variable is a record that can
  113. store the entire state of a process.  We will see more about
  114. this record variable in the remainder of this chapter.
  115.  
  116.                                                           15-2
  117.  
  118.                                       Chapter 15 - Concurrency
  119.  
  120. The end result of execution of both procedure calls in lines
  121. 39 and 41 is that we have two procedures stored along with all
  122. of their local variables, in this case only the single
  123. variable defined in line 13, and we have two process variables
  124. stored.
  125.  
  126.  
  127. HOW DO WE GET IT STARTED?
  128. ______________________________________________________________
  129.  
  130. When we began executing the main program, we actually loaded
  131. and started a process, the one we are presently executing and
  132. this process stays resident in memory and active throughout
  133. the period of execution of the program.  We have done this for
  134. every program in this tutorial so far but paid no attention
  135. to it as far as referring to it as a process.  To transfer
  136. control to a different process, we use the transfer function
  137. with the name of a process variable for the process we wish
  138. to terminate and another process variable for the process we
  139. wish to start.  The current state of the hardware processor
  140. is stored in the first process variable mentioned, and the
  141. state of the second process variable named is loaded into the
  142. hardware processor.  This effectively transfers control to the
  143. second process.
  144.  
  145. This is illustrated in line 43 from which we jump to line 15
  146. in the process named Process1.  In Process1 we begin a FOR
  147. loop where we write a string and a cardinal number then when
  148. Index exceeds 2, we do another transfer, this time from
  149. Process1 to Process2.  The transfer procedure in line 19
  150. stores the current state of the hardware processor in the
  151. process variable named Process1 and retrieves the machine
  152. state from Process2, stores it in the hardware processor, and
  153. jumps to the new process.  The jump is effected automatically
  154. since the instruction counter is part of the process variable.
  155. Thus we jump from line 19 in the first procedure to line 31
  156. in the second where we begin an infinite loop.  We display
  157. another string in line 32 and once again execute another
  158. transfer from line 33 to somewhere.  This transfer causes the
  159. current state of the hardware processor to be stored in
  160. Process2 and retrieves the state from process1 and stores it
  161. in the hardware processor.  Since the state stored in the
  162. process variable named Process1 was stored there at statement
  163. 19, the address of the next line is a part of this state and
  164. the program counter is automatically set to the address where
  165. line 20 is stored and execution is returned there.
  166.  
  167.  
  168. WHERE DO WE RETURN TO A COROUTINE?
  169. ______________________________________________________________
  170.  
  171. Instead of jumping to the beginning of the procedure named
  172. MainProcess again, which would be line 15 in this example, we
  173. return to the statement following the one we transferred away
  174.  
  175.                                                           15-3
  176.  
  177.                                       Chapter 15 - Concurrency
  178.  
  179. from.  In this case we will return from line 33 to line 20
  180. and complete the loop we started earlier.  When Index is
  181. increased to 4, we will once again transfer control from line
  182. 19 to the state stored in Process2, but instead of jumping to
  183. line 31 we will return where we left off there at line 34.
  184. That loop will complete, and we will once again return to line
  185. 20.  When the for loop in MainProcess finishes, we execute
  186. lines 24 and 25 in normal sequential fashion, then the
  187. transfer in line 26 will load the data stored in the process
  188. variable named main effectively returning control to the main
  189. module body where we will arrive at line 44.  From there we
  190. complete the last two write statements, then do a normal exit
  191. to the operating system.
  192.  
  193. This example of coprocess usage was defined step by step as
  194. a beginning into this topic.  If it was not clear, reread the
  195. entire description until you understand it.  There is really
  196. nothing else to know about coroutines other than the knowledge
  197. gained by experience in using them, which is true of any new
  198. principle in computer programming or any other facet of life.
  199.  
  200.  
  201. WHAT WAS ALL THAT GOOD FOR?
  202. ______________________________________________________________
  203.  
  204. The thing that is really different about coroutines is the
  205. fact that they are both (or all three or more) loaded into the
  206. computers memory, and they stay loaded for the life of the
  207. program along with their local variables.  This is not true
  208. of normal procedures.  It is transparent to you, but variables
  209. local to a procedure are not all simply loaded into the
  210. computer and left there.  They are dynamically allocated and
  211. used each time the procedure is called, then discarded when
  212. the procedure completes its job.  That is why variables are
  213. not saved from one invocation of a procedure to the next.  The
  214. variables which are defined in the outer layer of a process
  215. are loaded once, and stay resident for the life of the
  216. process.
  217.  
  218. In the example program under consideration, all three
  219. processes including the main program are loaded and none is
  220. really the main program since any of the programs have the
  221. ability to call or control the others.  Rather than the strict
  222. hierarchy of calling, as is done with procedures, the
  223. coroutines are all at the same hierarchical level.
  224.  
  225. Examine the program named COROUT2.MOD for      ===============
  226. the second example with coroutines.  This        COROUT2.MOD
  227. program is identical with the last one         ===============
  228. except that two lines are removed from the
  229. first process and placed in a normal procedure which is called
  230. from line 22 to illustrate that some of the code can be placed
  231. outside of the coroutine process to make the resident part
  232. smaller.  The implication here is that you could have several
  233.  
  234.                                                           15-4
  235.  
  236.                                       Chapter 15 - Concurrency
  237.  
  238. coprocesses going on, each of which had a very small resident
  239. portion, and each of which called some large regular
  240. procedures.  In fact, there is no reason why two or more of
  241. the coprocesses could not call the same normal procedure.
  242.  
  243. Study this program until you understand the implications, then
  244. compile and execute it to see that it does exactly the same
  245. thing as the last program.
  246.  
  247.  
  248. HOW ABOUT THREE PROCESSES?
  249. ______________________________________________________________
  250.  
  251. Examine the example program named              ===============
  252. COROUT3.MOD for an example with three            COROUT3.MOD
  253. concurrent processes.  This program is         ===============
  254. identical to the first program with the
  255. addition of another process.  In this program, Process1 calls
  256. Process2, which calls Process3, which once again calls
  257. Process1.  Thus the same loop is traversed but with one
  258. additional stop along the way.  It should be evident to you
  259. that there is no reason why this could not be extended to any
  260. number of processes each calling the next or in any looping
  261. scheme you could think up provided of course that it had some
  262. utilitarian purpose.  It is not apparent, but there are
  263. actually four coprocesses here because the main program, in
  264. lines 47-57, qualifies to be called another process.  This
  265. will be very graphically demonstrated in the next example
  266. program because the main program is the main control loop.
  267.  
  268.  
  269. SORT OF RANDOM PROCESSES
  270. ______________________________________________________________
  271.  
  272. Examine the program named RANPROG.MOD for      ===============
  273. an example of coprocessing that is a             RANPROG.MOD
  274. little more irregular than the very            ===============
  275. repeatable loops of the first three
  276. example programs in this chapter.  Note that the main program
  277. is one of the major contributors to this program because it
  278. contains a loop which calls each of the other processes once
  279. during each pass through the loop, with WriteString calls
  280. interleaved between the calls.  The WriteString calls are
  281. obviously for the purpose of tracking program execution later.
  282.  
  283. Each call to Hello results in writing the word "hello" to the
  284. monitor and a return to the main program, but each call to
  285. Toggle results in either a return to the main program or a
  286. transfer to Hello after writing a different word to the
  287. monitor in each case.  Which path is taken is controlled by
  288. the local variable ToggleFactor which is toggled each time the
  289. Toggle procedure is called.  If ToggleFactor is zero, the word
  290. "even" is written to the monitor, and control is transferred
  291. to Hello, which writes "hello" and transfers directly back to
  292.  
  293.                                                           15-5
  294.  
  295.                                       Chapter 15 - Concurrency
  296.  
  297. the main program without returning through the Toggle
  298. procedure.  When ToggleFactor is one, the word "odd" is
  299. displayed and control is transferred back to the main program.
  300.  
  301. The observant student will notice that we return to each
  302. process at the statement following where we transferred away
  303. and in the case of the procedure named toggle, we actually
  304. return inside of a loop and inside of an if statement.  The
  305. Modula-2 system is designed to handle this for us, and it is
  306. because of this capability that we can write true coprocessing
  307. programs in Modula-2.  The time it takes you to understand
  308. this program will be well spent since it is the only program
  309. in this tutorial that depicts the value of the concurrent
  310. capabilities of Modula-2.
  311.  
  312. The interested student will find many books and articles on
  313. coprocessing and parallel operation in general.
  314.  
  315.  
  316. WHAT IS THE BIG DIFFERENCE?
  317. ______________________________________________________________
  318.  
  319. Actually, the big difference between real concurrent
  320. processing and what this is doing is in the division of time
  321. and in who, or what, is doing the division.  In real
  322. concurrent processing, the computer hardware is controlling
  323. the operation of the processing and allocating time slots to
  324. the various processes.  In the pseudo concurrent processing
  325. we are doing, it is the processes themselves that are doing
  326. the time allocation leading to the possibility that if one of
  327. the processes went bad, it could tie up all of the resources
  328. of the system and no other process could do anything.  You
  329. could consider it a challenge to write a successful system
  330. that really did share time and resources well.
  331.  
  332. The important thing to consider about this technique is that
  333. it is one additional tool available in Modula-2 that is not
  334. available in the usual implementations of other popular
  335. languages such as Pascal, C, Fortran, or BASIC.
  336.  
  337.  
  338. ONE MORE INFINITE EXAMPLE OF CONCURRENCY
  339. ______________________________________________________________
  340.  
  341. Examine the program named INFINITE.MOD for    ================
  342. another example of a program with               INFINITE.MOD
  343. concurrency.  In this program, three          ================
  344. processes are created and control is
  345. transferred to the first one after which they call each other
  346. in a loop with no provision for ever returning to the main
  347. program.  The computer will continually loop around the three
  348. processes checking the printer, the keyboard, and the system
  349. clock to see if they need servicing.  It must be pointed out
  350. that it would be a simple matter to include all three checks
  351.  
  352.                                                           15-6
  353.  
  354.                                       Chapter 15 - Concurrency
  355.  
  356. in a single loop in the main program and do away with all of
  357. this extra baggage.  This method had one advantage over the
  358. simple loop and that is the fact that each coprocess can have
  359. its own variables which cannot be affected by the operation
  360. of the other processes and yet are all memory resident at all
  361. times.
  362.  
  363. This program can be compiled and run but it will execute
  364. forever since it has no way to stop it.  You must stop it
  365. yourself by using the method of program abort provided on your
  366. system.  If you are using MS-DOS, a control-break combination
  367. will probably terminate the program.  It should be mentioned
  368. that if this technique were used in a real situation, it would
  369. not be writing to the monitor continually.
  370.  
  371.  
  372. IS THIS REALLY USEFUL?
  373. ______________________________________________________________
  374.  
  375. In a situation where you needed to service interrupts in some
  376. prescribed and rapid fashion, a technique involving Modula-2
  377. concurrency could prove to be very useful.  There are other
  378. procedures available in Modula-2 to aid in writing a
  379. pseudo-concurrent program but they are extremely advanced and
  380. would require an intimate knowledge of your particular systems
  381. hardware, especially the interrupt system.  The one procedure
  382. available for this is the IOTRANSFER procedure which is used
  383. to establish the interface to a hardware interrupt.
  384.  
  385. Since using these techniques are extremely advanced
  386. programming techniques, they are beyond the scope of this
  387. tutorial and will not be covered here.
  388.  
  389.  
  390. WHAT ABOUT USING THESE PROCEDURES
  391. ______________________________________________________________
  392.  
  393. In order to effectively use the techniques of coprocessing,
  394. you will need to devote a great deal of study to parallel
  395. processing.  Many terms will be encountered, such as shared
  396. variables, semaphores, deadlock, etc.  Each of these terms
  397. involve techniques on programming problems that are beyond the
  398. scope of this tutorial since our goal is to teach you the use
  399. of various constructs in Modula-2, not the overall system
  400. design problem.
  401.  
  402. Chapter 16 of this tutorial gives you practical examples of
  403. the use of Modula-2.
  404.  
  405.  
  406.  
  407.  
  408.  
  409.                                                           15-7
  410.  
  411.