Programming Concepts: Queues
A queue is a first-in first-out (FIFO) abstract data type that is heavily used in computing. Uses for queues involve anything where you want things to happen in the order that they were called, but where the computer can't keep up to speed. For example:
- Keyboard Buffer - you want the letters to appear on the screen in the order you press them. You might notice that when your computer is busy the keys you press don't appear on the screen until a little while after you press them. When they do appear they appear in the order you press them.
- Printer Queue - you want print jobs to complete in the order you sent them, i.e. page 1, page 2, page 3, page 4 etc. When you are sharing a printer several people may send a print job to the printer and the printer can't print things instantly, so you have to wait a little while, but the items output will be in the order you sent them.
There are several different types of queues such as the ones described below:
In this queue form, elements are able to join the queue at one end and can exit from the queue at the other end. First In First Out (FIFO).
A real life example of this would be queuing to pay at the supermarket. The first person into the queue is the first person to be served. And if you join the queue last you are going to be served last (no pushing!). However, there is one difference, in a supermarket queue once the first person has been served the rest of the queue shuffles forward, making the previously second person now first, this is possible in a computer but very costly in terms of processing. The linear queue you are about to see 'crawls' through memory, devouring everything it comes across.
A Linear queue is constantly working its way through memory, it does not re-use memory. As a result if a large number of items are being added and removed from the list this means the lists will grow very large without containing much data. It is not a very efficient solution and will use up large amounts of memory. Take a look at this example and the values of the two pointers storing the front of the queue (FrontPtr) and the next free memory location (NextFree).
|State 1||State 2||State 3||State 4||State 5||State 6|
|start state||H joins queue||Start is served||J joins queue||Start is served||P joins queue|
FrontPtr = 1 NextFree = 4
FrontPtr = 1 NextFree = 5
FrontPtr = 2 NextFree = 5
Note that no data is
FrontPtr = 2 NextFree = 6
FrontPtr = 3 NextFree = 6
FrontPtr = 3 NextFree = 7
Unlike linear queues Circular queues allow for memory to be re-used:
Generally, a circular buffer requires three pointers:
- one to the actual buffer in memory
- one to point to the start of valid data
- one to point to the end of valid data
The following example shows a partially-full fixed length buffer and how it handles additions and deletions from a queue. Take particular care to note the pointers.
Circular queues are very common in computer science and they are used to store things, they have the following benefits
This is based on the order of priority of the elements in the queue. In other words, each element of this type of queue has different level of priority attached to it; e.g., high priority or low priority.
A real world example of this would be an Accident and Emergency Department waiting room, someone who had fallen over, would probably be low priority compared with someone who had cut their head open, and as such even if the head injury patient came in later they would probably jump the queue.
|State 1||State 2||State 3|
|1. broken arm
2. grazed knee
|1. heart attack
2. broken arm
3. grazed knee
|1. heart attack|
2. severe concussion
3. broken arm
4. grazed knee
|initial queue||heart attack top priority jumps the queue||severe concussion less important than heart attack, so moves to second|
In a computer we use priority queues to handle the execution of processes. Each process will have a priority attached to it, with the more important processes jumping ahead of the less important for the processor's attention when they require it. For example:
|Media Player||Below Normal|
|Scheduled Virus Scanner||Low|
There are several methods we can use to handle processor scheduling, each have their own benefits and drawbacks:
A circular queue uses a fixed amount of memory and reuses memory as it moves through the queue. A linear queue does not reuse memory and can waste memory.
The lower priority task is queued and the higher priority task is given the processors attention
StartPtr = 2 EndPtr = 1
This would break, as there is no more space left in the queue!
A first in first out data type