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 +---------------------------------------------------------------------*/ 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 +---------------------------------------------------------------------*/ 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 +---------------------------------------------------------------------*/ 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