grind: run parallel system calls forever
This commit is contained in:
		
							parent
							
								
									028af27646
								
							
						
					
					
						commit
						16b3b63f06
					
				
					 3 changed files with 170 additions and 5 deletions
				
			
		
							
								
								
									
										1
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -127,6 +127,7 @@ UPROGS=\ | ||||||
| 	$U/_sh\
 | 	$U/_sh\
 | ||||||
| 	$U/_stressfs\
 | 	$U/_stressfs\
 | ||||||
| 	$U/_usertests\
 | 	$U/_usertests\
 | ||||||
|  | 	$U/_grind\
 | ||||||
| 	$U/_wc\
 | 	$U/_wc\
 | ||||||
| 	$U/_zombie\
 | 	$U/_zombie\
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										160
									
								
								user/grind.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								user/grind.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,160 @@ | ||||||
|  | //
 | ||||||
|  | // run random system calls in parallel forever.
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #include "kernel/param.h" | ||||||
|  | #include "kernel/types.h" | ||||||
|  | #include "kernel/stat.h" | ||||||
|  | #include "user/user.h" | ||||||
|  | #include "kernel/fs.h" | ||||||
|  | #include "kernel/fcntl.h" | ||||||
|  | #include "kernel/syscall.h" | ||||||
|  | #include "kernel/memlayout.h" | ||||||
|  | #include "kernel/riscv.h" | ||||||
|  | 
 | ||||||
|  | // from FreeBSD.
 | ||||||
