Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Global Variables//
- semaphore full, full2, full3;
- semaphore mutex, mutex2, mutex3;
- semaphore IOREQ, reqservice, requestpending, physicalIO, OP_COMPLETE;
- semaphore print;
- int ID=1, B_ID=0;
- int ADDR, B_ADDR=0, D_ADDR=0, seek=0;
- int IORQ_ID[5];
- int IORQ_ADDR[5];
- int k=0, m=0;
- void User()
- {
- int count1;
- for(count1=0;count1<10;count1++){
- ADDR=random(200);
- p(full);
- p(mutex);
- B_ID=ID;
- B_ADDR=ADDR;
- v(mutex);
- p(print);
- cout << "User 1 Executes system call SIO or DOIO" <<endl;
- v(print);
- v(IOREQ);
- p(reqservice);
- }
- }
- void DOIO()
- {
- //Variables//
- int Temp_ID;
- int Temp_ADDR;
- int buffersize=5;
- int count2;
- for(count2=0;count2<10;count2++){
- p(IOREQ);
- p(mutex);
- Temp_ID=B_ID;
- Temp_ADDR=B_ADDR;
- v(mutex);
- v(full);
- p(full2);
- p(mutex2);
- k=(k+1)%5;
- IORQ_ID[k]=Temp_ID;
- IORQ_ADDR[k]=Temp_ADDR;
- v(mutex2);
- p(print);
- cout << "DOIO assembles IORB and inserts it in IORQ" << endl;
- v(print);
- v(requestpending);
- }
- }
- //Consumer
- void Driver()
- {
- //Variables//
- int buffersize=5;
- int Temp2_ID, Temp2_ADDR;
- int count3;
- for(count3=0;count3<10;count3++){
- p(requestpending);
- p(mutex2);
- m=(m+1)%5;
- Temp2_ID=IORQ_ID[m];
- Temp2_ADDR=IORQ_ADDR[m];
- v(mutex2);
- v(full2);
- p(print);
- cout << "Driver initiates I/O operation for user 1" << endl;
- v(print);
- p(full3);
- p(mutex3);
- D_ADDR=Temp2_ADDR;
- v(mutex3);
- v(physicalIO);
- p(OP_COMPLETE);
- v(reqservice);
- }
- }
- void Disk()
- {
- int count4,seek_count;
- for(count4=0;count4<10;count4++){
- p(physicalIO);
- p(mutex3);
- seek=D_ADDR;
- v(mutex);
- v(full3);
- for(seek_count=1; seek_count<seek; seek_count++)
- {
- }
- p(print);
- cout << "Disk Completes I/O operation (disk does not know what process initiated the I/O operation)" << endl;
- v(print);
- v(OP_COMPLETE);
- p(print);
- cout << "Driver signal user 1 (operation complete)" << endl;
- v(print);
- }
- }
- void main()
- {
- initialsem(mutex,1);
- initialsem(mutex2,1);
- initialsem(mutex3,1);
- initialsem(full,1);
- initialsem(full2,5);
- initialsem(full3,1);
- initialsem(IOREQ,0);
- initialsem(reqservice,1);
- initialsem(requestpending,0);
- initialsem(physicalIO,0);
- initialsem(OP_COMPLETE,1);
- initialsem(print,1);
- cobegin
- {
- User();
- DOIO();
- Driver();
- Disk();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement