Journal/Paper.thy
changeset 17 105715a0a807
parent 16 9764023f719e
child 20 b56616fd88dd
--- a/Journal/Paper.thy	Sat Dec 22 01:58:45 2012 +0000
+++ b/Journal/Paper.thy	Sat Dec 22 14:50:29 2012 +0000
@@ -302,6 +302,8 @@
 
   \noindent
   In this definition we assume @{text "set"} converts a list into a set.
+  Note that in the first definition the condition about @{text "th \<in> set (wq cs)"} does not follow
+  from @{text "th = hd (set (wq cs))"}, since the head of an empty list is undefined in Isabelle/HOL. 
   At the beginning, that is in the state where no thread is created yet, 
   the waiting queue function will be the function that returns the
   empty list for every resource.
@@ -380,6 +382,7 @@
   Clearly, also every resource can only have at most one outgoing holding edge---indicating
   that the resource is locked. In this way we can always start at a thread waiting for a 
   resource and ``chase'' outgoing arrows leading to a single root of a tree. 
+  
 
 
   The use of relations for representing RAGs allows us to conveniently define
@@ -527,7 +530,7 @@
   \begin{tabular}{@ {}l}
   @{thm (lhs) schs.simps(6)} @{text "\<equiv>"}\\
   \hspace{5mm}@{text "let"} @{text "wq = wq_fun (schs s)"} @{text "in"}\\
-  \hspace{5mm}@{text "let"} @{text "new_wq = release (wq cs)"} @{text "in"}\\
+  \hspace{5mm}@{text "let"} @{text "new_wq = wq(cs := release (wq cs))"} @{text "in"}\\
   \hspace{8mm}@{term "(|wq_fun = new_wq, cprec_fun = cpreced new_wq (V th cs # s)|)"}
   \end{tabular}
   \end{isabelle}
@@ -1289,7 +1292,13 @@
   an unlocked resource is given next to the waiting thread with the
   highest precedence is realised in our implementation by priority queues. We implemented
   them as \emph{Braun trees} \cite{Paulson96}, which provide efficient @{text "O(log n)"}-operations
-  for accessing and updating. Apart from having to implement relatively complex data\-structures in C
+  for accessing and updating. In the code we shall describe below, we use the function
+  @{ML_text "queue_insert"}, for inserting a new element into a priority queue, and 
+  @{ML_text "queue_update"}, for updating the position of an element that is already
+  in a queue. Both functions take an extra argument that specifies the
+  comparison function used for organising the priority queue.
+  
+  Apart from having to implement relatively complex data\-structures in C
   using pointers, our experience with the implementation has been very positive: our specification 
   and formalisation of PIP translates smoothly to an efficent implementation in PINTOS. 
   Let us illustrate this with the C-code for the function @{ML_text "lock_acquire"}, 
@@ -1297,7 +1306,6 @@
   locking of a resource by the current running thread. The convention in the PINTOS
   code is to use the terminology \emph{locks} rather than resources. 
   A lock is represented as a pointer to the structure {\tt lock} (Line 1). 
-
   Lines 2 to 4 are taken from the original 
   code of @{ML_text "lock_acquire"} in PINTOS. They contain diagnostic code: first, 
   there is a check that 
@@ -1308,7 +1316,7 @@
   current thread does not ask twice for a lock. These assertions are supposed
   to be satisfied because of the assumptions in PINTOS about how this code is called.
   If not, then the assertions indicate a bug in PINTOS and the result will be
-  a \emph{kernel panic}. 
+  a ``kernel panic''. 
 
 
 
@@ -1347,7 +1355,7 @@
   intr_set_level(old_level);
 }
   \end{lstlisting}
-  \caption{Our version of the {\tt lock\_release} function for the small operating 
+  \caption{Our version of the {\tt lock\_acquire} function for the small operating 
   system PINTOS.  It implements the operation corresponding to a @{text P}-event.\label{code}}
   \end{figure}
 
@@ -1366,7 +1374,7 @@
   to prove for @{text P}, we need to ``chase'' all the dependants 
   in the RAG (Resource Allocation Graph) and update their
   current precedence; however we only have to do this as long as there is change in the 
-  current precedence from one thread at hand to another. 
+  current precedence.
 
   The ``chase'' is implemented in the while-loop in Lines 13 to 24. 
   To initialise the loop, we 
@@ -1395,8 +1403,9 @@
   Similar operations need to be implementated for the @{ML_text lock_release} function, which
   we however do not show. The reader should note though that we did \emph{not} verify our C-code. 
   This is in contrast, for example, to the work on seL4, which actually verified in Isabelle/HOL
-  that their C-code satisfies its specification \cite{sel4}.
-  Our verification however provided us with the justification for designing 
+  that their C-code satisfies its specification, thought this specification does not contain 
+  anything about PIP \cite{sel4}.
+  Our verification of PIP however provided us with the justification for designing 
   the C-code. It gave us confidence that leaving the ``chase'' early, whenever
   there is no change in the calculated current precedence, does not break the
   correctness of the algorithm.
@@ -1444,7 +1453,7 @@
 
   PIP is a scheduling algorithm for single-processor systems. We are
   now living in a multi-processor world. Priority Inversion certainly
-  occurs also there, see for example \cite{Brandenburg11, Davis11}  
+  occurs also there, see for example \cite{Brandenburg11, Davis11}.  
   However, there is very little ``foundational''
   work about PIP-algorithms on multi-processor systems.  We are not
   aware of any correctness proofs, not even informal ones. There is an