¸®´ª½º ÀÔÃâ·Â ¸ðµ¨
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.


Linux I/O ¸ðµ¨

Linux I/O ¸ðµ¨

À± »ó¹è

dreamyun@yahoo.co.kr



1절. ¼Ò°³

Áö³­¹ø¿¡ À̾ Linux I/O ¸ðµ¨ÀÇ 2¹øÂ° ¹®¼­ÀÌ´Ù. À̹ø ¹®¼­¿¡¼­´Â ¸®´ª½º ÀÔÃâ·Â ¸ðµ¨Áß I/O Multiplexing (ÀÌÇÏ ÀÔÃâ·Â´ÙÁßÈ­)¿Í signal driven I/O ¿¡ ´ëÇØ¼­ ¾Ë¾Æº¼°ÍÀÌ´Ù.


2절. ÀÔÃâ·Â ´ÙÁßÈ­

Áö³­¹øÀÇ ºÀ¼â/ºñºÀ¼â ¸ðµ¨¿¡¼­ ¿ì¸®´Â ÀÔ·ÂÀ̳ª Ãâ·ÂÀÌ ´ÜÀÏÇѰæ¿ì¿¡ ´ëÇØ¼­¸¸ ´Ù·ç¾ú´Ù. Áï 2°³³ª ±×ÀÌ»óÀÇ ÆÄÀÏ·Î ºÎÅÍ µ¿½Ã¿¡ Àаųª, ȤÀº ¿©·¯°³ÀÇ ¼ÒÄÏÁöÁ¤¹øÈ£·Î ºÎÅÍ µ¥ÀÌŸ¸¦ Àоî¾ß ÇÒ°æ¿ì¿¡ ´ëÇØ¼­´Â ´Ù·çÁö ¾Ê¾Ò´Ù. ±×·¯³ª ÇÁ·Î±×·¡¹ÖÀ» ÇÒ¶§ ¿©·¯°³ÀÇ ÀÔÃâ·ÂÀ» µ¿½Ã¿¡ ´Ù·ç¾î¾ß ÇÏ´Â °æ¿ì°¡ »ý±ä´Ù.


2.1절. ÀÔÃâ·Â ´ÙÁßÈ­°¡ ¿Ö ÇÊ¿äÇѰ¡

¿ì¸®°¡ ÀϹÝÀûÀÎ ÆÄÀÏÀ» ´Ù·ç´Â ÇÁ·Î±×·¡¹ÖÀ» ÇÒ°æ¿ì¿¡´Â º¸Åë ´ÜÁö Çѹø¿¡ ÇϳªÀÇ ÆÄÀϸ¸À» ´Ù·ç°Ô µÈ´Ù. ±×·¯³ª ³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀ̳ª Interactive ÇÑ ÇÁ·Î±×·¥À» ¸¸µé°æ¿ì¿¡´Â µ¿½Ã¿¡ ¿©·¯°³ÀÇ ÀÔ·ÂÀ» ó¸®ÇؾßÇÏ´Â °æ¿ì°¡ ¹ß»ýÇÑ´Ù. ³×Æ®¿÷ ¼­¹öÀÇ °æ¿ì¿¡´Â º¸Åë ¿©·¯°³ÀÇ Å¬¶óÀÌ¾ðÆ® ¿¬°áÀ» µ¿½Ã¿¡ ó¸®ÇØ¾ß ÇϹǷΠ¿©·¯°³ÀÇ ÀÔ·ÂÀ» ó¸®ÇÏ´Â °ÍÀº ¸Å¿ì ÀϹÝÀûÀÎ »óȲÀÌ´Ù. ¶ÇÇÑ »óÈ£´ëÈ­ ÇØ¾ß ÇÏ´Â ÇÁ·Î±×·¥ÀÇ ¿¹¸¦µé¼ö ÀÖ´Ù. Áï È­¸é¿¡ ¾î¶² µ¥ÀÌŸ¸¦ Ãâ·ÂÇϸ鼭 µ¿½Ã¿¡ ÀÔ·ÂÀ» ±â´Ù·Á¾ß ÇÏ´Â °æ¿ì¿¡µµ ¿ª½Ã µ¿½Ã¿¡ 2°³ ÀÌ»óÀÇ ÀÔÃâ·ÂÀ» ´Ù·ê¼ö ÀÖ¾î¾ß ÇÑ´Ù.

