<!doctype html public "-//w3c//dtd html 4.0 transitional//en">

CS 471
Operating Systems


Spring 2010
Final Exam

Time 2 & 1/2 hours


Open Book & Notes

 

 

 

 Name:

 Unix Login:

 

Each Question is 20 points.

 

 


Question 1

 

 

A.  Fill in the number of page faults in the following matrix, assuming the following page reference string:

 

5   6   1   0    1    6   0   8    6    2

 

 Working set

             size

Page

Replacement Algorithm

1

2

10

Optimal

 

 

 

Random

 

 

 

FIFO

 

 

 

LRU

 

 

 

LFU

 

 

 

MFU

 

 

 

 

 


 

Question 2

 

 

A. Explain the meaning of s in the following listing of the passwd file:

 

% cd /usr/bin

% ls -l passwd

-r-sr-sr-x   1 root  sys  27228 Aug 16  2007 passwd

Answer:

 

 

 

B. Consider the following access matrix.

 

 

1.   Is it possible for D1 to access the laser printer? Explain.

Answer:

 

 

 

 

2.   Is it possible for D1 to access F2? Explain.

Answer:


 

Question 3

 

In class we discussed the concepts of Blocking and Nonblocking I/O:

Blocking - process suspended until I/O completed

Nonblocking - Returns quickly with count of bytes read or written

To set a file descriptor fd to Nonblocking we use the following system calls:

        val = fcntl (fd, F_GETFL, 0);

        fcntl (fd, F_SETFL, val | O_NONBLOCK);

 

Consider the following 6 programs:

ServerX and ClientX, where X = 1, 2, 3.

Fill in the following matrix with one of the following choices:

·         DD = Definite Deadlock, the client and server are deadlocked

·         PD = Possible Deadlock, the client and server may reach a deadlock state.

·         NC = Normal Chatting,  a message typed by one “immediately” is seen by the other.

·         EC = Erratic Chatting, a message typed by one “eventually” will be seen by the other.

 

Clients

 

Servers

1

2

3

1

 

 

 

2

 

 

 

3

 

 

 

 


 

ServerX.c

int
main(void)
{
          int             len, listenfd, connfd;
          struct sockaddr_in servaddr, cliaddr;
          char            buff[512];
          int             nread;
          listenfd = socket(AF_INET, SOCK_STREAM, 0);
          bzero(&servaddr, sizeof(servaddr));
          servaddr.sin_family = AF_INET;
          servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
          servaddr.sin_port = htons(10123);
          bind(listenfd, (SA *) & servaddr, sizeof(servaddr));
          listen(listenfd, 0);
          len = sizeof(cliaddr);
          connfd = accept(listenfd, (SA *) & cliaddr, &len);
          ChatX(connfd);
}

 

 

ClientX.c

int
main(int argc, char **argv)
{
          int             sockfd;
          struct sockaddr_in servaddr;
          struct hostent *hp, *gethostbyname();
          char            buffer[512];
          int             nread;

          sockfd = socket(AF_INET, SOCK_STREAM, 0);
          bzero(&servaddr, sizeof(servaddr));
          hp = gethostbyname(argv[1]);
          bcopy(hp->h_addr, &(servaddr.sin_addr.s_addr), hp->h_length);
          servaddr.sin_family = AF_INET;
          servaddr.sin_port = htons(10123);
          if (connect(sockfd, (SA *) & servaddr, sizeof(servaddr)) < 0) {
                   perror("connect error");
                   exit(-1);
          }
      ChatX (sockfd);
}

 


 

ChatFunctions.c:

Void Chat1(int sockfd)
{

        int             nread;
        char            buffer[512];
        for (;;) {
                nread = read(0, buffer, 512);
                if (nread == 0) exit(0);
                write(sockfd, buffer, nread);
                nread = read(sockfd, buffer, 512);
                if (nread == 0) exit(0);
                write(1, buffer, nread);
        }

}

