TAS behavior: surprise! Cache effects TAS Simple TAS TAS - - PowerPoint PPT Presentation

tas behavior surprise cache effects
SMART_READER_LITE
LIVE PREVIEW

TAS behavior: surprise! Cache effects TAS Simple TAS TAS - - PowerPoint PPT Presentation

B3 icdVDLSgMxFL3js9ZX1aWbYBFcDTOtaN0V3Lis2LGFtpRMm lDM5MhuSOU0r0bxZXiH/kL/o3pw0V9HAgczjnh3nPDVAqDnvfprKyurW9s5rby2zu7e/uFg8N7ozLNeMCUVLoZUsOlSHiA iVvp


slide-1
SLIDE 1

TAS behavior: surprise!

lock.acquire() { while (TAS(value)); } lock.release() { value := 0 } lock.acquire() { while (true) { while (value); if (!TAS(value)) return; } } lock.release() { value := 0 }

  • no. of threads

time

ideal TAS TTAS

Why is TTAS performing much better than TAS? Why are TAS and TTAS performing poorly?

TAS TTAS

56

Cache effects

Simple TAS

all TAS go to bus

everybody waits

each TAS invalidates cached copies of lock

every TAS writes “1” blindly every thread must use bus to retrieve new lock value even if unchanged lots of bus traffic!

lock release may be delayed

by spinner hogging the bus

57

Cache effects

TTAS

Suppose reads a lock held by

cache miss the first time but, as long as has the lock, all reads are from the cache

When releases lock

all cached copies of lock are invalidated all spinning thread reread lock value call TAS at about same time burst of bus traffic, before quiescence

T2

<latexit sha1_base64="qJry6qLI gVk57UapqM0b8+SUqE=">A B3 icdVDLSgNBEOyNrxhfUY9eBoPgadlNROPJgBePEbMmkIQwO5lNhsw+mOkVQshR8KJ4Uvwjf8Fv8OQfOEn0EB8FDUV NdM1fiKFRsd5szILi0vLK9nV3Nr6xuZWfnvnWsepYtxjsYxVw6eaSxFxDwVK3kgUp6Eved0fnE/8+g1XWsR DYcJb4e0F4lAMIpGuqp1ip18wbWdKcj/pHD28X5LAKDayb+2ujFLQx4hk1Trpusk2B5RhYJ Ps61Us0Tyga0x0fTA8fkwEhdEsTKTIRkqs7laKj1MPRNMqTY1z+9ifiX10wxKLdHIkpS5BGbPRSk mBMJm1JVyjOUA4NoUwJcyFhfao Q/MnOVPdsUvHR27JIb/Jd3WvaJ/a7qVTqJRh izswT4cg snUIELqI HDHpwD0/wbPnWnfVgPc6iGetrZxfmYL18Aueoi+E=</latexit> <latexit sha1_base64="dJNclTW6nH ygsNlhmY3rZrOAZA=">A B3 icdVDLSgMxFL2pr1pfVZeCBIvgaphpRevKghuXLXZsoS0lk2ba0MyDJCOU0qXgRnGl+Cd+gr/gN+jGPzBtdVEfBy4czjmX3BMvFlxp235Fqbn5hcWl9HJmZXVtfSO7uXWpokRS5tJIRL uEcUED5mruRasHktGAk+wmtc/G/u1KyYVj8KqHsSsFZBuyH1OiTbSRbWdb2dzjmVPgP8nudOPt+vd58p7uZ19aXYimgQs1FQ pRqOHevWkEjNqWCjTDNRLCa0T7psODlwhPeN1MF+JM2EGk/UmRwJlBoEnk GRPfUT28s/uU1Eu0XW0MexolmIZ0+5CcC6wiP2+IOl4xqMTCEUMnNhZj2iCRUmz/JmOq2VTg6dAo2/k2+q7t568RyKnauVIQp0rADe3A DhxDCc6hDC5Q6MItPMAj8tANukP302gKfe1sw zQ0ydszo3U</latexit> <latexit sha1_base64="dJNclTW6nH ygsNlhmY3rZrOAZA=">A B3 icdVDLSgMxFL2pr1pfVZeCBIvgaphpRevKghuXLXZsoS0lk2ba0MyDJCOU0qXgRnGl+Cd+gr/gN+jGPzBtdVEfBy4czjmX3BMvFlxp235Fqbn5hcWl9HJmZXVtfSO7uXWpokRS5tJIRL uEcUED5mruRasHktGAk+wmtc/G/u1KyYVj8KqHsSsFZBuyH1OiTbSRbWdb2dzjmVPgP8nudOPt+vd58p7uZ19aXYimgQs1FQ pRqOHevWkEjNqWCjTDNRLCa0T7psODlwhPeN1MF+JM2EGk/UmRwJlBoEnk GRPfUT28s/uU1Eu0XW0MexolmIZ0+5CcC6wiP2+IOl4xqMTCEUMnNhZj2iCRUmz/JmOq2VTg6dAo2/k2+q7t568RyKnauVIQp0rADe3A DhxDCc6hDC5Q6MItPMAj8tANukP302gKfe1sw zQ0ydszo3U</latexit> <latexit sha1_base64="dJNclTW6nH ygsNlhmY3rZrOAZA=">A B3 icdVDLSgMxFL2pr1pfVZeCBIvgaphpRevKghuXLXZsoS0lk2ba0MyDJCOU0qXgRnGl+Cd+gr/gN+jGPzBtdVEfBy4czjmX3BMvFlxp235Fqbn5hcWl9HJmZXVtfSO7uXWpokRS5tJIRL uEcUED5mruRasHktGAk+wmtc/G/u1KyYVj8KqHsSsFZBuyH1OiTbSRbWdb2dzjmVPgP8nudOPt+vd58p7uZ19aXYimgQs1FQ pRqOHevWkEjNqWCjTDNRLCa0T7psODlwhPeN1MF+JM2EGk/UmRwJlBoEnk GRPfUT28s/uU1Eu0XW0MexolmIZ0+5CcC6wiP2+IOl4xqMTCEUMnNhZj2iCRUmz/JmOq2VTg6dAo2/k2+q7t568RyKnauVIQp0rADe3A DhxDCc6hDC5Q6MItPMAj8tANukP302gKfe1sw zQ0ydszo3U</latexit> <latexit sha1_base64="dJNclTW6nH ygsNlhmY3rZrOAZA=">A B3 icdVDLSgMxFL2pr1pfVZeCBIvgaphpRevKghuXLXZsoS0lk2ba0MyDJCOU0qXgRnGl+Cd+gr/gN+jGPzBtdVEfBy4czjmX3BMvFlxp235Fqbn5hcWl9HJmZXVtfSO7uXWpokRS5tJIRL uEcUED5mruRasHktGAk+wmtc/G/u1KyYVj8KqHsSsFZBuyH1OiTbSRbWdb2dzjmVPgP8nudOPt+vd58p7uZ19aXYimgQs1FQ pRqOHevWkEjNqWCjTDNRLCa0T7psODlwhPeN1MF+JM2EGk/UmRwJlBoEnk GRPfUT28s/uU1Eu0XW0MexolmIZ0+5CcC6wiP2+IOl4xqMTCEUMnNhZj2iCRUmz/JmOq2VTg6dAo2/k2+q7t568RyKnauVIQp0rADe3A DhxDCc6hDC5Q6MItPMAj8tANukP302gKfe1sw zQ0ydszo3U</latexit> <latexit sha1_base64="Au1esu523HZyJ NnO7JpMaUhQ9E=">A B3 icdVDLSgMxFL3js9ZX1aWbYBFcDTOtaN0V3Lis2LGFtpRMm lDM5MhuSOU0r0bxZXiH/kL/o3pw0V9HAgczjnh3nPDVAqDnvfprKyurW9s5rby2zu7e/uFg8N7ozLNeMCUVLoZUsOlSHiA iVvp rTOJS8EQ6vp37jgWsjVFLHUco7Me0nIhKMopXu6t1St1D0XW8G8j8pwgK1buGj3VMsi3mCTFJjWr6XYmdMNQom+STfzgxPKRvSPh/PFpyQUyv1SKS0fQmSmbqUo7Exozi0yZjiwPz0puJfXivDqNIZiyTNkCdsPijKJEF pm1JT2jOUI4soUwLuyFhA6opQ3uTvK3u eWLc7/skd/ku3pQcq9c/9YrViuLG+TgGE7gDHy4hCrcQA0CYNCHJ3iFNyd0Hp1n52UeX EWf45gCc7 F02RiSE=</latexit>