¿©·¯ºÐÀº ¶ÇÇÑ ÇϳªÀÇ Æ÷Æ®¿¡ ´ëÇÏ¿© tcp¿Í udp ¸¦ µ¿½Ã¿¡ Áö¿øÇÏ´Â ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥À» º»ÀûÀÌ ÀÖÀ»°ÍÀε¥, ÀÌ·²¶§µµ ¿ª½Ã ÀÔÃâ·Â ´ÙÁßÈ­¸¦ ÀÌ¿ëÇØ¼­ ½±°Ô ±¸ÇöÀÌ °¡´ÉÇÒ°ÍÀÌ´Ù.


2.2절. ÀÌÀü¿¡ ¹è¿ü´ø ºÀ¼â/ºñºÀ¼â·Î ÀÔÃâ·Â ´ÙÁßÈ­¸¦ ±¸ÇöÇÒ¼ö Àִ°¡?

°á·ÐÀûÀ¸·Î ¸»ÇÏÀÚ¸é ºÀ¼â ¸ðµ¨·Î´Â ºÒ°¡´ÉÇϸç, ºñºÀ¼â ¸ðµ¨·Î´Â °¡´ÉÇÏ´Ù.

ºñºÀ¼â ¸ðµ¨·Î ÇÒ°æ¿ì´Â °¡´ÉÇÒ°ÍÀÌ´Ù. ¿©·¯°³ÀÇ ÆÄÀÏÀ» open ÇÑ´ÙÀ½¿¡ ·çÇÁ¸¦ µ¹¸é¼­ ÀÔ·ÂÀ» °Ë»çÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù. ´ÙÀ½Àº ´ë·«ÀûÀÎ È帧µµÀÌ´Ù.

fd1 = open("file1", O_NONBLOCK);
fd2 = open("file2", O_NONBLOCK);

while(1)
{
    read(fd1, buf1, 255);	
	¸¸¾à (fd1 ¿¡ ÀÐÀ» µ¥ÀÌŸ°¡ ÁغñµÇ¾î ÀÖ´Ù¸é)
    {
        µ¥ÀÌŸ¸¦ Àо ÀÛ¾÷À» ÇÑ´Ù. 
    } 
    ±×·¸Áö ¾Ê´Ù¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù.

    read(fd2, buf2, 255);	
	¸¸¾à (fd2 ¿¡ ÀÐÀ» µ¥ÀÌŸ°¡ ÁغñµÇ¾î ÀÖ´Ù¸é)
    {
        µ¥ÀÌŸ¸¦ Àо ÀÛ¾÷À» ÇÑ´Ù. 
    } 
    ±×·¸Áö ¾Ê´Ù¸é ¹Ù·Î ¸®ÅÏÇÑ´Ù.
}
			
±×·¯³ª À§ÀÇ ÄÚµå´Â ¿©·¯°¡Áö ¹®Á¦¸¦ °¡Áö°í ÀÖ´Ù. ºñºÀ¼â ¸ðµ¨ÀÚüÀÇ ¹®Á¦Á¡Àε¥, µ¥ÀÌŸ°¡ Áغñ°¡ µÇ¾îÀÖÁö ¾Ê¾ÒÀ½¿¡µµ À̸¦ °Ë»çÇϱâ À§Çؼ­ °è¼Ó ÇØ¼­ loop ¸¦ µ¹¾Æ¾ß ÇϹǷΠ¸Å¿ì ºñÈ¿À²ÀûÀ̰í, ±ò²ûÇÏÁö ¸øÇÑ Äڵ带 »ý»êÇÑ´Ù.


2.3절. ÀÔÃâ·Â ´ÙÁßÈ­ ¸ðµ¨ÀÇ ±¸Çö

¿ì¼±Àº ÀÔÃâ·Â ´ÙÁßÈ­ ¸ðµ¨¿¡ ´ëÇØ¼­ ¼³¸íÇϵµ·Ï ÇϰڴÙ. ´ÙÀ½Àº ÀÔÃâ·Â ´ÙÁßÈ­ ¸ðµ¨À» ¼³¸íÇÑ ±×¸²? ÀÌ´Ù.

     application   

     fd1,fd2,fd3 ...
     select         ----------------------------> no data ready +--+
                                                      |            |
                                                      |            |- ÀÐÀ» µ¥ÀÌŸ°¡ ÀÖ´ÂÁö °Ë»ç
                                                      |            |
                                                      |            |
      return       <---------------------------- data ready     +--+

      read          ----------------------------> data copy  +--+
                                                      |         |
                                                      |         |- data ¸¦ Ä¿³Î¿¡¼­ À¯Àú·Î º¹»ç
                                                      |         |
                                                      |         |
       data         <---------------------------- copy  ¿Ï·á +--+
			
