ºìÁªLinuxÃÅ»§
Linux°ïÖú

WindowsÓëSolaris»¥³âÓëͬ²½»úÖÆ¶Ô±È

·¢²¼Ê±¼ä:2008-06-22 00:08:20À´Ô´:ºìÁª×÷Õß:theset
º«ÈýÆÕ
ÔÚWindowsºÍSolarisÖж¼Ìṩ½ø³ÌÓëÏ̵߳Ļ¥³âÓëͬ²½»úÖÆ¡£WindowsÌṩÁË»¥³â¶ÔÏó¡¢ÐźÅÁ¿¶ÔÏóºÍʼþ¶ÔÏóµÈÈýÖÖÄÚºËͬ²½¶ÔÏóºÍÏàÓ¦µÄϵͳµ÷Óà £¬ÓÃÓÚ½ø³ÌºÍÏß³Ìͬ²½¡£ÕâЩͬ²½¶ÔÏó¶¼ÓÐÒ»¸öÓû§Ö¸¶¨µÄ¶ÔÏóÃû³Æ£¬²»Í¬½ø³ÌÖÐÓÃͬÑùµÄ¶ÔÏóÃû³ÆÀ´´´½¨»ò´ò¿ª¶ÔÏ󣬴Ӷø»ñµÃ¸Ã¶ÔÏóÔÚ±¾½ø³ÌµÄ¾ä±ú¡£¶øSolarisÒ²ÏàÓ¦µÄÌṩÁ˼¸¸ö»¥³âͬ²½¶ÔÏ󣬻¥³âËø(Mutex Locks)£¬¶ÁÐ´Ëø(Reader/writer (RW) locks)£¬µ÷¶ÈËø(Dispatcher Locks)£¬ºÍÐźÅÁ¿(Semaphores)¡£ÏÂÃæ½«Ò»Ò»¶Ô±È»òÕß˵Ã÷¡£
£±»¥³â¶ÔÏó£¨Mutex£©
WindowsÖеĻ¥³â¶ÔÏó(Mutex)¾ÍÊÇ»¥³âÐźÅÁ¿£¬ÔÚÒ»¸öʱ¿ÌÖ»Äܱ»Ò»¸öÏß³ÌʹÓá£ËüµÄÏà¹ØAPI°üÀ¨£ºCreateMutex¡¢OpenMutexºÍReleaseMutex ¡£
a) CreateMutex´´½¨Ò»¸ö»¥³â¶ÔÏ󣬷µ»Ø¶ÔÏó¾ä±ú¡£
b) OpenMutex´ò¿ª²¢·µ»ØÒ»¸öÒÑ´æÔڵĻ¥³â¶ÔÏó¾ä±ú£¬ÓÃÓÚºóÐø·ÃÎÊ¡£
c) ReleaseMutexÊͷŶԻ¥³â¶ÔÏóµÄÕ¼Óã¬Ê¹Ö®³ÉΪ¿ÉÓá£
ÔÚSolarisÖУ¬ÓÐMutex locks£¨¿É³Æ×ö»¥³âËø£©ºÍWindowsÖеĻ¥³â¶ÔÏóÓÐÏàËÆµÄµØ·½ÓÖÓÐËù²»Í¬£¬Ïà±È¸ü¼Ó¸´ÔÓ¡£Ò»¸öÏ̵߳õ½Ò»¸ö»¥³âËø£¬¾ÍÓÐÁ½ÖÖ¿ÉÄÜ£¬Ò»ÊÇ×ÔÐý(spin)£¬µ÷ÓÃÕß¾Íһֱѭ»·ÔÚÄÇÀï¿´ÊÇ·ñ¸Ã×ÔÐýËøµÄ±£³ÖÕßÒѾ­ÊÍ·ÅÁËËø¡£ÁíÒ»Çé¿öÊÇ(block)×èÈû£¬Ï̱߳»°²ÅÅÔÚÒ»¸ö˯Ãß¶ÓÁÐÖУ¬µ±Ëø±»ÊͷŻᷢ³öÐźŸøÏ̡߳£×ÔÐýµÄºÃ´¦ÊÇûÓÐÉÏÏÂÎÄÇл»µÄ¿ªÏú£¬Ð§Âʷdz£¸ß¡£¶ø×èÈûµÄÓÅÊÆÊÇ¿ÉÒÔÊÍ·ÅCPU¸øÆäËüỊ̈߳¬µ«ÊÇÐèÒªÉÏÏÂÎÄ»·¾³£¬²¢ÇÒ±È×ÔÐýËøÐ§ÂʵÍÒ»µã¡£ÓÉ´ËϵͳΪMutexÌṩÁËÁ½ÖÖËø£¬×ÔÐýËøºÍ×ÔÊÊÓ¦Ëø¡£×ÔÐýËø¾ÍÊDzÉÓÃ×ÔÐýµÄ·½Ê½£¬¶ø×ÔÊÊÓ¦ËøÊǸù¾Ý³ÖÓÐÕßµÄ״̬£¬¶¯Ì¬Æ½ºâÊÇ·ñ²ÉÓÃ×ÔÐý»òÕß×èÈû£»Èç¹ûËøµÄ³ÖÓÐÕßÔÚÔËÐÐ̬£¬Ï̵߳õ½µÄËø¾Í»áÊÇ×ÔÐýµÄ£¬Èç¹û²»ÔÚÔËÐÐ̬£¬¾Í»áÊÇ×èÈûµÄ£¬ÕâÑù³ä·Ö·¢»ÓÁËÁ½ÖÖËøµÄÓŵ㡣
ÏÂÃæÊÇSolarisÌṩµÄmutex locksµÄʵÏÖº¯Êý£º
a) mutex_init(): ³õʼ»¯Ò»¸öËø£¬Ö»ÄÜÑ¡Ôñ³õʼ×ÔÐý»òÕß×ÔÊÊÓ¦Á½ÖÖµÄÒ»ÖÖ£¬Ä¬ÈÏÊÇ×ÔÊÊÓ¦¡£
b) mutex_enter():»ñÈ¡»¥³âËø
c) mutex_vector_enter(): µ±Ëø±»³ÖÓлòÕßÊÇ×ÔÐýʱ»ñÈ¡»¥³âËø
d) mutex_exit(): ÊÍ·ÅÒ»¸öËø
£²ÐźÅÁ¿¶ÔÏó£¨Semaphore£©
WindowsÖÐÐźÅÁ¿¶ÔÏó(Semaphore)¾ÍÊÇ×ÊÔ´ÐźÅÁ¿£¬È¡ÖµµÄȡֵÔÚ0µ½Ö¸¶¨×î´óÖµÖ®¼ä£¬ÓÃÓÚÏÞÖÆ²¢·¢·ÃÎʵÄÏß³ÌÊý¡£ËüµÄÏà¹ØAPI°üÀ¨£ºCreateSemaphore¡¢OpenSemaphoreºÍReleaseSemaphore
a) CreateSemaphore´´½¨Ò»¸öÐźÅÁ¿¶ÔÏó£¬ÔÚÊäÈë²ÎÊýÖÐÖ¸¶¨×î´óÖµºÍ³õÖµ£¬·µ»Ø¶ÔÏó¾ä±ú
b) OpenSemaphore·µ»ØÒ»¸öÒÑ´æÔÚµÄÐźÅÁ¿¶ÔÏóµÄ¾ä±ú£¬ÓÃÓÚºóÐø·ÃÎÊ
c) ReleaseSemaphoreÊͷŶÔÐźÅÁ¿¶ÔÏóµÄÕ¼ÓÃ
ÔÚSolarisÖУ¬ÄÚºËÒ²ÌṩÁËÐźÅÁ¿(Semaphores)£¬¿Éͬ²½µÄʹÓÿɹ²ÏíµÄ×ÊÔ´¡£¿É¶ÔËü½øÐУС¢£Ö²Ù×÷¡££Ð²Ù×÷³¢ÊԵõ½Ò»¸öÐźÅÁ¿£¬£Ö²Ù×÷ÊÍ·ÅÒ»¸öÐźÅÁ¿¡£¸ù¾Ý¹²Ïí×ÊÔ´µÄÊýÁ¿³õʼ»¯ÐźÅÁ¿µÄÖµ¡£ÆäÔ­ÀíºÍwindows·Ç³£ÏàËÆ¡£
ÏÂÃæÊÇSolarisÌṩµÄsemaphoresµÄʵÏÖº¯Êý£º
a) sema_init(): ³õʼ»¯ÐźÅÁ¿
b) sema_p(): P²Ù×÷£¬³¢ÊÔ»ñÈ¡ÐźÅÁ¿
c) sema_v(): V²Ù×÷£¬ÊÍ·ÅÐźÅÁ¿
d) sema_held(): ²âÊÔº¯Êý
e) sema_destroy(): Ïú»ÙÐźÅÁ¿
£³Ê¼þ¶ÔÏó£¨Event£©
WindowsÌṩµÄÁíÒ»¸ö»¥³âÓëͬ²½¶ÔÏóÊÇʼþ¶ÔÏó(Event)£¬Ï൱ÓÚ¡°´¥·¢Æ÷¡±£¬¿ÉÓÃÓÚ֪ͨһ¸ö»ò¶à¸öÏß³ÌijʼþµÄ³öÏÖ¡£ËüµÄÏà¹ØµÄAPI°üÀ¨£ºCreateEvent¡¢OpenEvent¡¢SetEvent¡¢ResetEventºÍPulseEvent
a) CreateEvent´´½¨Ò»¸öʼþ¶ÔÏ󣬷µ»Ø¶ÔÏó¾ä±ú
b) OpenEvent·µ»ØÒ»¸öÒÑ´æÔÚµÄʼþ¶ÔÏóµÄ¾ä±ú£¬ÓÃÓÚºóÐø·ÃÎÊ
c) SetEventºÍPulseEventÉèÖÃÖ¸¶¨Ê¼þ¶ÔÏóΪ¿ÉÓÃ״̬
d) ResetEventÉèÖÃÖ¸¶¨Ê¼þ¶ÔÏóΪ²»¿ÉÓÃ״̬
£´ÁÙ½çÇø¶ÔÏó(Critical Section)
ÕâÊÇWindows»·¾³ÌṩµÄÓÖÒ»ÖÖͬ²½»¥³â»úÖÆ¡£Ö»ÄÜÔÚͬһ½ø³ÌÄÚʹÓõÄÁÙ½çÇø£¬Í¬Ò»½ø³ÌÄÚ¸÷Ï̶߳ÔËüµÄ·ÃÎÊÊÇ»¥³â½øÐеġ£°Ñ±äÁ¿ËµÃ÷ΪCRITICAL_SECTIONÀàÐÍ£¬¾Í¿É×÷ΪÁÙ½çÇøÊ¹Óá£ÓйصÄAPI£º
a) InitializeCriticalSection¶ÔÁÙ½çÇø¶ÔÏó½øÐгõʼ»¯£»
b) EnterCriticalSectionµÈ´ýÕ¼ÓÃÁÙ½çÇøµÄʹÓÃȨ£¬µÃµ½Ê¹ÓÃȨʱ·µ»Ø£»
c) TryEnterCriticalSection·ÇµÈ´ý·½Ê½ÉêÇëÁÙ½çÇøµÄʹÓÃȨ£»ÉêÇëʧ°Üʱ£¬·µ»Ø0£»
d) LeaveCriticalSectionÊÍ·ÅÁÙ½çÇøµÄʹÓÃȨ£»
e) DeleteCriticalSectionÊÍ·ÅÓëÁÙ½çÇø¶ÔÏóÏà¹ØµÄËùÓÐϵͳ×ÊÔ´£»
£µ»¥Ëø±äÁ¿·ÃÎÊ
ÔÚWindowsÏ£¬»¹¿ÉÒÔ²ÉÓû¥Ëø±äÁ¿·ÃÎʵķ½·¨ÊµÏÖͬ²½»¥³â£¬ËüÏ൱ÓÚÓ²¼þÖ¸Á¶ÔÒ»¸öÕûÊý£¨½ø³ÌÄڵıäÁ¿»ò½ø³Ì¼äµÄ¹²Ïí±äÁ¿£©½øÐвÙ×÷¡£ÆäÄ¿µÄÊDZÜÃâÏ̼߳äÇл»µÄÓ°Ïì¡£ÓйصÄAPI£º
a) InterlockedExchange½øÐÐ32λÊý¾ÝµÄÏȶÁºóдԭ×Ó²Ù×÷£»
b) InterlockedCompareExchangeÒÀ¾Ý±È½Ï½á¹û½øÐи³ÖµµÄÔ­×Ó²Ù×÷£»
c) InterlockedExchangeAddÏÈ¼Óºó´æ½á¹ûµÄÔ­×Ó²Ù×÷£»
d) InterlockedDecrementÏȼõ1ºó´æ½á¹ûµÄÔ­×Ó²Ù×÷£»
e) InterlockedIncrementÏȼÓ1ºó´æ½á¹ûµÄÔ­×Ó²Ù×÷£»
£¶µ÷¶ÈËø£¨Dispatcher Locks£©
ÁíÍ⣬ÔÚSolarisÖл¹ÓÐÒ»ÖÖËø£¬¿ÉÖ§³Ö¶àCPUµ÷¶È£¬½Ð×öµ÷¶ÈËø£¨Dispatcher Locks£©¡£Äں˵ķÖÅäÆ÷Kernel dispatcher ²é¿´Ï̵߳ÄÉÏÏÂÎÄ»·¾³À´¿ØÖÆ·ÖÅä¶ÓÁÐËü·ÖΪÁ½ÖÖÀàÐÍ£¬·Ö±ðÊÇÆÕͨµÄ×ÔÐýËøºÍCPUÓÅÏÈȨÌáÉýµÄËø¡£
£·¶ÁÐ´Ëø(Reader/Writer Locks)
ÕâÒ²ÊÇSolarisÌṩµÄÒ»ÖÖ»¥³âͬ²½»úÖÆ£¬ËüÊÊÓÃÓÚ¶ÁÕßдÕßÎÊÌâ¡£±ÈÈ磺¿ÉÔÚ¶àÏß³Ìͬʱ¶ÁÈ¡Êý¾Ý£¬Ö»ÓÐÒ»¸öÏß³ÌдÊý¾ÝʱÓõ½¡£Èç¹ûÓÐÒ»¸öдÓû§µÃµ½Õâ¸öËø£¬ËùÓжÁÓû§¶¼²»¿ÉÒÔ·ÃÎÊ¡£
»ù±¾ÊµÏÖ·½·¨£º
a) rw_init(): ³õʼ»¯¶ÁÐ´Ëø¡£
b) rw_enter():µÃµ½¶ÁÐ´Ëø
c) rw_exit(): ÊͷŶÁÐ´Ëø
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