联系方式

  • QQ:99515681
  • 邮箱:99515681@qq.com
  • 工作时间:8:00-21:00
  • 微信:codinghelp

您当前位置:首页 >> C/C++编程C/C++编程

日期:2019-12-06 10:52

Due before: 11:59 PM (before Midnight) on Dec 4 2019

Page 1 of 6

CSE-381: Systems 2

Homework #9

Due: Wednesday Dec 4 2019 before 11:59 PM

Email-based help Cutoff: 5:00 PM on Tue, Dec 3 2019

Maximum Points: 35

Submission Instructions

This homework assignment must be turned-in electronically via Canvas. Ensure your

C++ source code is named MUID_hw3.cpp, where MUID is your Miami University

Unique ID. Ensure your program compiles without any warnings or style violations.

Ensure you thoroughly test operations of your program as indicated. Once you have

tested your implementation, upload the following onto Canvas:

1. The 1 C++ source file developed for this homework.

General Note: Upload each file associated with homework individually to Canvas. Do

not upload archive file formats such as zip/tar/gz/7zip/rar etc.

Objective

The objective of this homework is to:

? Do some self-research/learning

? Understand the use of /proc file system

? Review the use of server sockets for communication

? Review fork, exec, and pipes in preparation for final exam.

? Extend a C++ program that can be used as a web server

? Develop a web server to run programs & monitor programs

Grading Rubric:

The program submitted for this homework must pass necessary base

case test(s) in order to qualify for earning any score at all.

Programs that do not meet base case requirements will be assigned

zero score!

Program that do not compile, have a method longer than 25 lines, or

just some skeleton code will be assigned zero score.

? See points set for each command and overall structure, organization, conciseness,

variable-names, etc. in the next page. If your methods are not concise points will be

deducted.

? -1 Points: for each warning generated by the compiler (warnings are most likely sources

of errors in C++ programs)

Due before: 11:59 PM (before Midnight) on Dec 4 2019

Page 2 of 6

NOTE: Violating CSE programming style guidelines is a compiler error! Your program should

not have any style violations.

Background

The /proc file system is a logical view of internal data that is maintained by the Linux kernel

about a process. For a given process the kernel exposes a logical file called

/proc/[pid]/stat (where [pid ]is the process ID, e.g., /proc/235/stat). This stats

file contains a variety of statistics about the process that can be used to report runtime statistics

about the process. In this homework, you will be using the following 3 values as described in the

following URL: http://man7.org/linux/man-pages/man5/proc.5.html

Word number

in stats file

Logical name

for Value

Notes

14th word utime (float) Cumulative user time. This value must be divided by divide

by sysconf(_SC_CLK_TCK) to get value in seconds

and round it using std::round.

15th word stime (float) Cumulative system time. This value must be divided by

divide by sysconf(_SC_CLK_TCK) to get value in

seconds and round it using std:round.

23rd word vsize (long) Current virtual memory size in bytes. This value must be

divided by 106 to get memory size in MB.

Starter code

The starter code for this homework is just the solution for Exercise #8 along with test inputs &

outputs supplied as a zip file. Invest time to refresh your memory by reviewing Exercise #8.

Requirements

Suitably extend (how you modify is up to you) the starter source code to perform the following

additional functionality:

1. Base case -- Run a program & record runtime statistics [22 points]: Run a specified

command with suitable arguments and return the output and runtime statistics in the

HTML format shown further below.

a. Outputs are sent line-by-line to the client using chunked encoding.

b. Record and print runtime statistics every second by opening & reading

/proc/[pid]/stat

c. Reading and printing statistics each second for the duration of a child process can

be accomplished as suggested below:

int exitCode = 0;

while (waitpid(pid, &exitCode, WNOHANG) == 0) {

sleep(1); // sleep for 1 second.

// Record current statistics about the process.

}

d. You must run the above loop in a separate thread to record the necessary

statistics.

Due before: 11:59 PM (before Midnight) on Dec 4 2019

Page 3 of 6

e. The recorded statistics must finally be sent to the client as one chunk at the end

of child-program execution.

? Note on formatting statistics: The statistics on each line of the output is

rounded using the std::round method..

! The base case is relatively straightforward. You are given plenty of time to finish

this homework. Consequently, if the base case does not operate as expected, as per

the course policy, the whole program will be assigned zero score.

2. Setup statistics to plot a chart [8 points]: If the genChart parameter (3rd parameter) to

the serveClient method is true, then the program should also generate the runtime

statistics as a JSON array in the following format:

[ second, utime+stime, vsize ]

See annotated HTML in base case output below for details.

Note: This output should use exactly the same statistics values from base case. Do not reread

the stats file to generate the statistics in JSON output.

3. Code quality [5 points]: Five points in this homework are reserved for good code quality,

effective code reuse, and documentation (in the form of doxygen comments). These 5

points would be the hardest to earn in this homework.

Functional testing

The supplied starter code already includes a simple test harness that will also be used for testing

and grading purposes. Several test inputs and expected output files are also supplied to