Ä¿³ÎÀº ¿©°Å·¡ÀÇ ÆÄÀÏ Áö½ÃÀÚ fd1, fd2, fd3 ¿¡¼­ µ¥ÀÌŸ°¡ ÀÖ´ÂÁö È®ÀÎÇϸ鼭 ÇØ´ç ¿µ¿ª¿¡¼­ ºÀ¼âµÈ´Ù. ±×·¯´Ù°¡ ¾î´À ÇϳªÀÇ ÆÄÀϵðÁö½ÃÀÚ¿¡ ÀÐÀ» µ¥ÀÌŸ°¡ ÁغñµÈ´Ù¸é °ð¹Ù·Î return µÈ´Ù. ±×·¯¸é »ç¿ëÀÚ´Â ¾î´À ÆÄÀÏ Áö½ÃÀÚ¿¡ ÀÐÀ» µ¥ÀÌŸ°¡ ÀÖ´ÂÁö È®ÀÎÈÄ µ¥ÀÌŸ¸¦ Àоîµé¿©¼­ ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÏ¸é µÈ´Ù.


2.3.1절. select ¿Í poll

¸®´ª½º(Unix Æ÷ÇÔ)¿¡¼­´Â ÀÌ·¯ÇÑ ÀÔÃâ·Â ´ÙÁßÈ­¸¦ À§Çؼ­ select(2) ¿Í poll(2) ÇÔ¼öµéÀ» Á¦°øÇϸç À̵éÀ» ÅëÇØ¼­ ¿©·¯°³ÀÇ ÀÔÃâ·ÂÀ» µ¿½Ã¿¡ ´Ù·ê¼ö ÀÖ´Ù. À̵é select ¿Í poll ÇÔ¼ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº select ¸¦ ÅëÇÑ ÀÔÃâ·Â ´ÙÁßÈ­ ¸¦ Âü°íÇϱ⠹ٶõ´Ù.

°£´ÜÇÑ ¿¹¸¦ Çϳª µé¾îº¸µµ·Ï ÇϰڴÙ. ¿ì¸®´Â ÀÌÀü¹®¼­ÀÎ ¸®´ª½º I/O ¸ðµ¨ÀÇ Ã¹¹øÂ° ¿¹Á¦¸¦ ÀÔÃâ·Â ´ÙÁß ¸ðµ¨À» Àû¿ë½ÃŲ ¹öÁ¯À¸·Î º¯°æ½ÃÄÑ º¸µµ·Ï ÇϰڴÙ. ÀÔÃâ·Â ´ÙÁßÈ­ÀÇ ±¸ÇöÀ» À§Çؼ­ select ¸¦ »ç¿ëÇϵµ·Ï ÇÒ°ÍÀÌ´Ù.

¿¹Á¦ : multiplex_test.c

#include <sys/types.h>
#include <sys/time.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    int fd;
    int i = 0;
    char buf[80];
    fd_set readfds;
    int state;

    struct timeval limit_time;

    fd = 0;
    if (fd < 0)
    {
        perror("open error ");
        exit(0);
    }

    printf("q ¸¦ ÀÔ·ÂÇϸé ÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù\n");
    while(1)
    {
        
        FD_ZERO(&readfds);
        FD_SET(fd, &readfds);
        memset(buf, 0x00, 80);
        
        // polling ŸÀÓÀ» 1ÃÊ·Î ÇÑ´Ù.
        limit_time.tv_sec = 1;
        limit_time.tv_usec = 10;

        // 1Ãʸ¦ ±â´Ù¸°´Ù. 
        // ¸¸¾à 1ÃÊ ³»¿¡ Űº¸µå·Î ºÎÅÍ ÀÔ·ÂÀÌ ÀÖ´Ù¸é, 0º¸´Ù Å«¼ýÀÚ°¡ ¹ÝȯµÉ°ÍÀÌ´Ù. 
        // 1Ãʳ»¿¡ ¾î¶°ÇÑ Å°º¸µå ÀԷµµ ¾ø´Ù¸é, 0ÀÌ ¸®ÅϵɰÍÀÌ´Ù. 
        state = select(fd+1, &readfds, (fd_set *)0, (fd_set *)0, &limit_time);
        switch(state)
        {
            case -1:
                perror("select error ");
                exit(0);
                break;

            // Űº¸µå ÀÔ·ÂÀÌ ¾øÀ¸¸é ÁÖ¾îÁø ÀÛ¾÷À» ¼öÇàÇÑ´Ù. 
            case 0:
                printf("-->%d\n", i);
                i++;

            // Űº¸µå ÀÔ·ÂÀÌ ÀÖ´Ù¸é, ۰ªÀ» °Ë»çÇØ¼­ 
            // q ¸¦ ÀÔ·ÂÇßÀ»°æ¿ì ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù. 
            default:
                if (FD_ISSET(fd, &readfds))
                {
                    memset(buf, 0x00, 80);
                    read(fd, buf, 80);
                    printf("Űº¸µåÀÔ·Â : %s", buf);
                    if (buf[0] == 'q')
                        exit(0);
                    // ¸¸¾à q ÀÌ¿ÜÀÇ °ªÀ» ÀÔ·ÂÇß´Ù¸é 
					// ±âº»ÀÛ¾÷ÀÎ i++ ÀÛ¾÷À» ¼öÇàÇÑ´Ù. 
                	i++;
                }
        }
    }
}
				
