1 System-Level I/O Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron.

Slides:



Advertisements
Similar presentations
© Original by Donald Acton; Changes by George Tsiknis Unix I/O Related Text Sections: 2nd Ed: and st Ed: and
Advertisements

1. I/O. I/O Unix I/O RIO (robust I/O) package Metadata, sharing, and redirection Standard I/O Conclusions and examples.
Carnegie Mellon 1 System-Level I/O : Introduction to Computer Systems 14 th Lecture, Oct. 12, 2010 Instructors: Randy Bryant and Dave O’Hallaron.
System-Level I/O November 4, 2003 Topics Unix I/O Robust reading and writing Reading file metadata Sharing files I/O redirection Standard I/O “The.
System-Level I/O Topics Unix I/O Robust reading and writing Reading file metadata Sharing files I/O redirection Standard I/O.
System-Level I/O October 8, 2008 Topics Unix I/O Robust reading and writing Reading file metadata Sharing files I/O redirection Standard I/O class14.ppt.
System-Level I/O May 28, 2008 Topics Unix I/O Robust reading and writing Reading file metadata Sharing files I/O redirection Standard I/O.
System-Level I/O November 11, 2004 Topics Unix I/O Robust reading and writing Reading file metadata Sharing files I/O redirection Standard I/O “The.
System-Level I/O Nov 14, 2002 Topics Unix I/O Robust reading and writing Reading file metadata Sharing files I/O redirection Standard I/O class24.ppt
System-Level I/O Topics Unix I/O Robust reading and writing Reading file metadata Sharing files I/O redirection Standard I/O.
I/O April 16, 2002 Topics Files Unix I/O Standard I/O Reading: (Beta) or (New) Problems: 12.9 (Beta) or 12.4 (New) class24.ppt
System-Level I/O May 22, 2006 Topics Unix I/O Robust reading and writing Reading file metadata Sharing files I/O redirection Standard I/O.
CS 311 – Lecture 12 Outline File management system calls Stat() Directory Information  Opendir()  Readdir()  Closedir() Truncate() and remove() Lecture.
Recitation 11: I/O Problems Andrew Faulring Section A 18 November 2002.
Introduction to Operating Systems File I/O Most of the following slides are adapted from slides of Gregory Kesden and Markus Püschel of Carnegie Mellon.
System-level I/O Alan L. Cox Some slides adapted from CMU slides.
Chapter 39 Virtsualization of Storage: File and Directory Chien-Chung Shen CIS, UD
Input and Output Topics I/O hardware Unix file abstraction Robust I/O File sharing io.ppt CS 105 “Tour of the Black Holes of Computing”
System-Level I/O Topics Unix I/O Robust reading and writing
Carnegie Mellon 1 System-Level I/O / : Introduction to Computer Systems 15 th Lecture, Oct. 18, 2012 Instructors: Dave O’Hallaron, Greg Ganger,
Week 12 - Friday.  What did we talk about last time?  Exam 2 post mortem  Low level file I/O.
Shell (Part 2). Example r What if we want to support something like this: m ps –le | sort r One process should execute ps –le and another should execute.
Recitation 11: 11/18/02 Outline Robust I/O Chapter 11 Practice Problems Annie Luo Office Hours: Thursday 6:00 – 7:00 Wean.
Pipes A pipe is a simple, synchronized way of passing information between processes A pipe is a special file/buffer that stores a limited amount of data.
CS252: Systems Programming Ninghui Li Based on Slides by Prof. Gustavo Rodriguez-Rivera Topic 8: Opening Files and Starting Processes.
Carnegie Mellon 1 System-Level I/O / : Introduction to Computer Systems 15 th Lecture, Oct. 16, 2014 Instructors: Greg Ganger, Greg Kesden,
Carnegie Mellon 1 System-Level I/O / : Introduction to Computer Systems 15 th Lecture, June 25, 2013 Instructors: Gregory Kesden.
1 IT 252 Computer Organization and Architecture Interaction Between Systems: File Sharing R. Helps.
System-Level I/O March 25, 2004 Topics Unix I/O Robust reading and writing Reading file metadata Sharing files I/O redirection Standard I/O “The.
Lee CSCE 312 TAMU 1 System Level I/O Instructor: Dr. Hyunyoung Lee Based on slides provided by Randy Bryant and Dave O’Hallaron.
Input and Output Topics I/O hardware Unix file abstraction Robust I/O File sharing CS 105 “Tour of the Black Holes of Computing”
System-Level I/O.
Today’s topic Access and manipulate meta data for files –File type, ownership, access permissions, access time, etc How to determine if a file is not there?
Input and Output Topics I/O hardware Unix file abstraction Robust I/O File sharing CS 105 “Tour of the Black Holes of Computing”
Recitation: Signaling S04, Recitation, Section A Debug Multiple Processes using GDB Debug Multiple Processes using GDB Dup2 Dup2 Signaling Signaling.
Laface 2007 File system 2.1 Operating System Design Filesystem system calls buffer allocation algorithms getblk brelse bread breada bwrite iget iput bmap.
CS 105 “Tour of the Black Holes of Computing”
CSE333 SECTION 3. Important Dates Jan 27 th – Homework 1 Due Feb 6 th – Midterm.
1 System-Level I/O. 2 Outline Unix I/O Reading File Metadata Sharing Files & I/O redirection Robust I/O Standard I/O Suggested Reading –10.1~10.3, 10.5~10.7,
CSCI 330 UNIX and Network Programming Unit VIII: I/O Management II.
Carnegie Mellon 1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition System-Level I/O : Introduction to Computer.
File Subsystem in Linux by Dr P.Padmanabham Professor (CSE)&Director Bharat Institute of Engineering &Technology Hyderabad Mobile
Carnegie Mellon /18-243: Introduction to Computer Systems Instructors: Bill Nace and Gregory Kesden (c) All Rights Reserved. All work.
Files Oct. 28, 2008 Topics Mapping file offsets to disk blocks File system buffering and you The directory hierarchy lecture-18.ppt “The course.
System-Level I/O Topics Unix I/O Robust reading and writing Reading file metadata Sharing files I/O redirection Standard I/O.
CSCE Systems Programming Lecture 07 – Make, Stdio, I/O Buffering CSCE 510 Jan 23, 2013.
Week 12 - Friday.  What did we talk about last time?  Exam 2 post mortem.
Carnegie Mellon 1 System-Level I/O / : Introduction to Computer Systems 15 th Lecture, June 24, 2014 Instructors: Gregory Kesden.
Week 12 - Thursday CS222.
System-Level I/O.
Supplementary Material on Unix System Calls and Standard I/O
System-Level I/O : Introduction to Computer Systems
Introduction to Operating Systems File I/O
Files CMSC 15400: Introduction to Computer Systems Chapter 10
CS 105 “Tour of the Black Holes of Computing”
System-Level I/O Topics Unix I/O Robust reading and writing
System-Level I/O October 9, 2008
“The course that gives CMU its Zip!”
“The course that gives CMU its Zip!”
Virtual Memory CSCI 380: Operating Systems Lecture #7 -- Review and Lab Suggestions William Killian.
File I/O (1) Prof. Ikjun Yeom TA – Mugyo
Reference: Advanced Programming in the UNIX Environment, Third Edition, W. Richard Stevens and Stephen A. Rago, Addison-Wesley Professional Computing Series,
File I/O (1) Prof. Ikjun Yeom TA – Hoyoun
IPC Prof. Ikjun Yeom TA – Hoyoun
System-Level I/O CSCI 380: Operating Systems
CSCI 380: Operating Systems William Killian
Chien-Chung Shen CIS, UD
CS 105 “Tour of the Black Holes of Computing”
Instructors: David Trammell
Presentation transcript:

1 System-Level I/O Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron

2 Unix I/O and Files UNIX abstracts many things into files (just a series of bytes) All I/O devices are represented as files:  /dev/sda2 ( /usr disk partition)  /dev/tty2 (terminal) Even the kernel is represented as a file:  /dev/kmem (kernel memory image)  /proc (kernel data structures)

3 Unix File Types Regular file  File containing user/app data (binary, text, whatever)  OS does not know anything about the format  other than “sequence of bytes”, akin to main memory Directory file  A file that contains the names and locations of other files Character special and block special files  Terminals (character special) and disks (block special) FIFO (named pipe)  A file type used for inter-process communication Socket  A file type used for network communication between processes

4 Unix I/O Key Features  All input and output is handled in a consistent and uniform way Basic Unix I/O operations (system calls):  Opening and closing files  open() and close()  Reading and writing a file  read() and write()  Changing the current file position (seek)  indicates next offset into file to read or write  lseek() B0B0 B1B1 B k-1 BkBk B k+1 Current file position = k

5 Opening Files Open a file before access:  Returns a small integer file descriptor (or -1 for error) Why fd?  Kernel maintains an array of info on currently opened files for a process  fd indexes into this in-kernel array Each process starts out with three open files  0: standard input  1: standard output  2: standard error int fd; /* file descriptor */ if ((fd = open(”X", O_RDONLY)) < 0) { perror("open"); exit(1); } For more info, do “man 2 open”

6 Closing Files Closing a file informs the kernel that you are finished accessing that file int fd; /* file descriptor */ int retval; /* return value */ if ((retval = close(fd)) < 0) { perror("close"); exit(1); }

7 Simple read/write example Copying standard in to standard out, one byte at a time #include int main(void) { char c; while(read(0, &c, 1) == 1){ write(1, &c, 1); } exit(0); } cpstdin.c Returns # of bytes read, -1 for error Returns # of bytes written, -1 for error

8 Topics Unix I/O Metadata, sharing, and redirection Standard I/O Conclusions and examples

9 File Metadata (data about data) Per-file metadata maintained by kernel  accessed by users with the stat and fstat functions /* Metadata returned by the stat and fstat functions */ struct stat { dev_t st_dev; /* device */ ino_t st_ino; /* inode */ mode_t st_mode; /* protection and file type */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device type (if inode device) */ off_t st_size; /* total size, in bytes */ unsigned long st_blksize; /* blocksize for filesystem I/O */ unsigned long st_blocks; /* number of blocks allocated */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last change */ };

10 Example of Accessing File Metadata /* statcheck.c - Querying and manipulating a file’s meta data */ #include "csapp.h" int main (int argc, char **argv) { struct stat stat; char *type, *readok; stat(argv[1], &stat); if (S_ISREG(stat.st_mode)) type = "regular"; else if (S_ISDIR(stat.st_mode)) type = "directory"; else type = "other"; if ((stat.st_mode & S_IRUSR)) /* OK to read?*/ readok = "yes"; else readok = "no"; printf("type: %s, read: %s\n", type, readok); exit(0); } unix>./statcheck statcheck.c type: regular, read: yes unix> chmod 000 statcheck.c unix>./statcheck statcheck.c type: regular, read: no unix>./statcheck.. type: directory, read: yes unix>./statcheck /dev/kmem type: other, read: yes statcheck.c

11 Accessing Directories Only recommended operation on a directory: read its entries  dirent structure contains information about a directory entry  DIR structure contains information about directory while stepping through its entries #include { DIR *directory; struct dirent *de;... if (!(directory = opendir(dir_name))) error("Failed to open directory");... while (0 != (de = readdir(directory))) { printf("Found file: %s\n", de->d_name); }... closedir(directory); }

12 Kernel tracks user processes’ opened files fd 0 fd 1 fd 2 fd 3 fd 4 Descriptor table [one table per process] Open file table [shared by all processes] v-node table [shared by all processes] File pos refcnt=1... File pos refcnt=1... stderr stdout stdin File access... File size File type File access... File size File type File A (terminal) File B (disk) Info in stat struct kernel state

13 Calling open twice with the same filename fd 0 fd 1 fd 2 fd 3 fd 4 Descriptor table [one table per process] Open file table [shared by all processes] v-node table [shared by all processes] File pos refcnt=1... File pos refcnt=1... stderr stdout stdin File access... File size File type File A (disk) File B (disk) Kernel tracks user processes’ opened files

14 Child process inherits its parent’s open files Before fork() call: fd 0 fd 1 fd 2 fd 3 fd 4 Descriptor table [one table per process] Open file table [shared by all processes] v-node table [shared by all processes] File pos refcnt=1... File pos refcnt=1... stderr stdout stdin File access... File size File type File access... File size File type File A (terminal) File B (disk)

15 After fork():  Child’s descriptor table same as parent’s, and +1 to each refcnt fd 0 fd 1 fd 2 fd 3 fd 4 Descriptor table [one table per process] Open file table [shared by all processes] v-node table [shared by all processes] File pos refcnt=2... File pos refcnt=2... File access... File size File type File access... File size File type File A (terminal) File B (disk) fd 0 fd 1 fd 2 fd 3 fd 4 Parent Child Child process inherits its parent’s open files

16 Fun with File Descriptors (fork) What would this program print for file containing “abcde”? #include int main(int argc, char *argv[]) { int fd1; char c1, c2; char *fname = argv[1]; fd1 = open(fname, O_RDONLY, 0); read(fd1, &c1, 1); if (fork()) { /* Parent */ read(fd1, &c2, 1); printf("Parent: c1 = %c, c2 = %c\n", c1, c2); } else { /* Child */ sleep(5); read(fd1, &c2, 1); printf("Child: c1 = %c, c2 = %c\n", c1, c2); } return 0; } unix>./fd_fork Parent: c1 = a, c2 = b Child: c1 = a, c2 = c

17 I/O Redirection How does a shell redirect I/O? unix$ ls > foo.txt Use syscall dup2(oldfd, newfd)  Copies descriptor table entry oldfd to entry newfd file a file b fd 0 fd 1 fd 2 fd 3 fd 4 Descriptor table before dup2(4,1) file b fd 0 fd 1 fd 2 fd 3 fd 4 Descriptor table after dup2(4,1)

18 Fun with File Descriptors (dup2) What would this program print for file containing “abcde”? #include int main(int argc, char *argv[]) { int fd1, fd2, fd3; char c1, c2, c3; char *fname = argv[1]; fd1 = open(fname, O_RDONLY, 0); fd2 = open(fname, O_RDONLY, 0); fd3 = open(fname, O_RDONLY, 0); dup2(fd2, fd3); read(fd1, &c1, 1); read(fd2, &c2, 1); read(fd3, &c3, 1); printf("c1 = %c, c2 = %c, c3 = %c\n", c1, c2, c3); return 0; } ffiles1.c unix>./ffiles1 abcde.txt c1 = a, c2 = a, c3 = b

19 Shell I/O redirection Exercise: implement shell I/O redirect functionality using dup2 unix$ ls > foo.txt

20 I/O Redirection Example Step #1: open file to which stdout should be redirected  Do it in parent or child? Before or after calling exec? fd 0 fd 1 fd 2 fd 3 fd 4 Descriptor table [one table per process] Open file table [shared by all processes] v-node table [shared by all processes] File pos refcnt=1... File pos refcnt=1... stderr stdout stdin File access... File size File type File access... File size File type File A File B Opened file has fd=4

21 I/O Redirection Example (cont.) Step #2: call dup2(4,1)  cause fd=1 (stdout) to refer to disk file pointed at by fd=4 fd 0 fd 1 fd 2 fd 3 fd 4 Descriptor table [one table per process] Open file table [shared by all processes] v-node table [shared by all processes] File pos refcnt=0... File pos refcnt=2... stderr stdout stdin File access... File size File type File access... File size File type File A File B

22 Shell I/O redirection // Parse commandline to obtain “prog”, its arguments // and redirected to file “out”… // Here? if ((pid = fork())==0) { // Here? if (execve(prog,…) < 0) { // Here? printf(“%s: command not found\n”, prog); exit(0); } } if (!bg) { // Here? waitpid(pid,…); } // Where does this code go? fd = open(out, O_WRONLY|O_CREAT); dup2(fd,1); close(fd);

23 Shell I/O redirection // Parse commandline to obtain “prog”, its arguments // and redirected to file “out”… if ((pid = fork())==0) { if (execve(prog,…) < 0) { printf(“%s: command not found\n”, prog); exit(0); } if (!bg) { waitpid(pid,…); } fd = open(out, O_WRONLY|O_CREAT); dup2(fd,1); close(fd);

24 Topics Unix I/O Metadata, sharing, and redirection Standard I/O Conclusions and examples

25 Standard I/O Functions The C library ( libc.so ) contains a collection of higher- level standard I/O functions fopen flcose fdopen fread fwrite fscanf fprintf sscanf sprintf fgets fputs fflush fseek open read write lseek stat close Internally invokes I/O syscalls

26 Standard I/O Streams Standard I/O implements buffered streams  Abstraction for a file descriptor and a buffer in memory. C programs begin life with three open streams  stdin (standard input)  stdout (standard output)  stderr (standard error) #include extern FILE *stdin; /* standard input (descriptor 0) */ extern FILE *stdout; /* standard output (descriptor 1) */ extern FILE *stderr; /* standard error (descriptor 2) */ int main() { fprintf(stdout, "Hello, world\n"); }

27 Buffering in Standard I/O Standard I/O functions use buffered I/O Buffer flushed to output fd on “\n” or fflush() call printf("h"); hello\n.. printf("e"); printf("l"); printf("o"); printf("\n"); fflush(stdout); buf write(1, buf, 6);

28 Unix I/O vs. standard I/O Unix I/O:  + most general, lowest overhead (no intermediate functions)  + provides functions for accessing file metadata  + can be used safely in signal handlers  - no built-in buffering Standard I/O:  + buffering increases efficiency by reducing # of read and write system calls  - no metadata access  - not appropriate for signal handlers.  - not appropriate for input and output on network sockets

29 Choosing I/O Functions General rule: use the highest-level I/O available  Many C programs are able to do all of their work using the standard I/O When to use standard I/O  When working with disk or terminal files When to use raw Unix I/O  Inside signal handlers, because Unix I/O is async-signal-safe  When you are reading and writing network sockets.  In rare cases when you can tune for absolute highest performance

30 Standard I/O Buffering in Action See buffering in using the strace program: linux> strace./hello execve("./hello", ["hello"], [/*... */]).... write(1, "hello\n", 6) = 6... exit_group(0) = ? #include int main() { printf("h"); printf("e"); printf("l"); printf("o"); printf("\n"); fflush(stdout); exit(0); }