CS 3423 Operating Systems
Assignment 3
1. [40 points] Problem Set
From Chapter 3 of Sieberchatz 9th edition book. “Processes”
1. [20 points] 3.2: Describe the actions taken by a kernel to context-switch between
processes.
2. [20 points] 3.11.a: What are the benefits and the disadvantages of each of the
following? Consider both the system level and the programmer level.
a. Synchronous and asynchronous communication
2. [40 points] Nachos Exercise
This is a continuation of last week’s Write(char *buffer, int size, OpenFileId
id) system call. Be sure you are able to understand last week’s assignment completely, or
else you won’t be able to do this part. If you could not get your code working for hw2,
contact a TA to get graded for hw2 first and then obtain a working copy of the relevant files.
Last week, you were asked to use DEBUG statement to print the parameter values passed to
the system call and the return value from the system call to the user program.
Modify the {userprog} /exception.cc:ExceptionHandler() code from hw2 by
typecasting the first parameter value (which corresponds to the buffer pointer) to (char*)
type and use DEBUG statement to print it as a string. However, it does not print "Hello
world\n", and in fact it most likely results in a core dump (crash).
1. [20 points] Explain why dereferencing the first parameter in ExceptionHandler()
does not result in the string whose address is passed by the statement
Write("Hello world\n", 12, 1); in {test} /hw2.c:main() .2. [20 points] Explain the correct way for ExceptionHandler() to obtain the string,
by giving both verbal description and the C code to do it. Hint: the answer can be
found easily in other system call examples in the same code. Otherwise, study the
Machine class in {machine} /machine.h and find the relevant data structure.
Then, modify exception.cc to implement this change. Remove the DEBUG
statements that you added for hw2, and add a DEBUG statement to print the string.
Turn in the modified exception.cc file, and also submit a typescript that shows how
you rebuild Nachos (i.e., make clean; make in build.linux directory) and running the
same hw2 executable.
3. [20 points] Python Programming
This week, you are to write code for a producer-consumer problem using message passing.
Python supports pretty much all of the system programming libraries as C does, but in a
slightly different (and convenient) way. For sockets programming, you can use the module
named socket . You can get help in interactive mode:
$ python3
import socket
help(socket)
Help on module socket:
NAME
socket
...
A socket is an endpoint of a point-to-point connection over TCP/IP network between two
processes on either the same machine or different machines. There are two phases: (1)
establishing a connection (2) sending and receiving data.
3.1 Establishing a Connection
Connections need to be established by two processes that wish to communicate with each
other. The side making a request to connect is the client , and the side awaiting connection
is called the server. Your assignment is to write the server side; you will use the telnet
program as the client.
To make a connection, you can use the following sample code.
import socket
def MakeServerSocket(host='', port=8888, limit=10):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind((host, port))
except socket.error as msg:print('bind fails: '+str(msg[0]))
import sys
sys.exit(-1)
s.listen(limit)
return s
The return value from calling
s = MakeServerSocket()
will be a “server socket” ready for accepting connection requests from clients. Any potential
client can send request to the server’s IP address at the given port number (defaults to 8888
in this case), and up to limit (defaults to 10) clients may have pending requests.
For the server to accept connection requests, it should do
conn, addr = s.accept()
This is a blocking call. It will not return until a client comes and requests a connection. if
successful, then conn contains the actual socket for the server to communicate with the
client, and addr is the IP address of the client. Note that the difference between s and
conn is that s is for accepting connections only but cannot be used for communication,
whereas conn is for actual sending and receiving.
3.2 Sending and Receiving
The methods to use for communication are send() and recv(). In the example below, conn
is just the name of the socket object from accept .
● conn.send( data ) ; you may want to use conn.sendall() instead if you want to
make sure all bytes are sent.
● conn.recv( numOfBytes)
In Python, you can’t just send a str type (string), because str is more general and can be
encoded differently. So, you have to use the encode method to convert the string to an
array of bytes. For example, if you want to send the string 'hello' , you need to pass
'hello'.encode('utf-8') , since utf-8 is a way to encode Unicode using 8-bit (namely
byte) sequences.
For this assignment, you are to write a simple server program in Python to return the string
of one value at a time from the YieldBST() function you wrote for hw2. Your server needs
to look like this:
● create a server socket (using the code above)
● use the server socket to accept client requests and get the socket for communicating
with the client.
● make the generator object by calling YieldBST(T); you may call it gen .
● go into a loop to iterate over gen
○ receive from client but discard the message
○ convert the item from the generator (which is an int ) to a str and then to a
byte-like array using the .encode() method above
○ send it to the clientYou don’t have to write a client program; instead, you can use telnet , which is a common
text-mode client program found in most Unix systems. To run both the client and server on
the same machine, you may open two terminal windows. In one, you start the server by
typing
$ python3 hw3.py
Assuming you use the default port number, then in another window, you type
$ telnet localhost 8888
Then you should be able to talk to the server by typing. You may also print additional
messages to display the status of your program.
For example, a telnet session may look like this:
$ telnet 127.0.0.1 8888
Connected to localhost.
Escape character is '^]'.
hello # this is just junk ignored by the server
6
world # you can type and delete; client won’t send till enter
12
a # more stuff, or just enter
14
b
17
cdefg
32
hijklm
35
opq
40
Connection closed by foreign host.
$ U
se the script program to capture the session when running telnet, similar to the example
above, but rename the typescript file as typescript3 before submitting.