À§ÀÇ ¿¹Á¦ÀÇ °æ¿ì´Â ÀÔÃâ·Â ´ÙÁßÈ­¸¦ À§Çؼ­ °Ë»çÇÏ´Â ÆÄÀÏÁö½ÃÀÚ°¡ ´ÜÁö Çϳª(Ç¥ÁØÀÔ·Â) ÀÌÁö¸¸, readfds ¿¡ °Ë»çÇÒ ÆÄÀÏÁö½ÃÀÚ¸¦ ÃæºÐÇÑ ¼ýÀÚ·Î ÁöÁ¤°¡´ÉÇϱ⶧¹®¿¡(º¸Åë 1024 °³±îÁö) ¾à°£¸¸ ¼öÁ¤ÇÏ¸é ´Ù¸¥ ¿µ¿ª¿¡µµ ÀÀ¿ë ÀÌ °¡´ÉÇÒ°ÍÀÌ´Ù.

±×·¯³ª ¹¹´Ï¹¹´Ï ÇØµµ ¿ª½Ã ÀÔÃâ·Â ´ÙÁßÈ­°¡ °¡Àå ¿ä±äÇÏ°Ô ¾²ÀÌ´Â ºÎºÐÀº ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö ÂÊÀÌ´Ù. ´ëºÎºÐÀÇ ¼­¹ö´Â ´ÙÁßÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ¹Þ¾ÆµéÀ̱â À§Çؼ­ ¿©·¯°³ÀÇ ¼ÒÄÏÀ» »ý¼ºÇϱ⠶§¹®ÀÌ´Ù. ¶ÇÇÑ Å¬¶óÀ̾ðÆ®ÀÇ °æ¿ì¿¡µµ µ¿½Ã¿¡ ¿©·¯°³ÀÇ ¼­¹ö¿¡ ¿¬°áÇϱâ À§Çؼ­ ¿©·¯°³ÀÇ ¼ÒÄÏÀ» ¿­¾î¾ß Çϴ°æ¿ì°¡ Àֱ⠶§¹®ÀÌ´Ù.

ÀÌ ¹®¼­¿¡¼­´Â ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö¿¡¼­ÀÇ ÀÔÃâ·Â ´ÙÁßÈ­ÀÇ ±¸ÇöÀº ¼³¸íÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ÀÌÀ¯´Â ´ÙÁß¿¬°á¼­¹ö ¸¸µé±â (2) ¿Í ´ÙÁß¿¬°á¼­¹ö ¸¸µé±â(3) ¿¡tj ÃæºÐÈ÷ ÀÚ¼¼ÇÏ°Ô ¼³¸íÇϰí Àֱ⠶§¹®ÀÌ´Ù. ³×Æ®¿÷ »ó¿¡¼­ÀÇ ´ÙÁßÀÔÃâ·Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë±â¸¦ ¿øÇÑ´Ù¸é À§ÀÇ ¸µÅ©µÈ ¹®¼­µéÀ» Âü°íÇϱ⠹ٶõ´Ù. °¢°¢ select ¿Í poll À» ÀÌ¿ëÇÑ ÀÔÃâ·Â´ÙÁßÈ­ÀÇ ±¸Çö¹æ¹ý¿¡ ´ëÇØ¼­ ¼³¸íÇϰí ÀÖ´Ù.


3절. °á·Ð

Áö±Ý±îÁö ºÀ¼â, ºñºÀ¼â, ÀÔÃâ·Â ´ÙÁßÈ­ÀÇ 3°¡Áö I/O ¸ðµ¨¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. ¿ø·¡ À̹ø Àå¿¡¼­ Asynchronous(ºñµ¿±â ÀÔÃâ·Â) ¸ðµ¨±îÁö¸¦ ´Ù·ç·Á°í ÇßÀ¸³ª, ±×·¸°Ô ÇÏÁö ¸øÇßÀ½À» ¾çÇØÇØ Áֱ⠹ٶõ´Ù.

ºñµ¿±â ÀÔÃâ·Â¿¡ °üÇÑ ³»¿ëÀº ´ÙÀ½±âȸ¿¡ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ.


Cache Error
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.