This lecture picks up the concept of Modularity from last lecture and further divides it into two categories: soft modularity and hard modularity. From that, the lecture defines "Process" that utilizes hard modularity to enforce their independent share of computing resources.
process file has(major resources we need):
ALU | ALU |
registers | registers * (*when running) |
memory(RAM)   | physical memory ** (**when running, and "looking at"(access) |
I/O | emulated/simulated |
(system calls) | (kernels implementation) |
(pretend) | on real |
So far, we have looked at OS organization via virtualization. Our machine must have a CPU, with an ALU and registers, RAM/primary memory, and a bus of devices. We must also consider the dimension of time, in which we allow our machine to run.
Each process has a process descriptor inside the RAM, which contains a copy of registers, memory information, file descriptor entries(0-1023). The fd entries sector of the process descriptor that is associated to each process records the process's access of certain files.
compress process memory into memory info
access file indirectly by a number of file descriptor
in Linux/Unix, 'int' is a handle for an open file
other OSes, 'point': struct file descriptor *
int main(void){
return open("/dev/tty", O_RDWR);
}
The design is bad, there is no sense to return a file descriptor in main() as above.
1.write to a pipe, it's full, all the readers are busy doing something else.
cat /etc/passwd | less
-- make buffer bigger (exhaust memory)2.write to pipe, no readers
cat /etc/passwd | :
-- suspend will have a problem, maybe suspend forever
if (printf("hello")<0)
goto exit_from_write_loop
3.read from empty pipe
The pipe will hang waiting for the writer, that never writes (wait forever)
read reutrns 0(EOF)
int fd[2];
pipe(fd);
read(fd[0], &c, 1);
4.named pipe
cat will hang until write end of pipe is closed. Only close the write end of pipe will send eof to read end of pipe.
$mkfifo /tmp/pipe
$cat /tmp/pipe > out &
$echo helllo > /tmp/pipe
also need to be careful of deadlock, which both way are hang.
rm bigfile
grep intersting < bigfile
it will display the output, since it run fd level instruction first, then file name level.
error in your code
/O, FP overflow, invalid insn
impatient user or infinite loop SIGINT
impending power outage SIGPWR
p = waitpid(-1, &status, WNOHANG) in a SIGCHILD
user went away SIGHUP
while (fork()) continue; SIGKILL(cannot be caught or ignored)
#kill -KILL -29316 pid negative process means kill all of its descendants too.
runaway program
alarm(20) SIGALRM
--break out of a loop
--kill a process, or suspend it kill -STOP (29) kill -CONT (29)
--timeouts
important, unusual, unexpected events
sighandler_t signal(int, sighandler
^ ^ new handler
| | void (*sighandler_t) (int)
old handler signal
) #
signal call will cause bug like following
signal(29, f)
x = y + 1;
<---- f(29) and change the value of x
x = x + 1;
gzip:
fd = open("foo", O_RDONLY);
<- signal(SIGINT, cleanup) 1.race here(may not create the foo.gz before signal comes)
fo = open("foo.gz", O_WRONLY)
while (compress(fd, fo))
continue;
to fix this problem, we need to use a signal handler to make the gzip action atomic.