|  | int | ||||||
|  | do_rand(unsigned long *ctx) | ||||||
|  | { | ||||||
|  | /*
 | ||||||
|  |  * Compute x = (7^5 * x) mod (2^31 - 1) | ||||||
|  |  * without overflowing 31 bits: | ||||||
|  |  *      (2^31 - 1) = 127773 * (7^5) + 2836 | ||||||
|  |  * From "Random number generators: good ones are hard to find", | ||||||
|  |  * Park and Miller, Communications of the ACM, vol. 31, no. 10, | ||||||
|  |  * October 1988, p. 1195. | ||||||
|  |  */ | ||||||
|  |     long hi, lo, x; | ||||||
|  | 
 | ||||||
|  |     /* Transform to [1, 0x7ffffffe] range. */ | ||||||
|  |     x = (*ctx % 0x7ffffffe) + 1; | ||||||
|  |     hi = x / 127773; | ||||||
|  |     lo = x % 127773; | ||||||
|  |     x = 16807 * lo - 2836 * hi; | ||||||
|  |     if (x < 0) | ||||||
|  |         x += 0x7fffffff; | ||||||
|  |     /* Transform to [0, 0x7ffffffd] range. */ | ||||||
|  |     x--; | ||||||
|  |     *ctx = x; | ||||||
|  |     return (x); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | unsigned long rand_next = 1; | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | rand(void) | ||||||
|  | { | ||||||
|  |     return (do_rand(&rand_next)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | go() | ||||||
|  | { | ||||||
|  |   int fd = -1; | ||||||
|  |   static char buf[999]; | ||||||
|  |   char *break0 = sbrk(0); | ||||||
|  |    | ||||||
|  |   while(1){ | ||||||
|  |     int what = rand() % 20; | ||||||
|  |     if(what == 1){ | ||||||
|  |       close(open("a", O_CREATE|O_RDWR)); | ||||||
|  |     } else if(what == 2){ | ||||||
|  |       close(open("b", O_CREATE|O_RDWR)); | ||||||
|  |     } else if(what == 3){ | ||||||
|  |       unlink("a"); | ||||||
|  |     } else if(what == 4){ | ||||||
|  |       unlink("b"); | ||||||
|  |     } else if(what == 5){ | ||||||
|  |       close(fd); | ||||||
|  |       fd = open("a", O_CREATE|O_RDWR); | ||||||
|  |     } else if(what == 6){ | ||||||
|  |       close(fd); | ||||||
|  |       fd = open("b", O_CREATE|O_RDWR); | ||||||
|  |     } else if(what == 7){ | ||||||
|  |       write(fd, buf, sizeof(buf)); | ||||||
|  |     } else if(what == 8){ | ||||||
|  |       read(fd, buf, sizeof(buf)); | ||||||
|  |     } else if(what == 9){ | ||||||
|  |       mkdir("a"); | ||||||
|  |     } else if(what == 10){ | ||||||
|  |       mkdir("b"); | ||||||
|  |     } else if(what == 11){ | ||||||
|  |       unlink("b"); | ||||||
|  |       link("a", "b"); | ||||||
|  |     } else if(what == 12){ | ||||||
|  |       unlink("a"); | ||||||
|  |       link("b", "a"); | ||||||
|  |     } else if(what == 13){ | ||||||
|  |       int pid = fork(); | ||||||
|  |       if(pid == 0){ | ||||||
|  |         exit(0); | ||||||
|  |       } | ||||||
|  |       wait(0); | ||||||
|  |     } else if(what == 14){ | ||||||
|  |       int pid = fork(); | ||||||
|  |       if(pid == 0){ | ||||||
|  |         fork(); | ||||||
|  |         fork(); | ||||||
|  |         exit(0); | ||||||
|  |       } | ||||||
|  |       wait(0); | ||||||
|  |     } else if(what == 15){ | ||||||
|  |       sbrk(6011); | ||||||
|  |     } else if(what == 16){ | ||||||
|  |       if(sbrk(0) > break0) | ||||||
|  |         sbrk(-(sbrk(0) - break0)); | ||||||
|  |     } else if(what == 17){ | ||||||
|  |       int pid = fork(); | ||||||
|  |       if(pid == 0){ | ||||||
|  |         close(open("a", O_CREATE|O_RDWR)); | ||||||
|  |         exit(0); | ||||||
|  |       } | ||||||
|  |       kill(pid); | ||||||
|  |       wait(0); | ||||||
|  |     } else if(what == 18){ | ||||||
|  |       int pid = fork(); | ||||||
|  |       if(pid == 0){ | ||||||
|  |         kill(getpid()); | ||||||
|  |         exit(0); | ||||||
|  |       } | ||||||
|  |       wait(0); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   int pid1 = fork(); | ||||||
|  |   if(pid1 < 0){ | ||||||
|  |     printf("grind: fork failed\n"); | ||||||
|  |     exit(1); | ||||||
|  |   } | ||||||
|  |   if(pid1 == 0){ | ||||||
|  |     rand_next = 31; | ||||||
|  |     go(); | ||||||
|  |     exit(0); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   int pid2 = fork(); | ||||||
|  |   if(pid2 < 0){ | ||||||
|  |     printf("grind: fork failed\n"); | ||||||
|  |     exit(1); | ||||||
|  |   } | ||||||
|  |   if(pid2 == 0){ | ||||||
|  |     rand_next = 7177; | ||||||
|  |     go(); | ||||||
|  |     exit(0); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   int st1 = -1; | ||||||
|  |   wait(&st1); | ||||||
|  |   if(st1 != 0){ | ||||||
|  |     kill(pid1); | ||||||
|  |     kill(pid2); | ||||||
|  |   } | ||||||
|  |   int st2 = -1; | ||||||
|  |   wait(&st2); | ||||||
|  | 
 | ||||||
|  |   exit(0); | ||||||
|  | } | ||||||
|  | @ -1038,11 +1038,15 @@ concreate(char *s) | ||||||
|       close(open(file, 0)); |       close(open(file, 0)); | ||||||
|       close(open(file, 0)); |       close(open(file, 0)); | ||||||
|       close(open(file, 0)); |       close(open(file, 0)); | ||||||
|  |       close(open(file, 0)); | ||||||
|  |       close(open(file, 0)); | ||||||
|     } else { |     } else { | ||||||
|       unlink(file); |       unlink(file); | ||||||
|       unlink(file); |       unlink(file); | ||||||
|       unlink(file); |       unlink(file); | ||||||
|       unlink(file); |       unlink(file); | ||||||
|  |       unlink(file); | ||||||
|  |       unlink(file); | ||||||
|     } |     } | ||||||
|     if(pid == 0) |     if(pid == 0) | ||||||
|       exit(0); |       exit(0); | ||||||
|  | @ -1106,7 +1110,7 @@ bigdir(char *s) | ||||||
|     name[2] = '0' + (i % 64); |     name[2] = '0' + (i % 64); | ||||||
|     name[3] = '\0'; |     name[3] = '\0'; | ||||||
|     if(link("bd", name) != 0){ |     if(link("bd", name) != 0){ | ||||||
|       printf("%s: bigdir link failed\n", s); |       printf("%s: bigdir link(bd, %s) failed\n", s, name); | ||||||
|       exit(1); |       exit(1); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | @ -1335,8 +1339,8 @@ bigfile(char *s) | ||||||
|   enum { N = 20, SZ=600 }; |   enum { N = 20, SZ=600 }; | ||||||
|   int fd, i, total, cc; |   int fd, i, total, cc; | ||||||
| 
 | 
 | ||||||
|   unlink("bigfile"); |   unlink("bigfile.dat"); | ||||||
|   fd = open("bigfile", O_CREATE | O_RDWR); |   fd = open("bigfile.dat", O_CREATE | O_RDWR); | ||||||
|   if(fd < 0){ |   if(fd < 0){ | ||||||
|     printf("%s: cannot create bigfile", s); |     printf("%s: cannot create bigfile", s); | ||||||
|     exit(1); |     exit(1); | ||||||
|  | @ -1350,7 +1354,7 @@ bigfile(char *s) | ||||||
|   } |   } | ||||||
|   close(fd); |   close(fd); | ||||||
| 
 | 
 | ||||||
|   fd = open("bigfile", 0); |   fd = open("bigfile.dat", 0); | ||||||
|   if(fd < 0){ |   if(fd < 0){ | ||||||
|     printf("%s: cannot open bigfile\n", s); |     printf("%s: cannot open bigfile\n", s); | ||||||
|     exit(1); |     exit(1); | ||||||
|  | @ -1379,7 +1383,7 @@ bigfile(char *s) | ||||||
|     printf("%s: read bigfile wrong total\n", s); |     printf("%s: read bigfile wrong total\n", s); | ||||||
|     exit(1); |     exit(1); | ||||||
|   } |   } | ||||||
|   unlink("bigfile"); |   unlink("bigfile.dat"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Robert Morris
						Robert Morris