More on Programs and Processes Jeff Chase Duke University.

Slides:



Advertisements
Similar presentations
Constructor. 2 constructor The main use of constructors is to initialize objects. A constructor is a special member function, whose name is same as class.
Advertisements

Carnegie Mellon 1 Dynamic Memory Allocation: Basic Concepts : Introduction to Computer Systems 17 th Lecture, Oct. 21, 2010 Instructors: Randy Bryant.
Dynamic Memory Allocation I Topics Basic representation and alignment (mainly for static memory allocation, main concepts carry over to dynamic memory.
Chris Riesbeck, Fall 2007 Dynamic Memory Allocation Today Dynamic memory allocation – mechanisms & policies Memory bugs.
CSC 501 Operating Systems Principles
1 Memory Allocation Professor Jennifer Rexford COS 217.
User-Level Memory Management in Linux Programming
Memory allocation CSE 2451 Matt Boggus. sizeof The sizeof unary operator will return the number of bytes reserved for a variable or data type. Determine:
The Environment of a UNIX Process. Introduction How is main() called? How are arguments passed? Memory layout? Memory allocation? Environment variables.
CSE 451: Operating Systems Winter 2006 Module 4 Processes Ed Lazowska Allen Center 570.
Processes CSCI 444/544 Operating Systems Fall 2008.
Process in Unix, Linux and Windows CS-3013 C-term Processes in Unix, Linux, and Windows CS-3013 Operating Systems (Slides include materials from.
CS-502 Fall 2006Processes in Unix, Linux, & Windows 1 Processes in Unix, Linux, and Windows CS502 Operating Systems.
C and Data Structures Baojian Hua
Unix & Windows Processes 1 CS502 Spring 2006 Unix/Windows Processes.
Processes in Unix, Linux, and Windows CS-502 Fall Processes in Unix, Linux, and Windows CS502 Operating Systems (Slides include materials from Operating.
Process. Process Concept Process – a program in execution Textbook uses the terms job and process almost interchangeably A process includes: – program.
Lecture Topics: 11/3 Address spaces Memory protection Creating a process –NT style –Unix style.
System Calls 1.
Protection and the Kernel: Mode, Space, and Context.
Process in Unix, Linux, and Windows CS-3013 A-term Processes in Unix, Linux, and Windows CS-3013 Operating Systems (Slides include materials from.
Today’s Topics Introducing process: the basic mechanism for concurrent programming –Process management related system calls Process creation Process termination.
Multiprogramming CSE451 Andrew Whitaker. Overview Multiprogramming: Running multiple programs “at the same time”  Requires multiplexing (sharing) the.
Pointers and Arrays Beyond Chapter Pointers and Arrays What are the real differences? Pointer Holds the address of a variable Can be pointed.
Processes and Threads CS550 Operating Systems. Processes and Threads These exist only at execution time They have fast state changes -> in memory and.
The Structure of Processes (Chap 6 in the book “The Design of the UNIX Operating System”)
Computer Science and Software Engineering University of Wisconsin - Platteville 2. Pointer Yan Shi CS/SE2630 Lecture Notes.
University of Washington Today Finished up virtual memory On to memory allocation Lab 3 grades up HW 4 up later today. Lab 5 out (this afternoon): time.
1 Dynamic Memory Allocation –The need –malloc/free –Memory Leaks –Dangling Pointers and Garbage Collection Today’s Material.
Dynamic Memory Allocation. Domain A subset of the total domain name space. A domain represents a level of the hierarchy in the Domain Name Space, and.
More on Programs and Processes Jeff Chase Duke University.
Dynamic Memory. We will follow different order from Course Book We will follow different order from Course Book First we will cover Sect The new.
Mode, space, and context: the basics
CPS4200 Unix Systems Programming Chapter 2. Programs, Processes and Threads A program is a prepared sequence of instructions to accomplish a defined task.
Mode, space, and context: the basics Jeff Chase Duke University.
CS 153 Design of Operating Systems Spring 2015 Lecture 5: Processes and Threads.
Processes CS 6560: Operating Systems Design. 2 Von Neuman Model Both text (program) and data reside in memory Execution cycle Fetch instruction Decode.
Pointers in C Computer Organization I 1 August 2009 © McQuain, Feng & Ribbens Memory and Addresses Memory is just a sequence of byte-sized.
Topics memory alignment and structures typedef for struct names bitwise & for viewing bits malloc and free (dynamic storage in C) new and delete (dynamic.
Processes and Virtual Memory
Programs and Processes Jeff Chase Duke University.
Notes on Heap Manager in C Jeff Chase Duke University.
Some abstractions and a peek at their implementation Jeff Chase Duke University.
D u k e S y s t e m s CPS 310 Unix Process Model Jeff Chase Duke University
C Tutorial - Pointers CS 537 – Introduction to Operating Systems.
“Success consists of going from failure to failure without loss of enthusiasm.” Winston Churchill.
You learned how to declare pointer variables how to store the address of a variable into a pointer variable of the same type as the variable how to manipulate.
Variables Bryce Boe 2012/09/05 CS32, Summer 2012 B.
A process is a program in execution A running system consists of multiple processes – OS processes Processes started by the OS to do “system things” –
Dynamic Allocation in C
Dynamic Storage Allocation
Introduction to Operating Systems
Protection of System Resources
Processes in Unix, Linux, and Windows
CSCI206 - Computer Organization & Programming
Processes in Unix, Linux, and Windows
Introduction to Operating Systems
Processes in Unix, Linux, and Windows
System Structure and Process Model
Memory Allocation CS 217.
What does an Operating System Do?
CSCE 313 – Introduction to UNIx process
October 7, 2002 Gary Kimura Lecture #4 October 7, 2002
CSE 451: Operating Systems Winter 2003 Lecture 4 Processes
Processes in Unix, Linux, and Windows
Processes in Unix and Windows
CS510 Operating System Foundations
CSE 451: Operating Systems Autumn 2004 Module 4 Processes
Outline Chapter 2 (cont) Chapter 3: Processes Virtual machines
Presentation transcript:

More on Programs and Processes Jeff Chase Duke University

Today What does the machine/OS look like to a program? – (continued) How is the machine shared among processes? How are processes protected?

About the heap manager The heap manager is a library module. A program can redefine it, change it, misuse it. It manages memory only within a running program. The kernel allocates memory among programs (processes) – E.g., via sbrk or mmap system calls. lib OS kernel processes prog The heap manager does not protect the program from itself! A buggy program can corrupt the heap! A buggy heap manager can crash the program! “fate sharing”

0x0 0x7fffffff Static data Dynamic data (heap/BSS) Text (code) Stack Reserved VAS example (32-bit) The program uses virtual memory through its process’ Virtual Address Space: An addressable array of bytes… Containing every instruction the process thread can execute… And every piece of data those instructions can read/write… – i.e., read/write == load/store on memory Partitioned into logical segments with distinct purpose and use. Every memory reference by a thread is interpreted in the context of its VAS. – Resolves to a location in machine memory

0x0 0x7fffffff Static data Dynamic data (heap/BSS) Text (code) Stack Reserved 0x0 0x7fffffff Static data Dynamic data (heap/BSS) Text (code) Stack Reserved

Operating Systems: The Classical View data Programs run as independent processes. Protected system calls...and upcalls (e.g., signals) Protected OS kernel mediates access to shared resources. Threads enter the kernel for OS services. Each process has a private virtual address space and one or more threads. The kernel code and data are protected from untrusted processes.

Foreground and background A multiprogrammed OS can run many processes concurrently / simultaneously / at the same time. When you run a program as a command to the shell (e.g., Terminal), by default the process is foreground. – The shell calls the OS to create a child process to run the program, passes control of the terminal to the child process, and waits for the process to finish (exit). You can also run a program in background with &. – & is an arbitrary syntax used in Unix since the 1960s. – The shell creates the child process and starts it running, but keeps control of the terminal to accept another command. – & allows you to run multiple concurrent processes. – The processes share the machine; they could run different programs, or the same program.

cpu.c (OSTEP) int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "usage: cpu \n"); exit(1); } char *str = argv[1]; while (1) { printf("%s\n", str); Spin(1); } return 0; } time  chase$ cc -o cpu cpu.c chase$./cpu A & chase$./cpu B & A B A B …

mem.c (OSTEP) int main(int argc, char *argv[]) { int *p; p = malloc(sizeof(int)); *p = atoi(argv[1]); while (1) { Spin(1); *p = *p + 1; printf("(pid:%d) value of p: %d\n”, getpid(), *p); } chase$ cc -o mem mem.c chase$./mem 21 & chase$./mem 42 & (pid:5587) value of p: 22 (pid:5587) value of p: 23 (pid:5587) value of p: 24 (pid:5588) value of p: 43 (pid:5588) value of p: 44 (pid:5587) value of p: 25 (pid:5587) value of p: 26 … data p pid: 5587pid: 5588

Heap: dynamic memory Allocated heap blocks for structs or objects. Align! A contiguous chunk of memory obtained from OS kernel. E.g., with Unix sbrk() system call. A runtime library obtains the block and manages it as a “heap” for use by the programming language environment, to store dynamic objects. E.g., with Unix malloc and free library calls.

Using the heap (1) #include int main() { char* cb = (char*) malloc(14); cb[0]='h'; cb[1]='i'; cb[2]='!'; cb[3]='\0'; printf("%s\n", cb); free(cb); } chase$ cc -o heap heap.c chase$./heap hi! chase$

Using the heap (2) #include int main() { char* cb = (char*) malloc(14); cb[0]='h'; cb[1]='i'; cb[2]='!'; cb[3]='\0'; printf("%s\n", cb); int *ip = (int*)cb; printf("0x%x\n", *ip); free(cb); } chase$ cc -o heap heap.c chase$./heap hi! 0x chase$ h=0x68 i=0x69 !=0x21 0 cb ip Try:

Endianness A silly difference among machine architectures creates a need for byte swapping when unlike machines exchange data over a network. Lilliput and Blefuscu are at war over which end of a soft-boiled egg to crack. Gulliver’s Travel’s 1726

x86 is little-endian chase$ cc -o heap heap.c chase$./heap hi! 0x chase$ h=0x68 i=0x69 !=0x21 0 cb ip Little-endian: the lowest- numbered byte of a word (or longword or quadword) is the least significant.

64 bytes: 3 ways p + 0x0 0x1f 0x0 0x1f 0x0 char p[] char *p int p[] int* p p char* p[] char** p Pointers (addresses) are 8 bytes on a 64-bit machine. Memory is “fungible”.

Alignment p + 0x0 0x1f 0x0 0x1f 0x0 char p[] char *p int p[] int* p p char* p[] char** p Machines desire/require that an n-byte type is aligned on an n-byte boundary. n = 2 i X X X

Using the heap (3) char* cb = (char*)malloc(14); strcpy(cb, "hi!"); free(cb); /* * Dangling reference! */ printf("%s\n", cb); int *ip = (int*)cb; printf("0x%x\n", *ip); /* * Uninitialized heap block! */ char* cb2 = (char*)malloc(14); printf("%s\n", cb2); chase$ cc -o heap2 heap2.c chase$./heap2 ??? chase$ h=0x68 i=0x69 !=0x21 0 cb ip

Using the heap (4) chase$ cc -o heap2 heap2.c chase$./heap2 hi! 0x hi! chase$ h=0x68 i=0x69 !=0x21 0 cb ip char* cb = (char*)malloc(14); strcpy(cb, "hi!"); free(cb); /* * Dangling reference! */ printf("%s\n", cb); int *ip = (int*)cb; printf("0x%x\n", *ip); /* * Uninitialized heap block! */ char* cb2 = (char*)malloc(14); printf("%s\n", cb2);

WARNING These behaviors are undefined. Any program whose behavior relies on the meaning of a dangling reference is incorrect. For example, a change in the allocation policy of the heap manager could result in different behavior. Can a program stay safe from dangling references by just never calling free?

Another way Java’s new operator calls malloc “under the hood”. – Allocate a heap block for each new object. – How big should the heap block be? Who decides? – Java initializes the block by automatically calling a type-specific constructor defined by the program. – C++ is the same. But in Java there is no free (or delete)! – No dangling references! How does Java avoid memory leaks?

Digression: Garbage collection Java has new but no free (or delete)! – No dangling references! Q: How does Java avoid memory leaks? A: automatic garbage collection Java is strongly typed: e.g., it tracks and controls pointers, and it knows where all of them are and what object types they reference. Java knows if an object has no references pointing to it, and it calls free for you! But Java has no pointer arithmetic: your program cannot manipulate virtual addresses as numbers, as in C.

Pointer arithmetic char* cb = (char*) malloc(14); strcpy(cb, "hi!"); void* ptr = (void*)cb; ptr = ptr + 2; cb = (char*)ptr; printf("%s\n", cb); free(cb); h=0x68 i=0x69 !=0x21 0 cb ptr chase$ cc -o heap3 heap3.c chase$./heap3 ??? chase$

Pointer arithmetic char* cb = (char*) malloc(14); strcpy(cb, "hi!"); unsigned long ptr = (unsigned long)cb; ptr = ptr + 2; cb = (char*)ptr; printf("%s\n", cb); free(cb); h=0x68 i=0x69 !=0x21 0 cb ptr chase$ cc -o heap3 heap3.c chase$./heap3 ! heap3(5478) malloc: *** error for object 0x7f92a9c000e2: pointer being freed was not allocated Abort trap: 6 chase$

Simple I/O: args and printf #include int main(int argc, char* argv[]) { int i; printf("arguments: %d\n", argc); for (i=0; i<argc; i++) { printf("%d: %s\n", i, argv[i]); }

Environment variables #include int main(int argc, char* argv[], char* envp[]) { int i; int count = atoi(argv[1]); for (i=0; i < count; i++) { printf("env %d: %s\n", i, envp[i]); }

Libraries Programs may incorporate (link to) libraries packaged with the OS or written by third parties. – E.g., C standard library and standard I/O library These libraries may even define a system API that applications use. (e.g., heap manager malloc and free is in a library). Libraries run as part of the program. Any failure in the library can interfere with other parts of the running program, and vice versa. These libraries have no more privilege or power than any other part of the running program. However, some libraries are merely wrappers for system calls that transfer control to the trusted operating system kernel.

On most platforms, program execution contexts are isolated. They cannot interfere with one another, even if they are running the same program. I.e., each context is its own sandbox/lockbox. The programs may fail independently. In classical OS, a context is called a process. Each has a private virtual address space. Protection / isolation Butler Lampson’s definition: “I am isolated if anything that goes wrong is my fault (or my program’s fault).” Isolation might not be absolute. E.g., the program instances may choose to interact, or may access shared data.