Synchronous I/O
Asynchronous I/O
write(fd, buffer, length) {continue processing} status = waitio(fd) {blocked waiting for I/O to complete} {continue processing}
How is waitio implemented ? Using semaphores :
PROCEDURE waitio(fd) P(complete(fd)) return status END
File Manager Process
PROCESS fileman initialise data structures REPEAT receiveany(source, msg) case msg.mode open : get device descriptor check access permissions and mode if device free - allocate file descriptor {what if device already open ?} insert info. into descriptor send(source,fd) close : ... read : use fd to find the file descriptor save source in descriptor check if request is valid set up devicemsg send(device, devicemsg) write : ... I/O complete: If error - notify find descriptor for device send(user_process, status) FOREVER END
Figure 5: File manager data structures
open(device_name, mode) find device in device descriptor table IF (allocated) or (out of service) or (mode incompatible with operations supported) or (no access permissions) THEN send(source, error) ELSE find free file descriptor set mode and device descriptor pointer set device status busy send(source, fd) close(fd) IF (allocated to process) THEN set device status free deallocate file descriptor send(source,ok)
The Device Descriptor (held by the filemanager) contains :
Device Name Access Control Information Permitted Operations Current Status : allocated, free, out of service etc Current User : process id if allocated Device Handler process id Error Handling procedures - who to send what messages