T1

<latexit sha1_base64="tUkRZIs2RQDRZ8XTLTUQIH/13 E=">A B3 icdVDLSgNBEOyNrxhfUY9eBoPgadk1QePJgBePEbMmkIQwO5lNhsw+mOkVQshR8KJ4Uvwjf8Fv8OQfOEn0EB8FDUV NdM1fiKFRsd5szILi0vLK9nV3Nr6xuZWfnvnWsepYtxjsYxVw6eaSxFxDwVK3kgUp6Eved0fnE/8+g1XWsR DYcJb4e0F4lAMIpGuqp13E6+4NrOFOR/Uj 7eL8lAFDt5F9b3ZilIY+QSap103USbI+oQsEkH+daqeYJZQPa46PpgWNyYKQuCWJlJkIyVedyN R6GPomGVLs65/eRPzLa6Y lNsjESUp8ojNHgpS TAmk7akKxRnKIeGUKaEuZCwPlWUofmTnKnu2MXjklt0yG/yXd07sk9t9 IpVMowQxb2YB8OwYUTqMAFVMEDBj24hyd4tnzrznqwHmfRjPW1swtzsF4+AeYvi+A=</latexit> <latexit sha1_base64="erk+2Lmol7sN2/Lzp3M1hdZx42Q=">A B3 icdVBLSgNBFHzjN8Zf1KUgjUFwNcwY0bgy4MZlghkTSELo6XS Jj0fut8I WQpuF cKd7EI3gFz6Ab 2An0UX8FDwoqurRr9qPpdDoOK/WzOzc/MJiaim9vLK6tp7Z2LzU aIY91gkI1X1qeZShNxDgZJXY8Vp4Ete8XtnI79yxZUWUVjGfswbAe2Eoi0YRSNdlJtuM5N1bWcM8j/Jn 68Xe8 l96LzcxLvRWxJOAhMkm1r lOjI0BVSiY5MN0PdE8pqxHO3w PnBI9ozUIu1ImQmRjNWpHA207ge+SQYUu/qnNxL/8moJtvONgQj BHnIJg+1E0kwIqO2pCU Zyj7hlCmhLmQsC5VlKH5k7Sp7ti5o0M35 Df5Lu6d2Cf2G7JyRbyME KtmEX9sGFYyjAORTBAwYduIUHeLR868a6s+4n0Rnra2cLpmA9fQJrVY3T</latexit> <latexit sha1_base64="erk+2Lmol7sN2/Lzp3M1hdZx42Q=">A B3 icdVBLSgNBFHzjN8Zf1KUgjUFwNcwY0bgy4MZlghkTSELo6XS Jj0fut8I WQpuF cKd7EI3gFz6Ab 2An0UX8FDwoqurRr9qPpdDoOK/WzOzc/MJiaim9vLK6tp7Z2LzU aIY91gkI1X1qeZShNxDgZJXY8Vp4Ete8XtnI79yxZUWUVjGfswbAe2Eoi0YRSNdlJtuM5N1bWcM8j/Jn 68Xe8 l96LzcxLvRWxJOAhMkm1r lOjI0BVSiY5MN0PdE8pqxHO3w PnBI9ozUIu1ImQmRjNWpHA207ge+SQYUu/qnNxL/8moJtvONgQj BHnIJg+1E0kwIqO2pCU Zyj7hlCmhLmQsC5VlKH5k7Sp7ti5o0M35 Df5Lu6d2Cf2G7JyRbyME KtmEX9sGFYyjAORTBAwYduIUHeLR868a6s+4n0Rnra2cLpmA9fQJrVY3T</latexit> <latexit sha1_base64="erk+2Lmol7sN2/Lzp3M1hdZx42Q=">A B3 icdVBLSgNBFHzjN8Zf1KUgjUFwNcwY0bgy4MZlghkTSELo6XS Jj0fut8I WQpuF cKd7EI3gFz6Ab 2An0UX8FDwoqurRr9qPpdDoOK/WzOzc/MJiaim9vLK6tp7Z2LzU aIY91gkI1X1qeZShNxDgZJXY8Vp4Ete8XtnI79yxZUWUVjGfswbAe2Eoi0YRSNdlJtuM5N1bWcM8j/Jn 68Xe8 l96LzcxLvRWxJOAhMkm1r lOjI0BVSiY5MN0PdE8pqxHO3w PnBI9ozUIu1ImQmRjNWpHA207ge+SQYUu/qnNxL/8moJtvONgQj BHnIJg+1E0kwIqO2pCU Zyj7hlCmhLmQsC5VlKH5k7Sp7ti5o0M35 Df5Lu6d2Cf2G7JyRbyME KtmEX9sGFYyjAORTBAwYduIUHeLR868a6s+4n0Rnra2cLpmA9fQJrVY3T</latexit> <latexit sha1_base64="erk+2Lmol7sN2/Lzp3M1hdZx42Q=">A B3 icdVBLSgNBFHzjN8Zf1KUgjUFwNcwY0bgy4MZlghkTSELo6XS Jj0fut8I WQpuF cKd7EI3gFz6Ab 2An0UX8FDwoqurRr9qPpdDoOK/WzOzc/MJiaim9vLK6tp7Z2LzU aIY91gkI1X1qeZShNxDgZJXY8Vp4Ete8XtnI79yxZUWUVjGfswbAe2Eoi0YRSNdlJtuM5N1bWcM8j/Jn 68Xe8 l96LzcxLvRWxJOAhMkm1r lOjI0BVSiY5MN0PdE8pqxHO3w PnBI9ozUIu1ImQmRjNWpHA207ge+SQYUu/qnNxL/8moJtvONgQj BHnIJg+1E0kwIqO2pCU Zyj7hlCmhLmQsC5VlKH5k7Sp7ti5o0M35 Df5Lu6d2Cf2G7JyRbyME KtmEX9sGFYyjAORTBAwYduIUHeLR868a6s+4n0Rnra2cLpmA9fQJrVY3T</latexit> <latexit sha1_base64="/I25v0l7CuWgOkzMUVIZ2pTwpls=">A B3 icdVDLSgMxFL1TX7W+qi7dBIvgashY0boruHFZsWMLbSmZN OGZh4kd4RSunejuFL8I3/BvzF9uKiPA4HDOSfce26QKm Q0k8nt7K6tr6R3yxsbe/s7hX3D+5NkmkufJ6oRDcDZoS sfBRohLNVAsWBUo0guH1 G8 CG1kEtdxlIpOxPqxDCVnaKW7etfrFkueS2cg/5MSLFDrFj/avYRnkYiRK2ZMy6MpdsZMo+RKTArtzIiU8SHri/FswQk5sVKPhIm2L0YyU5dyLDJmFAU2GTEcmJ/eVPzLa2UYVjpjGacZipjPB4WZIpiQaVvSk1pwVCNLGNfSbkj4gGnG0d6kYKtTt3x 7pUp+U2+q/tn7pXr3dJStbK4QR6O4BhOwYNLqMIN1MAHDn14gld4cwLn0Xl2XubRnLP4cwhLcN6/AEwYiSA=</latexit>

T1

