Busy waiting

Чөлөөт нэвтэрхий толь — Википедиагаас
Jump to navigation Jump to search

Busy-waiting гэдгийг тодорхойлoхын өмнө waiting буюу хүлээлтийг тодорхойлoё. Хүлээлт гэдэг нь аливаа хуулбар, эсвэл процесс нь биелэх хүртлээ хоосон зогсохыг хэлдэг. Энэ нь нөөцийн төлөө өрсөлдөөнийг бий болгодог. Хүлээх хоёр арга байдаг. - busy waiting, - sleeping Систем нь busy waiting гэсэн ойлголтыг тасралгүй давталтаар, нөхцөл биелэсэн эсэхийг шалгаж, нөхцөл биелэх хүртэл давтсанаар хэрэгжүүлдэг. Жишээ нь, хэрвээ 5 секүнд хүлээх байсан бол, бид энэ таван секүндыг дараах байдлаар өнгөрөөнө.

  1. const int until = get_time() + 5;//одоогоос 5 секунд
  2. while (until <get_time()){}

Энэ алхмын давуу тал нь энгийн бөгөөд, удаан хугацаанд хүлээхгүй, хурдан байдаг. Харин сул тал нь бид төв процессорыг үр ашиггүй хоосон үрж байгаа юм. Busy waiting нь sleeping[1]-тай харьцуулахад хамаагүй хялбархан байдаг. Харин sleeping нь илүү түвэгтэй байдаг. Хэсэг хуулбар процессийг хүлээлгэж, өөрийгөө хүлээх төлөвт хийж, кернелийг нөхцөл биелэсэн тохиолдолд сэрээхийг хүснэ.

Sleeping ийн busy waiting-аас илүү гэх давуу тал нь төв процессорыг үр ашигтайгаар зарцуулдаг ба сул хоосон зогсолтыг багасгадаг. Сул тал нь нэмэлт ачаа ихтэй байдаг. Жагсаалтаа хянаж, өөрийгөө унтах горимд хийх гэх мэт. Хэрвээ хүлээх хугацаа нь маш богинохон байвал энэ нь busy waiting-тай яг адилхан болно.

Доод түвшиний хэлэнд, busy-waiting нь илүү тохиромжтой байдаг. Хэрвээ систем нь тасалдал ихтэй, төв процессорлуу хандах хандалт нь бага бол busy-waiting нь тохиромжгүй юм. жишээ кодыг доор харуулав.

Жишээ С++ код[засварлах | edit source]

  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. volatile int i = 0;
  6. static void *f1(void *p)
  7. {
  8. while (i==0) {
  9. }
  10. printf("i's value has changed to %d.\n", i);
  11. return NULL;
  12. }
  13. static void *f2(void *p)
  14. {
  15. sleep(60); /* sleep for 60 seconds */
  16. i = 99;
  17. printf("t2 has changed the value of i to %d.\n", i)
  18. return NULL;
  19. }
  20. int main()
  21. {
  22. int rc;
  23. pthread_t t1, t2;
  24. rc = pthread_create(&t1, NULL, f1, NULL);
  25. if (rc != 0) {
  26. fprintf(stderr,"pthread f1 failed\n");
  27. return EXIT_FAILURE;
  28. }
  29. rc = pthread_create(&t2, NULL, f2, NULL);
  30. if (rc != 0) {
  31. fprintf(stderr,"pthread f2 failed\n");
  32. return EXIT_FAILURE;
  33. }
  34. pthread_join(t1, NULL);
  35. pthread_join(t2, NULL);
  36. puts("All pthreads finished.");
  37. return 0;
  38. }

Ишлэл[засварлах | edit source]

http://en.wikipedia.org/wiki/Busy_waiting

http://www.quora.com/Operating-Systems/What-does-busy-waiting-mean