void Chat2(int sockfd)
{
        int             nread;
        char            buffer[512];
        for (;;) {
                nread = read(sockfd, buffer, 512);
                if (nread == 0) exit(0);
                write(1, buffer, nread);
                nread = read(0, buffer, 512);
                if (nread == 0) exit(0);
                write(sockfd, buffer, nread);
        }
}

void Chat3(int sockfd)
{
        int             val, nread;
        char            buffer[512];
        val = fcntl (sockfd, F_GETFL, 0);
        fcntl (sockfd, F_SETFL, val | O_NONBLOCK);
        val = fcntl (0, F_GETFL, 0);
        fcntl (0, F_SETFL, val | O_NONBLOCK);
        for (;;) {
                nread = read(0, buffer, 512);
                if (nread == 0) exit(0);
                write(sockfd, buffer, nread);
                nread = read(sockfd, buffer, 512);
                if (nread == 0) exit(0);
                write(1, buffer, nread);
                usleep(1000);
        }
}

 

Question 4

 

A.   Calculate the total head movement for servicing the following request Queue according to the specified disk I/O scheduling algorithms.

Request Queue (cylinder range 0-100): 83   37  14   24   65

Head pointer:  cylinder 0

 

Disk Scheduling Algorithm

FCFS

SSTF

C-LOOK

 

Total Head Movement

 

 

 

 

 

B.  The following is the typical information kept about a file in UNIX.

 

 

 

Assume the following:

·         A data block pointer =  10 bytes.

·         Number of direct blocks = 10

·         A block size = 1000 bytes.

Calculate the maximum possible file size in blocks.

Answer:

 

 

 

 

C.   To keep track of the free disk blocks, one method is to use a Bit vector where

Bit [i] = 0 means block i is occupied.

     Assume a word length of 32 bits and the prefix of the bit map is: 003

     What is the index number of the first empty block?

Answer:

 

 

 

Question 5

 

The following is an example of a general directory structure.

 

 


 

 

 

A.   Draw the director structure rooted at Q5 after executing the followingcommands:

 

% pwd

/home/cs471w/public_html/spring10/final

% mkdir Q5

% cd Q5

% mkdir D1 D2

% cd D1

% echo HI > F1

% echo BY > F2

% cd  ../D2

% touch F3

% mkdir D3

% cd D3

% ln –s /home/cs471w/public_html/spring10/final/Q5/D1  F4

% ln  F4/F1 F5

 

Answer:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B.   What is the output of the following two statements:

 

% cat /home/cs471w/public_html/spring10/final/Q3/D2/D1/F5

Answer:

 

 

% cat /home/cs471w/public_html/spring10/final/Q3/D2/D3/F4/F2

Answer:

 

 

 

 

 

 

C.   Consider the following three programs:

Q5R.c

int

main(int argc, char **argv)

{

        int             fd;

        fd = open("Q5file", O_RDONLY);

        read_lock(fd);

        printf("Q5R");

        while (1) sleep(20);

        unlock(fd);

}

Q5S.c

int

main(int argc, char **argv)

{

        int             fd;

        fd = open("Q5file", O_RDONLY);

        read_lock(fd);

        printf("Q5S");

        lseek(fd, 5, SEEK_SET);

        read(fd, buf, 5);

        write(1, buf, 5);

        while (1) sleep(20);

        unlock(fd);

}

Q5W.c

int

main(int argc, char **argv)

{

        int             fd;

        fd = open("Q5file", O_WTONLY);

        write_lock(fd);

        printf("Q5W");

        while (1) sleep(20);

        unlock(fd);

}

 

Assume the contents of Q5file is: 0123456789

Fill in the following matrix with the output of each program, assuming we have 4 open windows and in each window we execute one program as follows:

1st raw:  execute Q5R then  Q5R, Q5S and Q5W

2nd raw:  execute Q5S then  Q5R, Q5S and Q5W

3rd raw:  execute Q5W then  Q5R, Q5S and Q5W

If no out is produced, enter: nothing

 

 

Q5R

Q5S

Q5W

Q5R

 

 

 

Q5S

 

 

 

Q5W