<latexit sha1_base64="oaMKEm3R/72+nB/vBD3nv/KctoM=">A B3 icdVDJTgJBFHyDG+KGevTSkZh4msyIQT1J4sUjRkZIgGBP0wMdepZ0vzEh LsXl5PG3/HkL/gZ/oEN6AGXSl5SqaqXftV+IoVGx3m3MnPzC4tL2eXcyura+kZ+c+tKx6li3GOxjFXdp5pLEXEPBUpeTxSnoS95ze+fjf3aDVdaxFEVBwlvhbQbiUAwika6rLbd r7g2s4E5H9SOP14fbgGgEo7/9bsxCwNeYRMUq0brpNga0gVCib5KNdMNU8o69MuH04OHJE9I3VIECszEZKJOpOjodaD0DfJkGJP/ TG4l9eI8XguDU ZIij9j0oSCVBGMybks6QnG cmAIZUqYCwnrU Zmj/JmeqOXSwdukWH/Cbf1b0D+8R2L5xCuQRTZGEHdmEfXDiCMpxDBTxg0IU7eIJny7durXvrcRrNWF872zAD6+UTE mL/w= </latexit> <latexit sha1_base64="upZnz gY zYa43z40MrJmdaWxQU=">A B3 icdVC7TgJBFL2L 8QXamkzkZhQbXbFoFaS2FhiZIUECJkdBpgw+8jMXRNC6G18VBp/Rxt/wc+wsHcALfBxkpucnHNu5p7xYyk0Os6blZqbX1hcSi9nVlbX1jeym1uXOkoU4x6LZKRqPtVcipB7KFDyWqw4DXzJq37/dOxXr7jSIgorOIh5M6DdUHQEo2iki0rLbWVzru1MQP4nuZP357tG/uOl3Mq+NtoRSwIeIpNU67r xNgcUoWCST7KNBLNY8r6tMuHkwNHZM9IbdKJlJkQyUSdydFA60Hgm2RAsad/emPxL6+eYOeoOR hnCAP2fShTiIJRmTclrSF4gzlwBDKlDAXEtajijI0f5Ix1R27UDxwCw75Tb6re/v2se2eO7lSEaZIw 7sQh5cOIQSnE ZPGDQhRt4gEfLt6 tW+t+Gk1ZXzvbMAPr6RN3OI3b</latexit> <latexit sha1_base64="upZnz gY zYa43z40MrJmdaWxQU=">A B3 icdVC7TgJBFL2L 8QXamkzkZhQbXbFoFaS2FhiZIUECJkdBpgw+8jMXRNC6G18VBp/Rxt/wc+wsHcALfBxkpucnHNu5p7xYyk0Os6blZqbX1hcSi9nVlbX1jeym1uXOkoU4x6LZKRqPtVcipB7KFDyWqw4DXzJq37/dOxXr7jSIgorOIh5M6DdUHQEo2iki0rLbWVzru1MQP4nuZP357tG/uOl3Mq+NtoRSwIeIpNU67r xNgcUoWCST7KNBLNY8r6tMuHkwNHZM9IbdKJlJkQyUSdydFA60Hgm2RAsad/emPxL6+eYOeoOR hnCAP2fShTiIJRmTclrSF4gzlwBDKlDAXEtajijI0f5Ix1R27UDxwCw75Tb6re/v2se2eO7lSEaZIw 7sQh5cOIQSnE ZPGDQhRt4gEfLt6 tW+t+Gk1ZXzvbMAPr6RN3OI3b</latexit> <latexit sha1_base64="upZnz gY zYa43z40MrJmdaWxQU=">A B3 icdVC7TgJBFL2L 8QXamkzkZhQbXbFoFaS2FhiZIUECJkdBpgw+8jMXRNC6G18VBp/Rxt/wc+wsHcALfBxkpucnHNu5p7xYyk0Os6blZqbX1hcSi9nVlbX1jeym1uXOkoU4x6LZKRqPtVcipB7KFDyWqw4DXzJq37/dOxXr7jSIgorOIh5M6DdUHQEo2iki0rLbWVzru1MQP4nuZP357tG/uOl3Mq+NtoRSwIeIpNU67r xNgcUoWCST7KNBLNY8r6tMuHkwNHZM9IbdKJlJkQyUSdydFA60Hgm2RAsad/emPxL6+eYOeoOR hnCAP2fShTiIJRmTclrSF4gzlwBDKlDAXEtajijI0f5Ix1R27UDxwCw75Tb6re/v2se2eO7lSEaZIw 7sQh5cOIQSnE ZPGDQhRt4gEfLt6 tW+t+Gk1ZXzvbMAPr6RN3OI3b</latexit> <latexit sha1_base64="upZnz gY zYa43z40MrJmdaWxQU=">A B3 icdVC7TgJBFL2L 8QXamkzkZhQbXbFoFaS2FhiZIUECJkdBpgw+8jMXRNC6G18VBp/Rxt/wc+wsHcALfBxkpucnHNu5p7xYyk0Os6blZqbX1hcSi9nVlbX1jeym1uXOkoU4x6LZKRqPtVcipB7KFDyWqw4DXzJq37/dOxXr7jSIgorOIh5M6DdUHQEo2iki0rLbWVzru1MQP4nuZP357tG/uOl3Mq+NtoRSwIeIpNU67r xNgcUoWCST7KNBLNY8r6tMuHkwNHZM9IbdKJlJkQyUSdydFA60Hgm2RAsad/emPxL6+eYOeoOR hnCAP2fShTiIJRmTclrSF4gzlwBDKlDAXEtajijI0f5Ix1R27UDxwCw75Tb6re/v2se2eO7lSEaZIw 7sQh5cOIQSnE ZPGDQhRt4gEfLt6 tW+t+Gk1ZXzvbMAPr6RN3OI3b</latexit> <latexit sha1_base64="xsCI OVUYMy1dULdosH9YpVzdJc=">A B3 icdVDLSgMxFL1TX7W+qi7dBIvgashYqboruHFZsWMLbSmZN OGZh4kd4RSunejuFL8I3/BvzF9uKiPA4HDOSfce26QKm Q0k8nt7K6tr6R3yxsbe/s7hX3D+5NkmkufJ6oRDcDZoS sfBRohLNVAsWBUo0guH1 G8 CG1kEtdxlIpOxPqxDCVnaKW7etfrFkueS2cg/5MSLFDrFj/avYRnkYiRK2ZMy6MpdsZMo+RKTArtzIiU8SHri/FswQk5sVKPhIm2L0YyU5dyLDJmFAU2GTEcmJ/eVPzLa2UYXnbGMk4zFDGfDwozRTAh07akJ7XgqEaWMK6l3ZDwAdOMo71JwVanbrly7pUp+U2+q/tn7pXr3dJStbK4QR6O4BhOwYMLqMIN1MAHDn14gld4cwLn0Xl2XubRnLP4cwhLcN6/AEt+iR4=</latexit>

T1

<latexit sha1_base64="tUkRZIs2RQDRZ8XTLTUQIH/13 E=">A B3 icdVDLSgNBEOyNrxhfUY9eBoPgadk1QePJgBePEbMmkIQwO5lNhsw+mOkVQshR8KJ4Uvwjf8Fv8OQfOEn0EB8FDUV NdM1fiKFRsd5szILi0vLK9nV3Nr6xuZWfnvnWsepYtxjsYxVw6eaSxFxDwVK3kgUp6Eved0fnE/8+g1XWsR DYcJb4e0F4lAMIpGuqp13E6+4NrOFOR/Uj 7eL8lAFDt5F9b3ZilIY+QSap103USbI+oQsEkH+daqeYJZQPa46PpgWNyYKQuCWJlJkIyVedyN R6GPomGVLs65/eRPzLa6Y lNsjESUp8ojNHgpS TAmk7akKxRnKIeGUKaEuZCwPlWUofmTnKnu2MXjklt0yG/yXd07sk9t9 IpVMowQxb2YB8OwYUTqMAFVMEDBj24hyd4tnzrznqwHmfRjPW1swtzsF4+AeYvi+A=</latexit> <latexit sha1_base64="erk+2Lmol7sN2/Lzp3M1hdZx42Q=">A B3 icdVBLSgNBFHzjN8Zf1KUgjUFwNcwY0bgy4MZlghkTSELo6XS Jj0fut8I WQpuF cKd7EI3gFz6Ab 2An0UX8FDwoqurRr9qPpdDoOK/WzOzc/MJiaim9vLK6tp7Z2LzU aIY91gkI1X1qeZShNxDgZJXY8Vp4Ete8XtnI79yxZUWUVjGfswbAe2Eoi0YRSNdlJtuM5N1bWcM8j/Jn 68Xe8 l96LzcxLvRWxJOAhMkm1r lOjI0BVSiY5MN0PdE8pqxHO3w PnBI9ozUIu1ImQmRjNWpHA207ge+SQYUu/qnNxL/8moJtvONgQj BHnIJg+1E0kwIqO2pCU Zyj7hlCmhLmQsC5VlKH5k7Sp7ti5o0M35 Df5Lu6d2Cf2G7JyRbyME KtmEX9sGFYyjAORTBAwYduIUHeLR868a6s+4n0Rnra2cLpmA9fQJrVY3T</latexit> <latexit sha1_base64="erk+2Lmol7sN2/Lzp3M1hdZx42Q=">A B3 icdVBLSgNBFHzjN8Zf1KUgjUFwNcwY0bgy4MZlghkTSELo6XS Jj0fut8I WQpuF cKd7EI3gFz6Ab 2An0UX8FDwoqurRr9qPpdDoOK/WzOzc/MJiaim9vLK6tp7Z2LzU aIY91gkI1X1qeZShNxDgZJXY8Vp4Ete8XtnI79yxZUWUVjGfswbAe2Eoi0YRSNdlJtuM5N1bWcM8j/Jn 68Xe8 l96LzcxLvRWxJOAhMkm1r lOjI0BVSiY5MN0PdE8pqxHO3w PnBI9ozUIu1ImQmRjNWpHA207ge+SQYUu/qnNxL/8moJtvONgQj BHnIJg+1E0kwIqO2pCU Zyj7hlCmhLmQsC5VlKH5k7Sp7ti5o0M35 Df5Lu6d2Cf2G7JyRbyME KtmEX9sGFYyjAORTBAwYduIUHeLR868a6s+4n0Rnra2cLpmA9fQJrVY3T</latexit> <latexit sha1_base64="erk+2Lmol7sN2/Lzp3M1hdZx42Q=">A B3 icdVBLSgNBFHzjN8Zf1KUgjUFwNcwY0bgy4MZlghkTSELo6XS Jj0fut8I WQpuF cKd7EI3gFz6Ab 2An0UX8FDwoqurRr9qPpdDoOK/WzOzc/MJiaim9vLK6tp7Z2LzU aIY91gkI1X1qeZShNxDgZJXY8Vp4Ete8XtnI79yxZUWUVjGfswbAe2Eoi0YRSNdlJtuM5N1bWcM8j/Jn 68Xe8 l96LzcxLvRWxJOAhMkm1r lOjI0BVSiY5MN0PdE8pqxHO3w PnBI9ozUIu1ImQmRjNWpHA207ge+SQYUu/qnNxL/8moJtvONgQj BHnIJg+1E0kwIqO2pCU Zyj7hlCmhLmQsC5VlKH5k7Sp7ti5o0M35 Df5Lu6d2Cf2G7JyRbyME KtmEX9sGFYyjAORTBAwYduIUHeLR868a6s+4n0Rnra2cLpmA9fQJrVY3T</latexit> <latexit sha1_base64="erk+2Lmol7sN2/Lzp3M1hdZx42Q=">A B3 icdVBLSgNBFHzjN8Zf1KUgjUFwNcwY0bgy4MZlghkTSELo6XS Jj0fut8I WQpuF cKd7EI3gFz6Ab 2An0UX8FDwoqurRr9qPpdDoOK/WzOzc/MJiaim9vLK6tp7Z2LzU aIY91gkI1X1qeZShNxDgZJXY8Vp4Ete8XtnI79yxZUWUVjGfswbAe2Eoi0YRSNdlJtuM5N1bWcM8j/Jn 68Xe8 l96LzcxLvRWxJOAhMkm1r lOjI0BVSiY5MN0PdE8pqxHO3w PnBI9ozUIu1ImQmRjNWpHA207ge+SQYUu/qnNxL/8moJtvONgQj BHnIJg+1E0kwIqO2pCU Zyj7hlCmhLmQsC5VlKH5k7Sp7ti5o0M35 Df5Lu6d2Cf2G7JyRbyME KtmEX9sGFYyjAORTBAwYduIUHeLR868a6s+4n0Rnra2cLpmA9fQJrVY3T</latexit> <latexit sha1_base64="/I25v0l7CuWgOkzMUVIZ2pTwpls=">A B3 icdVDLSgMxFL1TX7W+qi7dBIvgashY0boruHFZsWMLbSmZN OGZh4kd4RSunejuFL8I3/BvzF9uKiPA4HDOSfce26QKm Q0k8nt7K6tr6R3yxsbe/s7hX3D+5NkmkufJ6oRDcDZoS sfBRohLNVAsWBUo0guH1 G8 CG1kEtdxlIpOxPqxDCVnaKW7etfrFkueS2cg/5MSLFDrFj/avYRnkYiRK2ZMy6MpdsZMo+RKTArtzIiU8SHri/FswQk5sVKPhIm2L0YyU5dyLDJmFAU2GTEcmJ/eVPzLa2UYVjpjGacZipjPB4WZIpiQaVvSk1pwVCNLGNfSbkj4gGnG0d6kYKtTt3x 7pUp+U2+q/tn7pXr3dJStbK4QR6O4BhOwYNLqMIN1MAHDn14gld4cwLn0Xl2XubRnLP4cwhLcN6/AEwYiSA=</latexit>

58

S E M A P H O R E S

N U J V

59

slide-2
SLIDE 2

Semaphores (Dijkstra, 1962)

Interface

Init (starting value) P(): decrement V(): increment

Introduced in THE Operating System

catchy name…

Stateful

a non-negative integer (count) a lock a queue

No operation to read the semaphore’ s value

NONE!

Probeer (“Try”) Verhoog (“+1”)

60

Semantics of P and V

P():

wait until count > 0 when so, decrement count by 1

V():

increment count by 1

P() { while (n = 0); n := n-1; } V() { n := n+1; }

Binary Semaphores: count can be either 0 or 1

61

Semaphore’ s count

Must be initialized Maintains the semaphore’ s state

Reflects sequence of past P, V operations Positive value indicates how many future P operations will succeed

Important

It is not possible to read the count It is not possible to increase or decrease the count but through P and V It is not possible to increment/decrement by more than 1

62

Implementing semaphores

Been there, done that: by enabling/disabling interrupts by using TAS with a queue, to avoid busy waiting

63

slide-3
SLIDE 3

Semaphores with interrupts

class Semaphore { int value := k }

Semaphore.P() { Disable interrupts; while (value == 0) { Enable interrupts; Disable interrupts; } value := value - 1; Enable interrupts; } Semaphore.V() { Disable interrupts; value := value + 1; Enable interrupts; }

64

Semaphores using TAS

Semaphore.P() { while (TAS(guard)) ; if (value == 0) { Put on queue of threads waiting for lock; Set guard to 0; Go to sleep; } else { value := value - 1; guard := 0 } } Semaphore.V() { while (TAS(guard)) ; if anyone on wait queue { Take a waiting thread off lock’ s wait queue and put it at the front of ready queue; } else { value := value + 1; } guard := 0 }

class Semaphore { int value := k int guard := 0 }

65

How to use Semaphores

Binary semaphores good for Mutual Exclusion

S.P(); CriticalSection(); S(V); Semaphore S S.init(1)

