Advertisement
nex036ara

zad3

May 30th, 2012
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. /*Napisati konkurentni program koji modeluje pristupanje vise procesora deljenoj memoriji.
  2.  
  3. Deljena memorija je predstavljena klasom Memory.
  4. Prilikom instanciranja se zadaje velicina memorije.
  5. Upis vrednosti u memoriju se obavlja pozivom operacije write(),
  6. a citanje pozivom operacije read().
  7.  
  8. I citanje i pisanje svake vrednosti traju po 1 sekundu.
  9.  
  10. Svaka adresa u memoriji adresira lokaciju velicine jednog bajta.
  11. Tokom pisanja u memorijsku lokaciju ekskluzivno se zakljucava
  12. cela rec kojoj ta lokacija (bajt) pripada.
  13. Tokom citanja memorijske lokacije rec kojoj ta lokacija (bajt) pripada
  14. se zakljucava, tako da i drugi procesori koji zele da citaju mem. lokaciju
  15. iz te reci to mogu istovremeno da urade.
  16.  
  17. Treba omoguciti istovremeno pristupanje memorijskim lokacijama koje ne pripadaju istoj reci.
  18.  
  19. Ako istovremeno postoje i procesori koji zeli da citaju i procesori koji zeli da pisu u istu rec,
  20. treba prvo pristup dozvoliti procesorima koji zele da citaju.
  21.  
  22. Stvoriti nekoliko niti koje pokazuju da program radi ispravno.
  23.  
  24. Dat je primer scenarija pristupanja, zarad lakseg testiranja.
  25. */
  26.  
  27. class Memory {
  28. public:
  29. enum State { FREE, READING, WRITING };
  30. Memory(size_t bytes);
  31. char read(size_t address);
  32. void write(size_t address, char value);
  33. };
  34.  
  35. struct MemoryAccess {
  36. Memory::State accessType;
  37. size_t address;
  38. char value;
  39. MemoryAccess(Memory::State rw, size_t addr, char v=0) : accessType(rw), address(addr), value(v) {}
  40. };
  41.  
  42. void processor(Memory& mem, vector<MemoryAccess>& exec) {
  43. static mutex term_m;
  44. for(auto action = exec.begin(); action!=exec.end(); ++action) {
  45. if(action->accessType == Memory::READING) {
  46. action->value = mem.read(action->address);
  47. unique_lock<mutex> l(term_m);
  48. cout << "Processor " << this_thread::get_id()
  49. << " read from address " << action->address
  50. << " value=" << action->value << endl;
  51. } else {
  52. mem.write(action->address, action->value);
  53. unique_lock<mutex> l(term_m);
  54. cout << "Processor " << this_thread::get_id()
  55. << " wrote to address " << action->address
  56. << " value=" << action->value << endl;
  57. }
  58. }
  59. }
  60.  
  61. int main() {
  62. vector<MemoryAccess> I = {
  63. {Memory::WRITING, 0, '0'},
  64. {Memory::WRITING, 4, '4'},
  65. {Memory::READING, 0},
  66. {Memory::WRITING, 8, '8'}
  67. };
  68. vector<MemoryAccess> II = {
  69. {Memory::WRITING, 5, '5'},
  70. {Memory::WRITING, 1, '1'},
  71. {Memory::READING, 1},
  72. {Memory::WRITING, 9, '9'}
  73. };
  74. vector<MemoryAccess> III = {
  75. {Memory::WRITING, 8, '8'},
  76. {Memory::WRITING, 9, '9'},
  77. {Memory::WRITING, 2, '2'},
  78. };
  79.  
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement