• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *   Copyright (c) International Business Machines  Corp., 2001
3  *
4  *   This program is free software;  you can redistribute it and/or modify
5  *   it under the terms of the GNU General Public License as published by
6  *   the Free Software Foundation; either version 2 of the License, or
7  *   (at your option) any later version.
8  *
9  *   This program is distributed in the hope that it will be useful,
10  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
12  *   the GNU General Public License for more details.
13  *
14  *   You should have received a copy of the GNU General Public License
15  *   along with this program;  if not, write to the Free Software
16  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 /*
19   FUNCTIONS: Scheduler Test Suite
20  */
21 
22 /*---------------------------------------------------------------------+
23 |                               sched_tc2                              |
24 | ==================================================================== |
25 |                                                                      |
26 | Description:  Creates long-term disk I/O bound process               |
27 |                                                                      |
28 | Algorithm:    o  Set process priority                                |
29 |               o  Open a large file and repeatedly read from it       |
30 |                  for a specified time duration                       |
31 |                                                                      |
32 | To compile:   cc -o sched_tc2 sched_tc2.c -L. -lpsc                  |
33 |                                                                      |
34 | Usage:        sched_tc2 [-t sec] [-p priority] [-v] [-d]             |
35 |                                                                      |
36 | Last update:   Ver. 1.3, 4/10/94 23:05:01                           |
37 |                                                                      |
38 | Change Activity                                                      |
39 |                                                                      |
40 |   Version  Date    Name  Reason                                      |
41 |    0.1     050689  CTU   Initial version                             |
42 |    0.2     010402  Manoj Iyer Ported to Linux			       |
43 |                                                                      |
44 +---------------------------------------------------------------------*/
45 
46 #include   <stdlib.h>
47 #include <sys/time.h>
48 #include <sys/resource.h>
49 #include   "sched.h"
50 
51 /*
52  * Defines:
53  *
54  * USAGE: usage statement
55  *
56  * DEFAULT_PRIORITY_TYPE: default priority
57  *
58  * DEFAULT_EXECUTION_TIME: default execution time (in seconds)
59  *
60  * DEFAULT_MATRIX_SIZE: default size of matrix
61  *
62  */
63 #define DEFAULT_PRIORITY_TYPE	"variable"
64 #define DEFAULT_EXECUTION_TIME	1800
65 #define MATRIX_SIZE		100
66 #define USAGE "Usage:  %s  [-p priority] [-t sec] [-v] [-d]      \n" \
67               "        -t sec      execution time (default 1800 sec)    \n" \
68               "        -p priority priority (default variable)          \n" \
69               "        -v          verbose                              \n" \
70               "        -d          enable debugging messages            \n"
71 
72 /*
73  * Function prototypes:
74  *
75  * process_file: reads data file
76  *
77  * parse_args: parse command line arguments
78  */
79 void parse_args(int, char **);
80 void multiply_matrices();
81 
82 /*
83  * Global variables:
84  *
85  * verbose: enable normal messages
86  *
87  * debug: enable debugging messages
88  *
89  * execution_time: testcase execution time (hours)
90  *
91  * priority: process type (fixed priority, variable priority)
92  */
93 int verbose = 0;
94 int debug = 0;
95 long execution_time = DEFAULT_EXECUTION_TIME;
96 char *priority = DEFAULT_PRIORITY_TYPE;
97 
98 /*---------------------------------------------------------------------+
99 |                                 main                                 |
100 | ==================================================================== |
101 |                                                                      |
102 | Function:  ...                                                       |
103 |                                                                      |
104 +---------------------------------------------------------------------*/
main(int argc,char ** argv)105 int main(int argc, char **argv)
106 {
107 	long start_time;	/* time at start of testcase */
108 	int i;
109 
110 	/*
111 	 * Process command line arguments...
112 	 */
113 	if (argc < 2) {
114 		fprintf(stderr, USAGE, *argv);
115 		exit(0);
116 	}
117 
118 	parse_args(argc, argv);
119 	if (verbose)
120 		printf("%s: Scheduler TestSuite program\n\n", *argv);
121 	if (debug) {
122 		printf("\tpriority:       %s\n", priority);
123 		printf("\texecution_time: %ld (sec)\n", execution_time);
124 	}
125 
126 	/*
127 	 * Adjust the priority of this process if the real time flag is set
128 	 */
129 	if (!strcmp(priority, "fixed")) {
130 #ifndef __linux__
131 		if (setpri(0, DEFAULT_PRIORITY) < 0)
132 			sys_error("setpri failed", __FILE__, __LINE__);
133 #else
134 		if (setpriority(PRIO_PROCESS, 0, 0) < 0)
135 			sys_error("setpri failed", __FILE__, __LINE__);
136 #endif
137 	}
138 
139 	/*
140 	 * Continuously multiply matrix as time permits...
141 	 */
142 	i = 0;
143 	start_time = time(NULL);
144 
145 	if (debug)
146 		printf("\n");
147 	while ((time(NULL) - start_time) < execution_time) {
148 		if (debug) {
149 			printf("\r\tmultiplying matrix [%d], time left: %ld",
150 			       i++,
151 			       execution_time - (time(NULL) - start_time));
152 			fflush(stdout);
153 		}
154 		multiply_matrices();
155 	}
156 	if (debug)
157 		printf("\n");
158 
159 	/*
160 	 * Exit with success!
161 	 */
162 	if (verbose)
163 		printf("\nsuccessful!\n");
164 	return (0);
165 }
166 
167 /*---------------------------------------------------------------------+
168 |                         multiply_matricies ()                        |
169 | ==================================================================== |
170 |                                                                      |
171 | Function:  Randomly assigns two matrices values and then multiplies  |
172 |            them together.                                            |
173 |                                                                      |
174 +---------------------------------------------------------------------*/
multiply_matrices()175 void multiply_matrices()
176 {
177 	int i, j, k;		/* various indeces to access the arrays */
178 	float matrix_1[MATRIX_SIZE][MATRIX_SIZE];
179 	float matrix_2[MATRIX_SIZE][MATRIX_SIZE];
180 	float matrix_3[MATRIX_SIZE][MATRIX_SIZE];
181 
182 	/* first, fill the two matrices to be multiplied with random values */
183 
184 	for (i = 0; i < MATRIX_SIZE; i++) {
185 		for (j = 0; j < MATRIX_SIZE; j++) {
186 			matrix_1[i][j] = (float)(rand() % 100);
187 			matrix_2[i][j] = (float)(rand() % 100);
188 		}
189 	}
190 
191 	/*
192 	 * Now multiply the two matrices
193 	 */
194 	for (i = 0; i < MATRIX_SIZE; i++) {
195 		for (j = 0; j < MATRIX_SIZE; j++) {
196 			matrix_3[i][j] = 0.0;	/* clear the element first */
197 			for (k = 0; k < MATRIX_SIZE; k++)
198 				matrix_3[i][j] +=
199 				    matrix_1[i][k] * matrix_2[k][j];
200 		}
201 	}
202 }
203 
204 /*---------------------------------------------------------------------+
205 |                             parse_args ()                            |
206 | ==================================================================== |
207 |                                                                      |
208 | Function:  Parse the command line arguments & initialize global      |
209 |            variables.                                                |
210 |                                                                      |
211 | Updates:   (command line options)                                    |
212 |                                                                      |
213 |            [-p] priority: "fixed" or "variable"                      |
214 |            [-t] n:        execution time in hours                    |
215 |            [-v]           verbose                                    |
216 |            [-d]           enable debugging messages                  |
217 |                                                                      |
218 +---------------------------------------------------------------------*/
parse_args(int argc,char ** argv)219 void parse_args(int argc, char **argv)
220 {
221 	int opt;
222 	int pflg = 0, tflg = 0;
223 	int errflag = 0;
224 	char *program_name = *argv;
225 	extern char *optarg;	/* Command line option */
226 
227 	/*
228 	 * Parse command line options.
229 	 */
230 	if (argc < 2) {
231 		fprintf(stderr, USAGE, program_name);
232 		exit(0);
233 	}
234 
235 	while ((opt = getopt(argc, argv, "p:t:vd")) != EOF) {
236 		switch (opt) {
237 		case 'p':	/* process type */
238 			pflg++;
239 			priority = optarg;
240 			break;
241 		case 't':	/* time (hours) */
242 			tflg++;
243 			execution_time = atof(optarg);
244 			break;
245 		case 'v':	/* verbose */
246 			verbose++;
247 			break;
248 		case 'd':	/* enable debugging messages */
249 			verbose++;
250 			debug++;
251 			break;
252 		default:
253 			errflag++;
254 			break;
255 		}
256 	}
257 
258 	/*
259 	 * Check percentage, execution time and process slots...
260 	 */
261 	if (pflg) {
262 		if (strcmp(priority, "fixed") && strcmp(priority, "variable"))
263 			errflag++;
264 	}
265 	if (tflg) {
266 		if (execution_time < 0.0 || execution_time > 360000)
267 			errflag++;
268 	}
269 	if (errflag) {
270 		fprintf(stderr, USAGE, program_name);
271 		exit(2);
272 	}
273 }
274