T1 T2

S.P(); CriticalSection(); S(V);

66

How to use Semaphores

Counting semaphores good for signaling or counting resources

One thread performs P() to await an event Another thread performs V() to inform waiting thread that event has occurred pkt := getpacket(); enqueue(pcketq, pkt); packjetarrived.V() Semaphore packetarrived packetarrived.init(0)

T1 T2

packetarrived.P(); pkt := dequeue(packetq) print(pkt);

67

slide-4
SLIDE 4

Producer-Consumer with Bounded Buffer

A set of producer and consumer threads communicate through a buffer of size N

producer inserts resources into the buffer (writes to “in” and moves right)

disk blocks, output, memory pages, characters… consumer removes resources from the buffer (reads from

  • ut and moves right)

Producer and consumer execute at different rates

in

  • ut

N-1 68

Safety

Sequence of consumed values is a prefix of the sequence of produced values Let

= number consumed = number produced N = size of buffer, then maintain the following invariant: nc

<latexit sha1_base64="tsvTb SiFlDV6qTk+Y1yPfjANdQ=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgaphR8bHRghuXVRxbaEvNpJk2NJMZkjtCKV27UVwpfpK/4G/4Ba tLurjwIXDOe SexKmUhj0vHcnNzM7N7+QXywsLa+srhX N25MkmnGA5bIRNdCargUigcoUPJaqjmNQ8mrYe985FfvuDYiUdfYT3kzph0lIsEoWulKsVax5LveGOR/Ujr7iKJbAKi0im+NdsKymCtk hpT970UmwOqUTDJh4VGZnhKWY92+GB835DsWKlNokTbU jG6lSOxsb049AmY4pd89MbiX959Qyj4+ZAqDRDrtjkoSiTB MyKkvaQnOGsm8JZVrYCwnrUk0Z2i8p2Oqeu394 O975Df5rh7suSeuf+mVyqcwQR62YBt2wYcjKM FVCA BhE8wDO8ONS5dx6dp0k053ztbMIUnNdPJKGLZg= </latexit> <latexit sha1_base64="GkYpHv5/UsAbEGx8pi2dl/LDSmk=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgapix4mOjBTcuq1hbaEvJpJk2NJMZkjtCKV27UVwpfpK/4G/4BaZTXdTHgQuHc84l9yRIpD oe 9Obm5+YXEpv1xYWV1b3yhubt2aONWM1 gsY90IqOFSKF5DgZI3Es1pFEheDwYXE79+x7URsbrBYcLbEe0pEQpG0UrXinWKJd/1MpD/Sen8I8xQ7RTfWt2YpRFXyCQ1pul7CbZHVKNgko8LrdTwhLIB7fFRdt+Y7FmpS8JY21FIMnUmRyNjhlFgkxHFv npTcS/vGaK4Ul7JFS Ilds+lCYSoIxmZQlXaE5Qzm0hDIt7IWE9am DO2XFGx1zy0fHfplj/wm39VrB+6p6195pcoZTJGH diFf DhGCpwCVWoAYMQHuAZXhzq3DuPztM0mnO+drZhBs7rJ7gkjJ4=</latexit> <latexit sha1_base64="GkYpHv5/UsAbEGx8pi2dl/LDSmk=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgapix4mOjBTcuq1hbaEvJpJk2NJMZkjtCKV27UVwpfpK/4G/4BaZTXdTHgQuHc84l9yRIpD oe 9Obm5+YXEpv1xYWV1b3yhubt2aONWM1 gsY90IqOFSKF5DgZI3Es1pFEheDwYXE79+x7URsbrBYcLbEe0pEQpG0UrXinWKJd/1MpD/Sen8I8xQ7RTfWt2YpRFXyCQ1pul7CbZHVKNgko8LrdTwhLIB7fFRdt+Y7FmpS8JY21FIMnUmRyNjhlFgkxHFv npTcS/vGaK4Ul7JFS Ilds+lCYSoIxmZQlXaE5Qzm0hDIt7IWE9am DO2XFGx1zy0fHfplj/wm39VrB+6p6195pcoZTJGH diFf DhGCpwCVWoAYMQHuAZXhzq3DuPztM0mnO+drZhBs7rJ7gkjJ4=</latexit> <latexit sha1_base64="GkYpHv5/UsAbEGx8pi2dl/LDSmk=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgapix4mOjBTcuq1hbaEvJpJk2NJMZkjtCKV27UVwpfpK/4G/4BaZTXdTHgQuHc84l9yRIpD oe 9Obm5+YXEpv1xYWV1b3yhubt2aONWM1 gsY90IqOFSKF5DgZI3Es1pFEheDwYXE79+x7URsbrBYcLbEe0pEQpG0UrXinWKJd/1MpD/Sen8I8xQ7RTfWt2YpRFXyCQ1pul7CbZHVKNgko8LrdTwhLIB7fFRdt+Y7FmpS8JY21FIMnUmRyNjhlFgkxHFv npTcS/vGaK4Ul7JFS Ilds+lCYSoIxmZQlXaE5Qzm0hDIt7IWE9am DO2XFGx1zy0fHfplj/wm39VrB+6p6195pcoZTJGH diFf DhGCpwCVWoAYMQHuAZXhzq3DuPztM0mnO+drZhBs7rJ7gkjJ4=</latexit> <latexit sha1_base64="GkYpHv5/UsAbEGx8pi2dl/LDSmk=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgapix4mOjBTcuq1hbaEvJpJk2NJMZkjtCKV27UVwpfpK/4G/4BaZTXdTHgQuHc84l9yRIpD oe 9Obm5+YXEpv1xYWV1b3yhubt2aONWM1 gsY90IqOFSKF5DgZI3Es1pFEheDwYXE79+x7URsbrBYcLbEe0pEQpG0UrXinWKJd/1MpD/Sen8I8xQ7RTfWt2YpRFXyCQ1pul7CbZHVKNgko8LrdTwhLIB7fFRdt+Y7FmpS8JY21FIMnUmRyNjhlFgkxHFv npTcS/vGaK4Ul7JFS Ilds+lCYSoIxmZQlXaE5Qzm0hDIt7IWE9am DO2XFGx1zy0fHfplj/wm39VrB+6p6195pcoZTJGH diFf DhGCpwCVWoAYMQHuAZXhzq3DuPztM0mnO+drZhBs7rJ7gkjJ4=</latexit> <latexit sha1_base64="jvD6jTyYFkOhi/GSJMybx6qd51A=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgapix cdGCm5cVnFsoS0lk2ba0ExmSO4IpXTtRnGl+En+gn9j+nBRHwcCh3NOuPfcMJXCoOd9Orml5ZXVtfx6YWNza3unuLt3b5JM x6wRCa6EVLDpVA8QIGSN1LNaRxKXg8HVxO/ sC1EYm6w2HK2zHtKREJRtFKt4p1i Xf9aYg/5MSzFHrFD9a3YRlMVfIJDWm6XsptkdUo2CSjwutzPCUsgHt8dF0vzE5slKXRIm2TyGZqgs5GhszjEObjCn2zU9vIv7lNTOMztsjodIMuWKzQVEmCSZkUpZ0heYM5dASyrSwGxLWp5oytCcp2OqeWz6t+GWP/Cbf1YMT98L1b7xS9XJ+gzwcwCEcgw9nUIVrqE ADCJ4gld4c6jz6Dw7L7Nozpn/2YcFO 9fDHeJCQ= </latexit>

np

<latexit sha1_base64="uovqlS9jMkCp1fxFqNRQiny4MVg=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgaphR8bHRghuXVRxbaEvNpJk2NJMZkjtCKV27UVwpfpK/4G/4Ba tLurjwIXDOe SexKmUhj0vHcnNzM7N7+QXywsLa+srhX N25MkmnGA5bIRNdCargUigcoUPJaqjmNQ8mrYe985FfvuDYiUdfYT3kzph0lIsEoWulKpa1iyXe9Mcj/pHT2EUW3AFBpFd8a7YRlMVfIJDWm7nspNgdUo2CSDwuNzPCUsh7t8MH4viHZsVKbRIm2o5CM1akcjY3px6FNxhS75qc3Ev/y6hlGx82BUGmGXLHJQ1EmCSZkVJa0heYMZd8SyrSwFxLWpZoytF9SsNU9d/ w N/3yG/yXT3Yc09c/9IrlU9hgjxswTbsg 9HUIYLqEA DCJ4gGd4cahz7zw6T5Nozvna2YQpOK+fN8aLcw= </latexit> <latexit sha1_base64="9aJ XZI+RPZqAYVWMg10FIy05Z8=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgapix4mOjBTcuq1hbaEvJpJk2NJMZkjtCKV27UVwpfpK/4G/4BaZTXdTHgQuHc84l9yRIpD oe 9Obm5+YXEpv1xYWV1b3yhubt2aONWM1 gsY90IqOFSKF5DgZI3Es1pFEheDwYXE79+x7URsbrBYcLbEe0pEQpG0UrXKukUS7 rZSD/k9L5R5ih2im+tboxSyOukElqTNP3EmyPqEbBJB8XWqnhCWUD2uOj7L4x2bNSl4SxtqOQZOpMjkbGDKPAJiOKf PTm4h/ec0Uw5P2SKgkRa7Y9KEwlQRjMilLukJzhnJoCWVa2AsJ61N GdovKdjqnls+OvTLHvlNvqvXDtxT17/ySpUzmCIPO7AL+ D MVTgEqpQAwYhPMAzvDjUuXcenadpNOd87WzD JzXT8tJjKs=</latexit> <latexit sha1_base64="9aJ XZI+RPZqAYVWMg10FIy05Z8=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgapix4mOjBTcuq1hbaEvJpJk2NJMZkjtCKV27UVwpfpK/4G/4BaZTXdTHgQuHc84l9yRIpD oe 9Obm5+YXEpv1xYWV1b3yhubt2aONWM1 gsY90IqOFSKF5DgZI3Es1pFEheDwYXE79+x7URsbrBYcLbEe0pEQpG0UrXKukUS7 rZSD/k9L5R5ih2im+tboxSyOukElqTNP3EmyPqEbBJB8XWqnhCWUD2uOj7L4x2bNSl4SxtqOQZOpMjkbGDKPAJiOKf PTm4h/ec0Uw5P2SKgkRa7Y9KEwlQRjMilLukJzhnJoCWVa2AsJ61N GdovKdjqnls+OvTLHvlNvqvXDtxT17/ySpUzmCIPO7AL+ D MVTgEqpQAwYhPMAzvDjUuXcenadpNOd87WzD JzXT8tJjKs=</latexit> <latexit sha1_base64="9aJ XZI+RPZqAYVWMg10FIy05Z8=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgapix4mOjBTcuq1hbaEvJpJk2NJMZkjtCKV27UVwpfpK/4G/4BaZTXdTHgQuHc84l9yRIpD oe 9Obm5+YXEpv1xYWV1b3yhubt2aONWM1 gsY90IqOFSKF5DgZI3Es1pFEheDwYXE79+x7URsbrBYcLbEe0pEQpG0UrXKukUS7 rZSD/k9L5R5ih2im+tboxSyOukElqTNP3EmyPqEbBJB8XWqnhCWUD2uOj7L4x2bNSl4SxtqOQZOpMjkbGDKPAJiOKf PTm4h/ec0Uw5P2SKgkRa7Y9KEwlQRjMilLukJzhnJoCWVa2AsJ61N GdovKdjqnls+OvTLHvlNvqvXDtxT17/ySpUzmCIPO7AL+ D MVTgEqpQAwYhPMAzvDjUuXcenadpNOd87WzD JzXT8tJjKs=</latexit> <latexit sha1_base64="9aJ XZI+RPZqAYVWMg10FIy05Z8=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgapix4mOjBTcuq1hbaEvJpJk2NJMZkjtCKV27UVwpfpK/4G/4BaZTXdTHgQuHc84l9yRIpD oe 9Obm5+YXEpv1xYWV1b3yhubt2aONWM1 gsY90IqOFSKF5DgZI3Es1pFEheDwYXE79+x7URsbrBYcLbEe0pEQpG0UrXKukUS7 rZSD/k9L5R5ih2im+tboxSyOukElqTNP3EmyPqEbBJB8XWqnhCWUD2uOj7L4x2bNSl4SxtqOQZOpMjkbGDKPAJiOKf PTm4h/ec0Uw5P2SKgkRa7Y9KEwlQRjMilLukJzhnJoCWVa2AsJ61N GdovKdjqnls+OvTLHvlNvqvXDtxT17/ySpUzmCIPO7AL+ D MVTgEqpQAwYhPMAzvDjUuXcenadpNOd87WzD JzXT8tJjKs=</latexit> <latexit sha1_base64="jJrDk+YFvmLRC/geHw72PGYSyac=">A B3nicdVDLSgMxFL1TX7W+qi7dBIvgapix cdGCm5cVnFsoS0lk2ba0ExmSO4IpXTtRnGl+En+gn9j+nBRHwcCh3NOuPfcMJXCoOd9Orml5ZXVtfx6YWNza3unuLt3b5JM x6wRCa6EVLDpVA8QIGSN1LNaRxKXg8HVxO/ sC1EYm6w2HK2zHtKREJRtFKtyrtFEu+601B/iclmKPWKX60ugnLYq6QSWpM0/dSbI+oRsEkHxdameEpZQPa46PpfmNyZKUuiRJtn0IyVRdyNDZmGIc2GVPsm5/eRPzLa2Y nbdHQqUZcsVmg6JMEkzIpCzpCs0ZyqEl GlhNySsTzVlaE9SsNU9t3xa8cse+U2+qwcn7oXr3 il6uX8Bnk4gEM4Bh/OoArXUIMAGETwBK/w5lDn0Xl2XmbRnDP/sw8LcN6/AB+ciRY=</latexit>

0 ≤ np − nc ≤

<latexit sha1_base64="ACL2I29MlBmq9t0VBsLwucLkRG0=">A B73icdVDLSgMxFL3js9bXVJdugkVw45Cx4mNl0YUuKzi20JaS TNtaCYzJBml P6HG6UrxT/xF1z6C36BM60u6uPAhcM5 J74seCa4PxmzUzOze/sJhbyi+vrK6t24WNGx0lijKPRiJSNZ9oJrhknuFGsFqsGAl9wap+7z q7dMaR7Ja9OPWTMkHckDTolJpZ dwKghGJIx2kOSZrxlF10Hj4H+J8XTj/eLEQBUWvZrox3RJGTSUEG0r s4Ns0BUYZTwYb5RqJZTGiPdNhgfPAQ7aRSGwWRSkcaNFanciTUuh/6aTIkpqt/epn4l1dPTHDcH AZJ4ZJOnkoSAQyEcraozZXjBrRTwmhiqcXItolilCT/lE+rY6d0uGBW8LoN/mu7u07J457hYvlM5g B1uwDbvgwhGU4RIq4AGFO3iAJ3i2lHVvPVqjSXTG+trZhClYL5/p8JEC</latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="erKf/ 9lwmBsQRe0hCli BYug Q=">A B73icdVDLSgMxFL3js9bXVJdugkVw45Cx4mNXdO ygmMLbSmZN OGZjJDklFK6X+4UVwp/om/4N+YaeuiPg4EDuec O+5YSq4Nh /OguLS8srq4W14vrG5ta2W9q50 m KAtoIhLVCIlmgksWG 4Ea6SKkTgUrB4OrnK/fs+U5om8NcOUtWPSkz ilBgrd wSRi3BkEzREZI05x237Ht4AvQ/KcM tY7 0eomNIuZNFQ rZs+Tk17RJThVLBxsZVplhI6ID02miw8RgdW6qIoUfZJgybqXI7EWg/j0CZjYvr6p5eLf3nNzETn7RGXaWaYpN BUSaQSVDeHnW5YtSIoSWEKm43RLRPFKHG3qhoq2OvcnriVzD6Tb6rB8fehef 4HL1cnaDAuzBPhyCD2dQhWuoQ AUHuAJXuHNUc6j8+y8TKMLzuzPLszBef8CBgO CQ= </latexit>

N

69

How to go about this problem

Are there shared variables? If so, we’ll need to make sure the code accessing them is in a critical section variable in (shared by producers) variable out (shared by consumers) the buffer (shared by all) How many locks we need?

70

Step 1: Guard Shared Resources

71

/ / add item to buffer void produce(int item) { in_lock.acquire(); buf[in] := item; in := (in+1)%N in_lock.release(); } Shared: int buf[N]; int in := 0, out := 0; lock: in_lock, out_lock / / remove item from buffer int consume() {

  • ut_lock.acquire();

int item :- buf[out];

  • ut := (out+1)%N;
  • ut_lock.release();

return(item); }

0 ≤ np − nc ≤

<latexit sha1_base64="ACL2I29MlBmq9t0VBsLwucLkRG0=">A B73icdVDLSgMxFL3js9bXVJdugkVw45Cx4mNl0YUuKzi20JaS TNtaCYzJBml P6HG6UrxT/xF1z6C36BM60u6uPAhcM5 J74seCa4PxmzUzOze/sJhbyi+vrK6t24WNGx0lijKPRiJSNZ9oJrhknuFGsFqsGAl9wap+7z q7dMaR7Ja9OPWTMkHckDTolJpZ dwKghGJIx2kOSZrxlF10Hj4H+J8XTj/eLEQBUWvZrox3RJGTSUEG0r s4Ns0BUYZTwYb5RqJZTGiPdNhgfPAQ7aRSGwWRSkcaNFanciTUuh/6aTIkpqt/epn4l1dPTHDcH AZJ4ZJOnkoSAQyEcraozZXjBrRTwmhiqcXItolilCT/lE+rY6d0uGBW8LoN/mu7u07J457hYvlM5g B1uwDbvgwhGU4RIq4AGFO3iAJ3i2lHVvPVqjSXTG+trZhClYL5/p8JEC</latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="erKf/ 9lwmBsQRe0hCli BYug Q=">A B73icdVDLSgMxFL3js9bXVJdugkVw45Cx4mNXdO ygmMLbSmZN OGZjJDklFK6X+4UVwp/om/4N+YaeuiPg4EDuec O+5YSq4Nh /OguLS8srq4W14vrG5ta2W9q50 m KAtoIhLVCIlmgksWG 4Ea6SKkTgUrB4OrnK/fs+U5om8NcOUtWPSkz ilBgrd wSRi3BkEzREZI05x237Ht4AvQ/KcM tY7 0eomNIuZNFQ rZs+Tk17RJThVLBxsZVplhI6ID02miw8RgdW6qIoUfZJgybqXI7EWg/j0CZjYvr6p5eLf3nNzETn7RGXaWaYpN BUSaQSVDeHnW5YtSIoSWEKm43RLRPFKHG3qhoq2OvcnriVzD6Tb6rB8fehef 4HL1cnaDAuzBPhyCD2dQhWuoQ AUHuAJXuHNUc6j8+y8TKMLzuzPLszBef8CBgO CQ= </latexit>

N Invariant

slide-5
SLIDE 5

Step 1: Guard Shared Resources

72

/ / add item to buffer void produce(int item) { in_lock.acquire(); buf[in%N] := item; in := in+1; in_lock.release(); } Shared: int buf[N]; int in := 0, out := 0; lock: in_lock, out_lock / / remove item from buffer int consume() {

  • ut_lock.acquire();

int item := buf[out%N];

  • ut := out+1;
  • ut_lock.release();

return(item); }

0 ≤ np − nc ≤

<latexit sha1_base64="ACL2I29MlBmq9t0VBsLwucLkRG0=">A B73icdVDLSgMxFL3js9bXVJdugkVw45Cx4mNl0YUuKzi20JaS TNtaCYzJBml P6HG6UrxT/xF1z6C36BM60u6uPAhcM5 J74seCa4PxmzUzOze/sJhbyi+vrK6t24WNGx0lijKPRiJSNZ9oJrhknuFGsFqsGAl9wap+7z q7dMaR7Ja9OPWTMkHckDTolJpZ dwKghGJIx2kOSZrxlF10Hj4H+J8XTj/eLEQBUWvZrox3RJGTSUEG0r s4Ns0BUYZTwYb5RqJZTGiPdNhgfPAQ7aRSGwWRSkcaNFanciTUuh/6aTIkpqt/epn4l1dPTHDcH AZJ4ZJOnkoSAQyEcraozZXjBrRTwmhiqcXItolilCT/lE+rY6d0uGBW8LoN/mu7u07J457hYvlM5g B1uwDbvgwhGU4RIq4AGFO3iAJ3i2lHVvPVqjSXTG+trZhClYL5/p8JEC</latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="Vp90/iVWAtPh19qTYgk358X90zc=">A B73icdVDLTgIxFO3gC/E1qDs3jcTEjZO GB8riS50iYkjJEBIp3SgodOZtB0NEv7DjcaVxo3f4S+45Bf8AjugC3yc5CYn5 yb3lM/5kxphN6tzNT0zOxcdj63sLi0vGLnV69UlEhCPRLxSFZ9rChngnqa U6rsaQ49Dmt+N3T1K9cU6lYJC51L6aNELcFCxjB2khNO49gnVMoYrgDBUl50y64DhoB/k8Kx /Ds9f12 G5ab/VWxFJQio04Vipmoti3ehjqRnhdJCrJ4rGmHRxm/ZHBw/glpFaMIikGaHhSJ3I4VCpXuibZIh1R/30UvEvr5bo4LDRZyJONBVk/FCQcKgjmLaHLSYp0bxnC aSmQsh6WCJiTZ/lDPVkVPc3 OLCP4m39W9XefIcS9QoXQCxsiCDbAJtoELDkAJnIMy8A BN+AePIFnS1p31oP1OI5mrK+dNTAB6+UT1fySfw= </latexit> <latexit sha1_base64="erKf/ 9lwmBsQRe0hCli BYug Q=">A B73icdVDLSgMxFL3js9bXVJdugkVw45Cx4mNXdO ygmMLbSmZN OGZjJDklFK6X+4UVwp/om/4N+YaeuiPg4EDuec O+5YSq4Nh /OguLS8srq4W14vrG5ta2W9q50 m KAtoIhLVCIlmgksWG 4Ea6SKkTgUrB4OrnK/fs+U5om8NcOUtWPSkz ilBgrd wSRi3BkEzREZI05x237Ht4AvQ/KcM tY7 0eomNIuZNFQ rZs+Tk17RJThVLBxsZVplhI6ID02miw8RgdW6qIoUfZJgybqXI7EWg/j0CZjYvr6p5eLf3nNzETn7RGXaWaYpN BUSaQSVDeHnW5YtSIoSWEKm43RLRPFKHG3qhoq2OvcnriVzD6Tb6rB8fehef 4HL1cnaDAuzBPhyCD2dQhWuoQ AUHuAJXuHNUc6j8+y8TKMLzuzPLszBef8CBgO CQ= </latexit>

N Invariant

Step 1: Guard Shared Resources*

73

/ / add item to buffer void produce(int item) { in_lock.acquire(); buf[in%N] := item; in := in+1; in_lock.release(); } / / remove item from buffer int consume() {

  • ut_lock.acquire();

int item := buf[out%N];

  • ut := out+1;
  • ut_lock.release();

return(item); }

Implement mutual exclusion with a binary semaphore initialized to 1

*with Semaphores

