Busy waiting
Идэвхтэй хүлээлт Англи: Busy-waiting гэдгийг тодорхойлoхын өмнө waiting буюу хүлээлтийг тодорхойлoё. Хүлээлт гэдэг нь аливаа хуулбар, эсвэл процесс нь биелэх хүртлээ хоосон зогсохыг хэлдэг. Энэ нь нөөцийн төлөө өрсөлдөөнийг бий болгодог. Хүлээх хоёр арга байдаг.
- busy waiting
- sleeping
Систем нь busy waiting гэсэн ойлголтыг тасралтгүй давталтаар, нөхцөл биелсэн эсэхийг шалгаж, нөхцөл биелэх хүртэл давтсанаар хэрэгжүүлдэг. Жишээ нь хэрвээ 5 секунд хүлээх байсан бол, бид энэ таван секундыг дараах байдлаар өнгөрөөнө.
- const int until = get_time() + 5;//одоогоос 5 секунд
- while (until <get_time()){}
Энэ алхмын давуу тал нь энгийн бөгөөд, удаан хугацаанд хүлээхгүй, хурдан байдаг. Харин сул тал нь бид төв процессорыг үр ашиггүй хоосон үрж байгаа юм. Busy waiting нь sleeping-тай харьцуулахад хамаагүй хялбархан байдаг. Харин sleeping нь илүү түвэгтэй байдаг. Хэсэг хуулбар процессийг хүлээлгэж, өөрийгөө хүлээх төлөвт хийж, кернелийг нөхцөл биелсэн тохиолдолд сэрээхийг хүснэ.
Sleeping-ийн busy waiting-аас илүү гэх давуу тал нь төв процессорыг үр ашигтайгаар зарцуулдаг ба сул хоосон зогсолтыг багасгадаг. Сул тал нь нэмэлт ачаа ихтэй байдаг. Жагсаалтаа хянаж, өөрийгөө унтах горимд хийх гэх мэт. Хэрвээ хүлээх хугацаа нь маш богинохон байвал энэ нь busy waiting-тай яг адилхан болно.
Доод түвшний хэлэнд, busy-waiting нь илүү тохиромжтой байдаг. Хэрвээ систем нь тасалдал ихтэй, төв процессорлуу хандах хандалт нь бага бол busy-waiting нь тохиромжгүй юм.
жишээ кодыг доор харуулав.
- #include <stdio.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <stdlib.h>
- volatile int i = 0;
- static void *f1(void *p)
- {
- while (i==0) {
- }
- printf("i's value has changed to %d.\n", i);
- return NULL;
- }
- static void *f2(void *p)
- {
- sleep(60); /* sleep for 60 seconds */
- i = 99;
- printf("t2 has changed the value of i to %d.\n", i)
- return NULL;
- }
- int main()
- {
- int rc;
- pthread_t t1, t2;
- rc = pthread_create(&t1, NULL, f1, NULL);
- if (rc != 0) {
- fprintf(stderr,"pthread f1 failed\n");
- return EXIT_FAILURE;
- }
- rc = pthread_create(&t2, NULL, f2, NULL);
- if (rc != 0) {
- fprintf(stderr,"pthread f2 failed\n");
- return EXIT_FAILURE;
- }
- pthread_join(t1, NULL);
- pthread_join(t2, NULL);
- puts("All pthreads finished.");
- return 0;
- }