ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. ¹®¼´Â ¿Ï¼ºµÈ°Ô ¾Æ´Ï¸ç, Ʋ¸° ³»¿ëÀÌ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. ¼öÁ¤ÇØ¾ß ÇÒ ºÎºÐÀÌ ÀÖÀ½ ¾Ë·ÁÁÖ¼¼¿ä. È®ÀÎ ÈÄ ¹Ý¿µÇϵµ·Ï ÇϰڽÀ´Ï´Ù. 1 Thread¿¡ ´ëÇØ¼
ÇÁ·Î±×·¥À» º´·Ä·Î ½ÇÇà½ÃŰ´Â ¹æ¹ýÀ¸·Î fork()¿¡ ´ëÇØ¼ ¾Ë¾Æº¸¾Ò´Ù. fork()´Â ¸Å¿ì ÀÌÇØÇϱ⠽¬¿î ÇÁ·Î±×·¡¹Ö ¹æ¹ýÀ̱ä ÇÏÁö¸¸ ÀÚ¿øÈ¿À²¼º¿¡¼ ¸î°¡Áö ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù. ÇÁ·Î¼¼½º´Â ±âº»ÀûÀ¸·Î code, data, stack, file I/O, ±×¸®°í signal tableÀÇ 5°¡Áö ¿ä¼Ò·Î ±¸¼ºÀÌ µÈ´Ù. fork()¸¦ ÀÌ¿ëÇØ¼ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ°Ô µÇ¸é, ÀÌ·¯ÇÑ 5°¡Áö ±¸¼º¿ä¼Ò°¡ ¸ðµÎ º¹»ç°¡ µÈ´Ù. ±×·¯ÇÏ´Ù º¸´Ï ÇÁ·Î¼¼½º¸¦ »ý¼ºÇϴµ¥ ¸¹Àº ºñ¿ëÀÌ ¼ÒºñµÉ °ÍÀÌ´Ù. ´ë°ÔÀÇ °æ¿ì¿¡´Â ÇÁ·Î¼¼½º¸¦ »õ·Î »ý¼º½Ãų¶§ ¹ß»ýÇÏ´Â ¼º´ÉÀúÇϰ¡ ¹®Á¦°¡ µÇÁö´Â ¾Ê°ÚÁö¸¸ À¥¼ºñ½ºÃ³·³ ´ë·®ÀÇ Á¢±ÙÀÌ ¹ß»ýÇÏ´Â ¿µ¿ª¿¡¼´Â ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù.
forkÀÇ ÀÌ·¯ÇÑ ¹æ½ÄÀº »ó´çÈ÷ È¿À²ÀÌ ¶³¾îÁö´Â Ãø¸éÀÌ ÀÖ´Ù. ¾î¶² ÇÁ·Î±×·¥À» º´·Ä·Î ½ÇÇà½ÃŲ´Ù°í ÇßÀ» ¶§, ½ÇÁ¦ ¿ì¸®°¡ º´·Ä·Î ½ÇÇàµÇ±â¸¦ ¿øÇÏ´Â ¿µ¿ªÀº ÄÚµåÀÇ ÀϺκÐÀÌÁö ÇÁ·Î±×·¥ Àüü´Â ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. // ... pid = fork(); if (pid > 0) { // ½ÇÁ¦´Â ÀÌ ºÎºÐÀÇ Äڵ常 º´·Ä·Î ½ÇÇàµÇ¸é µÈ´Ù. // fork()´Â ´Ù¸¥ ¸ðµç¿µ¿ªÀÇ Äڵ尡 º¹»çµÇ¾î ¹ö¸°´Ù. }
°Ô´Ù°¡ ÀüÇô´Ù¸¥ ÇÁ·Î¼¼½º¸¦ »ý¼º½ÃÅ´À¸·Î½á, ÇÁ·Î¼¼½º°£ Åë½ÅÀ̶ó´Â »ó´çÈ÷ º¹ÀâÇÑ ¹®Á¦±îÁö¸¦ ÇØ°áÇØ¾ß ÇÑ´Ù. º´·Ä·Î ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥Àº Ư¼º»ó µ¥ÀÌÅ͸¦ °øÀ¯Çϰųª ¼·Î Åë½ÅÀ» ÇØ¾ß ÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ±×·±µ¥ ÇÁ·Î¼¼½º´Â ¼·Î µ¶¸³µÈ °´Ã¼À̹ǷΠÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î´Â µ¥ÀÌÅ͸¦ °øÀ¯ÇÒ ¼ö°¡ ¾ø´Ù. ÀÌ·¯ÇÑ ÇÁ·Î¼¼½º°£ µ¥ÀÌÅÍ Åë½ÅÀ» À§Çؼ ¸®´ª½º´Â IPC¶ó´Â ¼³ºñ¸¦ Á¦°øÇϴµ¥, IPC¶ó´Â°Ô »ç¿ëÇϱⰡ ¿©°£ ±î´Ù·ÓÁö°¡ ¾Ê´Ù. IPC¿¡ ´ëÇØ¼´Â º°µµÀÇ ÀåÀ» ÇÒ¾ÖÇØ¼ ´Ù·ê °èȹÀÌ´Ù.
Thread¸¦ ÀÌ¿ëÇϸé fork()¸¦ ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º ±â¹ÝÀÇ º´·Äó¸®ÀÇ ¹®Á¦Á¡ÀÇ ¸¹Àº ºÎºÐÀ» ÇØ°áÇÒ ¼ö ÀÖ´Ù. Thread´Â »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼º½ÃŰÁö ¾Ê°í, ƯÁ¤ ¹®¸Æ(ÄÚµå)¸¸À» º´·Ä·Î ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï Çã¿ëÇÑ´Ù. »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼º½ÃŰÁö ¾Ê±â ¶§¹®¿¡ ±×¸¸Å ÀÚ¿øÀ» ¾Æ³¥ ¼ö ÀÖÀ¸¸ç, ´õ È¿À²ÀûÀ¸·Î ºü¸£°Ô ¿òÁ÷ÀÏ ¼ö ÀÖ´Ù. ¶ÇÇÑ °°Àº ÇÁ·Î¼¼½ºÀ̱⠶§¹®¿¡, µ¥ÀÌÅ͸¦ °øÀ¯ÇϱⰡ ½±´Ù´Â ÀåÁ¡µµ °¡Áø´Ù. 1.1 Thread vs Process
Thread´Â ÇÁ·Î¼¼½º¿Í ´ÙÀ½°ú °°Àº Â÷ÀÌÁ¡À» °¡Áø´Ù.
1.2 Multi Thread ÇÁ·Î±×·¥ÀÇ ´ÜÁ¡
¸ðµç µµ±¸°¡ ±×·¯ÇϵíÀÌ Multi Thread ÇÁ·Î±×·¥À̶ó°í ÇØ¼ ÀåÁ¡¸¸ °¡Áø °ÍÀº ¾Æ´Ï´Ù. Multi Thread ÇÁ·Î±×·¥Àº Multi Process ÇÁ·Î±×·¡¹Ö ¹æ½Ä¿¡ ºñÇØ¼ ´ÙÀ½°ú °°Àº ´ÜÁ¡À» °¡Áø´Ù.
1.3 PThread
Thread´Â ¿î¿µÃ¼Á¦¿¡¼ Á¦°øÇÏ´Â º´·Äó¸® ¸ÞÄ¿´ÏÁòÀ¸·Î, ½ÇÁ¦ ÀÌ ¸ÞÄ¿´ÏÁòÀ» ÀÌ¿ëÇϱâ À§Çؼ´Â ThreadÀÇ ±¸Çöü°¡ ÇÊ¿äÇÏ´Ù.
¸®´ª½º¿¡¼´Â pthread¶ó´Â thread ±¸Çö ¶óÀ̺귯¸®°¡ »ç¿ëµÇ°í ÀÖ´Ù. pthread´Â POSIX thread ÀÇ ÁÙÀÓ¸»·Î POSIX Ç¥ÁØÀ» µû¸£°í ÀÖ´Ù. pthread´Â ¸®´ª½º »Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ °ÅÀÇ ´ëºÎºÐÀÇ À¯´Ð½º¿¡¼µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. À̿ܿ¡µµ BSD °è¿¿¡¼ »ç¿ëÇÏ´Â 'Light Weight Kernel Threads , Apple ¿¡¼ »ç¿ëÇÏ´Â Multiprocessing ServicesµîÀÇ ±¸Çöü°¡ ÀÖ´Ù. ÀÌ ¹®¼´Â pthread±¸Çö¸¸À» ¼³¸íÇϵµ·Ï ÇÒ °ÍÀÌ´Ù.
pthread´Â ¸®´ª½º ¿î¿µÃ¼Á¦¿¡¼ Á¦°øÇÏ´Â thread ¸¦ Á¦¾îÇϱâ À§ÇÑ ÇÔ¼öµéÀ» ¸ð¾Æ ³õÀº C ¶óÀ̺귯¸®·Î, ´ÙÀ½°ú °°Àº ±â´ÉÀÇ ÇÔ¼ö±ºÀ» Á¦°øÇÑ´Ù.
1.4 Multi Thread ÇÁ·Î±×·¥
º´·Ä·Î ÀÛµ¿ÇÏÁö ¾Ê´Â ÇϳªÀÇ ¹®¸ÆÈ帧¸¸À» °¡Áö´Â ÇÁ·Î±×·¥À» ´ÜÀÏ ¾²·¹µå ÇÁ·Î±×·¥À̶ó°í ÇÑ´Ù. ¹Ý´ë·Î ¾Æ·¡¿Í °°ÀÌ ¹®¸ÆÀÌ ³ª´µ¾î¼, µ¿½Ã¿¡ µÎ°³ ÀÌ»óÀÇ ¾²·¹µå°¡ ½ÇÇàµÇ¸é, À̸¦ ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥'''À̶ó°í ÇÑ´Ù.
1.5 Process, Kernel Thread, User Thread
ÇÁ·Î¼¼½º´Â °¡Àå ¹«°Å¿î Ä¿³ÎÀÇ ½ºÄÉÁ층 ´ÜÀ§ÀÌ´Ù. ÇÁ·Î¼¼½º´Â ¿î¿µÃ¼Á¦¿¡°Ô ÇÒ´ç¹ÞÀº ÀÚ¿øµé - ÆÄÀÏ Çڵ鷯,¼ÒÄÏ,ÀåÄ¡ Çڵ鷯 - À» ÇÒ´ç¹Þ°Ô µÈ´Ù. ÇÁ·Î¼¼½º´Â µ¶¸³µÈ ´ÜÀ§·Î½á ÆÄÀÏÀ̳ª ÁÖ¼Ò¿µ¿ª µîÀ» °øÀ¯ÇÏÁö ¾Ê´Â´Ù.
kernel thread´Â °¡Àå °¡º¿î Ä¿³Î ½ºÄÉÁ층 ´ÜÀ§´Ù. ÇϳªÀÇ ÇÁ·Î¼¼½º´Â Àû¾îµµ ÇϳªÀÇ Ä¿³Î ¾²·¹µå¸¦ °¡Áö°Ô µÈ´Ù. ¸¸¾à¿¡ ÇÁ·Î¼¼½º°¡ ÇϳªÀÌ»óÀÇ ¾²·¹µå¸¦ °¡Áö°í ÀÖ´Ù¸é, ÀÌµé ¾²·¹µå´Â °°Àº ¸Þ¸ð¸®¿Í ÆÄÀÏÀÚ¿øµîÀ» °øÀ¯ÇÏ°Ô µÈ´Ù. ¸¸¾à Ä¿³ÎÀÇ ÇÁ·Î¼¼½º ½ºÄÉÁì·¯°¡ ¼±Á¡ÇüÀ̶ó¸é ¾²·¹µåÀÇ ½ºÄÉÁì·¯µµ ¼±Á¡ÇüÀÎ °æ¿ì°¡ ¸¹´Ù. Âü°í»ï¾Æ¼ ¼±Á¡Çü°ú ºñ¼±Á¡Çü¿¡ ´ëÇØ¼ °£·«ÇÏ°Ô ¼³¸íÇϵµ·Ï ÇϰڴÙ.
¶§¶§·Î ¾²·¹µå°¡ À¯Àú¿µ¿ª ¶óÀ̺귯¸®·Î ±¸ÇöµÇ´Â °æ¿ì°¡ Àִµ¥, À̸¦ user Thread ¶ó°í ºÎ¸¥´Ù. 1.6 ¾²·¹µåÀÇ »ý¼º°ú Á¾·á
¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥À̶ó°í ÇÏ´õ¶óµµ, óÀ½ ½ÃÀ۵ǾúÀ» ¶§´Â main()¿¡¼ ½ÃÀ۵Ǵ ´ÜÀÏ ¾²·¹µå »óÅ·ΠÀÛµ¿ÀÌ µÈ´Ù. ÀÌ »óÅ¿¡¼ pthread_create(3) ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î½á, »õ·Î¿î ¾²·¹µå¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. pthread_create¸¦ ÀÌ¿ëÇØ¼ »ý¼ºµÈ »õ·Î¿î ¾²·¹µå¸¦ worker ¾²·¹µå¶ó°í ÇÏÀÚ.
¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº È帧À» °¡Áø´Ù.
»ý¼ºµÈ worker thread´Â ¾ðÁ¨°¡ Á¾·á°¡ µÉ °ÍÀÌ´Ù. Master Thread (ÀÌÇÏ ºÎ¸ð ¾²·¹µå)´Â pthread_join()À» ÀÌ¿ëÇØ¼ worker threadµéÀÇ Á¾·á¸¦ ±â´Ù¸°´Ù. pthread_join()´Â Á¾·áµÈ worker threadÀÇ ÀÚ¿øÀ» Á¤¸®ÇÏ´Â ÀÏÀ» ÇÑ´Ù. fork()¸¦ ÀÌ¿ëÇÑ ¸ÖƼ ÇÁ·Î¼¼½º ÇÁ·Î±×·¥¿¡¼, ºÎ¸ð ÇÁ·Î¼¼½º°¡ wait()¸¦ ÀÌ¿ëÇØ¼ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ±â´Ù¸®´Â °Í°ú °°Àº ÀÌÀ¯¶ó°í º¸¸é µÈ´Ù. 1.6.1 pthread_create : ¾²·¹µå »ý¼º
pthread_create(3)ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é »õ·Î¿î ¾²·¹µå¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù. #include <pthread.h>
int pthread_create(pthread_t * thread, pthread_attr_t *attr,
void * (*start_routine)(void *), void * arg);
1.6.2 pthread_join : ¾²·¹µå Á¤¸®
¾²·¹µå°¡ ½ÇÇà½ÃŰ´Â °ÍÀº ÇÔ¼ö ÀÌ´Ù. ±×·¯¹Ç·Î returnÀ̳ª exit(0)µîÀ» ÀÌ¿ëÇØ¼ ¾²·¹µå¸¦ Á¾·á½Ãų ¼ö ÀÖ°Ô µÈ´Ù. ±×·¯³ª ¾²·¹µå ÇÔ¼ö°¡ Á¾·áµÇ¾ú´Ù°í ÇØ¼ °ð¹Ù·Î ¾²·¹µåÀÇ ¸ðµçÀÚ¿øÀÌ Á¾·áµÇÁö ¾Ê´Â´Ù. fork()±â¹ÝÀÇ ¸ÖƼÇÁ·Î¼¼½º ÇÁ·Î±×·¥¿¡¼ Á¾·áµÈ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ Á¤¸®Çϱâ À§Çؼ wait()·Î ±â´Ù¸®µíÀÌ, Á¾·áµÈ ¾²·¹µå¸¦ ±â´Ù·Á¼ Á¤¸®¸¦ ÇØÁÖ¾î¾Æ¸¸ ÇÑ´Ù. ±×·¸Áö ¾ÊÀ» °æ¿ì ¾²·¹µåÀÇ ÀÚ¿øÀÌ µÇµ¹·ÁÁöÁö ¾Ê¾Æ¼ ¸Þ¸ð¸® ´©¼öÇö»óÀÌ ¹ß»ýÇÏ°Ô µÈ´Ù.
pthread_create()·Î »ý¼º½ÃŲ ¾²·¹µå´Â pthread_join()À» ÅëÇØ¼ ±â´Ù¸®¸é µÈ´Ù. pthread_join ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù. #include <pthread.h> int pthread_join(pthread_t th, void **thread_return);
1.6.3 ¾²·¹µå »ý¼º ¿¹Á¦
pthread_create¿Í pthread_joinÀ» ¾Ë°í ÀÖ´Ù¸é, ÀÌÁ¦ thread¸¦ »ý¼º½Ãų ¼ö ÀÖ´Ù. #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> // ¾²·¹µå ÇÔ¼ö void *t_function(void *data) { int id; int i = 0; id = *((int *)data); while(1) { printf("%d : %d\n", id, i); i++; sleep(1); } } int main() { pthread_t p_thread[2]; int thr_id; int status; int a = 1; int b = 2; // ¾²·¹µå »ý¼º ¾Æ±Ô¸ÕÆ®·Î 1 À» ³Ñ±ä´Ù. thr_id = pthread_create(&p_thread[0], NULL, t_function, (void *)&a); if (thr_id < 0) { perror("thread create error : "); exit(0); } // ¾²·¹µå »ý¼º ¾Æ±Ô¸ÕÆ®·Î 2 ¸¦ ³Ñ±ä´Ù. thr_id = pthread_create(&p_thread[1], NULL, t_function, (void *)&b); if (thr_id < 0) { perror("thread create error : "); exit(0); } // ¾²·¹µå Á¾·á¸¦ ±â´Ù¸°´Ù. pthread_join(p_thread[0], (void **)&status); pthread_join(p_thread[1], (void **)&status); return 0; }¾ÆÁÖ ÀüÇüÀûÀÎ ÇÁ·Î±×·¥À̱ä ÇÏÁö¸¸ pthread_joinºÎºÐ¿¡ ¹®Á¦°¡ ÀÖ´Ù. pthread_joinÀº ¾²·¹µå°¡ Á¾·áµÉ ¶§±îÁö ºí·°µÇ±â ¶§¹®ÀÌ´Ù. ÀÌ·¡¼´Â ¾²·¹µå¸¦ µÎ°³ÀÌ»ó »ý¼º½ÃŰÁö ¸øÇÒ °ÍÀÌ´Ù. ±×·¸´Ù°í pthread_joinÀ» ÀÌ¿ëÇÏÁö ¾Ê´Â´Ù¸é, ¸Þ¸ð¸® ´©¼ö°¡ »ý±â°Ô µÇ´Ï, »ý·«ÇÒ ¼öµµ ¾ø´Â ³ë¸©ÀÌ´Ù. 1.6.4 Àڽľ²·¹µå¸¦ ºÎ¸ð¾²·¹µå·Î ºÎÅÍ ºÐ¸®Çϱâ
pthread_joinÀÇ »ç¿ëÀ¸·Î ¹ß»ýÇÒ ¼ö ÀÖ´Â ¹®Á¦Á¡À» ÇØ°áÇϱâ À§ÇÑ, °¡Àå ÁÁÀº ¹æ¹ýÁßÀÇ Çϳª´Â pthread_detach ¸¦ ÀÌ¿ëÇØ¼, ÀÚ½Ä ¾²·¹µå¸¦ ºÎ¸ð¾²·¹µå¿Í ¿ÏÀüÈ÷ ºÐ¸®ÇØ ¹ö¸®´Â ¹æ¹ýÀÌ´Ù. ÀÌ °æ¿ì ÀÚ½Ä ¾²·¹µå°¡ Á¾·áµÇ¸é, ¸ðµç ÀÚ¿øÀÌ Áï½Ã ¹ÝȯµÈ´Ù. ¹Ý¸é, ÀÚ½Ä ¾²·¹µåÀÇ Á¾·á»óŸ¦ ¾Ë ¼ö ¾ø´Ù´Â ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. ´ë°ÔÀÇ °æ¿ì ÀÚ½Ä ¾²·¹µåÀÇ Á¾·á»óŰ¡ Áß¿äÇÑ ¹®Á¦°¡ µÇÁö´Â ¾ÊÀ» °ÍÀÌ´Ù.
¸¸¾à ÀÚ½Ä ¾²·¹µåÀÇ Á¾·á»óŸ¦ ¾Ë¾Æ³»´Â°Ô Áß¿äÇÏ´Ù¸é, Á¾·á»óŸ¦ ÀúÀåÇÒ Àü¿ªº¯¼ö¸¦ µÎ°í, ¿©±â¿¡ Á¾·á»óŸ¦ ±â·ÏÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÚ½Ä ¾²·¹µå°¡ Á¾·áÇÒ¶§, º¯¼öÀÇ °ªÀ» ¹Ù²Ù°í, ºÎ¸ð¾²·¹µå¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇÏ´Â ¹æ¹ýÀÌ´Ù. ÀÌ ¹æ¹ýÀº ÀÌ ¹®¼ÀÇ µÚ¿¡¼ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ. #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> // ¾²·¹µå ÇÔ¼ö // 1Ãʸ¦ ±â´Ù¸°ÈÄ ¾Æ±Ô¸ÕÆ®^2 À» ¸®ÅÏÇÑ´Ù. void *t_function(void *data) { char a[100000]; int num = *((int *)data); printf("Thread Start\n"); sleep(5); printf("Thread end\n"); } int main() { pthread_t p_thread; int thr_id; int status; int a = 100; printf("Before Thread\n"); thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a); if (thr_id < 0) { perror("thread create error : "); exit(0); } // ½Äº°¹øÈ£ p_thread ¸¦ °¡Áö´Â ¾²·¹µå¸¦ detach // ½ÃÄÑÁØ´Ù. pthread_detach(p_thread); pause(); return 0; } 1.7 ¾²·¹µå µ¿±âÈ
ÀÌÁ¦ ¿ì¸®´Â °£´ÜÇÑ ´ÙÁß¾²·¹µå ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ°Ô µÇ¾ú´Ù. ±×·¯³ª ÀÌµé ¾²·¹µå »ý¼º ÇÔ¼ö¸¸ °¡Áö°í´Â º¹ÀâÇÑ ¾²·¹µå ÇÁ·Î±×·¥À» ¸¸µé ¼ö°¡ ¾ø´Ù. ¾²·¹µå°£ µ¿±âȶó°í ÇÏ´Â ¹®Á¦°¡ ³õ¿©Àֱ⠶§¹®ÀÌ´Ù. ¾ÆÁÖ °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ ¾Æ´ÑÇÑÀº ¹Ýµå½Ã µ¿±âȹ®Á¦¸¦ °í¹ÎÇØ¾ß¸¸ÇÑ´Ù.
µ¿±âȶõ ¿©·¯°¡Áö Àǹ̷Π»ç¿ëµÉ ¼ö Àִµ¥, ÀÌ °æ¿ì¿¡ ÀÖ¾î¼ µ¿±âÈ´Â ¼·ÎÀÇ ½Ã°£À» ¸ÂÃá´Ù¸¦ ÀǹÌÇÑ´Ù. ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¥Àº ÇϳªÀÇ ½Ã°£¿¡ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ µ¹¾Æ°¡´Â ÇüŸ¦ ÃëÇÑ´Ù. ¶ÇÇÑ ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¥Àº ÀÚ¿øÀÇ »ó´çºÎºÐÀ» ¼·Î °øÀ¯ÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ¸¸¾à ´ÜÁö ÀÚ¿øÀ» ÀоîµéÀÌ´Â °Å¶ó¸é »ó°ü¾øÁö¸¸ Àаí/¾²´Â °ÍÀ̶ó¸é µ¿±âÈ¿Í °ü·ÃµÈ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.
¿¹ÄÁµ¥ ´ÙÀ½°ú °°Àº °æ¿ì´Ù.
1.8 Á¢±ÙÁ¦¾î
µ¿±âÈ ¹®Á¦´Â Çö½Ç¼¼°è¿¡¼µµ ÀÚÁÖ ¹ß»ýÇÑ´Ù. ÈÀå½ÇÀ» »ý°¢ÇÏ¸é µÈ´Ù. ÈÀå½ÇÀº °øÀ¯ÀÚ¿øÀ̸ç, ¿©·¯¸íÀÌ »ç¿ëÇÑ´Ù. ´©±º°¡ ÈÀå½ÇÀ» »ç¿ëÇϰí ÀÖ´Ù¸é, ´Ù¸¥ »ç¶÷Àº ÈÀå½ÇÀ» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù. ÀÌ ¹®Á¦¸¦ ¿ì¸®´Â Á¢±ÙÀ» Á¦¾îÇÏ´Â ¹æ½ÄÀ¸·Î ÇØ°áÇÑ´Ù. ¹®À» °É¾î Àá±Å¼ Çѹø¿¡ ÇÑ»ç¶÷¸¸ ÈÀå½Ç¿¡ µé¾î°¡µµ·Ï ÇÏ´Â ¹æ¹ýÀÌ´Ù. ¸Å¿ì ÀÌÇØÇϱ⠽¬¿î ¹æ½ÄÀÌ´Ù.
´ÙÁß¾²·¹µå ÇÁ·Î±×·¥¿¡¼µµ ¸¶Âù°¡Áö·Î Á¢±ÙÁ¦¾î¸¦ ÀÌ¿ëÇØ¼ ÀÌ ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. À̸¦ À§Çؼ pthread´Â mutex¶ó´Â Àá±Ý ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÑ´Ù. 1.8.1 mutex Àá±Ý
µ¿½Ã¿¡ ¿©·¯°³ÀÇ ¾²·¹µå°¡ ÇϳªÀÇ ÀÚ¿ø¿¡ Á¢±ÙÇÏ·Á°í ÇÒ¶§ ¹ß»ýÇÏ´Â ¹®Á¦¸¦ pthread´Â ÀӰ迵¿ªÀ» µÎ´Â °ÍÀ¸·Î ÇØ°áÇϰí ÀÖ´Ù. ÀӰ迵¿ª¾È¿¡´Â Á¢±ÙÇϰíÀÚ ÇÏ´Â ÀÚ¿øÀÌ ³õ¿©ÀÖ°í, ¿ÀÁ÷ ÇϳªÀÇ ¾²·¹µå¸¸ ÀӰ迵¿ª¾ÈÀ¸·Î ÁøÀÔÇÒ ¼ö ÀÖµµ·Ï Á¦ÇÑÇÑ´Ù. pthread´Â À̸¦ À§Çؼ mutex¸¦ Á¦°øÇÑ´Ù. mutex´Â ±× ÀÚü°¡ °¡Áö´Â Àá±ÝÀÇ Æ¯¼º ¶§¹®¿¡ mutex Àá±ÝÀ̶ó°í ºÒ¸®¿öÁö±âµµ ÇÑ´Ù.
À§ ±×¸²Àº mutex°¡ ÀÛµ¿ÇÏ´Â ¹æ½ÄÀ» º¸¿©ÁØ´Ù. thread 1ÀÌ ÀÚ¿ø¿¡ Á¢±ÙÇϸé mutex Àá±ÝÀ» ¾ò°Ô µÈ´Ù. ÀÌ Àá±ÝÀº ´ÜÁö Çϳª¸¸ Á¸ÀçÇϱ⠶§¹®¿¡ thread 2´Â Àá±ÝÀ» ¾òÁö ¸øÇϰí ÀӰ迵¿ª ¹Û¿¡¼ ´ë±âÇÏ°Ô µÈ´Ù. thread 1ÀÌ ÀÚ¿øÀ» ¸ðµÎ »ç¿ëÇϰí ÀӰ迵¿ªÀ» ¹þ¾î³ª¸é thread 2´Â Àá±ÝÀ» ¾ò°Ô µÇ°í ÀӰ迵¿ª¿¡ ÁøÀÔÇØ¼ ÀÚ¿øÀ» »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. 1.8.2 mutexÀÇ »ç¿ë
mutex¸¦ »ç¿ëÇϱâ À§Çؼ´Â ´ÙÀ½ÀÇ 4°¡Áö ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù.
1.8.3 pthread_mutex_init
mutex¸¦ »ç¿ëÇϱâ À§Çؼ´Â ¸ÕÀú pthread_mutex_init() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼, mutex Àá±Ý °´Ã¼¸¦ ¸¸µé¾îÁà¾ß ÇÑ´Ù. pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr *attr);ÀÌ ÇÔ¼ö´Â µÎ°³ÀÇ ÀÎÀÚ¸¦ ÇÊ¿ä·Î ÇÑ´Ù.
1.8.4 pthread_mutex_lock
mutex Àá±ÝÀ» ¾ò±â À§ÇÑ ÇÔ¼ö´Ù. int pthread_mutex_lock(pthread_mutex_t *mutex);mutex Àá±ÝÀ» ¾ò´Â´Ù¶ó´Â Ç¥Çöº¸´Ù´Â mutex Àá±ÝÀ» ¿äûÇÑ´Ù¶ó´Â Ç¥ÇöÀÌ ´õ Á¤È®ÇÒ °Í °°´Ù. ¸¸¾à mutex Àá±ÝÀ» ¼±Á¡ÇÑ ¾²·¹µå°¡ ÀÖ´Ù¸é, ¼±Á¡ÇÑ ¾²·¹µå°¡ mutex Àá±ÝÀ» µÇµ¹·ÁÁÖ±â Àü±îÁö ÀÌ Äڵ忡¼ ´ë±âÇÏ°Ô µÈ´Ù.
¶§¶§·Î Àá±ÝÀ» ¾òÀ» ¼ö ÀÖ´ÂÁö¸¸ üũÇÏ°í ´ë±â(ºí·°)µÇÁö ¾ÊÀº »óÅ·Π´ÙÀ½ ÄÚµå·Î ³Ñ¾î°¡¾ßÇÒ Çʿ䰡 ÀÖÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ °æ¿ì¿¡´Â ¾Æ·¡ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù. int pthread_mutex_trylock(pthread_mutex_t *mutex); 1.8.5 pthread_mutex_unlock
mutex Àá±ÝÀ» µÇµ¹·ÁÁÖ´Â ÇÔ¼ö´Ù. int pthread_mutex_unlock(pthread_mutex_t *mutex); 1.8.6 mutex Àá±Ý ¿¹Á¦
count ÇÁ·Î±×·¥À» ¿¹Á¦·Î ÇÒ °ÍÀÌ´Ù. ÀӰ迵¿ª¾È¿¡¼ º¸È£µÇ¾î¾ßÇÒ ÀÚ¿øÀº countÀ̰í, ¿©·¯°³ÀÇ ¾²·¹µå°¡ count¿¡ Á¢±ÙÇØ¼ +1À» ½ÃµµÇÏ·Á°í ÇÑ´Ù. À̶§ Á¦´ë·ÎµÈ count¸¦ À§Çؼ´Â Çѹø¿¡ ÇϳªÀÇ ¾²·¹µå¸¸ÀÌ countingÀ» Çϵµ·Ï ÇØ¾ßÇÒ °ÍÀÌ´Ù. mutex¸¦ ÀÌ¿ëÇØ¼ ÀӰ迵¿ªÀ» º¸È£Çϵµ·Ï ÇÒ °ÍÀÌ´Ù.
ÀӰ迵¿ªÀ» º¸È£ÇÏÁö ¾ÊÀ» °æ¿ì ´ÙÀ½°ú °°Àº ¹®Á¦°¡ ¹ß»ýÇÒ ¼öµµ ÀÖÀ» °ÍÀ» ¿¹»óÇÒ ¼ö ÀÖ´Ù. int a = 1;
Thread A ¿¡¼ a¸¦ ÀоîµéÀδÙ.
Thread B ¿¡¼ a¸¦ ÀоîµéÀδÙ.
Thread A ¿¡¼ a = a+1¸¦ ÇÑ´Ù.
{
a = a+1;
°á°ú´Â 2;
}
Thread B ¿¡¼ a++¸¦ ÇÑ´Ù.
{
a = a + 1; // ÀоîµéÀÎ °ªÀÌ 1À̱⠶§¹®¿¡
¿ª½Ã °á°ú´Â 2°¡ µÈ´Ù.
}
µÎ¹øÀÇ count°¡ ¹ß»ýÇ߱⠶§¹®¿¡ 3À̵Ǿî¾ß ÇϰÚÁö¸¸ ÀӰ迵¿ªÀÌ º¸È£µÇÁö ¾ÊÀ½À¸·Î½á 2°¡ µÇ¾î ¹ö·È´Ù.
mutex´Â ÀӰ迵¿ªÀ» Àá±ÝÀ¸·Î¼ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ´Â ÀӰ迵¿ª¿¡ ´ÜÁö ÇϳªÀÇ ¾²·¹µå¸¸ Á¢±ÙÇÏ´Â°É º¸ÀåÇØÁà¾ß ÇÒ °ÍÀÌ´Ù. mutex´Â ¾Æ·¡ÀÇ ¿ä¼ÒµéÀ» º¸ÀåÇÔÀ¸·Î½á À̸¦ º¸ÀåÇÑ´Ù.
´ÙÀ½Àº mutex¸¦ »ç¿ëÇÑ count ¿¹Á¦ÇÁ·Î±×·¥ÀÌ´Ù. 001 #include <stdio.h> 002 #include <unistd.h> 003 #include <pthread.h> 004 005 int ncount; // ¾²·¹µå°£ °øÀ¯µÇ´Â ÀÚ¿ø 006 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // ¾²·¹µå ÃʱâÈ 007 008 // ¾²·¹µå ÇÔ ¼ö 1 009 void* do_loop(void *data) 010 { 011 int i; 012 013 pthread_mutex_lock(&mutex); // Àá±ÝÀ» »ý¼ºÇÑ´Ù. 014 for (i = 0; i < 10; i++) 015 { 016 printf("loop1 : %d", ncount); 017 ncount ++; 018 sleep(1); 019 } 020 pthread_mutex_unlock(&mutex); // Àá±ÝÀ» ÇØÁ¦ÇÑ´Ù. 021 } 022 023 // ¾²·¹µå ÇÔ¼ö 2 024 void* do_loop2(void *data) 025 { 026 int i; 027 028 // Àá±ÝÀ» ¾òÀ¸·Á°í ÇÏÁö¸¸ do_loop ¿¡¼ ÀÌ¹Ì Àá±ÝÀ» 029 // ¾ò¾úÀ½À¸·Î Àá±ÝÀÌ ÇØÁ¦µÉ¶§±îÁö ±â´Ù¸°´Ù. 030 pthread_mutex_lock(&mutex); // Àá±ÝÀ» »ý¼ºÇÑ´Ù. 031 for (i = 0; i < 10; i++) 032 { 033 printf("loop2 : %d", ncount); 034 ncount ++; 035 sleep(1); 036 } 037 pthread_mutex_unlock(&mutex); // Àá±ÝÀ» ÇØÁ¦ÇÑ´Ù. 038 } 039 040 int main() 041 { 042 int thr_id; 043 pthread_t p_thread[2]; 044 int status; 045 int a = 1; 046 047 ncount = 0; 048 thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a); 049 sleep(1); 050 thr_id = pthread_create(&p_thread[1], NULL, do_loop2, (void *)&a); 051 052 pthread_join(p_thread[0], (void *) &status); 053 pthread_join(p_thread[1], (void *) &status); 054 055 status = pthread_mutex_destroy(&mutex); 056 printf("code = %d", status); 057 printf("programing is end"); 058 return 0; 059 } 060 1.9 ¾ÕÀ¸·Î ÇÒ °Í
¾²·¹µå´Â ¸Å¿ì ±¤¹üÀ§ÇÑ ÁÖÁ¦·Î ¿©±â¿¡¼´Â ¾²·¹µå¸¦ »ç¿ëÇϱâ À§ÇÑ °¡Àå ±âº»ÀûÀÎ ³»¿ë¸¸ ´Ù·ç¾ú´Ù. ¾²·¹µå¿¡ ´ëÇÑ Á»´õ ÀÚ¼¼ÇÑ ³»¿ëÀº º°µµÀÇ ÀåÀ» ÇÒ¾ÖÇØ¼ ´Ù·ê »ý°¢ÀÌ´Ù.
|
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|