The invention relates to methods of scheduling disk access requests in a video server, and, more particularly, to statistical scheduling methods that improve the effective disk bandwidth provided by video servers.
Video-on-demand systems allow subscribers to request video programs from a video library at any time for immediate viewing in their homes. Subscribers submit requests to a video service provider via a communication channel (e.g., telephone lines or a back channel through the distribution network that carries the video to the subscriber's home), and the requested video program is routed to the subscriber's home via telephone or coaxial television lines. In order to provide such movie-on-demand services, video service providers use a video server to process subscriber requests, retrieve the requested programs from storage, and distribute the programs to the appropriate subscriber(s). One exemplary system for providing video-on-demand services is described in commonly assigned U.S. Pat. No. 6,253,375, issued Jun. 26, 2001, which is incorporated herein by reference.
In order for video servers to provide good performance, it is crucial to schedule video storage (disk) access requests such that disk bandwidth is maximized. Also, once a subscriber is watching a program, it is imperative to continuously deliver program content to the subscriber without interruption. In addition to distributing content to subscribers, disk bandwidth in a video server is typically also utilized for operations such as loading content, disk maintenance, and file system meta-data synchronizing. Disk bandwidth may also be reserved for reducing latency in data transfer to subscribers. The number of subscribers that can be properly served concurrently by a video server therefore depends on effective disk bandwidth, which in turn depends on how disk access requests are scheduled.
One of the problems facing current disk scheduling methods is the potential variation in time required to service disk accesses. For example, the internal transfer rate of a SEAGATE CHEETAH™ disk varies from 152 Megabits per second (Mbps) on inner tracks to 231 Mbps on outer tracks, and the seek time can vary from 0 milliseconds (ms) to 13 ms depending on how far apart the segments of data are from one another. Given these variations in seek and transfer times and the fact that the server may contain sixteen or more disk drives, it is difficult to determine the effective disk bandwidth of a video server. As a result, current disk scheduling methods allocate a fixed amount of time for every disk access request, regardless of whether the access finishes early. This results in a deterministic system in which the available disk bandwidth is known, but since the fixed amount of time must be large enough to accommodate a worst-case disk access, disk bandwidth is wasted.
Therefore, there is a need in the art for a method and apparatus for scheduling disk access requests in a video server without allocating worst-case access times, thus improving disk bandwidth utilization.
The disadvantages associated with the prior art are overcome by a method of the present invention, called Statistical Disk Scheduling (SDS), which exploits the fact that disk access times are on average significantly less than the worst case access time. The SDS finds use in improving video server functionality by increasing the bandwidth utilization of the storage medium in the following manner: worst case performance is used for priority operations (e.g., user read operations) but the bandwidth created by better than worst case performance is used for non-priority operations such as loading content onto the disk drives and disk maintenance. As a result, bandwidth for loading content and disk maintenance, or file system meta-data synchronizing does not have to be specifically reserved, thus increasing the number of users that can be served simultaneously by the video server.
SDS maintains at least two queues and a queue selector. The first queue is an access request queue for access requests from a current user that is presently viewing a program and the second queue is for all other forms of access requests. The second queue may comprise multiple queues to provide a queuing hierarchy. The requests are ordered in each of the queues to optimize the bandwidth and ensure that the data to the current users is not interrupted such that a display anomaly occurs. The queue selector identifies the queue that will supply the next access request to a disk queue. The selected requests are sent to the disk queues for execution. The disk queues are generally located on the disk drives and are generally not accessible except to place a request in the queue for each disk drive. The requests are then executed on a first-in, first-out manner (FIFO). In effect, the invention defers disk use to the latest possible moment because once the request is in the disk queue it is more difficult to change. The inventive queue structure provides opportunities to alter the disk access requests and their execution order prior to sending the requests to the disk queue. If a disk queue is not used, i.e., the disk drive does not have an internal queue, then the access requests are sent one at a time from the SDS to the disk drive for execution.
More specifically, the preferred embodiment of the SDS maintains three queues for each disk based on the type and priority of disk access requests, and a queue selector for managing queue selection. Selected requests are forwarded from the three queues to the disk such that bandwidth utilization is maximized, while giving highest priority to subscribers currently viewing a program so that their program streams are generally not interrupted. (Subscribers currently viewing a program are referred to as “steady-state” subscribers.) SDS dynamically monitors bandwidth utilization to determine when lower-priority requests can be scheduled without affecting on-time completion of the higher priority steady-state subscriber requests. In order to keep the disks busy and maximize disk bandwidth utilization, disk command queuing may be employed to ensure that the disk can begin seeking for the next access immediately after it finishes the data transfer for the current disk access.
Furthermore, popular content is migrated to the faster (outer) tracks of the disk drives to reduce the average access time and improve performance.
The teachings of the present invention can be readily understood by considering the following detailed description in conjunction with the accompanying drawings, in which:
To facilitate understanding, identical reference numerals have been used, where possible, to designate identical elements that are common to the figures.
The transport network 140 is typically, but not exclusively, a conventional bi-directional hybrid fiber-coaxial cable network. Subscribers 160 are coupled to the transport network 140 by paths 1501 through 150n (collectively transport network paths 150) (e.g., coaxial cable). Additionally, transport network 140 forwards subscriber access requests along path 175 to the SDS 170, and receives video data from Distribution Manager 180 via path 185.
Commonly assigned U.S. Pat. No. 6,253,375, issued Jun. 26, 2001, which is incorporated herein by reference, describes an information distribution system, known as the ONSETS system, that uses a video server that may benefit from the present invention. Additionally, the video server of the ONSE™ system is described in U.S. Pat. Nos. 5,671,377 and 5,581,778 which are both herein incorporated by reference.
The SDS 170 performs the method of the present invention.
In the three queue embodiment of the SDS 170, a steady-state subscriber queue (SSQ) 2211 through 221n (collectively steady-state subscriber queues 221) is used for “steady-state” subscriber disk reads for active streams (i.e., continuous content retrieval for distribution to subscribers currently watching a program.) Disk access requests in SSQ 221 are assigned the highest priority. A new subscriber queue (NSQ) 2221 through 222n (collectively new subscriber queues 222) is for subscriber requests to begin viewing a program or perform other program related commands, i.e., non-steady state commands such as fast forward or rewind that in essence are a request for a new data stream. Disk access requests in NSQ 222 are assigned medium priority. The other request queue (ORQ) 2231 through 223n (collectively other request queues 223) is for all non-subscriber operations, such as loading content, disk maintenance, and file system meta-data synchronizing. Disk access requests in ORQ 223 are assigned the lowest priority.
Queues 221n, 222n, and 223n are collectively called the SDS queues 200n, where n is an integer greater than zero that represents a disk drive 120n in an array of disk drives 120. For each disk 120n, the queue selector 205 selects requests from the three SDS queues 221n, 222n, and 223n and forwards the requests to the corresponding disk queue 125n via paths 2511 to 251n, 2521 to 251n, and 2531 to 253n, respectively. Each request has an associated worst-case access time based on the type of request and data transfer size. The worst-case access time can be fixed, or dynamically computed based on prior access time statistics. Additionally, each steady-state subscriber request has a time deadline for when the request must complete in order to guarantee continuous video for that subscriber. Disk requests in the NSQ and ORQ generally do not have time deadlines.
Requests in the SSQ 221n are ordered by time deadline so that the request at the front of the queue has the earliest deadline. Consecutive SSQ requests with the same time deadline are ordered by logical disk block address according to an elevator algorithm. The elevator algorithm is a disk scheduling algorithm well-known in the art in which the disk head travels in one direction over the disk cylinders until there are no more requests that can be serviced by continuing in that direction. At this point, the disk head changes direction and repeats the process, thus traveling back and forth over the disk cylinders as it services requests. Since requests in the NSQ and ORQ do not generally have deadlines, they may be ordered on a first come first serve basis, or according to some other desired priority scheme.
In order to keep the disks 120 busy and maximize disk bandwidth utilization, disk command queuing may be employed to ensure that the disk can begin the seek for the next access immediately after it finishes the data transfer for the current disk access. When a steady-state request needs to access a sequence of multiple disks, the request is initially added to the SSQ 2211 of the first disk 1201. After this request is selected for servicing by the first disk 1201, the request is added to the second disk's SSQ 2212 as soon the video server begins sending the data that was recalled from the first disk 120n to the subscriber. Steady-state requests are similarly added to the SSQ 221n of each successive disk 120n.
The queue selector 205 employs an SDS Selection Procedure to select requests from the three SDS queues 200n and forward the requests to an associated disk queue 125n located within each of the disk drives 120n. The SDS Selection Procedure uses worst-case access times, request priorities, and time deadlines in determining which request to forward to the disk queue. The general strategy of the SDS Selection Procedure is to select a non-SSQ request only when such a selection will not cause any of the SSQ 221n requests to miss their time deadlines, even if the non-SSQ request and all requests in the SSQ 221n were to take their worst-case access times. If such a guarantee cannot be made, then the first request in the SSQ is always selected. As an optional step, once a request is selected, the SDS Selection Procedure checks whether the data for the selected read request is already in cache (if caching is used). If this is the case, the disk access request can be discarded and the Selection Procedure is repeated. Otherwise, the selected request is removed from the SDS queue 221n and forwarded to an associated disk queue 125n.
Each queue maintains “a sum of the worst case values” selector that performs a worst case analysis and selects the queue that will be used (in steps 320 and 330 described below) to send the next command to the disk drive. The following pseudocode represents the operation of such a selector.
Preference is given to the NRQ over the ORQ, which only takes requests off the ORQ if the NSQ is empty.
The ORQ.head.worstcase and NSQ.head.worstcase are the respective worstcase access times to fulfill the next request in the ORQ and NSQ. The “remaining time” value is computed as follows:
remaining time=disk Q Remaining Time (SSQn)−disk Q worst case (PQn)
The worst case access time value may be dynamically computed or empirically measured to be a cut off time that defines a period in which accesses have an acceptable error rate. If the first entry fulfills the requirement in step 320, then this first entry is selected (step 340); otherwise, the Selection Procedure checks whether the first entry in the ORQ can be selected while guaranteeing that all SSQ requests will meet their time deadlines in the worst case (step 330). If so, then this first entry is selected (step 350); otherwise, the procedure proceeds to step 315, wherein the procedure queries whether the first entry in the SSQ can be executed within its time deadline assuming the worst case access time. If the request cannot be executed in time, the request is discarded at step 325 and the procedure returns to step 320.
If, however, the request can be executed in the allotted time in step 315, the first entry of the SSQ is selected at step 360. The selected request is then removed from its queue (step 370). Furthermore, if caching is used, the Selection Procedure checks whether data for the selected request is already in cache (step 380) (the caching step 380 is shown in phantom to represent that it is an optional step). If the request is cached, the selected request is discarded (step 382) and the Selection Procedure 300 is repeated (step 320). Otherwise, the selected request is forwarded to the associated disk queue (step 390).
The SDS executes the Selection Procedure during two scheduling events, called the scheduling interval and the command completion event. The scheduling interval is a fixed, periodic interval, while a command completion event occurs every time one of the disks completes a command. (Note that it is possible, although highly unlikely, that multiple disks complete a command simultaneously at a command completion event.) At each scheduling interval, a procedure called the Scheduling Interval Procedure is executed, and at each command completion event, a procedure called the Command Completion Procedure is executed. In the case that a scheduling interval and a command completion coincide, the Command Completion Procedure is executed first (i.e., the Command Completion Procedure is given priority over the Scheduling Interval Procedure). Alternatively, if the disk queue has a depth that is greater than one, then the execution priority of these routines is reversed. Such reversal leaves more time available to do other operations.
In the Scheduling Interval Procedure, steady-state requests are added to the next SSQ, if possible. (Recall that a steady-state request can be added to the next SSQ as soon as the data is output from the video server to the subscriber), and all SSQ are reordered to maintain correct time deadline order. The first entries in each of the SSQs are then sorted based on time deadlines, which determines the order with which the disks are serviced. For each disk, the Selection Procedure 300 is repeatedly executed as long as the associated disk queue is not full, at least one of the three SDS queues (SSQ, NSQ, ORQ) is not empty, and there is a request in one of the three SDS queues that satisfies the Selection Procedure criteria. For example, if in a three-Disk system when the disk queues are not full the first entry in Disk 1's SSQ has a time deadline of 35, the first entry in Disk 2's SS 5 has a time deadline of 28, and the first entry in Disk 3's SSQ has a time deadline of 39, then the disks would be serviced in the following order: Disk 2, Disk 1, Disk 3. Once the disk order has been established, then the SDS Selection Procedure is performed for each disk in that order.
Generally, in a video server application, the extents for the data are very long (e.g., hundreds of kilobytes) such that the disk queues have a depth of one. In other applications using shorter data extents, the disk queues may have various depths, e.g., five requests could be stored and executed in a first-in, first-out (FIFO) manner. The extent size is inversely proportioned to disk queue depth where data delivery latency is the driving force that dictates the use of a large extent size for video server applications. For other applications where the extent size is relatively small, the disk queue depth is dictated by the desire to reduce disk drive idle time.
As disclosed in
In the case of large disk queues, however, filling the disk queues in a round-robin fashion may be more efficient. A round-robin version of the Scheduling Interval Procedure for large disk queues is shown in
Specifically, a vector D is defined as an ordered list of all the disks, where the order is based on the time deadlines of the first entry in each disk's SSQ (step 530). A Boolean variable SELECT is initialized to false, and an integer variable i is initialized to 1 (step 540). The following condition is then tested: if i=n+1 and SELECT=false (step 550). As will be seen shortly, this condition will only be true when all of the disks have been selected and no requests could be added to any of the disk's queues. Next (step 555), if i=n+1 (i.e., the last disk had been selected in the previous iteration), then i is set to 1 (start again with the first disk). If disk Di's disk queue is full (step 560), or all three of Di's SDS queues are empty (step 570), then the next disk is selected (step 585). The Selection Procedure is performed for Di (step 300), and if a request satisfying the Selection Procedure criteria was found, SELECT is set to true (step 580), and the next disk is selected (step 585). Thus the SELECT variable indicates whether a request was added to one of the disk queues during a pass over the vector of disks.
The Command Completion Procedure is executed, on a first-in, first-out basis, every time a disk completes a command. Thus, for each completed command, the Command Completion Procedure executes in the order in which the commands are completed, i.e., using the FIFO command handling step as shown in
Alternatively, the procedure can be adapted to handle simultaneous command events. In this procedure, it is first determined if multiple disks have completed a command simultaneously at the command completion event. (Most likely only one disk will have completed a command at the command completion event, but the multiple-disk situation is possible.) If more than one disk has completed a command, then the first entries in the SSQs of these disks are sorted based on time deadlines, thereby determining the order in which the disks are serviced. Once the disk order has been established, the SDS Selection Procedure is performed for each disk in order in the same manner as the Scheduling Interval Procedure (
A formal specification of both forms of the Command Completion Procedure is shown in flowchart form in
As disclosed in
In both the Scheduling Interval and Command Completion Procedures, the ordering of requests within the disk queues are managed by the video server central processing unit (CPU), and not the disks themselves. (Any reordering operations normally performed by the disk must be disabled.) While reordering by the disks would improve the average seek time, managing the disk queues by the CPU is required to preserve the time deadlines of the user requests.
In one embodiment, the method of the present invention is implemented as a multi-threaded process.
One basis for the controlled admission policy is the existence of at least two separate queues 910A and 910B for each disk 906n in a server's disk loop 912. This is shown schematically in
Recall that the steady state disk scheduling consists of a user sequentially accessing each disk in the disk loop by enqueuing a data request, i.e., the user request is enqueued for an extent read on disk J at time T, and on disk J+1 at time T+SP and on disk J+2 at time T+2*SP, and so on where SP is the service period within which all steady state users must be serviced. The fact that that user must read from disk J between times T and T+SP means that the user's request for data from disk J is enqueued into disk J's SSQ at time T, and that within the next service period the disk loop must service that request. Although the request is entered into the SSQ at time T, if many clients are using the server, it is likely that the request is not actually serviced for some time, during which the request sits pending in the queue while the request waits for its time to actually read from disk. The existence of the NUQ's (distinct from the SSQ's) allows the server to give steady state user requests priority over pending new user requests.
In order to perform a controlled admission policy, the server must be able to ascertain whether allowing a new user disk read to proceed ahead of any already enqueued steady state requests (on the same disk) will potentially cause missed deadline problems with the already existing steady state users of the server. In order to be able to make such a determination, the server must know each user's disk deadlines and the extent size of the requested data. (The extent size determines the expected time that the disk read will take.) If there are D disks in the disk loop, each user enqueues a read from each disk periodically once every D service periods. The full set of a user's disk deadlines can thus be summarized with just one number, e.g., the user's first deadline on disk 0, since all the other deadlines are simply periodic extensions from that one. Rather than use actual numeric deadlines, the following discussion uses “enqueue times”, which are one SP before each deadline. Each user's steady state scheduling requirements can thus be fully summarized with two numbers: (1) the extent size E of the data requested by the user, and (2) a normalized time value T0 (such that 0≦T0<D*SP), that tells when the user will enqueue a read from disk 0.
The dashed vector 1004 represents a disk usage request from a new client attempting to enter the server. That user's extent size is E_new and that user's normalized disk 0 request time is T0(new). T0(new) is calculated as follows: suppose the time the server receives the new user request is T_req and suppose the request is for a read from disk 1. Then, if the server were to allow that request to proceed (preempting any already enqueued, but not started, steady state reads) then that user would be requesting a read from disk 0 (D−1) service periods later (since there are D disks in the loop), at time
T0(new)_unnormalized=T—req+(D−1)*SP.
Assuming all times are measured with respect to some time 0 that occurred before any client entered the server, T0(new) is then simply the remainder of T0(new)_unnormalized after dividing by D service periods:
T0(new)=T0(new)_unnormalized % (D*SP).
Note that the service period prior to T0(new) has three steady state users requesting disk 0 reads in it: users 1, 2 and 3 with extent sizes E1, E2 and E3. Similarly, the service period following when the new user would read from disk 0 has three users 4, 5 and 6 requesting disk 0 reads.
Suppose user 3's request would come 5 milliseconds (msec) before the new user's request, and user 4's would come 5 msec after the new user's request, so that
T0(new)−T0(3)=T0(4)−T0(new)=5 msec.
Further suppose at the time the server receives the new user's request (T_req), user 3's request is still pending on disk 1's SSQ (the request was enqueued on disk 1's SSQ 5 msec earlier). The goal of the server's controlled admission algorithm is to ascertain whether preempting user 3's pending request on disk 1 with the new user's request, and delaying user 4's, will cause any missed deadlines by any existing server clients (user 3 or 4, or any others).
The amount of time it takes to read a fixed amount of data from a hard disk is not completely deterministic. In fact, the data access time depends on the distance the hard disk arm needs to seek, on whether multiple “on-track” attempts need to be made to successfully read serve data, and on the rotational latency experienced once the read head is determined to be on-track. These factors cause the statistical distribution of access times required to read a certain extent size to range over 100 msec.
The controlled admission algorithm must thus allow for the stochastic nature of the disk access process. To provide further understanding of this issue, a probabilistic analysis is performed below for the following problem: given a sequence of Q disk requests for extent sizes E1, E2, . . . , EQ, how long must the system wait before it is known that the probability that all Q accesses have completed is greater than 1-z, for some small number z. The total time the system must wait is called T_Q(E1, E2, . . . , EQ). For z=10−6, the probability that all Q reads are not finished after waiting T_Q is smaller than one in a million.
The analysis is performed for a single fixed extent size E. Let
The following shows a method of calculating J_Q(n,E) given the p(n,E) as input.
Pi=probability a single access takes between i and i+1 msec.
Pi=0 for i ≧N=>N msec=max access time.
Define JQ(n)=1−IQ(n)=probability of Q accesses taking >n msec.
Then the above equations become
Here θ(n≧0)=1 and θ(n<0)=0.
The minimum time to wait for all Q accesses to finish with probability greater than 1-z is T_Q(E,E, . . . , E). T_Q(E, E, . . . E can then be directly obtained from J_Q(n,E) as the minimum “n” such that J_Q(n,E) <z.
The foregoing analysis can be extended to multiple constant bit rate (mCBR), i.e., to different extent sizes. The first problem to be dealt with is that the extent size can vary continually. In the single extent size (CBR) case, the system only needs the p(n,E) distribution of the one extent size E as input. But in the mCBR case, E can vary, so the system needs to be able to estimate (or interpolate) p(n,E) for any E. As discussed below, this is performed by noting that the system can pick a baseline E (called E—0 there), and estimate the other p(n,E) as rigid shifts of p(n,E—0). With that approximation, the following shows how to calculate T_Q(E1, . . . EQ) given the p(n,E—0) and the shift parameters as input.
From
psh(n,E)=psh(n−Δ(E),Eo)
A preliminary result needed is that JQ(E1 . . . EQ) is independent of the order of the E1 . . . EQ:
The general result then follows recursively from this.
Now suppose p(jE2)=p(j−Δ,E1). Then
Since JQ(n)=1−IQ(n), the above arguments recursively give the following result:
If the psh(nE) are probability densities satisfying
psh(n,E)=0 for n<0, and
psh(n,Ei)=p(n−Δi,Eo),
then
JQsh(n;E1 . . . EQ)=JQsh(n−Δ1−Δ2 . . . ΔQ;EoEo . . . Eo).
That implies
TQsh(E1 . . . EQ)=TQsh(Eo . . . Eo)+Δ1+Δ2+ . . . +ΔQ
For example,
TQ=19sh[10(768 KB)+5(4 KB)+4(2 MB)]
=TQ=19sh[19(768 KB)]+5Δ(4 KB)+4Δ(2 MB)
=19(75 msec)+5(−56)+4(108) msec
=1633 msec.
This mathematical analysis is combined with simulations to create a critical time T_crit to be used in the controlled admission algorithm, in the following manner. Referring to the flow diagram of the admission algorithm or method 1300 shown in
If a read is active, the estimated time the read will complete is first calculated at step 1308 (using the probability curves shown in
To answer that question, the system calculates at step 1316 the T_Q value for the new user as follows. The new user itself, and each user with normalized disk 0 access time within one SP greater (i.e., users 4, 5 and 6 in
If, at step 1318, one of the T_Q<T_crit comparisons fails, then the new user is not allowed admission at that user's optimally requested time (i.e., at T_new—1), for fear that such an admission will generate a missed deadline on an already existing client. The admission algorithm 1300 deals with this case with a multi-tiered method, as shown in
While this invention has been particularly shown and described with references to a preferred embodiment thereof, it will be understood by those skilled in the art that various changes in form and details may be made therein without departing from the spirit and scope of the invention as defined by the appended claims.
This application is a continuation of U.S. patent application Ser. No. 09/801,021, filed Mar. 7, 2001, now U.S. Pat. No. 6,691,208, entitled “QUEUING ARCHITECTURE INCLUDING A PLURALITY OF QUEUES AND ASSOCIATED METHOD FOR CONTROLLING ADMISSION FOR DISK ACCESS REQUESTS FOR VIDEO CONTENT,” which is a continuation-in-part of U.S. patent application Ser. No. 09/268,512, filed Mar. 12, 1999, now U.S. Pat. No. 6,378,036, issued Apr. 23, 2002, entitled “STATISTICAL DISK SCHEDULING FOR VIDEO SERVERS,” and claims benefit of U.S. Provisional Application Ser. No. 60/220,776, filed Jul. 25, 2000; all of which applications are hereby incorporated by reference.
Number | Name | Date | Kind |
---|---|---|---|
5220653 | Miro | Jun 1993 | A |
5528513 | Vaitzblit et al. | Jun 1996 | A |
5530912 | Agrawal et al. | Jun 1996 | A |
5561456 | Yu | Oct 1996 | A |
5581778 | Chin et al. | Dec 1996 | A |
5610841 | Tanaka et al. | Mar 1997 | A |
5644786 | Gallagher et al. | Jul 1997 | A |
5671377 | Bleidt et al. | Sep 1997 | A |
5687390 | McMillan, Jr. | Nov 1997 | A |
5721956 | Martin et al. | Feb 1998 | A |
5787482 | Chen et al. | Jul 1998 | A |
5802394 | Baird et al. | Sep 1998 | A |
5870629 | Bordon et al. | Feb 1999 | A |
5926458 | Yin | Jul 1999 | A |
5926649 | Ma et al. | Jul 1999 | A |
5928327 | Wang et al. | Jul 1999 | A |
5991812 | Srinivasan | Nov 1999 | A |
6021464 | Yao et al. | Feb 2000 | A |
6023720 | Aref et al. | Feb 2000 | A |
6061504 | Tzelnic et al. | May 2000 | A |
6253375 | Gordon et al. | Jun 2001 | B1 |
6378036 | Lerman et al. | Apr 2002 | B1 |
6434631 | Bruno et al. | Aug 2002 | B1 |
6721789 | DeMoney | Apr 2004 | B1 |
Number | Date | Country | |
---|---|---|---|
20040064640 A1 | Apr 2004 | US |
Number | Date | Country | |
---|---|---|---|
60220776 | Jul 2000 | US |
Number | Date | Country | |
---|---|---|---|
Parent | 09801021 | Mar 2001 | US |
Child | 10663237 | US |
Number | Date | Country | |
---|---|---|---|
Parent | 09268512 | Mar 1999 | US |
Child | 09801021 | US |