Shared: int buf[N]; int in := 0, out := 0; lock: in_lock, out_lock

Step 1: Guard Shared Resources*

74

/ / add item to buffer void produce(int item) { in_lock.acquire(); buf[in%N] := item; in := in+1; in_lock.release(); } / / remove item from buffer int consume() {

  • ut_lock.acquire();

int item := buf[out%N];

  • ut := out+1;
  • ut_lock.release();

return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1);

*with Semaphores

Implement mutual exclusion with a binary semaphore initialized to 1

Step 1: Guard Shared Resources*

75

/ / add item to buffer void produce(int item) { mutex_in.P(); buf[in%N] := item; in := in+1; mutex_in.V(); } / / remove item from buffer int consume() {

  • ut_lock.acquire();

int item := buf[out%N];

  • ut := out+1;
  • ut_lock.release();

return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1);

*with Semaphores

Implement mutual exclusion with a binary semaphore initialized to 1

slide-6
SLIDE 6

Step 1: Guard Shared Resources*

76

/ / remove item from buffer int consume() { mutex_out.P(); int item := buf[out%N];

  • ut := out+1;

mutex_out.V(); return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1); / / add item to buffer void produce(int item) { mutex_in.P(); buf[in%N] := item; in := in+1; mutex_in.V(); }

*with Semaphores

Implement mutual exclusion with a binary semaphore initialized to 1

Step 1: Coordinate Actions

77

/ / remove item from buffer int consume() { mutex_out.P(); int item := buf[out%N];

  • ut := out+1;

mutex_out.V(); return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1); / / add item to buffer void produce(int item) { mutex_in.P(); buf[in%N] := item; in := in+1; mutex_in.V(); }

Need a full buffer entry to remove an item; and an empty

  • ne to add an item

Step 1: Coordinate Actions

78

/ / remove item from buffer int consume() { mutex_out.P(); int item := buf[out%N];

  • ut := out+1;

mutex_out.V(); return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1); Condition empty, full; / / add item to buffer void produce(int item) { mutex_in.P(); buf[in%N] := item; in := in+1; mutex_in.V(); } wait(empty); signal(full); wait(full); signal(empty);

Need a full buffer entry to remove an item; and an empty

  • ne to add an item

Step 1: Coordinate Actions*

79

/ / remove item from buffer int consume() { mutex_out.P(); int item := buf[out%N];

  • ut := out+1;

mutex_out.V(); return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1); Condition empty, full; / / add item to buffer void produce(int item) { mutex_in.P(); buf[in%N] := item; in := in+1; mutex_in.V(); } wait(empty); signal(full); wait(full); signal(empty);

Use two counting semaphores:

  • ne to count empty entries,
  • ne to count full

*with Semaphores

slide-7
SLIDE 7

Step 1: Coordinate Actions*

80

/ / remove item from buffer int consume() { mutex_out.P(); int item := buf[out%N];

  • ut := out+1;

mutex_out.V(); return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1); Semaphore empty(N), full(0); / / add item to buffer void produce(int item) { mutex_in.P(); buf[in%N] := item; in := in+1; mutex_in.V(); } wait(empty); signal(full); wait(full); signal(empty);

Use two counting semaphores:

  • ne to count empty entries,
  • ne to count full

*with Semaphores

Step 1: Coordinate Actions*

81

/ / remove item from buffer int consume() { mutex_out.P(); int item := buf[out%N];

  • ut := out+1;

mutex_out.V(); return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1); Semaphore empty(N), full(0); / / add item to buffer void produce(int item) { mutex_in.P(); buf[in%N] := item; in := in+1; mutex_in.V(); } empty.P(); signal(full); wait(full) signal(empty);

Use two counting semaphores:

  • ne to count empty entries,
  • ne to count full

*with Semaphores

Step 1: Coordinate Actions*

82

/ / remove item from buffer int consume() { mutex_out.P(); int item := buf[out%N];

  • ut := out+1;

mutex_out.V(); return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1); Semaphore empty(N), full(0); / / add item to buffer void produce(int item) { mutex_in.P(); buf[in%N] := item; in := in+1; mutex_in.V(); } empty.P(); full.V(); wait(full) signal(empty);

Use two counting semaphores:

  • ne to count empty entries,
  • ne to count full

*with Semaphores

Step 1: Coordinate Actions*

83

/ / remove item from buffer int consume() { mutex_out.P(); int item := buf[out%N];

  • ut := out+1;

mutex_out.V(); return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1); Semaphore empty(N), full(0); / / add item to buffer void produce(int item) { mutex_in.P(); buf[in%N] := item; in := in+1; mutex_in.V(); } empty.P(); full.V(); full.P(); empty.V();

Use two counting semaphores:

  • ne to count empty entries,
  • ne to count full

*with Semaphores

slide-8
SLIDE 8

Step 1: Coordinate Actions*

84

/ / remove item from buffer int consume() { mutex_out.P(); item := buf[out];

  • ut := (out+1)%N;

mutex_out.V(); return(item); } Shared: int buf[N]; int in := 0, out := 0; Semaphore mutex_in(1), mutex_out(1); Semaphore empty(N), full(0); / / add item to buffer void produce(int item) { mutex_in.P(); buf[in] := item; in := (in+1)%N; mutex_in.V(); } empty.P(); full.V(); full.P(); empty.V();

*with Semaphores

Is there a V for every P? Are mutexes initialized to 1? Do mutexes P&V in the same thread?

Readers-Writers

Models access to an object (e.g., a database), shared among several threads some threads only read the object

  • thers only write it

Safety

85

(#r ≥ 0) ∧ (0 ≤ #w ≤ 1) ∧ (#r > 0) ⇒ (#w = 0))

Fairness questions

Suppose a writer is active, and a combination

  • f readers and writers arrive

Who should get in next?

Suppose that a writer is waiting, and an endless stream of readers arrives

Who should get in next?

86

Readers-Writers Solution

int read() { rcount_mutex.P(); rcount := rcount+1; if (rcount = 1) then rOw_lock.P(); rcount_mutex.V(); … /* Perform read */ … rcount_mutex.P(); rcount := rcount-1; if (rcount = 0) then rOw.lock.V(); rcount_mutex.V(); } Shared: int rcount = 0; Semaphore rcount_mutex (1); Semaphore rOw_lock(1); void write() { rOw_lock.P(); … /* Perform write */ … rOw_lock.V(); }

87

slide-9
SLIDE 9

Musings on Readers/Writers

Semaphore rOw provides mutex between readers and writers

writers always rOw.P() / rOw.V() readers only when rcount transitions from 0 to 1 or from 1 to 0

If a writer is writing, where are readers waiting?

Once a writer exits, all readers can fall through

Which reader gets to go first? Are all readers guaranteed to fall through?

int read() { rcount_mutex.P(); rcount := rcount+1; if (rcount == 1) then rOw_lock.P(); rcount_mutex.V(); … /* Perform read */ … rcount_mutex.P(); rcount := rcount-1; if (rcount == 0) then rOw.lock.V(); rcount_mutex.V(); } Shared: int rcount = 0; Semaphore rcount_mutex (1); Semaphore rOw_lock(1); void write() { rOw_lock.P(); … /* Perform write */ … rOw_lock.V(); }

88

More Musings on Readers/Writers

If readers and writers are waiting, and a writer exits, who goes first? Why do readers use a mutex?

Why don’ t writers use a mutex? What if we move rcount_mutex.V() just above if (rcount = 1)?

int read() { rcount_mutex.P(); rcount := rcount+1; if (rcount == 1) then rOw_lock.P(); rcount_mutex.V(); … /* Perform read */ … rcount_mutex.P(); rcount := rcount-1; if (rcount == 0) then rOw.lock.V(); rcount_mutex.V(); } Shared: int rcount = 0; Semaphore rcount_mutex (1); Semaphore rOw_lock(1); void write() { rOw_lock.P(); … /* Perform write */ … rOw_lock.V(); }

89