Concurrent Pascal

From Wikipedia, the free encyclopedia



Concurrent Pascal was designed by Per Brinch Hansen for writing concurrent programs such as operating systems and real-time monitoring systems on shared-memory computers. A separate language, Sequential Pascal, is used as the language for applications programs run by the operating systems written in Concurrent Pascal. Both languages are extensions of Wirth's Pascal, and share a common threaded code interpreter. The following describes how Concurrent Pascal differs from Wirth's Pascal.

Several constructs in Pascal were removed from Concurrent Pascal for simplicity and security:

  • variant records;
  • the goto statement (and labels);
  • procedures as parameters;
  • packed arrays;
  • pointer types;
  • file types (and associated standard input/output procedures).

These omissions make it possible to guarantee, by a combination of compile-time checks and minimal run-time checking in the threaded-code interpreter, that a program can not damage itself or another program by addressing outside its allotted space.

Concurrent Pascal includes class, monitor, and process data types. Instances of these types are declared as variables, and initialized in an init statement.

Classes and monitors are similar: both package private variables and procedures with public procedures (called procedure entries). A class instance can be used by only one process, whereas a monitor instance may be shared by processes. Monitors provide the only mechanism for interprocess communication in a Concurrent Pascal program. Only one process can execute within a given monitor instance at a time. A built in data type, the queue, together with operations delay and continue, are used for scheduling within monitors. Each variable of type queue can hold a single process; if many processes are to be delayed in a monitor, multiple queue variables, usually organized as an array, must be provided. The single process queue variable gives a monitor complete control over medium-term scheduling, but the programmer is responsible for unblocking the correct process.

A process, like a class or monitor, has local variables, procedures, and an initial statement, but has no procedure entries. The initial statement ordinarily executes forever, calling local procedures, class procedures, and monitor procedures. Processes communicate through monitor procedures. Language rules prevent deadlock by imposing a hierarchy on monitors. But nothing can prevent a monitor from erroneously forgetting to unblock a delayed process (by not calling continue) so the system can still effectively hang up through programming errors.

The configuration of processes, monitors, and classes in a Concurrent Pascal program is normally established at the start of execution, and is not changed thereafter. The communication paths between these components are established by variables passed in the init statements, since class and monitor instance variables cannot be used as procedure parameters.


The following example shows the declaration of a simple monitor, and its use by two communicating processes.

type buffer = monitor                   "bounded buffer monitor"
var saved: integer;                     "saved item is an integer"
   fullq, emptyq: queue;                "used by only two processes"
   full: boolean;                       "true if an item is saved:

procedure entry put (item: integer)     "puts item in buffer"
begin
  if full then delay(fullq);            "block if full"
  saved := item;                        "save the item"
  full := true;                         "mark as full"
  continue(emptyq);                     "unblock consumer"
end;

procedure entry get(var item: integer)  "gets item from the buffer"
begin
  if not full then delay(emptyq);       "bock if empty"
  item := saved;                        "get the item"
  full := false;                        "mark as not full"
  continue(fullq);                      "unblock producer"
end;
begin full := false end;                "initialize the monitor"

type producer = process(pass: buffer)   "producer uses a buffer"
var item: integer;
begin
  cycle                                 "execute in a loop forever"
    "produce an item"
    pass.put(item);                     "pass an item to the monitor"
  end
end;

type consumer = process(pass: buffer)   "consumer uses a buffer"
var item: integer;
begin
  cycle                         
    pass.get(item);                     "get an item from the monitor"
    "consume the item"
  end
end;

"declare instances of the monitor, producer, and consumer"
"give the producer and consumer access to the monitor"
var pass: buffer; prod: producer; cons: consumer;
begin
  init pass,                    "initialize the monitor"
      prod(pass),               "run the producer"
      cons(pass);               "run the consumer"
end;
Advanced Search
Included Web Search Engines


Safe Search

close

Top Matching Results

Occasionally Search.com will highlight specialized results that are based on the context of your query. Examples of specialized results include specific links to news, images, or video.

Top Matching Results may highlight information from other Search.com pages, content from the CNET Network of sites, or third party content. The listings are based purely on relevance. Search.com does not receive payment for listings in this section but our partners that provide this data may get paid for listing these products.

Sponsored Links

This section contains paid listings which have been purchased by companies that want to have their sites appear for specific search terms and related content. These listings are administered, sorted and maintained by a third party and are not endorsed by Search.com.

Search Results

Search.com sends your search query to several search engines at one time and integrates the results into one list which has been sorted by relevance using Search.com's proprietary algorithm. You can customize the list of search engines included in your metasearch from the preferences.

The search engines that are used in your metasearch may allow companies to pay to have their Web sites included within the results. To view the Paid Inclusion policy for a specific search engine, please visit their Web site. Search.com does not accept payment or share revenue with any search engine partner for listings in this section.