Advertisement
Guest User

Untitled

a guest
Jul 25th, 2016
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 KB | None | 0 0
  1. /*
  2. Main program for the virtual memory project.
  3. Make all of your modifications to this file.
  4. You may add or rearrange any code or data as you need.
  5. The header files page_table.h and disk.h explain
  6. how to use the page table and disk interfaces.
  7. */
  8.  
  9. #include "page_table.h"
  10. #include "disk.h"
  11. #include "program.h"
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <errno.h>
  17.  
  18. int used_frames;
  19. char *algorithm;
  20. struct disk *disk;
  21. int last_frame_written;
  22. int oldest_page;
  23.  
  24. int lru(){
  25.  
  26. }
  27.  
  28. void page_fault_handler( struct page_table *pt, int page )
  29. {
  30. int frames = page_table_get_nframes(pt);
  31. int pages = page_table_get_npages(pt);
  32. int bits_ptr;
  33. int frame_ptr;
  34. char *physmem = page_table_get_physmem(pt);
  35. int remove_page = 0;
  36.  
  37. printf("page fault on page #%d\n",page);
  38. page_table_get_entry(pt, page, &frame_ptr, &bits_ptr);
  39.  
  40. // Seed random number generator
  41. time_t t;
  42. srand((unsigned) time(&t));
  43.  
  44. // Page not in memory
  45. if (&bits_ptr==NULL) {
  46.  
  47. fprintf(stderr, "Page not in memory.\n");
  48.  
  49. // Check if frames full
  50. if (used_frames == frames) {
  51.  
  52. // If full, kick out random page
  53. if (strcmp(algorithm, "lru") == 0) {
  54. remove_page = lru();
  55. page_table_get_entry(pt, remove_page, &frame_ptr, &bits_ptr);
  56.  
  57. while (&bits_ptr == NULL) {
  58. fprintf(stderr, "Trying again!\n");
  59. // Page not in table, try again
  60. remove_page = (pages-1) * (double) rand() / (double)RAND_MAX + 0.5;
  61. page_table_get_entry(pt, remove_page, &frame_ptr, &bits_ptr);
  62. }
  63. }
  64. else if (strcmp(algorithm, "fifo") == 0) {
  65. }
  66. fprintf(stderr, "Kicked out page %d\n", remove_page);
  67.  
  68. // Check if frame written
  69. if (bits_ptr&PROT_WRITE) {
  70. fprintf(stderr, "Dirty page, writing back.\n");
  71. disk_write(disk, remove_page, &physmem[frame_ptr * BLOCK_SIZE]);
  72. }
  73.  
  74. // Read new page into memory
  75. fprintf(stderr, "Reading page %d into memory.\n", page);
  76. disk_read(disk, page, &physmem[frame_ptr * BLOCK_SIZE]);
  77.  
  78. // Set new page entry, remove old one
  79. fprintf(stderr, "Setting page table entry.\n");
  80. page_table_set_entry(pt, page, frame_ptr, PROT_READ);
  81. page_table_set_entry(pt, remove_page, frame_ptr, 0);
  82.  
  83. }
  84.  
  85. // Else frames available
  86. else {
  87.  
  88. fprintf(stderr, "Frames available!\n");
  89. last_frame_written++;
  90.  
  91. if (last_frame_written == frames) {
  92. last_frame_written = 0;
  93. }
  94.  
  95. fprintf(stderr, "Reading page into memory and setting page table entry.\n");
  96. disk_read(disk, page, &physmem[last_frame_written * BLOCK_SIZE]);
  97. page_table_set_entry(pt, page, last_frame_written, PROT_READ);
  98. used_frames++;
  99. }
  100. }
  101.  
  102. // Page in memory, so fault is due to write permissions not set
  103. else if (!(bits_ptr&PROT_WRITE)) {
  104. fprintf(stderr, "Setting write permissions for page %d\n", page);
  105. page_table_set_entry(pt, page, frame_ptr, PROT_READ|PROT_WRITE);
  106. }
  107. else { // Who knooooows
  108. fprintf(stderr, "Whoops! We don't know why this faulted.\n");
  109. }
  110.  
  111. page_table_print(pt);
  112. return;
  113.  
  114.  
  115. }
  116.  
  117. int main( int argc, char *argv[] )
  118. {
  119. if(argc!=5) {
  120. printf("use: virtmem <npages> <nframes> <lru|clock> <sort|scan|focus>\n");
  121. return 1;
  122. }
  123.  
  124. int npages = atoi(argv[1]);
  125. int nframes = atoi(argv[2]);
  126. const char *program = argv[4];
  127.  
  128. struct disk *disk = disk_open("myvirtualdisk",npages);
  129. if(!disk) {
  130. fprintf(stderr,"couldn't create virtual disk: %s\n",strerror(errno));
  131. return 1;
  132. }
  133.  
  134.  
  135. struct page_table *pt = page_table_create( npages, nframes, page_fault_handler );
  136. if(!pt) {
  137. fprintf(stderr,"couldn't create page table: %s\n",strerror(errno));
  138. return 1;
  139. }
  140.  
  141. char *virtmem = page_table_get_virtmem(pt);
  142.  
  143. char *physmem = page_table_get_physmem(pt);
  144.  
  145. if(!strcmp(program,"sort")) {
  146. sort_program(virtmem,npages*PAGE_SIZE);
  147.  
  148. } else if(!strcmp(program,"scan")) {
  149. scan_program(virtmem,npages*PAGE_SIZE);
  150.  
  151. } else if(!strcmp(program,"focus")) {
  152. focus_program(virtmem,npages*PAGE_SIZE);
  153.  
  154. } else {
  155. fprintf(stderr,"unknown program: %s\n",argv[3]);
  156.  
  157. }
  158.  
  159. page_table_delete(pt);
  160. disk_close(disk);
  161.  
  162. return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement