80 likes | 199 Vues
Processes and threads. תהליכים ותתי תהליכים. תהליכים כל תוכנית שרצה היא תהליך ( process ) ניתן להתפצל מתהליך אחד למספר תהליכים, בעזרת הפקודה fork() . הרבה יותר יעיל מבחינת זיכרון מהרצת אותה תוכנית מספר פעמים. לתהליכים אין זיכרון משותף. תתי תהליכים (threads) :
E N D
תהליכים ותתי תהליכים • תהליכים • כל תוכנית שרצה היא תהליך (process) • ניתן להתפצל מתהליך אחד למספר תהליכים, בעזרת הפקודה fork(). • הרבה יותר יעיל מבחינת זיכרון מהרצת אותה תוכנית מספר פעמים. • לתהליכים אין זיכרון משותף. • תתי תהליכים (threads): • ניתן לפתוח תתי תהליכים מתוך תהליך בעזרת ספריית pthread.h • עשרות פונקציות לתיאום וסינכרון בין תתי תהליכים. • לתתי תהליכים יש גישה לזיכרון משותף :כולם מעדכנים משתנים משותפים.
שכפול תהליך בעזרת fork #include <stdio.h> int main() { int i, j=0, pid; pid = fork(); printf("pid is: %d\n", getpid()); j++; if (pid==0) printf("child: %d\n", j); else printf("parent: %d\n",j); }
output pid is: 20453 child: 1 pid is: 20452 parent: 1
יצירת תתי תהליכים #include <stdio.h> #include <pthread.h> int g; void *threadFunc(void *arg){ /* The thread function. Like main(), but for a thread */ char *str; str=(char*) arg; for (int i = 0; i < 6; i++) printf("%s (g = %d)\n",str, g++); return NULL; } void main(void) { pthread_t pth; pthread_create(&pth,NULL,threadFunc,“I’m a thread..."); for (int i = 0; i < 10 ; ++I;} printf("main() is running...(g = %d)\n", g++); } NULL = default attributes for thread Thread identifier Thread function Argument to function
output I'm a thread... (g = 0) I'm a thread... (g = 1) main() is running...(g = 2) I'm a thread... (g = 3) I'm a thread... (g = 4) I'm a thread... (g = 5) main() is running...(g = 6) I'm a thread... (g = 7) main() is running...(g = 8) main() is running...(g = 9) main() is running...(g = 10) main() is running...(g = 11)
יצירת תתי תהליכים - סנכרון #include <stdio.h> #include <pthread.h> int g = 0; void *threadFunc(void *arg){ /* The thread function. Like main(), but for a thread */ char *str; str=(char*) arg; for (int i = 0; i < 6; i++) printf("%s (g = %d)\n",str, g++); return NULL; } void main(void) { pthread_t pth; // the thread identifier pthread_create(&pth,NULL,threadFunc,“I’m a thread..."); pthread_join(pth, NULL);/* wait for our thread to finish before continuing */ for (int i = 0; i < 10 ; ++I;} printf("main() is running...(g = %d)\n", g++);
output I'm a thread... (g = 0) I'm a thread... (g = 1) I'm a thread... (g = 2) I'm a thread... (g = 3) I'm a thread... (g = 4) I'm a thread... (g = 5) main() is running...(g = 6) main() is running...(g = 7) main() is running...(g = 8) main() is running...(g = 9) main() is running...(g = 10) main() is running...(g = 11)