streamline your testing as shown below. The true/false flag (i.e., last command-line

argument) is used to enable/disable generation of JSON format used to plot charts.

$ ./hw9 base_case1_inputs.txt my_base_case1_output.txt false

$ diff my_base_case1_output.txt base_case1_expected_outputs.txt

Testing for graph case:

$ ./hw9 base_case1_inputs.txt my_graph_case1_output.txt true

$ diff my_graph_case1_output.txt graph_case1_expected_outputs.txt

Needless to add, the above diff commands will not produce any output if the outputs are

identical.

! Testing note: Due to non-deterministic scheduling and multiple users on the

machine, the CPU time and virtual memory use could be a bit different in some

cases. Minor differences in values or 1-more/1-less line of output is expected and

normal. This note also applies to testing via the CODE plug-in.

Ensure you test with input files and corresponding expected outputs prior to submission.

Due before: 11:59 PM (before Midnight) on Dec 4 2019

Page 4 of 6

Browser testing

You absolutely should test operation of your webserver running on

os1.csi.miamioh.edu. A partial screenshot is shown further below for your reference (you

will have to use a different port number instead of 4000).

Submit to Canvas

This homework assignment must be turned-in electronically via Canvas. Ensure your C++ source

files are named appropriately. Ensure your program compiles (without any warnings or style

errors) successfully. Ensure you have tested operations of your program with a browser. Once

you have tested your implementation, upload the following onto Canvas:

? The 1 C++ source file you developed for this homework. See earlier Testing note.

Upload all the necessary C++ source files to onto Canvas independently. Do not submit

zip/7zip/tar/gzip files. Upload each file independently.

Screenshot of browser test:

Due before: 11:59 PM (before Midnight) on Dec 4 2019

Page 5 of 6

Base case #2 Annotated output HTML

Parts of the HTML highlighted in gray are fixed/constant strings that can be hardcoded in your

program. Values highlighted in red are chunk sizes in hexadecimal notation.

HTTP/1.1 200 OK

Content-Type: text/html

Transfer-Encoding: chunked

Connection: Close

156

<html>

<head>

<script type='text/javascript'

src='https://www.gstatic.com/charts/loader.js'></script>

<script type='text/javascript' src='/draw_chart.js'></script>

<link rel='stylesheet' type='text/css' href='/mystyle.css'>

</head>

<body>

<h3>Output from program</h3>

<textarea style='width: 700px; height: 200px'>

1b

Using CPU for computation.

1d

Using memory for operations.

1b

Using CPU for computation.

1d

Using memory for operations.

10

Exit code: 0

6a3

</textarea>

<h2>Runtime statistics</h2>

<table>

<tr><th>Time (sec)</th><th>User time</th><th>System time</th><th>Memory

(MB)</th></tr>

<tr><td>1</td><td>1</td><td>0</td><td>14</td></tr>

<tr><td>2</td><td>2</td><td>0</td><td>14</td></tr>

<tr><td>3</td><td>3</td><td>0</td><td>14</td></tr>

<tr><td>4</td><td>4</td><td>0</td><td>22</td></tr>

<tr><td>5</td><td>4</td><td>0</td><td>22</td></tr>

<tr><td>6</td><td>4</td><td>0</td><td>31</td></tr>

<tr><td>7</td><td>4</td><td>0</td><td>31</td></tr>

<tr><td>8</td><td>4</td><td>0</td><td>47</td></tr>

<tr><td>9</td><td>4</td><td>0</td><td>47</td></tr>

Due before: 11:59 PM (before Midnight) on Dec 4 2019

Page 6 of 6

<tr><td>10</td><td>4</td><td>0</td><td>14</td></tr>

<tr><td>11</td><td>4</td><td>1</td><td>14</td></tr>

<tr><td>12</td><td>5</td><td>1</td><td>14</td></tr>

<tr><td>13</td><td>6</td><td>1</td><td>14</td></tr>

<tr><td>14</td><td>7</td><td>1</td><td>22</td></tr>

<tr><td>15</td><td>7</td><td>1</td><td>22</td></tr>

<tr><td>16</td><td>7</td><td>1</td><td>39</td></tr>

<tr><td>17</td><td>7</td><td>1</td><td>39</td></tr>

<tr><td>18</td><td>7</td><td>1</td><td>73</td></tr>

<tr><td>19</td><td>7</td><td>1</td><td>73</td></tr>

<tr><td>20</td><td>7</td><td>1</td><td>39</td></tr>

<tr><td>21</td><td>7</td><td>1</td><td>0</td></tr>

</table>

<div id='chart' style='width: 900px; height: 500px'></div>

</body>

<script type='text/javascript'>

function getChartData() {

return google.visualization.arrayToDataTable(

[

['Time (sec)', 'CPU Usage', 'Memory Usage'],

]

);

}

</script>

</html>

0


版权所有:编程辅导网 2021 All Rights Reserved 联系方式:QQ:99515681 微信:codinghelp 电子信箱:99515681@qq.com
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。 站长地图

python代写
微信客服:codinghelp