סמפורים.

Slides:



Advertisements
Similar presentations
Carnegie Mellon 1 Synchronization: Basics : Introduction to Computer Systems 23 rd Lecture, Nov. 16, 2010 Instructors: Randy Bryant and Dave O’Hallaron.
Advertisements

Critical Sections and Semaphores A critical section is code that contains access to shared resources that can accessed by multiple processes. Critical.
Семафоры-счетчики POSIX Программирование с использованием POSIX thread library.
1 #include int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void * (*start)(void *), void *args); P-threads: create tid: space used to return.
Carnegie Mellon 1 Synchronization: Basics / : Introduction to Computer Systems 23 rd Lecture, Jul 21, 2015 Instructors: nwf and Greg Kesden.
CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.
Project 2 Data Communication Spring 2010, ICE Stephen Kim, Ph.D.
1 Process Synchronization Andrew Case Slides adapted from Mohamed Zahran, Clark Barrett, Jinyang Li, Randy Bryant and Dave O’Hallaron.
PRINCIPLES OF OPERATING SYSTEMS Lecture 6: Processes CPSC 457, Spring 2015 May 21, 2015 M. Reza Zakerinasab Department of Computer Science, University.
Copyright ©: University of Illinois CS 241 Staff1 Synchronization and Semaphores.
CS345 Operating Systems Threads Assignment 3. Process vs. Thread process: an address space with 1 or more threads executing within that address space,
What is a thread? process: an address space with 1 or more threads executing within that address space, and the required system resources for those threads.
Copyright ©: Nahrstedt, Angrave, Abdelzaher1 Semaphore and Mutex Operations.
Linux Programming –Threads CS Threads Review Threads in the same address space –share everything in the address space –lighter than process –no.
1 Concurrent Programming. 2 Outline Semaphores for Shared Resources –Producer-consumer problem –Readers-writers problem Example –Concurrent server based.
Condition Variables u A condition variable is used to wait until a particular condition is true  like in a monitor u Always use condition variables together.
1 Pthread Programming CIS450 Winter 2003 Professor Jinhua Guo.
Lecture 15 Semaphore & Bugs. Concurrency Threads Locks Condition Variables Fixing atomicity violations and order violations.
CS252: Systems Programming Ninghui Li Based on Slides by Prof. Gustavo Rodriguez-Rivera Topic 11: Thread-safe Data Structures, Semaphores.
Pthreads #include pthread_t tid ; //thread id. pthread_attr_t attr ; void *sleeping(void *); /* thread routine */ main() { int time = 2 ; pthread_create(&tid,
SYNCHRONIZATION. Today  Threads review  Sharing  Mutual exclusion  Semaphores.
CS252: Systems Programming Ninghui Li Based on Slides by Prof. Gustavo Rodriguez-Rivera Topic 12: Thread-safe Data Structures, Semaphores.
PThread Synchronization. Thread Mechanisms Birrell identifies four mechanisms commonly used in threading systems –Thread creation –Mutual exclusion (mutex)
Working with Pthreads. Operations on Threads int pthread_create (pthread_t *thread, const pthread_attr_t *attr, void * (*routine)(void*), void* arg) Creates.
Concurrency Threads Synchronization Thread-safety of Library Functions Anubhav Gupta Dec. 2, 2002 Outline.
Web Server Architecture Client Main Thread for(j=0;j
1 Introduction to Threads Race Conditions. 2 Process Address Space Revisited Code Data OS Stack (a)Process with Single Thread (b) Process with Two Threads.
1 CMSC Laundry List P/W/F, Exam, etc. Instructors: HSG, HH, MW.
回到第一頁 What are threads n Threads are often called "lightweight processes” n In the UNIX environment a thread: u Exists within a process and uses the process.
CS 311/350/550 Semaphores. Semaphores – General Idea Allows two or more concurrent threads to coordinate through signaling/waiting Has four main operations.
Case Study: Pthread Synchronization Dr. Yingwu Zhu.
Chien-Chung Shen CIS/UD
Synchronization and Semaphores
CS 537 – Introduction to Operating Systems
C Threads and Semaphores
Lecture 5 : Pthread Programming
Lecture 6 Interprocess Communication with Homework#2
Threads Synchronization Thread-safety of Library Functions
Linux Thread Programming
Synchronization: Basics
Instructors: Randal E. Bryant and David R. O’Hallaron
Process Synchronization
Fork VS. Threads Lab 05.
Understand argc and argv
Threads in C Caryl Rahn.
Pthreads – Create and Join
Pthreads void *sleeping(void *); /* thread routine */
Structure of C Programs
POSIX Threads 1. Background 2. Threads vs. Processes
Yung-Hsiang Lu Purdue University
Instructor: Randy Bryant
Classical Synchronization Problems
Recitation 14: Proxy Lab Part 2
Concurrent Programming
Operating Systems Lecture 14.
BOOM! count is [ ], should be
Synchronization and Semaphores
Operating System Concepts
Synchronization Primitives – Semaphore and Mutex
Synchronization: Basics CSCI 380: Operating Systems
Shared Memory Programming via Posix threads
Synchronization.
Synchronization.
Lecture 20: Synchronization
Lecture 12 CV and Semaphores
Instructor: Brian Railing
Computer Architecture Multi-threaded Matrix Multiply
컴퓨터 프로그래밍 기초 - 13th : 마지막 수업 -
Lab #9 Semaphores Operating System Lab.
Presentation transcript:

סמפורים

סמפורים כלליים סמפור ממומש ב-Linux Threads בערך כמו שתואר בהרצאה: לכל סמפור יש מונה, תור ומנעול שתפקידו להגן על הקוד של הפעולות של הסמפור (פעולות אטומיות) שתי פעולות בסיסיות על הסמפור: wait: אם המונה גדול מ-0, מקטינה אותו ב-1, אחרת החוט נכנס להמתנה בתור. post: אם תור הממתינים לא ריק, מוציאה ומעירה את החוט הראשון בתור, אחרת מגדילה את המונה ב-1 בהרצאה קראנו ל-post בשם signal. תור הממתינים הוגן (FIFO) לפי עדיפויות, כלומר חוט בעדיפות גבוהה יצא מהתור לפני חוט בעדיפות נמוכה

פעולות על סמפורים (1) אתחול סמפור לפני השימוש: #include <pthread.h> #include <semaphore.h> אתחול סמפור לפני השימוש: int sem_init(sem_t *sem, int pshared, unsigned int value); פינוי סמפור בתום השימוש: int sem_destroy(sem_t *sem);

פעולות על סמפורים (2) ביצוע wait על סמפור: ביצוע post על סמפור: int sem_wait(sem_t *sem); ביצוע post על סמפור: int sem_post(sem_t *sem); גרסה לא-חוסמת של wait: int sem_trywait(sem_t *sem); אם המונה של הסמפור אינו גדול מ-0, חוזרת מיד ונכשלת קריאת ערך מונה הסמפור: int sem_getvalue(sem_t *sem, int *sval);

פעולות על סמפורים (3) פרמטרים: ערך מוחזר: 0 בהצלחה, (1-) בכישלון sem – הסמפור עליו מבוצעות הפעולות. pshared – אם ערכו גדול מ-0, מציין שהסמפור יכול להיות משותף למספר תהליכים. תכונה זו אינה נתמכת, ולכן נציב בו 0 קבוע. value – ערכו ההתחלתי של מונה הסמפור. sval – מצביע למקום בו יאוחסן ערך מונה הסמפור. ערך מוחזר: 0 בהצלחה, (1-) בכישלון הפונקציות sem_wait() ו-sem_getvalue() תמיד מצליחות.

הערות על סמפורים סמפור המאותחל עם מונה בערך 1 נקרא סמפור בינארי. סמפור בינארי יכול לשמש להגנה על קטע קריטי (ליצור מניעה הדדית בין החוטים הניגשים). סמפור בינארי אינו מנעול mutex, משום שכל חוט יכול לבצע post על סמפור, גם אם לא ביצע wait על הסמפור קודם לכן (אין "בעלות" על הסמפור), כמו גם עוד הבדלים מינורים.

סמפור בינארי #include <semaphore.h> sem_t sema; long count = 0; #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <semaphore.h> #define NITER 1000000000 sem_t sema; long count = 0; void * ThreadAdd(void * a) { for(long i = 0; i < NITER; i++) { sem_wait( &sema); count++; sem_post( &sema); } } int main(int argc, char * argv[]) { pthread_t tid1, tid2; sem_init(&sema,0,1); pthread_create(&tid1, NULL, ThreadAdd, NULL); pthread_create(&tid2, NULL, ThreadAdd, NULL); pthread_join(tid1, NULL); /* wait for the thread 1 to finish */ pthread_join(tid2, NULL); /* wait for the thread 2 to finish */ if (count < 2 * NITER) printf("\n BOOM! count is [%ld], should be %ld\n", count, 2*NITER); else printf("\n OK! count is [%ld]\n", count); sem_destroy(&sema); pthread_exit(NULL); OK! count is [2000000000] סמפור בינארי

BOOM! count1 is [16372624], should be 2000000000 #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <semaphore.h> #define NITER 1000000000 sem_t mutex; long count = 0, count1 = 0; void * ThreadAdd(void * a) { for(long i = 0; i < NITER; i++) { sem_wait( &mutex ); count++; sem_post( &mutex ); } for(i = 0; i < NITER; i++) count++; } int main(int argc, char * argv[]) { pthread_t tid1, tid2; sem_init(&mutex,0,1); pthread_create(&tid1, NULL, ThreadAdd, NULL); pthread_create(&tid2, NULL, ThreadAdd, NULL); pthread_join(tid1, NULL); /* wait for the thread 1 to finish */ pthread_join(tid2, NULL); /* wait for the thread 2 to finish */ if (count < 2 * NITER) printf("\n BOOM! count is [%ld], should be %ld\n", count, 2*NITER); else printf("\n OK! count is [%ld]\n", count); printf("\n BOOM! count1 is [%ld], should be %ld\n", count1, 2*NITER); printf("\n OK! count1 is [%ld]\n", count1); sem_destroy(&mutex); pthread_exit(NULL); OK! count is [2000000000] BOOM! count1 is [16372624], should be 2000000000 סמפור בינארי

} void *func2(void *arg) { #include < stdio.h > #include < pthread.h > #include < semaphore.h > #include < signal.h > sem_t semname; int qval=1; void *func1(void *arg) { while(qval) { sem_wait(&semname); printf("Thread one prints # %d\n",(*(int *)(arg))++); sem_post(&semname); sleep(1);} } void *func2(void *arg) { while(qval) { sem_wait(&semname); printf("Thread two prints # %d\n",(*(int *)(arg))++); sem_post(&semname); sleep(1);} } void quit() { qval=0; } main() { int i=0; signal(SIGINT,quit); //ctrl+c sem_init(&semname,0,1); pthread_t thread1,thread2; pthread_create(&thread1,NULL,func1,&i); pthread_create(&thread2,NULL,func2,&i); pthread_join(thread1,&i); pthread_join(thread2,&i); printf("\nQuiting...\n"); return 0;

כעת נעבור לדוגמאות נוספות דוגמאות השוואה דוגמאות לסמפור שאינו בינארי