1 / 22

UNIX Files

UNIX Files. File organization and a few primitives. The UNIX file system!. Each UNIX file has a description that is stored in a structure called inode . An inode includes: file size location owner (uid) permissions access times etc. Directories.

quinn-tran
Download Presentation

UNIX Files

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. UNIX Files File organization and a few primitives

  2. The UNIX file system! • Each UNIX file has a description that is stored in a structure called inode. An inode includes: • file size • location • owner (uid) • permissions • access times • etc.

  3. Directories • A UNIX directory is a file containing a correspondence between inodes and filenames. • When referencing a file, the Operating System (OS) traverses the File System tree to find the inode/name in the appropriate directory. • Once the OS has determined the inode number it can access the inode to get information about the file.

  4. Links • A link is an association between a filename and an inode. We distinguish 2 types of links: • hard links • soft (or symbolic) links • Directory entries are hard links as they directly link an inode to a filename. • Symbolic links use the file (contents) as a pointer to another filename.

  5. More on links • each inode may be pointed to by a number of directory entries (hard links) • each inode keeps a counter, indicating how many hard links exist to that inode. • When a hard link is removed via the rm or unlink command, the OS removes the corresponding link but does not free the inode and corresponding data blocks until the link count is 0

  6. Different types of files • UNIX deals with two different classes of files: • Special Files • Regular Files • Regular files are just ordinary data files on disk - something you have used all along when you studied programming! • Special files are abstractions of devices. UNIX deals with devices as if they were regular files. • The interface between the file system and the device is implemented through a device driver - a program that hides the details of the actual device.

  7. special files • UNIX distinguishes two types of special files: • Block Special Files represent a device with characteristics similar to a disk. The device driver transfers chunks or blocks of data between the operating system and the device. • Character Special Files represent devices with characteristics similar to a keyboard. The device is abstracted by a stream of bytes that can only be accessed in sequential order.

  8. Access Primitives • UNIX provides access to files and devices through a (very) small set of basic system calls (primitives) • create() • open() • close() • read() • write() • ioctl()

  9. the open() call #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *path, int flags, [mode_t mode]); char *path: is a string that contains the fully qualified filename of the file to be opened. int flags: specifies the method of access i.e. read_only, write_only read_and_write. mode_t mode: optional parameter used to set the access permissions upon file creation.

  10. read() and write() #include <unistd.h> ssize_t read(int filedes, void *buffer, size_t n); ssize_t write(int filedes, const void *buffer, size_t n); int filedes: file descriptor that has been obtained though an open() or create() call. void *buffer: pointer to an array that will hold the data that is read or holds the data to be written. size_t n: the number of bytes that are to be read or written from/to the file.

  11. A close() call Although all open files are closed by the OS upon completion of the program, it is good programming style to “clean up” after you are done with any system resource. Please make it a habit to close all files that your program has used as soon as you don’t need them anymore! #include <unistd.h> int close(int filedes); Remember, closing resources timely can improve system performance and prevent deadlocks from happening (more later)

  12. A rudimentary example: #include <fcntl.h> /* controls file attributes */ #include<unistd.h> /* defines symbolic constants */ main() { int fd; /* a file descriptor */ ssize_t nread; /* number of bytes read */ char buf[1024]; /* data buffer */ /* open the file “data” for reading */ fd = open(“data”, O_RDONLY); /* read in the data */ nread = read(fd, buf, 1024); /* close the file */ close(fd); }

  13. C Versions of Read, Write, … • C provides its own versions of read, write, open, close, namely • fread • fwrite • fopen • fclose • fflush --- ??? • The C versions are more portable as they are defined in the language itself. • The “OS” versions (read, write, …) usually allow for more efficient manipulation of files

  14. Buffered vs unbuffered I/O • The system can execute in user mode or kernel mode! • Memory is divided into user space and kernel space! • What happens when we write to a file? • the write call forces a context switch to the system. What?? • the system copies the specified number of bytes from user space into kernel space. (into mbufs) • the system wakes up the device driver to write these mbufs to the physical device (if the file-system is in synchronous mode). • the system selects a new process to run. • finally, control is returned to the process that executed the write call. • What are the effects on the performance of your program?

  15. Un-buffered I/O • Every read and write is executed by the kernel. • Hence, every read and write will cause a context switch in order for the system routines to execute. • Why do we suffer performance loss? • How can we reduce the loss of performance? • ==> We could try to move as much data as possible with each system call. • How can we measure the performance?

  16. Buffered I/O • explicit versus implicit buffering: • explicit - collect as many bytes as you can before writing to file and read more than a single byte at a time. • Then, use the basic UNIX I/O primitives • Careful !! Your program my behave differently on different systems. • Here, the programmer is explicitly controlling the buffer-size • implicit - use the Stream facility provided by <stdio.h> • FILE *fd, fopen, fprintf, fflush, fclose, ... etc. • a FILE structure contains a buffer (in user space) that is usually the size of the disk blocking factor (512 or 1024)

  17. Life Cycle of An I/O Request

  18. Interrupt-Driven I/O Cycle

  19. Intel Pentium Processor Event-Vector Table

  20. Direct Memory Access • Used to avoid programmed I/O for large data movement • Requires DMA controller • Bypasses CPU to transfer data directly between I/O device and memory

  21. Six Step Process to Perform DMA Transfer

  22. Improving Performance • Reduce number of context switches • Reduce data copying • Reduce interrupts by using large transfers, smart controllers • Use DMA • Balance CPU, memory, bus, and I/O performance for highest throughput

More Related