£Ò£Ô£Õ¤Î¥ê¥¢¥ë¥¿¥¤¥à³ÈÄ¥¤ÈÊÂÎó½èÍý

£±£¹£¹£¶Ç¯£±£°·î£²£³Æü¡¡Â裴ÈÇ¡¡µ»½ÑÉô

Ìܼ¡

¡ø£±¡¡½é¤á¤Ë ¡ø£²¡¡¥ê¥¢¥ë¥¿¥¤¥à¥·¥¹¥Æ¥à¤Ëµá¤á¤é¤ì¤ëµ¡Ç½ £²¡¥£±¡¡¥×¥ê¥¨¥ó¥×¥·¥ç¥ó £²¡¥£²¡¥£±¡¡³ä¹þ¤ß¤Î±þÅú»þ´Ö¤Èͽ¬À­ £²¡¥£²¡¥£²¡¡³ä¹þ¤ß½èÍý¤Î¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ²½ £²¡¥£²¡¥£³¡¡¥·¥¹¥Æ¥à»ñ¸»À©¸æ £²¡¥£²¡¥£´¡¡¥ê¥¢¥ë¥¿¥¤¥à¡¦¥¹¥ì¡¼¥Ö ¡ø£³¡¡¥ê¥¢¥ë¥¿¥¤¥à¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥° £³¡¥£±¡¡¸ÇÄêÍ¥ÀèÅ٣ƣɣƣϥ¹¥±¥¸¥å¡¼¥ê¥ó¥° £³¡¥£²¡¡¸ÇÄêÍ¥ÀèÅ٥饦¥ó¥É¥í¥Ó¥ó¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥° £³¡¥£³¡¡¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹À©¸æ ¡¡£³¡¥£´¡¡¥¤¥Ù¥ó¥È¶îư·¿¥¹¥±¥¸¥å¡¼¥ê¥ó¥° ¡¡£³¡¥£´¡¥£±¡¡£Á£Ó£Ô¡Ê£Á£ó£ù£î£ã£è£ò£ï£î£ï£õ£ó¡¡£Ó£ù£ó£ô£å£í¡¡£Ô£ò£á£ð£ó¡Ë ¡¡£³¡¥£´¡¥£²¡¡²¾ÁÛ³ä¹þ¤ßµ¡¹½ ¡¡£³¡¥£µ¡¡¥¿¥¤¥Þ³ä¹þ¤ß¤Ë¤è¤ëÄê¼þ´ü¥¹¥±¥¸¥å¡¼¥ê¥ó¥° ¡¡£³¡¥£µ¡¥£±¡¡¥¯¥í¥Ã¥¯£Á£Ó£Ô ¡¡£³¡¥£µ¡¥£²¡¡£Æ£á£ó£ô¥¯¥í¥Ã¥¯£Á£Ó£Ô ¡¡£³¡¥£¶¡¡¹âÀºÅÙ¥¿¥¤¥Þ¤È¥µ¡¼¥Ó¥¹ ¡ø£´¡¡¥Õ¥¡¥¤¥ë´ÉÍý £´¡¥£±¡¡Ï¢Â³Îΰè¥Õ¥¡¥¤¥ë £´¡¥£²¡¡È󯱴üÆþ½ÐÎÏ ¡ø£µ¡¡¥á¥â¥ê´ÉÍý¤È¥­¥ã¥Ã¥·¥å £µ¡¥£²¡¡¶¦Í­¥á¥â¥ê £µ¡¥£²¡¥£±¡¡£Ó£Ö£Ò£´Âбþ¤Î¥·¥§¥¢¡¼¥É¥á¥â¥ê £µ¡¥£²¡¥£²¡¡£Ò£Ô£Õ¤Ë¤ª¤±¤ë³ÈÄ¥¥á¥â¥ê ¡¡£µ¡¥£²¡¥£³¡¡¥·¥¹¥Æ¥à £µ¡¥£²¡¥£´¡¡¥¹¥ì¥Ã¥É¤ÎÀÅŪÊÑ¿ô ¡ø£¶¡¡ÊÂÎó½èÍý £¶¡¥£±¡¡¥·¥ó¥á¥È¥ê¥·¥¹¥Æ¥à¥³¡¼¥ë £¶¡¥£²¡¡Â¿½Å¥¹¥ì¥Ã¥É £¶¡¥£²¡¥£±¡¡¥¹¥ì¥Ã¥É¥â¥Ç¥ë £¶¡¥£³¡¡¥¹¥ì¥Ã¥É¤ÎÀ¸À®¡¢µ¯Æ°¡¢½ªÎ» £¶¡¥£´¡¡¥¹¥ì¥Ã¥É¤ÎƱ´ü¤ÈÇÓ¾À©¸æ ¡¡£¶¡¥£´¡¥£±¡¡ÇÓ¾À©¸æÊÑ¿ô¡Ê¥»¥Þ¥Õ¥©¡Ë¤Ë¤è¤ëƱ´ü £¶¡¥£´¡¥£²¡¡¾ò·ïÊÑ¿ô¤Ë¤è¤ëƱ´ü £¶¡¥£µ¡¡¤½¤Î¾¤ÎƱ´ü¼êÃÊ £¶¡¥£µ¡¥£±¡¡·×¿ô·¿ÇÓ¾À©¸æÊÑ¿ô¡Ê¥«¥¦¥ó¥¿¥»¥Þ¥Õ¥©¡Ë £¶¡¥£µ¡¥£²¡¡ÇÓ¾½ñ¹þ¤ß¿½ÅÆÉ¤ß¤À¤· ¡ø£·¡¡¸À¸ì´Ö¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹ ¡ø£¸¡¡ÎãÂê £¸¡¥£±¡¡°ìÄê»þ´Ö£×£Á£É£Ô £¸¡¥£²¡¡¼þ´ü¥¿¥¤¥Þ³ä¹þ¤ß¡Ê¥¯¥í¥Ã¥¯£Á£Ó£Ô¡Ëµ¯Æ° £¸¡¥£³¡¡£Æ£Ï£Ò£Ô£Ò£Á£Î¤È£Ã¤Î´Ö¤Î¶¦Í­¥á¥â¥ê £¸¡¥£´¡¡¥×¥í¥»¥¹¤ÎÄä»ß¤ÈºÆ³« £¸¡¥£µ¡¡¥¿¥¤¥ÞÃͼèÆÀ¤Èµ¯Æ°¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É £¸¡¥£¶¡¡¥×¥í¥»¥¹¤Î¥×¥í¥»¥Ã¥µ¤Ø¤Î³äÉÕ £¸¡¥£·¡¡¥¹¥ì¥Ã¥É¤Ë¤è¤ë¥À¥Ö¥ë¥Ð¥Ã¥Õ¥¡Ë¡¤Î¼Â¸½ ¡ø£¹¡¡¤ª¤ï¤ê¤Ë ¡ø£±£°¡¡»²¹Íʸ¸¥

[back] Back

¡ø£±¡¡½é¤á¤Ë

¡¡¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤Ç½èÍý»þ´Ö¤ËÂФ¹¤ëÍ׵᤬¸·¤·¤¤¾ì¹ç¤Ë¤Ï¡¢½¾Íè¤è¤ê¥¹¡¼¥Ñ¡¼¥ß¥Ë¥³¥ó¥Ô¥å¡¼¥¿¾å¤Ç¤Î¡ÖÊÂÎó½èÍý¡×¤òɬÍפȤ·¤Æ¤­¤Þ¤·¤¿¤¬¡¢¤½¤ì¤ò¼Â¸½¤¹¤ë¥Ï¡¼¥É¥¦¥§¥¢¤È¥½¥Õ¥È¥¦¥§¥¢¤Î¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Ï¥·¥¹¥Æ¥à¸ÇÍ­¤Î¤â¤Î¤Ç¤·¤¿¡£ ¡¡°ìÈÌŪ¤Ë¡¢£Õ£Î£É£Ø¤Ï³ä¹þ¤ß¤ËÂФ¹¤ë±þÅú»þ´Ö¤ä¥³¥ó¥Æ¥­¥¹¥È¡¦¥¹¥¤¥Ã¥Á»þ´Ö¤¬Ä¹¤¹¤®¤ë¤¿¤á¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤Ë¤Ï¸þ¤¤¤Æ¤¤¤Þ¤»¤ó¡£¤È¤³¤í¤¬¡¢£Õ£Î£É£Ø¤ò£Ï£Ó¤È¤·¤Æ¤¤¤ë¥ï¡¼¥¯¥¹¥Æ¡¼¥·¥ç¥ó¤ÎÀ¤³¦¤Ç¤â¡¢¥Ð¡¼¥Á¥ã¥ë¡¦¥ê¥¢¥ê¥Æ¥£¤ä¥Þ¥ë¥Á¥á¥Ç¥£¥¢¥·¥¹¥Æ¥à¡¢¥ª¥ó¥é¥¤¥ó¡¦¥È¥é¥ó¥¶¥¯¥·¥ç¥óÅù¤Ë¤ª¤±¤ë¥ê¥¢¥ë¥¿¥¤¥àµ¡Ç½¤ÎÍ׵᤬¶¯¤¯¤Ê¤Ã¤Æ¤­¤Þ¤·¤¿¡£ ¡¡¹â®¥ê¥¢¥ë¥¿¥¤¥à¥³¥ó¥Ô¥å¡¼¥¿¤ÎÀ¤³¦¤Ç¤â¡¢¹âµ¡Ç½»º¶È¥í¥Ü¥Ã¥È¤ä£Ã£É£Í¡¿£Æ£ÁÅù¤Ë¤ª¤±¤ë¿Í¹©ÃÎǽ±þÍѤä¥Þ¥ó¥Þ¥·¥ó¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Î½¼¼Â¡¢¥Í¥Ã¥È¥ï¡¼¥¯¤Ë¤è¤ë¥¨¥ó¥¸¥Ë¥¢¥ê¥ó¥°¡¦¥ï¡¼¥¯¥¹¥Æ¡¼¥·¥ç¥ó¤È¤ÎÅý¹çÅù¡¢£Õ£Î£É£Ø¤¬ÆÀ°Õ¤È¤¹¤ëµ¡Ç½¤¬µá¤á¤é¤ì¤Æ¤¤¤Þ¤¹¡£ ¡¡¤½¤ì¤Ë²Ã¤¨¡¢¹©¶ÈÍÑɸ½à¥Ð¥¹¤È¤·¤Æ£Ö£Í£Å£â£õ£ó¤¬ÄêÃ夷¤¿¤Î¤Ëȼ¤Ã¤Æ£Ö£Í£Å£â£õ£ó¾å¤Ç¤Î¥ê¥¢¥ë¥¿¥¤¥à¥·¥¹¥Æ¥à¹½ÃÛ¤ËÃå¼ê¤¹¤ë¥Ø¥Ó¡¼¥æ¡¼¥¶¤â¿¤¯¤Ê¤Ã¤Æ¤­¤Þ¤·¤¿¡£¤±¤ì¤É¤â¡¢£Ö£Í£Å¥Ü¡¼¥É¥³¥ó¥Ô¥å¡¼¥¿¤Ç¤Ï¡¢¥·¥ó¥°¥ë¥×¥í¥»¥Ã¥µ¤Ç¤Î¥Ñ¥ï¡¼¤ÎÉÔ­¡¢¥Ð¥¹¾å¤Ç¤ÎÆþ½ÐÎϥܥȥë¥Í¥Ã¥¯¤Ê¤É¤Ë²Ã¤¨¡¢ÀìÍѥꥢ¥ë¥¿¥¤¥à£Ï£Ó¤Ç¤Î¥½¥Õ¥È¥¦¥§¥¢³«È¯¤Î¥³¥¹¥ÈÁýÂç¤Ê¤É¤¬¥·¥¹¥Æ¥à¹½ÃÛ¤ÎÌäÂê¤È¤·¤Æ»Ä¤ê¤Þ¤¹¡£ ¡¡¤³¤Î¤è¤¦¤Ê¡¢»ëÅÀ¤«¤é£Õ£Î£É£Ø¥·¥¹¥Æ¥à¤ò¤È¤é¤¨¤Ê¤ª¤¹¤È¡¢É¸½à£Õ£Î£É£Ø¥·¥¹¥Æ¥à¤Î¥¹¡¼¥Ñ¥»¥Ã¥È¤È¤·¤Æ¤ÎÊÂÎó¥ê¥¢¥ë¥¿¥¤¥à£Õ£Î£É£Ø¥·¥¹¥Æ¥à¤¬Â礭¤Ê°ÕÌ£¤ò¤â¤Ã¤Æ¤­¤Þ¤¹¡£¤½¤ì¤ÏÊÂÎó¥ê¥¢¥ë¥¿¥¤¥à£Õ£Î£É£Ø¤ò³èÍѤ¹¤ì¤Ð¡¢½¾Íè¤Î¥ê¥¢¥ë¥¿¥¤¥à½èÍýʬÌî¤Î¤ß¤Ê¤é¤º¥Ó¥¸¥Í¥¹Ê¬Ìî¤Ë¤ª¤¤¤Æ¤â¤¹¤°¤ì¤¿³«È¯À­¤È¹â¤¤¼Â¹ÔÀ­Ç½¤Ë¤è¤Ã¤ÆÂ礭¤Ê³Î¼Â¤Ê¸ú²Ì¤ò¤¢¤²¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤ë¤«¤é¤Ç¤¹¡£ £Õ£Î£É£Ø¤Ï¡¢£Õ£Ó£Ì¤¬³«È¯¤·¥é¥¤¥»¥ó¥¹¤·¤Æ¤¤¤Þ¤¹ £Ð£Ï£Ó£É£Ø¤Ï¡¢£É£Å£Å£Å¤Î¾¦É¸¤Ç¤¹¡£ £Ò£Ô£Õ¤Ï¥³¥ó¥«¥ì¥ó¥È¤Î¾¦É¸¤Ç¤¹¡£ ¤½¤Î¾¤ÎËܹƤǵ­½Ò¤µ¤ì¤¿³ÆÀ½ÉʤϳƼҤξ¦É¸¤Ç¤¹¡£

¡ø£²¡¡¥ê¥¢¥ë¥¿¥¤¥à¥·¥¹¥Æ¥à¤Ëµá¤á¤é¤ì¤ëµ¡Ç½

¥ê¥¢¥ë¥¿¥¤¥à¥·¥¹¥Æ¥à¤Ë¤Ï¡¢Ëþ¤¿¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤¤¤¯¤Ä¤«¤Î´ðËÜ»ÅÍͤ¬¤¢¤ê¤Þ¤¹¤¬¡¢¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤ò£Õ£Î£É£Ø¤Ç¹Ô¤¦¤Ë¤Ï¡¢¼ï¡¹¤ÎÌäÂ꤬¤¢¤ê¤Þ¤¹¡£ ¥ê¥¢¥ë¥¿¥¤¥à½èÍý¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Í¥ÀèÅ٤ι⤤¥×¥í¥»¥¹¤¬¥¹¥±¥¸¥å¡¼¥ë¤µ¤ì¤ë¤Þ¤Ç¤ÎºÇĹ»þ´Ö¤È¥Ï¡¼¥É¥¦¥§¥¢³ä¹þ¤ß¤ËÂФ¹¤ëºÇÂç±þÅú»þ´Ö¤âÊݾڤ·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¤¬¡¢¸½ºßºÇ¤âɸ½àŪ¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤ë£Ó£Ö£Ò£´¤ä£Â£Ó£Ä£´¤Ë¤Ï¡¢¤¤¤º¤ì¤Î»þ´Ö¤òÊݾڤ¹¤ëµ¡¹½¤âÄ󶡤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤½¤ì¤Ë²Ã¤¨¡¢¥×¥í¥»¥¹´ÉÍý¡¢¥á¥â¥ê´ÉÍý¡¢¥Õ¥¡¥¤¥ë´ÉÍý¤Ë¤â¿¤¯¤ÎÌäÂê¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£Ëܽñ¤Ç¤Ï¡¢¥ê¥¢¥ë¥¿¥¤¥à³ÈÄ¥ÊÂÎó£Õ£Î£É£Ø¡Ê£Ò£Ô£Õ¡Ë¤Î¥ê¥¢¥ë¥¿¥¤¥à³ÈÄ¥¤Ë¤Ä¤¤¤Æ²òÀ⤷¤Þ¤¹¡£

£²¡¥£±¡¡¥×¥ê¥¨¥ó¥×¥·¥ç¥ó

¡¡¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤Ë¤ª¤¤¤Æ¡¢£Õ£Î£É£Ø¥«¡¼¥Í¥ëºÇÂç¤ÎÌäÂê¤Ï¡¢¥×¥ê¥¨¥ó¥×¥·¥ç¥ó²Äǽ¤Ê¹½Â¤¤Ë¤Ê¤Ã¤Æ¤¤¤Ê¤¤ÅÀ¤Ë¤¢¤ê¤Þ¤¹¡£ ¡¡¤³¤ì¤ÏÄãÍ¥ÀèÅÙ¥×¥í¥»¥¹¤Î¥·¥¹¥Æ¥à¥³¡¼¥ëÃæ¤Ë¡¢¤è¤êÍ¥ÀèÅ٤ι⤤¥×¥í¥»¥¹¤¬¼Â¹Ô²Äǽ¾õÂ֤ˤʤäƤ⡢¥·¥¹¥Æ¥à¥³¡¼¥ë½ªÎ»¤Þ¤Ç¡¢¥³¥ó¥Æ¥­¥¹¥È¡¦¥¹¥¤¥Ã¥Á¤¬Ãٱ䤵¤ì¤ë¸½¾Ý¤ò°ú¤­µ¯¤³¤·¤Þ¤¹¡£ ¡¡¤³¤Î¤³¤È¤Ï¡¢£Õ£Î£É£Ø¥·¥¹¥Æ¥à¤¬±þÅúÃÙ±ä¤ò°ú¤­µ¯¤³¤·¡¢¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤ò¤Þ¤Ã¤¿¤¯¼Â¹Ô¤Ç¤­¤Ê¤¤¤³¤È¤Ë¤Û¤«¤Ê¤ê¤Þ¤»¤ó¡£ ¡¡¥×¥ê¥¨¥ó¥×¥·¥ç¥ó²Äǽ¤Ç¤¢¤ì¤Ð¡¢¤¤¤Ä¤Ç¤â¥×¥í¥»¥¹¤òÀڤ괹¤¨¤é¤ì¤Þ¤¹¤¬¡¢£Õ£Î£É£Ø¥«¡¼¥Í¥ë¤Î¥³¡¼¥ÉÃæ¤Ë¤Ï¡¢Âç°èÊÑ¿ô¤ò¿ô¿¤¯»ÈÍѤ·¤Æ¤¤¤ë¤¿¤á¡¢Æ±°ì¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤òȯ¹Ô¤¹¤ë¤È¡¢¥×¥ê¥¨¥ó¥×¥·¥ç¥ó¤µ¤ì¤¿¥×¥í¥»¥¹¤¬»ÈÍÑÃæ¤ÎÂç°èÊÑ¿ô¤òÇ˲õ¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£ ¡¡ ¥·¥¹¥Æ¥à¥³¡¼¥ëȯ¹Ô ¡¡¥·¥¹¥Æ¥à¥³¡¼¥ë½ªÎ» ¡¡ ¥·¥¹¥Æ¥à¥³¡¼¥ëȯ¹Ô ¡¡¥·¥¹¥Æ¥à¥³¡¼¥ë½ªÎ» ¢­ ¢­ ¢­ ¢­ ¥×¥í¥»¥¹£Á ¨¡¨¡¨¤ ¨£¨¡ ¥×¥í¥»¥¹£Á ¨¡¨¡¨¤¥×¥ê¥¨¥ó¥×¥·¥ç¥ó¡¦¥Ý¥¤¥ó¥È¨£¨¡ ¡ÊÍ¥ÀèÅÙÄã¡Ë ¨¢ ¨¢ ¡ÊÍ¥ÀèÅÙÄã¡Ë ¨¢ ¡¡¢¦ ¨¢ ¥×¥í¥»¥¹£Â ¨¢¨¢¢«¡¡±þÅúÃٱ䡡¢ª ¨£¨«¨¡¨© ¥×¥í¥»¥¹£Â ¨¢¨¢¢«±þÅúÃٱ䢪¨£¨«¨¤ ¨¢ ¡ÊÍ¥ÀèÅÙ¹â¡Ë ¨¢¨¢ ¨¢ ¨¢ ¡ÊÍ¥ÀèÅÙ¹â¡Ë ¨¢¨¢¡¡¡¡ ¨¢<>¨¢ ¨¢ ¨¢ ¥«¡¼¥Í¥ë ¨¦¨«¨¡¨«¨¡¨¤¨£¨¡¨¡¨«¨¡¨© ¨¢ ¥«¡¼¥Í¥ë ¨¦¨«¨¡¨«¨¡¨¤¨§¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥ ¨¢³ä¹þ¤ß¨¢¨¢¥¹¥±¥¸¥å¨¢ ¨¢³ä¹þ¤ß¨¢¨¢¥¹¥±¥¸¥å¡¼¥ëÃÙ±ä ³ä¤ê¹þ¤ß½èÍý ¨¢ ÃÙ±ä ¨¦¨¥¡¼¥ëÃٱ䨢 ³ä¤ê¹þ¤ß½èÍý ¨¢ ÃÙ±ä ¨¦¨¥ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¢¬ ¢¬ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¢¬ ¢¬ ¡¡¡¡£Â¤Îµ¯Æ°Í×µá³ä¹þ¤ß¡¡£Â¤Î³ä¹þ¤ß½èÍý ¡¡¡¡¡¡£Â¤Îµ¯Æ°Í×µá³ä¹þ¤ß¡¡£Â¤Î³ä¹þ¤ß½èÍý ¥×¥ê¥¨¥ó¥×¥·¥ç¥ó¤È±þÅúÃÙ±ä ¡¡¤È¤³¤í¤¬¡¢£Õ£Î£É£Ø¥«¡¼¥Í¥ë¤Ï¡¢¤Þ¤Ã¤¿¤¯¥×¥ê¥¨¥ó¥×¥·¥ç¥óÉÔ²Äǽ¤Ê¤Î¤Ç¤Ï¤Ê¤¯¡¢¥«¡¼¥Í¥ë¥³¡¼¥É¾å¤Ë¥×¥ê¥¨¥ó¥×¥·¥ç¥ó²Äǽ¤ÊÉôʬ¤¬¤¤¤¿¤ë¤È¤³¤í¤Ë¸ºß¤·¤Þ¤¹¡£ ¡¡¤³¤Î¥«¡¼¥Í¥ëÃæ¤Î¥×¥ê¥¨¥ó¥×¥·¥ç¥ó²Äǽ¤ÊÅÀ¤Ï¡¢¥«¡¼¥Í¥ë¤Î¥Ç¡¼¥¿¹½Â¤¤ò¹¹¿·¤·°ì´ÓÀ­¤òÊݤĻö¤Î½ÐÍè¤ë¾ì½ê¤«¡¢ÇÓ¾À©¸æ¤Ë¤è¤ê¾¤Î¥×¥í¥»¥¹¤Î³èư¤òÉõº¿¤Ç¤­¤ëÎΰè¤Ç¤¢¤ê¡¢£Ò£Ô£Õ¤Ç¤Ï¥«¡¼¥Í¥ëÃæ¤ÎÌó£±£°£°¥ö½ê¤Ë¡¢¥×¥ê¥¨¥ó¥·¥ç¥ó¡¦¥Ý¥¤¥ó¥È¤òÀߤ±¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥×¥ê¥¨¥ó¥×¥·¥ç¥ó¥Ý¥¤¥ó¥È¤¬Â¿¤±¤ì¤Ð¡¢¤½¤ì¤À¤±¥¹¥±¥¸¥å¡¼¥ëÃٱ䤬û¤¯¤Ê¤ê¤Þ¤¹¡£¤·¤«¤·¥·¥¹¥Æ¥à±þÅúÀ­¤Î·èÄêŪ¤ÊÍ×°ø¤Ï¥¹¥±¥¸¥å¡¼¥ëÃÙ±ä¤Ç¤Ï¤Ê¤¯¡¢¤à¤·¤í³ä¹þ¤ßÃÙ±ä»þ´Ö¤Î¤Û¤¦¤Ë¤¢¤ê¤Þ¤¹¡£

£²¡¥£²¡¥£±¡¡³ä¹þ¤ß¤Î±þÅú»þ´Ö¤Èͽ¬À­

¡¡£Ò£Ô£Õ¤Ç¤Ï¡¢Àè¤Ë½Ò¤Ù¤¿³ä¹þ¤ßÃÙ±ä¤ò²ò¾Ã¤¹¤ë¤¿¤á¤Ë¥«¡¼¥Í¥ë¥Ç¡¼¥¿¹½Â¤¤Î´ÉÍý¤ò¥»¥Þ¥Õ¥©¹½Â¤ÂΤˤè¤ëÇÓ¾À©¸æ¤Ç¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£ ¡¡¤Ä¤Þ¤êÊ£¿ô¤Î¥»¥Þ¥Õ¥©¹½Â¤ÂΤòƳÆþ¤·¡¢¥«¡¼¥Í¥ë¤Î¥Ç¡¼¥¿¹½Â¤¤òºÇ¾®¤Îñ°Ì¤ÇÇÓ¾À©¸æ¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢¥«¡¼¥Í¥ë¤Î¥Ç¡¼¥¿¹½Â¤¤¬µö¤¹ºÇû»þ´Ö¤Ç±þÅú¤¹¤ë¤³¤È¤ò²Äǽ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£ ¡¡Ä̾盧¤Î¥¢¥×¥í¡¼¥Á¤Ï¡¢Âоݷ¿¤Î¥á¥â¥ê¶¦Í­¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¡¦¥·¥¹¥Æ¥à¤ËÍѤ¤¤é¤ì¡¢¤³¤Î¹½Â¤¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î¥×¥í¥»¥Ã¥µ¤Ç¥·¥¹¥Æ¥à¥³¡¼¥ëÅù¤òƱÍͤ˽èÍý¤Ç¤­¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤ÎÉé²Ùʬ»¶¤Ë¤â¤Ê¤ê¤Þ¤¹¡£ ¡¡Â¿½Å³ä¹þ¤ß½èÍý¤ò¡¢¥»¥Þ¥Õ¥©¹½Â¤ÂΤˤè¤ëÇÓ¾À©¸æ¤ËÃÖ¤­´¹¤¨¡¢¤¹¤Ù¤Æ¤Î¥×¥í¥»¥Ã¥µ¤Ç³ä¹þ¤ß¤ò¥Ï¥ó¥É¥ê¥ó¥°¤Ç¤­¤ë¤è¤¦¤Ë³ÈÄ¥¤·¤¿·ë²Ì¡¢³ä¹þ¤ß±þÅú»þ´Ö¤ÏÈôÌöŪ¤Ë¸þ¾å¤·¡¢¥³¥ó¥«¥ì¥ó¥È£·£°£°£°¥·¥ê¡¼¥º¡Ê£Í£Ã£¶£¸£°£´£°¡¡£²£µ£Í£È£ú¡Ë¤Ç¤Î¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥¿¥¤¥Þ¤Î³ä¹þ¤ß±þÅúÃÙ±ä»þ´Ö¤Ï¡¢Ä̾£°£°¦ÌÉÃÄøÅ٤DZþÅú¤·¤Þ¤¹¡£ ºÇ¹âÍ¥ÀèÅ٠ͥÀèÅÙÄã ¡¡¥·¥¹¥Æ¥à¥³¡¼¥ëȯ¹Ô ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥·¥¹¥Æ¥à¥³¡¼¥ë½ªÎ» ¨£¨¡¨¡¨¡¨¤ ¨£¨¨¨¤ Í¥ÀèÅÙÃæ ¢­ ¢­ ¨¢ ¨¢ ¨¢¨¢¨¢ ¨£¨¨¨¤ ¥×¥í¥»¥¹£Á ¨¡¨¡¨¤ ¨£¨¡ ¨¦¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¤ ¨¢¨¢¨¢ ¨¢¨¢¨¢ ¡ÊÍ¥ÀèÅÙÄã¡Ë ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¦¨ª¨¥ ¨¢¨¢¨¢ ¥×¥í¥»¥¹£Â ¨¢¨¢±þÅú¨£¨«¨¤ ¨¢ ½èÍý ¨¢ ¨¢ ¨¢ ¨¦¨ª¨¥ ¡ÊÍ¥ÀèÅÙ¹â¡Ë ¨¢¨¢Ãٱ䨢 ¨¢ ¨¢ ¢­ ¨¢ ¨¢ ¨¢ ¥«¡¼¥Í¥ë ¨¦¨©¨£¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¢ ¨¢ ¨¢ ¨£¨¨¨¤ ¨¢¨¢ ¢¤¡¡¡¡¢¤¡¡¢¤¡¡¢¤¡¡¢¤ ¡¡ ¨¢ ¨¢ ¨¢ ¨£¨¨¨¤ ¨¢¨¢¨¢ ³ä¤ê¹þ¤ß½èÍý ¨¦¨¥¥×¥ê¥¨¥ó¥×¥·¥ç¥ó¡¦¥Ý¥¤¥ó¥È ¨£¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¥ ¨¢¨¢¨¢ ¨¢¨¢¨¢ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¢¬ ¨¢ ¨¢ ¨¢¨¢¨¢ ¨¦¨ª¨¥ £Â¤Îµ¯Æ°Í×µá³ä¹þ¤ß ¡¡¡¡¡¡¡¡ £Â¤Î³ä¹þ¤ß½èÍý ¨¦¨¡¨¡¨¡¨¥ ¨¦¨ª¨¥ ¥ê¥¢¥ë¥¿¥¤¥à £Ò£Ô£Õ¤Î±þÅúÃÙ±ä ¥×¥í¥»¥¹ ¡¡ ³ä¹þ¤ß½èÍý ¡¡¤³¤³¤Ç¹Í¤¨¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤â¤¦¤Ò¤È¤Ä¤ÎÌäÂê¤Ï¡¢¥¤¥Ù¥ó¥È¤ËÂФ·¤Æ°ìÄê»þ´ÖÆâ¤Ç¤Î±þÅú¤òÊݾڤ¹¤ë¤³¤È¤Ç¤¹¡£ ¥·¥¹¥Æ¥à¤Î±þÅúÀ­¤Ï¡¢£Õ£Î£É£Ø¥«¡¼¥Í¥ë¤ËÂФ·¤ÆÂ¿¤¯¤Î¥×¥ê¥¨¥ó¥×¥·¥ç¥ó¥Ý¥¤¥ó¥È¤òÀߤ±¤ë¤³¤È¤ä¥»¥Þ¥Õ¥©¹½Â¤ÂΤòƳÆþ¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¸þ¾å¤·¤Þ¤·¤¿¡£ ¤·¤«¤·¤³¤Î¥¢¥×¥í¡¼¥Á¤À¤±¤Ç¤Ï¡¢±þÅú»þ´Ö¤ÎÊݾڤϤǤ­¤Þ¤»¤ó¡£¤³¤ÎÍýͳ¤Ï¡¢¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤ä¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥ÐÅù¤Î³ä¹þ¤ß¤Î½èÍý¤òÁ˻ߤǤ­¤Ê¤¤¤«¤é¤Ç¤¹¡£ ¡¡³ä¹þ¤ß½èÍý¤òÁ˻ߤ¹¤ë¤Î¤Ï¡¢¥Ç¡¼¥¿¹½Â¤¤Î°ì´ÓÀ­¤òÊݾڤ¹¤ë¤¿¤á¤Ë¡¢Èó³ä¹þ¤ßÉô¤¬³ä¹þ¤ß½èÍýÉô¤ÎÀßÄꤷ¤¿¥Ç¡¼¥¿¤ò¥¢¥¯¥»¥¹¤¹¤ë¾ì¹ç¤Ë¸Â¤é¤ì¤Þ¤¹¡£ ¡¡¤³¤Î¾õÂ֤Ǥ⡢¥Ï¡¼¥ÉŪ¤ËÍ¥ÀèÅ٤ι⤤³ä¹þ¤ß½èÍý¤Ï¡¢Â¿½Å¤Ë³ä¤ê¹þ¤ó¤Ç¤­¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤ÆÁí¤Æ¤Î³ä¹þ¤ß¤ò£±¤Ä¤Î¥×¥í¥»¥Ã¥µ¤Ç½èÍý¤¹¤ë¤È²¼¿Þ¤Î¤è¤¦¤Ë±þÅú»þ´Ö¤¬Í½Â¬ÉÔ²Äǽ¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¤¤Þ¤¹¡£ ¡¡¡¡³ä¹þ¤ßȯÀ¸¡¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¥×¥í¥»¥¹¥¹¥¿¡¼¥È ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢¹âÍ¥ÀèÅÙ¨¢ÄãÍ¥ÀèÅÙ¨¢¥·¥¹¥Æ¥à¨¢¥«¡¼¥Í¥ë¨¢ ¥³¥ó¥Æ¥­¥¹¥È¡¦¥¹¥¤¥Ã¥Á»þ´Ö ¨¢ ¨¢ ¨¢³ä¹þ½èÍý¨¢³ä¹þ½èÍý¨¢¥È¥é¥Ã¥×¨¢¥¹¥±¥¸¥å¨¢ ¨¢ ¨¢ ¨¢¥×¥í¥»¨¢ ¨¢¥µ¡¼¥Ó¥¹¨¢¥µ¡¼¥Ó¥¹¨¢¥µ¡¼¥Ó¥¹¨¢¡¡¡¡¡¼¥ë¨¢¥³¥ó¥Æ¥­¨¢¥¹¥±¥¸¥å¨¢¥³¥ó¥Æ¥­¨¢¥¹µ¯Æ°¨¢ ¨¢¡¡»þ´Ö ¨¢¡¡»þ´Ö¡¡¨¢ »þ´Ö ¨¢ÃÙ±ä»þ´Ö¨¢¥¹¥ÈÂÔÈò¨¢¡¼¥ê¥ó¥°¨¢¥¹¥ÈÉü³è¨¢ »þ´Ö ¨¢ ¨¢ ¨¢ ¢¬ ¨¢ ¢¬ ¨¢ ¢¬ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¦¨¡ ¥×¥ê¥¨¥ó¥×¥·¥ç¥ó¥Ý¥¤¥ó¥È¤Î¸ú²Ì ¨¢ ¨¢ ¨¢¡¡¡¡ ¨¦¨¡ 8.3 ms ¤« 16.7 ms ¤Ë£±²óɬ¤ºµ¯¤³¤ë ¡¡¡¡ ¨¢ ¨¢ ¨¦¨¡ ¿½Å¤Ë³ä¹þ¤ß¤ò¼õ¤±ÉÕ¤±¤ë¤Î¤Ç»þ´Ö¤Îͽ¬¤ÏÉÔ²Äǽ ¨¢ ¨¢ ¨¢ ¨¢¢«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡³ä¹þ¤ß±þÅú»þ´Ö¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¢ª¨¢ ¥·¥ó¥°¥ë¥×¥í¥»¥Ã¥µ¤Ç¤Î³ä¹þ¤ß±þÅú»þ´Ö

£²¡¥£²¡¥£²¡¡³ä¹þ¤ß½èÍý¤Î¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ²½

¡¡Á°½Ò¤Î¤è¤¦¤Ë¡¢¥·¥ó¥°¥ë¥×¥í¥»¥Ã¥µ¤Ç¤Ï±þÅú»þ´Ö¤òÊݾڤ¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¤¿¤á¡¢£Ò£Ô£Õ¤Ç¤Ï¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¤Ë¤¹¤ë¤³¤È¤Ç¿½Å³ä¹þ¤ß¤ÎÊÀ³²¤ò¤Ê¤¯¤·¡¢½ÅÍפʳ°Éô¥¤¥Ù¥ó¥È¤ËÂФ·¤Æ°ìÄê¤Î»þ´ÖÆâ¤Î±þÅú¤òÊݾڤ¹¤ë¤³¤È¤ò¹Í¤¨¤Þ¤·¤¿¡£¤³¤Î¥¢¥×¥í¡¼¥Á¤Ï£Ò£Ô£ÕÆÈ¼«¤Î¥¢¥¤¥Ç¥¢¤Ç¡¢¤³¤ì¤ò¼Â¸½¤¹¤ë¤¿¤á¤Ë¡¢¼¡¤Î£³ÅÀ¤ò²Äǽ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£ £±¡Ë³ä¹þ¤ß½èÍý¤Î¥×¥í¥»¥Ã¥µ³äÉÕ¤ò¼«Í³¤ËÊѹ¹¤Ç¤­¤ë¡£ £²¡ËÆþ½ÐÎϽèÍý¤ò¥·¥ó¥á¥È¥ê¥Ã¥¯¤Ë½èÍý¤¹¤ë¡£ £³¡Ë³ä¹þ¤ß½èÍý¤ò¥¹¥ì¥Ã¥É¤ò»ÈÍѤ·¤ÆÈó³ä¹þ¤ß½èÍý¤Î´Ä¶­¤Ç¼Â¹Ô¤¹¤ë ¡¡£±¡Ë¤Îµ¡Ç½¤Ï¡¢£·£°£°£°¥·¥ê¡¼¥º¤À¤±¤¬¥½¥Õ¥È¥¦¥§¥¢¤Ç¼Â¹Ô²Äǽ¤Ç¡¢¤½¤Î¾¤Î¥·¥ê¡¼¥º¤Ç¤Ï¥Ð¥Ã¥¯¥×¥ì¡¼¥ó¤ÎÊѹ¹¤òɬÍפȤ·¤Þ¤¹¡££·£°£°£°¥·¥ê¡¼¥º¤Ç¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¿¥¤¥Þ³ä¹þ¤ß¤Î¤¿¤á¤ËÍѤ¤¤é¤ì¤Æ¤¤¤Þ¤¹¡£ ¡¡¤Ä¤Þ¤ê£·£°£°£°¥·¥ê¡¼¥º¤Ç¤Î¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¿¥¤¥Þ¤Î³ä¹þ¤ß½èÍý¤Ï´°Á´¤ËÊÂÎó¼Â¹Ô¤µ¤ì¤ë¤ï¤±¤Ç¤¹¡£ ¡¡£²¡Ë¤Îµ¡Ç½¤Ï¡¢¤¹¤Ù¤Æ¤Î¥·¥ê¡¼¥º¤Ç»ÈÍѲÄǽ¤Ç¤¹¡££Ò£Ô£Õ¤Ç¤Ï¡¢¥·¥¹¥Æ¥à¡¦¥³¥ó¥Õ¥£¥°¥ì¡¼¥·¥ç¥ó¡¦¥Õ¥¡¥¤¥ëÃæ¤Ç²¼¤ÎÎã¤Î¤è¤¦¤Ë¡¢¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥Ð¤Î¡Ê¥«¡¼¥Í¥ë¾å°ÌÉô¡Ë½èÍý¤ò¼Â¹Ô¤¹¤ë¥×¥í¥»¥Ã¥µ¤ò»ØÄê¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¡Ê¥×¥í¥»¥Ã¥µ¥Þ¥¹¥¯¤¬¡Ý£±¤Î¾ì¹ç¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥»¥Ã¥µ¤Ç½èÍý¤µ¤ì¤Þ¤¹¡£¡Ë lance lcl:00300000 ¥×¥í¥»¥Ã¥µ¥Þ¥¹¥¯ ¡¡£³¡Ë¤Îµ¡Ç½¤Ï£Õ£Î£É£Ø¤¬³ä¹þ¤ß½èÍý¥ë¡¼¥Á¥ó¤«¤é¥³¥ó¥Æ¥­¥¹¥È¡¦¥¹¥¤¥Ã¥Á¤òµ¯¤³¤»¤Ê¤¤¤¿¤á¤ËƳÆþ¤µ¤ì¤¿µ¡Ç½¤Ç¤¹¡£ ¡¡Ä̾³ä¹þ¤ß½èÍý¥ë¡¼¥Á¥ó¤Ï¡¢¼«Ê¬¼«¿È¤Î¥³¥ó¥Æ¥­¥¹¥È¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¤¿¤á¤Ë¡¢³ä¤ê¹þ¤ó¤À¥×¥í¥»¥¹¤Î¥³¥ó¥Æ¥­¥¹¥È¤ò»ÈÍѤ·¤Æ³ä¹þ¤ß½èÍý¤ò¼Â¹Ô¤·¤Æ¤¤¤Þ¤¹¡£¤³¤Î¤¿¤á³ä¹þ¤ß½èÍý¥ë¡¼¥Á¥ó¤Ç¤Ï¡¢½èÍý¤ò½ªÎ»¤¹¤ë¤Þ¤ÇÂÔ¤Á¤ËÆþ¤ë»ö¤òµö¤µ¤ì¤Þ¤»¤ó¡£ ¡¡¤È¤³¤í¤¬¡¢³ä¤ê¹þ¤Þ¤ì¤¿¥×¥í¥»¥¹¤¬Èó¾ï¤ËÍ¥ÀèÅ٤ι⤤½èÍý¤Ç¤¢¤ê¡¢³ä¹þ¤ß½èÍý¥ë¡¼¥Á¥ó¤¬¤â¤Ã¤È¤âÄ㤤¥×¥í¥»¥¹¤Î¤¿¤á¤Ç¤¢¤Ã¤Æ¤â¡¢³ä¹þ¤ß½èÍý¤È¥×¥í¥»¥¹¤Î¼Â¹ÔÍ¥ÀèÅ٤ˤϡ¢¤Ê¤ó¤Î´Ø·¸ÉÕ¤±¤â¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢³ä¤ê¹þ¤Þ¤ì¤¿¥×¥í¥»¥¹¤ÎÍ¥Àè¼Â¹Ô¤Ï¡¢¤Ê¤ó¤éÊݾڤµ¤ì¤Þ¤»¤ó¡£ ¡¡¤Ä¤Þ¤ê¡¢¡É¤¢¤é¤æ¤ë³ä¹þ¤ß½èÍý¤Ï¡¢¤¹¤Ù¤Æ¤Î¥×¥í¥»¥¹¤ËÂФ·¤ÆÍ¥ÀèŪ¤Ë¼Â¹Ô¤µ¤ì¤ë¡É¤È¤¤¤¦¡¢°ÅÌÛ¤ÎÀ©Ìó¾ò·ï¤¬¤Ä¤¤¤Æ¤¤¤ë¤È¹Í¤¨¤ë»ö¤¬¤Ç¤­¤ë¤ï¤±¤Ç¤¹¡£ ¡¡¤·¤¿¤¬¤Ã¤Æ¡¢¥ê¥¢¥ë¥¿¥¤¥à¤Î±þÅúÀ­¤òÊݾڤ¹¤ë¤Ë¤Ï¡¢¥«¡¼¥Í¥ë²¼°ÌÉô¤Ç¤Î³ä¹þ¤ß½èÍý¤òĹ»þ´Ö³¤±¤Æ¤Ï¤Ê¤é¤Ê¤¤¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ¡¡¤·¤«¤·¡¢¸½¼Â¤Î¥Ç¥Ð¥¤¥¹¡¦¥É¥é¥¤¥Ð¤Ç¤Ï¡¢¥¹¥Æ¡¼¥¿¥¹¡¦¥ì¥¸¥¹¥¿Åù¤Î¥Á¥§¥Ã¥¯¤Ê¤É¤Ë»þ´Ö¤¬¤«¤«¤ê¡¢Ã»»þ´Ö¤Ç½ªÎ»¤Ç¤­¤Ê¤¤¥±¡¼¥¹¤¬¤Þ¤Þ¤¢¤ê¤Þ¤¹¡£ ¡¡¤³¤ÎÌäÂê¤Ï¡¢³ä¹þ¤ß½èÍý¤Ë¤ª¤¤¤Æ¥³¥ó¥Æ¥­¥¹¥È¥¹¥¤¥Ã¥Á¤òµ¯¤³¤¹¤«¡¢³ä¹þ¤ß½èÍý¤òÈó³ä¹þ¤ß½èÍý¤Ë°Ü¤·¤Æ½èÍý¤µ¤»¤ì¤Ð¡¢³ä¹þ¤ß½èÍý¤ò¹Ô¤¦¥×¥í¥»¥¹¤È³ä¤ê¹þ¤Þ¤ì¤¿¥×¥í¥»¥¹¤Î´Ö¤Ç¡¢Í¥Àè½ç°Ì¤Ë¤è¤ëÄ´Ä䤬²Äǽ¤Ë¤Ê¤ë¤¿¤á¡¢ÌäÂê¤Ï²ò·è¤Ç¤­¤Þ¤¹¡£ ¡¡£Ò£Ô£Õ¤Ç¤Ï¡¢³ä¹þ¤ß½èÍý¤òÈó³ä¹þ¤ß½èÍý¤Ë°Ü¤¹¤¿¤á¤Ë "System Light Weight Prosess"¡Ê£Ó£Ì£×£Ð¡Ë¤È¡¢"Dedicated Light Weight Prosess"¡Ê£Ä£Ì£×£Ð¡Ë¤òƳÆþ¤·¤Æ¤¤¤Þ¤¹¡£ ¡¡¤³¤Î¤è¤¦¤Êµ¡¹½¤Ë¤è¤Ã¤Æ²¼¿Þ¤Î¤è¤¦¤Ë¡¢³ä¹þ¤ß¤ò¼õ¤±ÉÕ¤±¤¿¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤¬Â¾¤Î¥×¥í¥»¥Ã¥µ¤ËÂФ·¤Æ½èÍý¤òưŪ¤Ë°Üư¤¹¤ë»ö¤¬¤Ç¤­¡¢³ä¹þ¤ß¤Î±þÅúÀ­¤òÊݾڤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡££Ò£Ô£Õ¤Ç¤Ï¤³¤Î¤è¤¦¤Ë¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¤òÍøÍѤ·¤Æ¥×¥ê¥¨¥ó¥×¥·¥ç¥ó¤ò¹â®¤Ë¹Ô¤¦¼êË¡¤ò¥Ï¥¤¥Ö¥ê¥Ã¥É¡¦¥×¥ê¥¨¥ó¥×¥·¥ç¥óµ¡¹½¤È¸Æ¤Ó¤Þ¤¹¡£ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡³ä¹þ¤ßȯÀ¸¡¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¥×¥í¥»¥¹¡¦¥¹¥¿¡¼¥È ¨¢ ¨¢ ¨¢ ¨¢ ¨¢¹âÍ¥ÀèÅÙ¨¢ÄãÍ¥ÀèÅÙ¨¢ ¨¢ ¡¡¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¨¢³ä¹þ½èÍý¨¢³ä¹þ½èÍý¨¢ ¨¢ ¨¢¥µ¡¼¥Ó¥¹¨¢¥µ¡¼¥Ó¥¹¨¢ ¨¢ ¨¢¡¡»þ´Ö ¨¢¡¡»þ´Ö¡¡¨¢ ¨¢ ¨§¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨© ¨¢ ¨¦¨¡¢ª¨¢¥·¥¹¥Æ¥à¨¢¥«¡¼¥Í¥ë¨¢ ¥³¥ó¥Æ¥­¥¹¥È¡¦¥¹¥¤¥Ã¥Á»þ´Ö ¨¢ ¨¢ ¨¢½èÍý¤Î ¨¢¥È¥é¥Ã¥×¨¢¥¹¥±¥¸¥å¨¢ ¨¢ ¨¢ ¨¢¥×¥í¥»¨¢ Èó¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¨¢¥Þ¥¤¥°¥ì¨¢¥µ¡¼¥Ó¥¹¨¢¡¡¡¡¡¼¥ë¨¢¥³¥ó¥Æ¥­¨¢¥¹¥±¥¸¥å¨¢¥³¥ó¥Æ¥­¨¢¥¹µ¯Æ°¨¢ ¨¢¡¼¥·¥ç¥ó¨¢ »þ´Ö ¨¢ÃÙ±ä»þ´Ö¨¢¥¹¥ÈÂÔÈò¨¢¡¼¥ê¥ó¥°¨¢¥¹¥ÈÉü³è¨¢ »þ´Ö ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢¢«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡³ä¹þ¤ß±þÅú»þ´Ö¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¢ª¨¢ ¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¤Ç¤Î³ä¹þ¤ß±þÅú»þ´Ö

£²¡¥£²¡¥£³¡¡¥·¥¹¥Æ¥à»ñ¸»À©¸æ

¡¡£Ò£Ô£Õ¤Ë¤ª¤±¤ë¡¢¥×¥í¥»¥Ã¥µ³äÉÕ¤±¤ä¥·¥¹¥Æ¥à¥¯¥í¥Ã¥¯¤ÎÀ©¸æ¤Ê¤É¤Î¥·¥¹¥Æ¥à»ñ¸»À©¸æ¤Ï¡¢¼¡¤Î¤è¤¦¤Ê¹½Ê¸¤Î mpadvise ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ç¼Â¸½¤·¡¢¤½¤Îµ¡Ç½¤Ï function ¥Õ¥£¡¼¥ë¥É¤Ç»ØÄꤷ¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ £í£ð£á£ä£ö£é£ó£å¡§¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¤È¥«¡¼¥Í¥ë¤Î¥·¥¹¥Æ¥à»ñ¸»¤ÎÀ©¸æ¤ò¹Ô¤Ê¤¦ ¨¢ ¨¢ ¨¢ ¨¢ ·Á¼° ¨¢ ¨¢ ¨¢ ¨¢ #include ¨¢ ¨¢ ¨¢ ¨¢ int mpadvise(function,cpu_mask[,arg]) ¨¢ ¨¢ int function,cpu_mask,arg ¨¢ ¨¢ ¨¢ ¨¢ °ú¿ô ¨¢ ¨¢ ¨¢ ¨¢ function : MPA_CPU_EXIST ¥·¥¹¥Æ¥à¤Ë¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥»¥Ã¥µ¤òÆÀ¤ë ¨¢ ¨¢ MPA_CPU_GET Èó¥ê¥¢¥ë¥¿¥¤¥à¤Ç»ÈÍѤǤ­¤ë¥×¥í¥»¥Ã¥µ¤òÆÀ¤ë ¨¢ ¨¢ MPA_CPU_SET Èó¥ê¥¢¥ë¥¿¥¤¥à¤Ç»ÈÍѤ¹¤ë¥×¥í¥»¥Ã¥µ¤ò cpu_mask ¤Ç»ØÄꤹ¤ë ¨¢ ¨¢ MPA_RT_GET ¥ê¥¢¥ë¥¿¥¤¥à¤Ç»ÈÍѤǤ­¤ë¥×¥í¥»¥Ã¥µ¤òÆÀ¤ë ¨¢ ¨¢ MPA_RT_SET ¥ê¥¢¥ë¥¿¥¤¥à¤Ç»ÈÍѤ¹¤ë¥×¥í¥»¥Ã¥µ¤ò cpu_mask ¤Ç»ØÄꤹ¤ë ¨¢ ¨¢ MPA_60HZ_ON cpu_mask ¤Î¥×¥í¥»¥Ã¥µ¤Î¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤òµö²Ä¤¹¤ë ¨¢ ¨¢ MPA_60HZ_OFF cpu_mask ¤Î¥×¥í¥»¥Ã¥µ¤Î¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤ò¶Ø»ß¤¹¤ë ¨¢ ¨¢ MPA_CLK_GET cpu_mask ¤Î¥×¥í¥»¥Ã¥µ¤Î¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¥¯¥í¥Ã¥¯¤òÆÀ¤ë ¨¢ ¨¢ MPA_CLK_SET cpu_mask ¤Î¥×¥í¥»¥Ã¥µ¤Ë¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¥¯¥í¥Ã¥¯¤ò¥»¥Ã¥È¤¹¤ë ¨¢ ¨¢ MPA_TBINV_ON £Ô£Ì£Â¤Î̵¸ú³ä¹þ¤ß¤òµö²Ä¤¹¤ë¡Ê¡ö ¨¢ ¨¢ MPA_TBINV_OFF £Ô£Ì£Â¤Î̵¸ú³ä¹þ¤ß¤ò¶Ø»ß¤¹¤ë¡Ê¡ö ¨¢ ¨¢ ¨¢ ¨¢ cpu_mask : ¿Þ¤Ë¼¨¤¹¤è¤¦¤Ê¥Ó¥Ã¥È»ØÄê¤Ç»ÈÍѤ¹¤ë¥×¥í¥»¥Ã¥µ¤ò»ØÄꤹ¤ë¡£ ¨¢ ¨¢ ¨¢ ¨¢ MSB boot LSB ¨¢ ¨¢ ¨£¨¡¨¨¨¨¨¡¨¨¨¡¨¨¨¡¨¨¨¡¨¨¨¡¨¨¨¡¨¨¨¡¨¨¨¡¨¨¨¡¨¨¨¡¨¤ ¨¢ ¨¢ ¨¢ ¨¢¨¢ ¨¢ ¨¢£·¨¢£¶¨¢£µ¨¢£´¨¢£³¨¢£²¨¢£±¨¢£¸¨¢ ¨¢ ¨¢ ¨¦¨¡¨ª¨ª¨¡¨ª¨¡¨ª¨¡¨ª¨¡¨ª¨¡¨ª¨¡¨ª¨¡¨ª¨¡¨ª¨¡¨ª¨¡¨¥ ¨¢ ¨¢ ¡¡¥×¥í¥»¥Ã¥µ¡¦¥Þ¥¹¥¯ ¨¢ ¨¢ ¨¢ ¨¢ arg : MPA_CLK_SET ¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤Î¼þ´ü¤ò»ØÄꤹ¤ë¡Ê£¶£°¡Á£±£°£°£°£È£ú¡Ë ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¤³¤Î mpadvise ¤ò»ÈÍѤ·¤Æ¡¢¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤Î¼þ´ü¤òÊѹ¹¤Ç¤­¤Þ¤¹¡£¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤Î¼þ´ü¤¬Ã»¤±¤ì¤Ð¡¢£Õ£Î£É£Ø¤Ç¤ÎÈ󯱴ü¥¤¥Ù¥ó¥È¤Îǧ¼±¤Ï¡¢¿Þ¤Î¤è¤¦¤Ë¼¡¤Î¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤Þ¤ÇÃٱ䤵¤ì¤Þ¤¹¤Î¤Ç¡¢¥¤¥Ù¥ó¥È¤Îǧ¼±¤ò¹â®¤Ë¤Ç¤­¤ë¸ú²Ì¤¬¤¢¤ê¤Þ¤¹¡£ if ( mpadvise(MPA_CPU_SET,cpu_mask) ) { perror("£Ô£Ó£Ó¥×¥í¥»¥Ã¥µ¤Î»ØÄê"); exit(1); } if ( (freq = mpadvise(MPA_CLK_SET,cpu_mask,1000))==-1 ){/*¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤ò£±£°£°£°£È£ú¤Ë¤¹¤ë*/ perror("¥·¥¹¥Æ¥à¥È¥é¥Ã¥×"); exit(3); } ¥¤¥Ù¥ó¥È¤Îǧ¼± ¡ß¡¡¡ß¡¡¡¡¡¡¡ß¡¡¡¡¡¡¡ß¡¡¡¡¡¡¡¡¡¡¡ß¡¡¡ß¡¡¡ß¡¡¡¡ ¡ß ¡ß¡¡¡¡ ¡ß¡¡ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¥¤¥Ù¥ó¥È¤ÎÍ×µá ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¡¨¨¨ª¨¨¨¡¨«¨¡¨¨¨ª¨¨¨¡¨¨¨¡¨«¨¡¨¨¨¡¨¨¨ª¨¨¨ª¨¨¨¡¨«¨¡¨¨¨ª¨¨¨¡¨«¨¡¨¨¨ª¨¨¨¡¨¨¨¡ ¥·¥¹¥Æ¥à¥È¥é¥Ã¥× ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¡¡¡¡¢ª»þ´Ö ¡Ê¡ö¡¡£Ò£Ô£Õ¤Ç¤Ï¡¢¥×¥í¥»¥¹¥Æ¡¼¥Ö¥ë¤Î¤è¤¦¤Ê²ÄÊѥǡ¼¥¿¤ËÂФ¹¤ë²¾ÁÛ¥¢¥É¥ì¥¹¤Ï¡¢Æ°Åª¤Ë³ä¤êÅö¤Æ¤é¤ì¤ë¤¿¤á¡¢¥×¥í¥»¥¹¤¬À¸À®¡¿¾Ãµî¤µ¤ì¤ë¤¿¤Ó¤Ë¡¢¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤«¤é¾¤Î¥×¥í¥»¥Ã¥µ¤Ë³ä¤ê¹þ¤ß¤òȯÀ¸¤·¡¢³Æ¥×¥í¥»¥Ã¥µ¤¬ÆÈ¼«¤Ë´ÉÍý¤·¤Æ¤¤¤ë¥Þ¥Ã¥×¥Æ¡¼¥Ö¥ë¤¬Ìµ¸ú¤Ë¤Ê¤Ã¤¿¤³¤È¤òÃΤ餻¤Æ¤¤¤ë¡£¤³¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ë¤è¤Ã¤Æ¡¢Í½¤á¤³¤ÎÎΰè¤ò³ä¤êÉÕ¤±¤Æ¤ª¤­¡¢£Ô£Ì£Â̵¸ú³ä¤ê¹þ¤ß¤Ë¤è¤ë½èÍý¤ÎÃæÃǤò¤Ê¤¯¤¹¤³¤È¤¬¤Ç¤­¤ë¡£¡Ê¥·¥¹¥Æ¥à¥³¥ó¥Õ¥£¥°¥ì¡¼¥·¥ç¥ó»þ¤Ëkmempool¤òÄêµÁ¤¹¤ëɬÍפ¢¤ê¡Ë¡£

£²¡¥£²¡¥£´¡¡¥ê¥¢¥ë¥¿¥¤¥à¡¦¥¹¥ì¡¼¥Ö

¡¡È󯱴ü¥¤¥Ù¥ó¥È¤Îǧ¼±¤Ë¤Ï¡¢¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤Î¼þ´ü¤òû¤¯¤¹¤ë¤³¤È¤¬Â礭¤Ê¸ú²Ì¤òÀ¸¤ß¤Þ¤¹¤¬¡¢µÕ¤Ë¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤òÃÙ¤¯¤¹¤ë¤³¤È¤Ç¡¢¥·¥¹¥Æ¥à¥ª¡¼¥Ð¥Ø¥Ã¥É¤Î¤ò¾®¤µ¤¯ÍÞ¤¨¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ¡¡£Ò£Ô£Õ¤Ç¤Î¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¼þ´ü¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç£±£²£°£È£ú¡Ê£¸¡¥£³¥ß¥êÉáˤǤ¹¤¬¡¢£¶£°£È£ú¡Á£±£°£°£°£È£ú¤Þ¤ÇÊѲ½¤µ¤»¤ë¤³¤È¤¬²Äǽ¤Ç¡¢Èó¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤Ë¸Â¤Ã¤Æ¤Ï¡¢¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤òÄä»ß¤¹¤ë¤³¤È¤â½ÐÍè¤Þ¤¹¡£ ¡¡¤³¤Îµ¡Ç½¤Ï¡¢ÆÃ¤Ë³ä¹þ¤ß¤Ç¥×¥í¥»¥¹¤òľÀܵ¯Æ°¤¹¤ëƱ´ü¥¤¥Ù¥ó¥È¤ä¹â®¤Ë±é»»¤ò¹Ô¤Ê¤¤¤¿¤¤¥×¥í¥»¥¹¤Ë¤È¤Ã¤Æ¤Ï¡¢Èó¾ï¤Ë¸ú²Ì¤¬¤¢¤ê¡¢¥·¥¹¥Æ¥à¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤òºÇ¾®¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ¡¡¤Ä¤Þ¤ê¡¢Äê¼þ´ü¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤òÄä»ß¤·¡¢Â¾¤Î¥×¥í¥»¥¹¤ò¥×¥í¥»¥Ã¥µ¤«¤éÄɤ¤½Ð¤¹¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥«¡¼¥Í¥ë¤Î¥×¥ê¥¨¥ó¥×¥·¥ç¥ó»þ´Ö¤È¥³¥ó¥Æ¥­¥¹¥È¡¦¥¹¥¤¥Ã¥Á¥ó¥°»þ´Ö¤È¤ò¾Êά¤·¡¢¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É»þ´Ö¤òºÇ¾®¤Ë¤¹¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡³ä¹þ¤ßȯÀ¸¡¡¡¡¡¡ ¡¡¡¡¥×¥í¥»¥¹¡¦¥¹¥¿¡¼¥È ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¥³¥ó¥Æ¥­¥¹¥È ¨¢ ¨¢ ¨¢³ä¹þ½èÍý¨¢ ¥¹¥¤¥Ã¥Á»þ´Ö ¨¢¥×¥í¥»¨¢ Èó¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¨¢¥µ¡¼¥Ó¥¹¨¢ ¨¢ ¨¢¥¹µ¯Æ°¨¢ ¨¢¡¡»þ´Ö ¨¢¥¹¥±¥¸¥å¨¢¥³¥ó¥Æ¥­¨¢ »þ´Ö ¨¢ ¨¢ ¨¢¡¼¥ê¥ó¥°¨¢¥¹¥ÈÉü³è¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢¢«¨¡¨¡¨¡¨¡¨¡³ä¹þ¤ß±þÅú»þ´Ö¨¡¨¡¨¡¨¡¢ª¨¢ ¥ê¥¢¥ë¥¿¥¤¥à¡¦¥¹¥ì¡¼¥Ö±þÅú»þ´Ö ¡¡£Ò£Ô£Õ¤È£·£°£°£°¥·¥ê¡¼¥º¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î³ä¹þ¤ß¿®¹æ¤ò¥½¥Õ¥È¥¦¥§¥¢¤Ç»ØÄꤷ¤¿¥×¥í¥»¥Ã¥µ¤ØÄ¾ÀÜÆþÎϤ¹¤ë¤³¤È¤¬¤Ç¤­¡¢Â¾¤Î±Æ¶Á¤òÁ´¤¯¼õ¤±¤Ê¤¤´Ä¶­¡Ê¥ê¥¢¥ë¥¿¥¤¥à¥¹¥ì¡¼¥Ö¤È¸Æ¤Ó¤Þ¤¹¡Ë¤ò¹½ÃۤǤ­¤ë¤è¤¦À߷פµ¤ì¡¢£Æ£á£ó£ô¥¯¥í¥Ã¥¯£Á£Ó£Ô¤È¤·¤Æ¥æ¡¼¥¶¤ËÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ¡¡¤³¤Î¤è¤¦¤Ê¥ê¥¢¥ë¥¿¥¤¥à¥¹¥ì¡¼¥Ö¤ËÀßÄꤹ¤ë¤¿¤á¤Ë¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ë¥×¥í¥°¥é¥à¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢Èó¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤Ç¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£¤³¤ÎÍýͳ¤Ï¤ª¤â¤Ë¡¢¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤Î¤¿¤á¤Î¥¯¥í¥Ã¥¯³ä¹þ¤ß¤ò¶Ø»ß¤¹¤ëÍýͳ¤Ë¤è¤ê¤Þ¤¹¡£ if ( mpadvise(MPA_RT_SET,cpu_mask) ) { perror("¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥Ã¥µ¤ÎÀßÄê"); exit(2); } if ( mpadvise(MPA_60HZ_OFF,cpu_mask) ) { perror("¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤ÎÄä»ß"); exit(2); } if ( mpadvise(MPA_CLK_SET,cpu_mask,0) ) { perror("¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥¯¥í¥Ã¥¯¤Î¶Ø»ß"); exit(3); } ¤³¤ÎÉôʬ¤Ï¡¢É¬¤º¤·¤âɬÍפǤϤʤ¤ if ( mpadvise(MPA_TBINV_OFF,cpu_mask) ) { perror("£Ô£Ì£Â̵¸ú³ä¹þ¤ß¤Î¶Ø»ß"); exit(4); }

¡ø£³¡¡¥ê¥¢¥ë¥¿¥¤¥à¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥°

¡¡É¸½à£Õ£Î£É£Ø¤È¥ê¥¢¥ë¥¿¥¤¥à£Ï£Ó¤òÈæ¤Ù¤¿¾ì¹ç¡¢¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Î¹Í¤¨Êý¤Ë¿¤¯¤ÎÁê°ãÅÀ¤¬¤¢¤ê¤Þ¤¹¡£ ¡¡°ìÈÌŪ¤Ê£Õ£Î£É£Ø¤Ç¤Ï¡¢£µ£°£È£ú¡Á£±£²£°£È£ú¤Î¥¯¥í¥Ã¥¯¤Ç¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤òȯÀ¸¤µ¤»¤³¤Î¥¿¥¤¥ß¥ó¥°¤Ç¼Â¹Ô¾õ¶·¤òÇİ®¤·¡¢£±É䴤Ȥˤ½¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò»È¤Ã¤ÆÆ°Åª¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ò¹Ô¤Ê¤¤¤Þ¤¹¡£ ¡¡¤³¤Î¤È¤­¡¢²áµî¤«¤é¸½ºß¤ËÅÏ¤Ã¤Æ¥×¥í¥»¥Ã¥µ¤òÀêÍ­¤·¤Æ¤¤¤ë¥×¥í¥»¥¹¤Ï¡¢Í¥Àè½ç°Ì¤ò²¼¤²¤é¤ì¡¢·ë²Ì¤È¤·¤ÆÄ¹»þ´ÖϢ³¤·¤ÆÆ°ºî¤¹¤ë¤è¤¦¤Ê¥×¥í¥»¥¹¤Ï¼Â¹Ô¤¬¸å²ó¤·¤Ë¤Ê¤ê¡¢£ì£ó¤ä£ë£é£ì£ì¤Ê¤É¤Î¾®¤µ¤Ê¥×¥í¥»¥¹¤Î¼Â¹Ô¤¬Í¥À褵¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¼Â¹Ô¸¢¤òÍ¿¤¨¤é¤ì¤ë¤Þ¤Ç¤Î»þ´Ö¤È¼Â¹Ô½ªÎ»¤Î»þ´Ö¤Ïͽ¬¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤Ï¸øÊ¿À­¤Ë½Å¤­¤ò¤ª¤¤¤¿À߷פǡ¢¥×¥í¥°¥é¥à³«È¯¥·¥¹¥Æ¥à¤È¤·¤Æ¤Î£Õ£Î£É£Ø¤È¤·¤Æ¤ÏÂÅÅö¤ÊÀ߷פǤ·¤¿¡£ ¡¡¤·¤«¤·¥ê¥¢¥ë¥¿¥¤¥à¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¥×¥í¥»¥¹¤Î±þÅú»þ´Ö¤ËÂФ¹¤ëÊݾڤò¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£¤¹¤Ê¤ï¤ÁÀ©¸Â»þ´Ö¤äÍ¥ÀèÅ٤˽¾¤Ã¤¿¸ÇÄêÍ¥ÀèÅÙ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ò¹Ô¤Ê¤ï¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£ ¡¡£Õ£Î£É£Ø¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ç¤Î¥×¥í¥»¥¹Í¥ÀèÅ٤ϡ¢£±É䴤ȤˣգΣɣإ«¡¼¥Í¥ë¤Ë¤è¤Ã¤Æ¡¢ºÆ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤µ¤ì¡¢¹ï¡¹¤ÈÊѲ½¤·¤Þ¤¹¤¬¡¢¸ÇÄêÍ¥ÀèÅ٤ϥ«¡¼¥Í¥ë¤Ë¤è¤Ã¤Æ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤µ¤ì¤Þ¤»¤ó¡£ ¡¡£Ó£Ö£Ò£´¤È¡¢¤Û¤È¤ó¤É¤Î¥ê¥¢¥ë¥¿¥¤¥à£Õ£Î£É£Ø¥·¥¹¥Æ¥à¤Ï¡¢¤³¤Î¸ÇÄêÍ¥ÀèÅÙ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ò¥«¡¼¥Í¥ë¤Ë¼è¤ê¹þ¤ó¤Ç¤¤¤Þ¤¹¡£ ¡¡£Ò£Ô£Õ¤Ç¤Ï¡¢É¸½à£Õ£Î£É£Ø¤Î£î£é£ã£åÃ͡ʡݣ²£°¡Á¡Ü£±£¹¡Ë¤Î¤¦¤Á°ìÉô¡Ê¡Ý£²£°¡Á¡Ý£±£±¡Ë¤ò¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹ÍѤθÇÄêÍ¥ÀèÅ٤Ȥ·¤Æ³ÎÊݤ·¤Æ¤¤¤Þ¤¹¡£ ¡¡¤µ¤é¤Ë¡¢£Ò£Ô£Õ¤Ç¤Ï¡¢¸å½Ò¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹ÀìÍѤΥ¹¥±¥¸¥å¡¼¥ê¥ó¥°µ¡¹½¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£ ¡¡¤³¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¡¦¥¢¥ë¥´¥ê¥º¥à¤Ç¤Ï¡¢£Õ£Î£É£Ø¥«¡¼¥Í¥ë¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤È¤ÏÊ̤ˡ¢¥ê¥¢¥ë¥¿¥¤¥à£Æ£É£Æ£Ï¡¢¥ê¥¢¥ë¥¿¥¤¥à¥é¥¦¥ó¥É¥í¥Ó¥ó¤È¥¿¥¤¥à¥·¥§¥¢¥ê¥ó¥°¤òÁªÂò¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ Í¥ÀèÅÙ¡¡¡¡¡¡¡¡¡¡¡¡¥Ý¥ê¥·¡¼¡¡¡¡¡¡ ¡¡Í¥ÀèÅÙÄã¡¡¡¡¡¡Í¥ÀèÅٹ⠥·¥¹¥Æ¥à¥³¡¼¥ë Í¥ÀèÅÙ ¨¡¨¡¨¨¨¡²ÄÊѨ¡¨¡¨¡¨¡¨¨¨¡¥é¥¦¥ó¥É¥í¥Ó¥ó 19 -10 nice (SVR4) ¨¢ ¨¦¨¡SCHED_OTHER MIN_TS_PRI(0) MAX_TS_PRI(28) schedset (RTU) ¨¢ (SCHED_TS) ¨¦¨¡¸ÇÄꨡ¨¡¨¡¨¡¨¨¨¡£Æ£É£Æ£Ï -11 -20 nice (RTU) ¨¢ ¨§¨¡SCHED_FIFO MIN_RT_PRI(0) MAX_RT_PRI(63) schedset (RTU) ¨¦¨¡SCHED_RR MIN_RT_PRI(0) MAX_RT_PRI(63) schedset (RTU) £Ò£Ô£Õ¤Î¥×¥í¥»¥¹¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥°

£³¡¥£±¡¡¸ÇÄêÍ¥ÀèÅ٣ƣɣƣϥ¹¥±¥¸¥å¡¼¥ê¥ó¥°

¡¡¤³¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¥Ý¥ê¥·¡¼¤Ç¤Ï¡¢Í¥ÀèÅ٤ι⤤¥×¥í¥»¥¹¤¬¼Â¹Ô¸¢¤ò»ý¤Ã¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤Î¥×¥í¥»¥¹¤¬¡Ê¥·¥¹¥Æ¥à¥³¡¼¥ëȯ¹ÔÅù¤Ç¡ËÂÔ¤Á¤Î¾õÂ֤ˤʤ뤫¡¢¤è¤ê¹â¤¤Í¥ÀèÅÙ¤ò»ý¤Ã¤¿¥×¥í¥»¥¹¤¬¼Â¹Ô²Äǽ¾õÂ֤ˤʤé¤Ê¤¤¸Â¤ê¼Â¹Ô¸¢¤òÊü´þ¤·¤Þ¤»¤ó¡£Æ±°ì¤ÎÍ¥ÀèÅ٤ξì¹ç£Æ£É£Æ£Ï¥­¥å¡¼¤Ç¡¢Àè¤Ë¼Â¹Ô¤µ¤ì¤¿¥×¥í¥»¥¹¤Î½ªÎ»¤òÂÔ¤Á¤Þ¤¹¡£ ¡¡£Ð£Ï£Ó£É£Ø¤ÇÄ󰯤µ¤ì¤Æ¤¤¤ë¸ÇÄêÍ¥ÀèÅÙ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤â¤³¤Î¥á¥«¥Ë¥º¥à¤òºÎÍѤ·¤Æ¤¤¤Þ¤¹¡£ ¡¡£Ò£Ô£Õ¤Ç¤Ï¡¢¤¹¤Ç¤Ë½Ò¤Ù¤¿ nice ÃͤγÈÄ¥¤Ë²Ã¤¨¤Æ¡¢¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹ÀìÍѤΥ·¥¹¥Æ¥à¥³¡¼¥ë schedset ¤Ç£¶£´¥ì¥Ù¥ë¤ÎÍ¥ÀèÅÙ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ò²Äǽ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£ ¡¡¡¡¡¡¡¡¡¡ Í¥ÀèÅÙ ¥¯¥ª¥ó¥¿¥à ¡¡¡¡·×»»ÎÌ ¢­¡¡¡¡¢­¡¡¡¡¡¡¡¡¢­¡¡¡¡¡¡¡¡¡¡¡¡¢­ ¥×¥í¥»¥¹ £Á Ãæ°Ì ¤Ê¤· ¡Î£µÃ±°Ì»þ´Ö½ªÎ»¡Ï ¡¡¨£¨¡¨¡¨¡¨¡¨¤ ¥×¥í¥»¥¹ £Â Äã°Ì ¤Ê¤· ¡Î£·Ã±°Ì»þ´Ö½ªÎ»¡Ï ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡ ¥×¥í¥»¥¹ £Ã ¹â°Ì ¤Ê¤· ¡Î£³Ã±°Ì»þ´Ö½ªÎ»¡Ï¨¡¨¡¨¡¨¥ ¸ÇÄêÍ¥ÀèÅÙ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°

£³¡¥£²¡¡¸ÇÄêÍ¥ÀèÅ٥饦¥ó¥É¥í¥Ó¥ó¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥°

¡¡¤³¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¥Ý¥ê¥·¡¼¤Ç¤ÏƱ¤¸Í¥ÀèÅ٤Υ¿¥¹¥¯¤Ë»ØÄê»þ´Ö¤À¤±¥×¥í¥»¥Ã¥µ¤Î»ÈÍѸ¢¤òÍ¿¤¨¤Þ¤¹¡£¤â¤·Í¥ÀèÅ٤ι⤤¥×¥í¥»¥¹¤¬¼Â¹Ô²Äǽ¤Ë¤Ê¤ë¤È¤³¤Á¤é¤¬Í¥À褵¤ì¡¢¤½¤Î¥×¥í¥»¥¹¤Î¼Â¹Ô¤¬½ªÎ»¸å¡¢¸µ¤Î¥¿¥¹¥¯¤ÎÅÓÃæ¤«¤é¼Â¹Ô¤ò³¤±¤Þ¤¹¡£ ¡¡£Ó£Ö£Ò£´¤Î¥«¡¼¥Í¥ë¤Ç¤Ï¡¢Âç°è¥ê¥¢¥ë¥¿¥¤¥àÍ¥ÀèÅÙ¡Ê£±£µ£¹¡Á£±£°£°¡Ë¤È¤·¤Æ¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤¹¡££Ó£Ö£Ò£´¤Î¥ê¥¢¥ë¥¿¥¤¥àÍ¥ÀèÅÙ¤ò¤â¤Ã¤¿¥×¥í¥»¥¹¤Ï¡¢ÀßÄꤷ¤¿¥¯¥ª¥ó¥¿¥à»þ´Ö¤À¤±¤Ï¡¢¥¹¥±¥¸¥å¡¼¥é¤Ë¼ÙË⤵¤ì¤º¼Â¹Ô¤ò³¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤³¤Î»þ´Ö¤ò»È¤¤¤­¤ë¤È¥·¥¹¥Æ¥à¤¬¥È¥é¥Ã¥×¤òȯÀ¸¤·¡¢¥¹¥±¥¸¥å¡¼¥é¤Ï¾¤ËÍ¥ÀèÅ٤ι⤤¥×¥í¥»¥¹¤¬¼Â¹Ô¤Ç¤­¤ë¤«¤É¤¦¤«¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£¤³¤Î¥¯¥ª¥ó¥¿¥à»þ´Ö¤Ï¡¢Í¥Àè½ç°Ì¤Ë´Ø·¸¤Å¤±¤Æ¥«¡¼¥Í¥ëÀ¸À®»þ¤Ë¥Ñ¥é¥á¡¼¥¿ÀßÄꤹ¤ë¤¿¤áưŪ¤ËÊѲ½¤µ¤»¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ¡¡¤È¤³¤í¤Ç¡¢¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤Î¥¯¥ª¥ó¥¿¥à»þ´Ö¤Ï¡¢¾¯¤Ê¤¯¤È¤â£±¦ÌÉÃÄøÅÙ¤ÎÀºÅÙ¤¬¤Ê¤¤¤È¼ÂºÝ¤Î»ÈÍѤˤÏÌò¤Ë¤¿¤Á¤Þ¤»¤ó¤¬¡¢Åµ·¿Åª¤Ê£Ó£Ö£Ò£´¤Î¥¿¥¤¥à¥·¥§¥¢¥ê¥ó¥°¥×¥í¥»¥¹¤Îñ°Ì»þ´Ö¡Ê¥¯¥ª¥ó¥¿¥à¡Ë¤Ï£±£°£°£È£ú¤Ä¤Þ¤ê£±£°£íÉäǤ·¤«¤¢¤ê¤Þ¤»¤ó¡£¤³¤ì¤Ç¤Ï¡¢½½Ê¬¤Ê¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤ÏÉÔ²Äǽ¤Ç¤¹¡£ ¡¡£Ò£Ô£Õ¤Ç¤Ï¡¢¸å½Ò¤¹¤ë£¶£´£°£î£ó¤Î²òÁüÅÙ¤ò»ý¤Ã¤¿¥·¥¹¥Æ¥à¥¿¥¤¥Þ¤ò»ÈÍѤ·¤Æ¡¢£¶£´£°£î£ó¡Á£¶£°Ê¬¤ÎǤ°Õ¤Î»þ´Ö¤Ç¥é¥¦¥ó¥É¥í¥Ó¥ó¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤òÀ©¸æ¤Ç¤­¤Þ¤¹¡£ ¡¡¡¡¡¡¡¡¡¡ Í¥ÀèÅÙ ¥¯¥ª¥ó¥¿¥à ¡¡¡¡·×»»ÎÌ ¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­ ¡¡¡¡¡¡¡¡¡¡¥×¥í¥»¥¹£Á¡¡Äã°Ì¡¡¡¡¡¡£±¡¡¡¡¡Î£´Ã±°Ì»þ´Ö½ªÎ»¡Ï ¨£¨¡¨¡¨¡¨¡ ¥×¥í¥»¥¹£Â Ãæ°Ì £± ¡Î£µÃ±°Ì»þ´Ö½ªÎ»¡Ï ¨£¨¤¨£¨¤¨£¨¤¨£¨¤¨£¨¤ ¨¢ ¥×¥í¥»¥¹£Ã Ãæ°Ì £± ¡Î£·Ã±°Ì»þ´Ö½ªÎ»¡Ï ¨¢¨¦¨¥¨¦¨¥¨¦¨¥¨¦¨¥¨¦¨¡¨¡¨¥ ¥×¥í¥»¥¹£Ä ¹â°Ì £± ¡Î£³Ã±°Ì»þ´Ö½ªÎ»¡Ï¨¡¨¡¨¡¨¥ ¸ÇÄêÍ¥ÀèÅ٥饦¥ó¥É¥í¥Ó¥ó¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥°

£³¡¥£³¡¡¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹À©¸æ

¡¡£Ò£Ô£Õ¤Ë¤ª¤±¤ë¡¢¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹À©¸æ¤Ï¡¢²¼É½¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÇÀ©¸æ¤·¤Þ¤¹¡£ ¡¡¤½¤Î¤Ê¤«¤Ç¤â£Ò£Ô£ÕÆÈ¼«¤Î¥ê¥¢¥ë¥¿¥¤¥à¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ï¡¢¼¡¤Î¤è¤¦¤Ê¹½Ê¸¤Î schedset/schedget ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ç»ØÄꤷ¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ó£ã£è£å£ä£ó£å£ô¡¿£ó£ã£è£å£ä£ç£å£ô¡¡¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¡¦¥Ý¥ê¥·¡¼¤ÎÀ©¸æ¤ò¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢ #include ¨¢ ¨¢ #include ¨¢ ¨¢ ¨¢ ¨¢ int schedset(pid,ppolicy,pprio,pquantum) ¨¢ ¨¢ int schedget(pid,ppolicy,pprio,pquantum) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢¡¡int pid; ¥×¥í¥»¥¹£É£Ä¡Ê£°¤Î¾ì¹ç¸Æ¤Ó¤À¤·¤¿¥×¥í¥»¥¹¼«¿È¡Ë ¨¢ ¨¢ int *ppolicy; SCHED_TS(SCHED_OTHER) ¥¿¥¤¥à¥·¥§¥¢¥ê¥ó¥°¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥° ¨¢ ¨¢ SCHED_FIFO ¥ê¥¢¥ë¥¿¥¤¥à¡¦ÀèÆþ¤ìÀè¤À¤·¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥° ¨¢ ¨¢ SCHED_RR ¥ê¥¢¥ë¥¿¥¤¥à¡¦¥é¥¦¥ó¥É¥í¥Ó¥ó¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥° ¨¢ ¨¢ int *pprio; MIN_TS_PRI ¡Á MAX_TS_PRI¡¡¥¿¥¤¥à¥·¥§¥¢¥ê¥ó¥°¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ÈÊ»ÍѤ¹¤ë(0¡Á28)¨¢ ¨¢ MIN_RT_PRI ¡Á MAX_RT_PRI¡¡¥ê¥¢¥ë¥¿¥¤¥à¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ÈÊ»ÍѤ¹¤ë(0¡Á63) ¨¢ ¨¢ struct timestruc { ¨¢ ¨¢ unsigned long int ts_sec; ÉÃñ°Ì ¨¢ ¨¢ long int ts_nsec; ¥Ê¥ÎÉÃñ°Ì ¨¢ ¨¢ } *pquantum; MIN_RT_QUAN ¡Á MAX_RT_QUAN¡¡¥·¥¹¥Æ¥à¡¦¥¯¥í¥Ã¥¯¤Î²òÁüÅÙ¤«¤é£¶£°Ê¬¤Þ¤Ç ¨¢ ¨¢ int nice(prio) ¡¡ ¡Ý£±£±¤«¤é¡Ý£²£°¤¬¸ÇÄêÍ¥ÀèÅ٣ƣɣƣϥ¹¥±¥¸¥å¡¼¥ê¥ó¥° ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¼¡¤Î¥×¥í¥°¥é¥à¤Ï¡¢¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤Ç¥é¥¦¥ó¥É¥í¥Ó¥ó¤ò¹Ô¤¦Îã¤Ç¡¢¥×¥í¥»¥¹¤Ï¡¢£±£°¥ß¥êÉäΥ饦¥ó¥É¡¦¥í¥Ó¥ó¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤òÀßÄꤷ»Ò¥×¥í¥»¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ ¡¡»Ò¥×¥í¥»¥¹¤Ï¡¢£Õ£Î£É£Ø¤Î¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤Ë½¾¤¤¡¢¿Æ¥×¥í¥»¥¹¤Î´Ä¶­¤ò°ú¤­·Ñ¤¤¤Ç¤¤¤Þ¤¹¤Î¤Ç¡¢¿Æ¥×¥í¥»¥¹¤È¤Þ¤Ã¤¿¤¯Æ±¤¸Ãͤò»ý¤Ã¤Æ¤¤¤ë»ö¤ò¥×¥í¥°¥é¥à¤Ç³Îǧ¤·¤Þ¤¹¡£ #include /* schedset(2) ¤ò»ÈÍÑ */ #include /* timestruc ¹½Â¤ÂΤòÄêµÁ*/ #include /* mpadvise(2) ¤ò»ÈÍÑ */ #include /* NULL ¤òÄêµÁ */ #define RT_MASK 0x4 /* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ */ #define CLK_FREQ 100 /* ¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¼þ´ü */ #define PROCESS_SLICE 10000000 /* £±£°¥ß¥êÉäò¥Ê¥ÎÉÃñ°Ì¤ÇÀë¸À */ /* ¤â¤· PROCESS_SLICE ¤è¤ê¥¯¥ª¥ó¥¿¥à»þ´Ö¤¬¤è¤ê¾®¤µ¤¤¾ì¹ç,¥¿¥¤¥ß¥ó¥°¤ÏÉÔÀµ³Î¤Ë¤Ê¤ë¤³¤È¤¬¤¢¤ë ¡¡ ¤³¤ì¤Ï¡¢¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥Ã¥µ¤Ë¤ª¤±¤ë CLK_FREQ ¤Î¥¯¥í¥Ã¥¯³ä¹þ¤ß¼þ´ü¤Ë°Í¸¤¹¤ë */ main () { int pidnew, /* »Ò¥×¥í¥»¥¹¤Î¥×¥í¥»¥¹£É£ÄÍѤÎÊÑ¿ô */ pid, /* ¿Æ¥×¥í¥»¥¹¤Î wait(2) ¤Ë¤ª¤±¤ë´Ø¿ô¤ÎÌá¤êÃÍÍѤÎÊÑ¿ô */ mask, /* ¥·¥¹¥Æ¥à¥×¥í¥»¥Ã¥µ¥Þ¥¹¥¯ÃÍÍѤÎÊÑ¿ô */ status; /* wait(2) ÍѤΥ¹¥Æ¥¤¥¿¥¹ÊÑ¿ô */ int policy; /* schedget/schedset¤Ç»ÈÍѤ¹¤ë¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¥Ý¥ê¥·¡¼ÍѤÎÊÑ¿ô*/ int prio; /* schedget/schedset¤Ç»ÈÍѤ¹¤ë¥¹¥±¥¸¥å¡¼¥ê¥ó¥°Í¥ÀèÅÙÍѤÎÊÑ¿ô*/ struct timestruc quantum;/* schedget/schedset¤Ç»ÈÍѤ¹¤ë¥¯¥ª¥ó¥¿¥à»þ´ÖÍѤÎÊÑ¿ô*/ /* ¤³¤ì¤«¤éÊѹ¹¤¹¤ë¤¿¤á¤Ë schedget ¤ò»ÈÍѤ·¤Æ¸½ºß¤ÎÃͤò½ÐÎϤ¹¤ë¡£ ¥×¥í¥»¥¹£É£Ä¤¬ NULL ¤Ê¤Î¤Ç¤³¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï¥«¥ì¥ó¥È¡¦¥×¥í¥»¥¹¡¿¥¹¥ì¥Ã¥É¤ò°ÕÌ£¤¹¤ë*/ if (schedget (NULL, &policy, &prio, &quantum) < 0) perror ("schedget"), exit (1); /*¥ê¥¢¥ë¥¿¥¤¥à¡¢£±£°¥ß¥êÉäǤΥ饦¥ó¥É¥í¥Ó¥ó¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤òÀßÄꤹ¤ë¤¿¤á¤ËÊÑ¿ô¤ò½é´ü²½¤¹¤ë*/ policy = SCHED_RR; /* ¥é¥¦¥ó¥É¥í¥Ó¥ó¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¡¦¥Ý¥ê¥·¡¼ */ prio = MIN_RT_PRI; /* ºÇ¾®¥ê¥¢¥ë¥¿¥¤¥àÍ¥ÀèÅÙ */ quantum.ts_sec = 0; quantum.ts_nsec = PROCESS_SLICE; /* ¥×¥í¥»¥¹¤Î¥¯¥ª¥ó¥¿¥à»þ´Ö¤Ï£±£°¥ß¥êÉà */ if (schedset (NULL, &policy, &prio, &quantum) < 0) /* ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ò¥»¥Ã¥È¤¹¤ë */ perror ("schedset"), exit (2); /* ¤â¤·¥¨¥é¡¼¤Ê¤é¤Ð exit ¤¹¤ë */ mask = mpadvise (MPA_CPU_EXIST, 0); /* ¸½ºß¤Î¥·¥¹¥Æ¥à¤Î¥×¥í¥»¥Ã¥µ»ñ¸»¤òÆÀ¤ë */ /* ¤â¤·Ë¾¤à¥×¥í¥»¥Ã¥µ¤¬¥·¥¹¥Æ¥à¤Ë¸ºß¤¹¤ì¤Ð¡¢¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥Ã¥µ¤È¤·¤Æ³ÎÊݤ·¡¢ ¤½¤Î¥×¥í¥»¥Ã¥µ¤Ë¥×¥í¥»¥¹¤ò°Üư¤¹¤ë */ if (mask & RT_MASK) { if (mpadvise (MPA_RT_SET, RT_MASK) < 0) perror ("mpadvise MPA_RT_SET"), exit (3); /* £±£°¥ß¥êÉäΥ¯¥ª¥ó¥¿¥à»þ´Ö¤ò¼Â¸½¤¹¤ë¤¿¤á¤Ë¡¢¥·¥¹¥Æ¥à¡¦¥È¥é¥Ã¥×»þ´Ö¤òÊѹ¹¤¹¤ë */ if (mpadvise (MPA_CLK_SET, RT_MASK, CLK_FREQ) < 0) perror ("mpadvise MPA_CLK_SET"), exit (4); } else printf ("Running on a uniprocessor\n"); /* Êѹ¹¤·¤¿¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¥Ý¥ê¥·¡¼¤Î³ÆÃͤò½ÐÎϤ¹¤ë */ if (schedget (NULL, &policy, &prio, &quantum) < 0) perror ("schedget"), exit (5); if (pidnew = fork ()) /* »Ò¥×¥í¥»¥¹¤òÀ¸À®¤¹¤ë*/ { pid = wait (&status); if (status & 0xff) /* »Ò¥×¥í¥»¥¹¤Î½ªÎ»¥¹¥Æ¥¤¥¿¥¹¤ò¥Á¥§¥Ã¥¯¤¹¤ë */ { fprintf (stderr, "Child exited: signal %d\n", status); exit (10); } else exit (status >> 8); } else /* »Ò¥×¥í¥»¥¹ */ { int new_policy, new_prio; struct timestruc new_quantum; /* »Ò¥×¥í¥»¥¹¤¬¿Æ¥×¥í¥»¥¹¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ò°ú¤­·Ñ¤¤¤Ç¤¤¤ë¤«³Îǧ¤¹¤ë */ if (schedget (NULL, &new_policy, &new_prio, &new_quantum) < 0) perror ("schedget"), exit (5); if (new_policy != policy) fprintf (stderr, "Policy was not inherited\n"), exit (6); if (new_prio != prio) fprintf (stderr, "Priority was not inherited\n"), exit (7); if (new_quantum.ts_sec != quantum.ts_sec || new_quantum.ts_nsec != quantum.ts_nsec) perror ("Time quantum was not inherited\n"), exit (8); if (mpadvise (MPA_RT_GET, 0) != RT_MASK) perror ("Processor mask was not inherited\n"), exit (9); printf ("Round-robin child with mask %#x\n", mpadvise (MPA_RT_GET, 0)); exit (0); } } ¡¡¤Þ¤¿£Ò£Ô£Õ¤Ç¤Ï¡¢¥ê¥¢¥ë¥¿¥¤¥à¡¦Í¥ÀèÅÙ¤ò»ý¤Ã¤¿¥×¥í¥»¥¹¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤òÀ©¸æ¤¹¤ë¡¢hold,release,yield ¤È¤¤¤Ã¤¿¥·¥¹¥Æ¥à¥³¡¼¥ë¤â¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£è£ï£ì£ä¡¤£ò£å£ì£å£á£ó£å¡¤£ù£é£å£ì£ä¡¡¥×¥í¥»¥¹¡¦¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ÎÀ©¸æ ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢int hold() ¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹¤ò¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤«¤é¤Ï¤º¤¹ ¨¢ ¨¢int release(pid) ¥Û¡¼¥ë¥É¾õÂÖ¤Î¥×¥í¥»¥¹¤ò²òÊü¤·¼Â¹Ô¾õÂ֤ˤâ¤É¤¹ ¨¢ ¨¢int yield() ¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹¤ò£Æ£É£Æ£Ï¤ÎºÇ¸å¤Ë°Üư¤·ºÆ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤¹¤ë ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡°Ê²¼¤Î¥×¥í¥°¥é¥à¤Ï¡¢¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤Ë£²¤Ä¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹¤òÀ¸À®¤·¡¢hold,release ¤ÇƱ´ü¤ò¤È¤ë¤â¤Î¤Ç¤¹¡£ ¿Æ¥×¥í¥»¥¹ mpadvise mpadvise fork schedset ½èÍý release wait exit »Ò¥×¥í¥»¥¹ schedset hold exit #include #include #define cpu_mask 0x4 main() { int pid=0,status,ppolicy=SCHED_FIFO,pprio=MIN_RT_PRI,cprio=MIN_RT_PRI+1; ¡¡¡¡if ( mpadvise(MPA_RT_SET,cpu_mask) ) { perror("¥ê¥¢¥ë¥¿¥¤¥à¥¹¥ì¡¼¥Öµ¡Ç½"); exit(1); } ¡¡¡¡if ( mpadvise(MPA_60HZ_OFF,cpu_mask) ) { perror("¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤Î¶Ø»ß"); exit(2); } if (pid = fork()) { /* »Ò¥×¥í¥»¥¹ */ if (schedset(pid,&ppolicy,&cprio,NULL)){ perror("¥¹¥±¥¸¥å¡¼¥ë¥»¥Ã¥È"); exit(2); } hold();/*¿Æ¥×¥í¥»¥¹¤òÂÔ¤Ä*/ /* ·×»»Åù */ exit(); } else {/* ¿Æ¥×¥í¥»¥¹ */ if (schedset(pid,&ppolicy,&pprio,NULL)){ perror("¥¹¥±¥¸¥å¡¼¥ë¥»¥Ã¥È"); exit(2); } sleep(10);/*¼ÂºÝ¤ÏÁ°½èÍýÅù*/ release(pid); /* ·×»»Åù */ wait(&status); } }

£³¡¥£´¡¡¥¤¥Ù¥ó¥È¶îư·¿¥¹¥±¥¸¥å¡¼¥ê¥ó¥°

£³¡¥£´¡¥£±¡¡£Á£Ó£Ô¡Ê£Á£ó£ù£î£ã£è£ò£ï£î£ï£õ£ó¡¡£Ó£ù£ó£ô£å£í¡¡£Ô£ò£á£ð£ó¡Ë

¡¡³ä¹þ¤ß¶îư·¿¤È¤â¸Æ¤Ð¤ì¤ë¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ç¡¢°ìÈÌŪ¤Ê£Õ£Î£É£Ø¤Ç¤Ï¥­¡¼¥Ü¡¼¥É³ä¹þ¤ßÅù¤¬¤³¤ÎÉôÎà¤ËÆþ¤ë¤È¹Í¤¨¤é¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¤Ê¤Ë¤«È󯱴ü¤ËȯÀ¸¤¹¤ë»ö¾Ý¤ò¤È¤é¤¨¤Æ¥×¥í¥»¥¹¤òµ¯Æ°¤¹¤ëµ¡¹½¤Ç¤¹¡£ ¡¡É¸½à£Õ£Î£É£Ø¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ç¤¤¤¨¤Ð¡¢£ó£é£ç£î£á£ì¡¤£ë£é£ì£ìÅù¤¬¤³¤ì¤ËÅö¤¿¤ê¤Þ¤¹¤¬¡¢¼ÂºÝ¤Ë¤Ï¸½¼Â¤Î¥Ç¥Ð¥¤¥¹¤È·ë¤Ó¤Ä¤«¤Ê¤¤¤È°ÕÌ£¤¬¤Ê¤¤¤¿¤á¡¢É¸½à¥Ç¥Ð¥¤¥¹°Ê³°¤Ï¡¢¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥Ð¡¦¥ì¥Ù¥ë¤Î¥×¥í¥°¥é¥à¤¬É¬Íפˤʤê¤Þ¤¹¡£ ¡¡¤·¤«¤·¡¢É¸½à¥Ç¥Ð¥¤¥¹¤Ç¤â£Õ£Î£É£Ø¤Ë¤ª¤±¤ëÈ󯱴ü»ö¾Ý¤ËÂФ¹¤ë°·¤¤¤ÏÈó¾ï¤Ë¼ê¹Ó¤¯¡¢³ä¹þ¤ß¤ò¥æ¡¼¥¶¥×¥í¥»¥¹¤ËÅÁ¤¨¤ëµ¡¹½¤Ç¤¢¤ë£ó£é£ç£î£á£ì¤Ë¤Ï¡¢²¼µ­¤Î¤è¤¦¤Ê¹­¤¯ÃΤé¤ì¤¿·çÅÀ¤¬¤¢¤ê¤Þ¤¹¡£ £±¡Ë¥­¥å¡¼¥¤¥ó¥°¤Ç¤­¤Ê¤¤¤¿¤á¡¢¥·¥°¥Ê¥ë¤ò¼º¤¦¤³¤È¤¬¤¢¤ë¡£ £²¡ËÍ¥ÀèÅÙÉÕ¤±¤¬¤Ç¤­¤Ê¤¤¤¿¤á¶ÛµÞÅ٤Τ¢¤ë¤â¤Î¤¬¸å²ó¤·¤Ë¤Ê¤ë¶²¤ì¤¬¤¢¤ë¡£ £³¡ËÁí¿ô(32)¤¬·è¤Þ¤Ã¤Æ¤¤¤Æ¥æ¡¼¥¶ÄêµÁ¤Ï£²¤Ä(SIGUSR1,SIGUSR2)¤·¤«¤Ê¤¤¡£ £´¡Ë¥Ç¡¼¥¿¼ø¼õ¤¬¤Ç¤­¤Ê¤¤¤¿¤á¡¢Ã±½ã¤Ê½èÍý¤·¤«¤Ç¤­¤Ê¤¤¡£ £µ¡Ë¼õ¿®¥×¥í¥»¥¹¤ÏÁ÷¿®¥×¥í¥»¥¹¤«¤é¤Î³ä¹þ¤ß¤ò¥Ö¥í¥Ã¥¯¤Ç¤­¤Ê¤¤¡£ ¡¡¤³¤ÎÈ󯱴ü¥¤¥Ù¥ó¥È¤ÎÄÌÃΤÎÌäÂê¤ËÂФ·¤Æ£Ð£Ï£Ó£É£ØÄó°Æ¤Ç¤Ï¡¢¥­¥å¡¼¥¤¥ó¥°µ¡¹½¤Èͽ¬²Äǽ¤Ê»þ´ÖÆâ¤Ç¤Î¥¤¥Ù¥ó¥ÈÄÌÃΡ¢¥Ç¡¼¥¿¤Î¼ø¼õÅù¤òµá¤á¤Æ¤¤¤Þ¤¹¡£ £Ò£Ô£Õ¤Ç¤Ï¡¢£ó£é£ç£î£á£ì¤Ë¤ß¤é¤ì¤ë·çÅÀ¤ò²ò·è¤¹¤ë¤¿¤á¤Ë°Ê²¼¤ÎÆÃħ¤ò»ý¤Ã¤¿£Á£Ó£Ô¡Ê£Á£ó£ù£î£ã£è£ò£ï£î£ï£õ£ó¡¡£Ó£ù£ó£ô£å£í¡¡£Ô£ò£á£ð£ó¡Ë¤È¸Æ¤Ð¤ì¤ëÈ󯱴ü¥¤¥Ù¥ó¥È¤ÎÄÌÃε¡¹½¤ò¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£¡Ê£Ä£Å£ÃÈǣ£ӣĤΣÁ£Ó£Ô¤È¤Ï°ÕÌ£¤¬°Û¤Ê¤ê¤Þ¤¹¡Ë £±¡ËÁ÷¿®¤·¤¿Ê£¿ô¤Î£Á£Ó£Ô¤Ï¥­¥å¡¼¥¤¥ó¥°¤µ¤ì¤ë¤¿¤á¥·¥°¥Ê¥ë¤ò¼º¤¦¤³¤È¤¬¤Ê¤¤¡£¡ö¡Ë £²¡Ë¥Ï¡¼¥É¥¦¥§¥¢³ä¹þ¤ß¤Î¤è¤¦¤Ë¡¢Í¥ÀèÅÙ¤òÀßÄê¤Ç¤­¤ë¤¿¤á¶ÛµÞÅ٤Τ¢¤ë¤â¤Î¤¬¸å²ó¤·¤Ë¤Ê¤ë¤³¤È¤¬¤Ê¤¤¡£ £³¡ËÁ÷¿®¤Ç¤­¤ë£Á£Ó£Ô¤Î¼ïÎà¡Ê¿ô¡Ë¤Ï»ö¼Â¾åÀ©¸Â¤¬¤Ê¤¤¡Ê£°¡Á£³£²£·£¶£·¡Ë £´¡Ë£³£²¥Ó¥Ã¥È¥Ç¡¼¥¿¼ø¼õ¤¬¤Ç¤­¤ë¤¿¤á¡¢£±¤Ä¤Î£Á£Ó£Ô¤Ç¤âÊ£¿ô¤Î½èÍý¤¬²Äǽ £µ¡Ë¼õ¿®¥×¥í¥»¥¹¤ÏÁ÷¿®¥×¥í¥»¥¹¤«¤é¤Î³ä¹þ¤ß¤ò¥Ö¥í¥Ã¥¯¤Ç¤­¤ë¡£ ¡¡£Á£Ó£Ô¤Ï¡¢³°Éô¥¤¥Ù¥ó¥È¤È¤ÎƱ´ü¤Ï¤â¤È¤è¤ê¡¢¥×¥í¥»¥¹¡¿¥¹¥ì¥Ã¥É´Ö¤ÎÄÌ¿®¡¢¾õÂÖÁ«°Ü¤Ë»ÈÍѤǤ­¤ë¤¿¤á¡¢¥æ¡¼¥¶¤Ï¥ê¥¢¥ë¥¿¥¤¥à¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò´Êñ¤«¤Ä°ÂÁ´¤ËÊݾڤµ¤ì¤¿»þ´ÖÆâ¤Ç¡¢µ¯Æ°¤µ¤»¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ £Á£Ó£Ô¤Ï¡¢°Ê²¼¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ç¡¢³°Éô¥×¥í¥»¥¹¡¿¥¹¥ì¥Ã¥É¤«¤é»ØÄꤷ¤¿¥×¥í¥»¥¹¡¿¥¹¥ì¥Ã¥É¤Î´Ø¿ô¤òµ¯Æ°¤Ç¤­¤Þ¤¹¡£ ¡ö¡Ë ¼ÂºÝ¤Î¥­¥å¡¼¥¤¥ó¥°¥µ¥¤¥º¤Ï¥·¥¹¥Æ¥à¥³¥ó¥Õ¥£¥°¥ì¡¼¥·¥ç¥ó¡¦¥Ñ¥é¥á¡¼¥¿¡¡nast ¤ËÀ©¸Â¤µ¤ì¤Æ¤¤¤Þ¤¹¡Ê¥Ç¥Õ¥©¥ë¥È¤Ï¡¢£±£°£°¡Ë ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢¡²£ó£å£î£ä£á£ó£ô¡¡£Á£Ó£Ô¡ÊÈ󯱴ü¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¡Ë¤ÎÁ÷¿® ¨¢ ¨¢ ¨¢ ¨¢ #include ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢ int _sendast(pid,lo_handler,func,param,priority); ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢ int pid; ¼õ¿®¥×¥í¥»¥¹¤Î¥×¥í¥»¥¹£É£Ä ¨¢ ¨¢ int (*lo_handler)(); Ä̾ï¤Ï¡¡_asthandler() ¤ò»ØÄꤹ¤ë ¨¢ ¨¢ int (*func)(); ¥·¥¹¥Æ¥à¥È¥é¥Ã¥×´Ø¿ô ¨¢ ¨¢ int param; Á÷¿®¥Ñ¥é¥á¡¼¥¿ ¨¢ ¨¢ int priority; £°¡Á£³£²£·£¶£·¤ÎÃͤò»ý¤Ä£Á£Ó£ÔÍ¥ÀèÅÙ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡pid ¤Ë£°¤ò»ØÄꤹ¤ë¤È¡¢Á÷¿®¥×¥í¥»¥¹¡¿¥¹¥ì¥Ã¥É¤ÈƱ°ì¤Î¥×¥í¥»¥¹¥°¥ë¡¼¥×¼±Ê̻Ҥò»ý¤Ä pid ¤¬£°¤È£±¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥×¥í¥»¥¹¡¿¥¹¥ì¥Ã¥É¤ËÁ÷¿®¤µ¤ì¤Þ¤¹¡£ ¡¡µ¯Æ°¤µ¤ì¤ë¥×¥í¥»¥¹¡¦¥¹¥ì¥Ã¥É¤Ï¡¢²¿¤«½èÍý¤ò¼Â¹Ô¤·¤Æ¤¤¤Æ¤âÎɤ¤¤·¡¢½èÍý¤¬Ìµ¤¤¾ì¹ç¤Ï¡¢°Ê²¼¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÇÂԤäƤ¤¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ ¡¡¤³¤Î¾ì¹ç¡¢¼õ¿®¥×¥í¥»¥¹¡¿¥¹¥ì¥Ã¥É¤Ï¡¢£Á£Ó£Ô¤ËÂФ·¤Æ¤ÎÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¤³¤È¤Ë¤è¤ê¡¢»ØÄêÍ¥ÀèÅٰʲ¼¤Î£Á£Ó£Ô¤ò¶Ø»ß¤¹¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ ¡¡¤Þ¤¿¡¢£Á£Ó£Ô¤Ë¤è¤Ã¤Æµ¯Æ°¤µ¤ì¤ë³ä¹þ¤ß´Ø¿ô¤Ï¡¢¼¡¤Î£³¤Ä¤Î¥Ñ¥é¥á¡¼¥¿¤ò°ú¤­ÅϤµ¤ì¤Þ¤¹¡£ func(param,pc,pri) int pram; /* _sendast() ¤Ç°ú¤­ÅϤµ¤ì¤¿¥Ñ¥é¥á¡¼¥¿ */ int pc; /* ³ä¤ê¹þ¤ó¤À¥×¥í¥»¥¹¤Î¥×¥í¥°¥é¥à¥«¥¦¥ó¥¿ */ int pri; /* ¼õ¿®¤·¤¿£Á£Ó£Ô¤Î£Á£Ó£ÔÍ¥ÀèÅÙ */ { } ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£á£ó£ô£ð£á£õ£ó£å¡¡£Á£Ó£ÔÍ¥ÀèÅÙÀßÄê¤È¥×¥í¥»¥¹¤ÎÄä»ß ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢ int astpause(priority,timeout); ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢ int priority; £°¡Á£³£²£·£¶£·¤ÎÃͤò»ý¤Ä£Á£Ó£ÔÍ¥ÀèÅÙ ¨¢ ¨¢ int timeout; ¡¡¡¡¡¡¥¿¥¤¥à¥¢¥¦¥È»þ´Ö¤ò¥ß¥êÉäǻØÄꤹ¤ë¡Ê¼Â²òÁüÅ٤ϥ·¥¹¥Æ¥à¥È¥é¥Ã¥×¤Ë°Í¸¡Ë¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡astpause ¤Î priority ¤¬Àµ¤ÎÃͤò»ý¤Ä¾ì¹ç¡¢ÂÔ¤Á¤Î´Ö£Á£Ó£ÔÍ¥ÀèÅÙ¤ò priority ¤Þ¤Ç°ú¤­¾å¤²¤Þ¤¹¤Î¤Ç¡¢Á÷¿®¥×¥í¥»¥¹¤Î£Á£Ó£ÔÍ¥ÀèÅÙ¤¬Ä㤤¾ì¹ç£Á£Ó£Ô¤Ï¥­¥å¡¼¥¤¥ó¥°¤µ¤ì¤Æ¤·¤Þ¤¤¤Þ¤¹¡£Éé¤ÎÃͤò»ý¤Ä¾ì¹ç¡¢£Á£Ó£ÔÍ¥ÀèÅ٤ϡ¢Êѹ¹¤µ¤ì¤Þ¤»¤ó¡£´Ø¿ô¤Ï¥¿¥¤¥à¥¢¥¦¥È¤ò¸¡½Ð¤¹¤ë¤È¡Ý£±¤òÊÖ¤·¡¢¥¿¥¤¥à¥¢¥¦¥ÈÁ°¤Ë£Á£Ó£Ô¤ò¸¡½Ð¤¹¤ë¤È¥¿¥¤¥à¥¢¥¦¥È¤Þ¤Ç¤Î»Ä¤ê»þ´Ö¤òÊÖ¤·¤Þ¤¹¡£ ¡¡¥×¥í¥»¥¹¼Â¹ÔÃæ¤Î£Á£Ó£ÔÍ¥ÀèÅÙ¤òÊѹ¹¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢setpri ¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê priority °Ê²¼¤Î£Á£Ó£ÔÍ¥ÀèÅÙ¡ÊÆ±°ìÍ¥ÀèÅÙ¤ò´Þ¤ß¤Þ¤¹¡Ë¤ò»ý¤Ä£Á£Ó£Ô¤ÎÁ÷¿®¤Ï¡¢¥­¥å¡¼¥¤¥ó¥°¤µ¤ì¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ó£å£ô£ð£ò£é¡¡£Á£Ó£ÔÍ¥ÀèÅÙ¤ÎÀßÄê ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢ int setpri(priority); ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢ int priority; £°¡Á£³£²£·£¶£·¤ÎÃͤò»ý¤Ä£Á£Ó£ÔÍ¥ÀèÅÙ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¼¡¤Î¥×¥í¥°¥é¥à¤Ï¡¢£²¤Ä¤Î¥×¥í¥»¥Ã¥µ¤Ë¥×¥í¥»¥¹¤ò³äÅö¤Æ¡¢¿Æ¥×¥í¥»¥¹¤«¤é»Ò¥×¥í¥»¥¹¤ËÂФ·¤Æ£Á£Ó£Ô¤òÁ÷¿®¤¹¤ë¥×¥í¥°¥é¥à¤Ç¤¹¡£ ¡¡¤³¤Î¤È¤­¡¢¿Æ¥×¥í¥»¥¹¤Ï¡¢¥Ö¡¼¥È¡¦¥×¥í¥»¥Ã¥µ¤Ç£Ô£Ó£Ó¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ç¤¹¤¬¡¢»Ò¥×¥í¥»¥¹¤Ï¡¢¥»¥«¥ó¥É¡¦¥×¥í¥»¥Ã¥µ¾å¤Ç¡¢¥ê¥¢¥ë¥¿¥¤¥à¡¦¥¹¥ì¡¼¥Ö¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ ¡¡¤³¤Î¤È¤­»Ò¥×¥í¥»¥¹¤Î¼Â¹Ô£Á£Ó£ÔÍ¥ÀèÅ٤ϣ°¤Ç¡¢Á÷¿®£Á£Ó£ÔÍ¥ÀèÅ٤ϣ±£°¤Ç¤¢¤ë¤¿¤á¡¢Í¥ÀèÅÙ¤«¤é»Ò¥×¥í¥»¥¹¤¬¼Â¹Ô¾õÂ֤Ǥâ³ä¹þ¤ß¶îư¤Ç´Ø¿ô¤¬µ¯Æ°¤µ¤ì¤Þ¤¹¡£ ¥ê¥¢¥ë¥¿¥¤¥à¡¦¥¹¥ì¡¼¥Ö¤ÈÈ󯱴ü¥·¥¹¥Æ¥à¡¦¥È¥é¥Ã¥×Îã #include /* mpadvise(2) ¤ËɬÍ×*/ #include /* #define NULL ¤ò»ÈÍÑ*/ #include /* rtplock(2) ¤ËɬÍ× */ #include /* schedset(2) ¤ËɬÍ× */ #define NON_BOOT 0xFD /* ¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ(0x2)°Ê³°¤Î¥×¥í¥»¥Ã¥µ¥Þ¥¹¥¯ */ #define CHILD_CPU 0x4 /* »Ò¥×¥í¥»¥¹¤Ï¡¢¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤Ç¼Â¹Ô */ #define AST_PRI 10 /* £Á£Ó£ÔÍ¥ÀèÅÙ */ #define END_TEST 4 /* £Á£Ó£Ô¤ÎÁ÷¿®¿ô */ int ast_rcvd; /* »Ò¥×¥í¥»¥¹¤Ç¼õ¿®¤·¤¿£Á£Ó£Ô¤Î¿ô¤ò³ÊǼ¤¹¤ëÊÑ¿ô*/ main () { int ast_sent; /* ¿Æ¥×¥í¥»¥¹¤ÇÁ÷¿®¤·¤¿£Á£Ó£Ô¤Î¿ô¤ò³ÊǼ¤¹¤ëÊÑ¿ô */ int mask; /* ¥·¥¹¥Æ¥à¤Ë¸ºß¤¹¤ë¥×¥í¥»¥Ã¥µ¤ò³ÊǼ¤¹¤ëÊÑ¿ô */ int pidchi; /* »Ò¥×¥í¥»¥¹£É£Ä³ÊǼÊÑ¿ô */ int status; /* »Ò¥×¥í¥»¥¹½ªÎ»¥¹¥Æ¡¼¥¿¥¹³ÊǼÊÑ¿ô/ int _asthandler (), resume_proc (); /* £Á£Ó£Ô¥Ï¥ó¥É¥é */ mask = mpadvise (MPA_CPU_EXIST, 0); /* ¥·¥¹¥Æ¥à¤Ë¸ºß¤¹¤ë¥×¥í¥»¥Ã¥µ¿ô¤òÆÀ¤ë */ if (!(mask & NON_BOOT)) /* ¤â¤·¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤Î¤ß¤Ê¤é½ªÎ»¤¹¤ë */ fprintf (stderr, "Program must run on a multiprocessor\n"), exit (1); if (pidchi = fork ()) /* ¿Æ¥×¥í¥»¥¹ */ { /*¡¡»Ò¥×¥í¥»¥¹¤ËÂФ·¤Æ£Á£Ó£Ô¤òÁ÷¿®¤¹¤ë */ for (ast_sent = 1; ast_sent <= END_TEST; ++ast_sent) { printf ("Parent sending AST; ast_sent = %d\n", ast_sent); if (_sendast (pidchi, _asthandler, resume_proc, ast_sent, AST_PRI) == -1) perror ("_sendast"), exit (2); astpause (-1, 100); } wait (&status); if (status) fprintf (stderr, "Child failed, status = %d\n", status), exit (3); else printf ("parent exiting\n"), exit (0); } else /* Child */ { int i; int policy = SCHED_FIFO; int prio = MIN_RT_PRI; /* ¸ÇÄêÍ¥ÀèÅ٣ƣɣƣϥ¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤òÀßÄê */ if (schedset (NULL, &policy, &prio, NULL) < 0) perror ("schedset"), exit (4); if (mpadvise (MPA_RT_SET, CHILD_CPU) < 0)/* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤Ç¼Â¹Ô */ perror ("Child MPA_RT_SET"), exit (5); /* £±£²£°£È£ú¤Î¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤òÄä»ß */ if (mpadvise (MPA_60HZ_OFF, CHILD_CPU) < 0) perror ("MPA_60HZ_OFF"), exit (6); /* ¥×¥í¥»¥¹¥»¥°¥á¥ó¥È¤ò¼çµ­²±¤Ë¾ïÃ󤵤»¤ë */ if ( rtplock(PROCLOCK) < 0) perror("rtplock"), exit (7); /* £Á£Ó£ÔÍ¥ÀèÅÙ¤ò£°¤ËÀßÄꤹ¤ë */ setpri (0); printf ("Child entering loop\n"); /* ¼õ¿®£Á£Ó£Ô¤Î¿ô¤¬ END_TEST ¤Ë¤Ê¤ë¤Þ¤Ç¥ë¡¼¥×¤¹¤ë¡£¾ï¤Ë¼Â¹Ô¾õÂ֤ˤ¢¤ë»ö¤ËÃí°Õ¡¡*/ while (ast_rcvd < END_TEST) ; printf ("child exiting\n"), exit (0); } } resume_proc (current) /* Á÷¿®¥×¥í¥»¥¹¤«¤éÁ÷¿®£Á£Ó£ÔÈֹ椬Á÷¿®¤µ¤ì¤Æ¤¯¤ë */ int current; { printf ("resume_proc: current = %d, ast_rcvd = %d\n", current, ++ast_rcvd); } ¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ ¡ý ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤Ë°Üư ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¡¡¡¡¡¡£æ£ï£ò£ë ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¥ê¥¢¥ë¥¿¥¤¥à¥¹¥ì¡¼¥Ö¤ËÀßÄê ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¡¡£Á£Ó£ÔÍ¥ÀèÅÙ¤ò£°¤ËÀßÄê ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¢ª ¡¡¡¡ ̵¸Â¥ë¡¼¥× ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£Á£Ó£Ô¤ÏÍ¥ÀèÅÙ¤ò»ý¤Á ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£Á£Ó£ÔÍ¥ÀèÅÙ£°¤Ç¼Â¹ÔÃæ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥­¥å¡¼¥¤¥ó¥°µ¡Ç½¤¬¤¢¤ë ¤³¤ÎÉôʬ¤Ï³ä¹þ¤ß½èÍý¤È¤·¤Æ¼Â¹Ô¤µ¤ì¤ë ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ £Á£Ó£ÔÍ¥ÀèÅÙ£±£°¤Î£Á£Ó£Ô¤òÁ÷¿® ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡ ¡¡¡¡£Á£Ó£Ô¤Î¼õ¿®¤È¼Â¹Ô ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥£Á£Ó£ÔÍ¥ÀèÅÙ£±£° ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ »Ò¥×¥í¥»¥¹¤Î½ªÎ»¤òÂÔ¤Ä ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥

£³¡¥£´¡¥£²¡¡²¾ÁÛ³ä¹þ¤ßµ¡¹½

¡¡£Á£Ó£Ô¤Ï¡¢¼õ¿®¥Ï¥ó¥É¥é¤Î´Ø¿ô¥¢¥É¥ì¥¹¤òÁ÷¿®Â¦¤Ç»ØÄꤹ¤ë¤¿¤á¡¢_sendast() ¤ò»ÈÍѤ¹¤ë¤È¤­¤Ë¤Ï¡¢½½Ê¬Ãí°Õ¤·¤Æ»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¡¢Ìµ´Ø·¸¤Ê¥×¥í¥»¥¹Æ±»Î¤ÎÄÌ¿®¤Ë¤Ï¡¢£ó£é£ç£î£á£ì¤«¤³¤³¤Ç½Ò¤Ù¤ë²¾ÁÛ³ä¹þ¤ßµ¡¹½¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¡¡²¾ÁÛ³ä¹þ¤ßµ¡¹½¤Ï¡¢¥×¥í¥»¥¹´ÖÄÌ¿®¤Ë¤ª¤±¤ë¥Ð¡¼¥Á¥ã¥ë¡¦¥µ¡¼¥­¥Ã¥È¤Î³ä¹þ¤ßÈǤȤ⤤¤¨¤ë¤â¤Î¤Ç¡¢Á÷¿®Éô¤È¼õ¿®Éô¤¬¸ß¤¤¤Î¥¤¥ó¥×¥ê¥á¥ó¥È¤Ë±Æ¶Á¤ò¼õ¤±¤ë»ö¤Ê¤¯¡¢Ãê¾ÝŪ¤Ê̾Á°¤Ç¥³¥Í¥¯¥·¥ç¥ó¤ò³ÎΩ¤µ¤»¤ë»ö¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ ¡¡²¾ÁÛ³ä¹þ¤ßµ¡¹½¤Ë¤Ï¡¢¼¡¤Î£²¤Ä¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤¬Â¸ºß¤·¤Þ¤¹¡£ ¡¦¥æ¡¼¥¶¥×¥í¥»¥¹ ¡¦£Ò£Ô£Õ¥«¡¼¥Í¥ë¡¿¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥Ð ¡¡¤³¤³¤Ç¤Ï¡¢¥æ¡¼¥¶¥×¥í¥»¥¹¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Î¤ß¤Ë¤Ä¤¤¤ÆÀâÌÀ¤ò¤·¤Þ¤¹¡££Ò£Ô£Õ¥«¡¼¥Í¥ë¡¿¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥Ð¤ÎÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢"Guide to Writing a UNIX Device Driver" ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ¡¡²¾ÁÛ³ä¹þ¤ßµ¡¹½¤Ï¡¢¤Þ¤º²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ËÂФ·¤Æ²¾ÁÛŪ¤Ê¥¿¥°Ì¾¤ò¤Ä¤±¤ÆÀ¸À®¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ¥Á¥ã¥Í¥ë¤ÏÄ̾ºîÀ®¤·¤¿¥æ¡¼¥¶¥×¥í¥»¥¹¡¢¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥Ð¡¢£Ò£Ô£Õ¥«¡¼¥Í¥ë¤Ë¤è¤Ã¤Æ½êÍ­¤µ¤ì¡¢ºîÀ®¼Ô¤¬Â¸ºß¤¹¤ë¤«¤®¤ê¡¢¥Á¥ã¥Í¥ë¤Ï¸ºß¤·¤Þ¤¹¡£ ¡¡¤¿¤À¤·¡¢¥Á¥ã¥Í¥ë¤Ï¡¢£Ò£Ô£Õ¥«¡¼¥Í¥ë¤Ë°ú¤­ÅϤ¹»ö¤¬¤Ç¤­¤Þ¤¹¤Î¤Ç¡¢¤½¤Î¾ì¹ç¤ÏÌÀ¼¨Åª¤Ëºï½ü¤¹¤ë¤«¥·¥¹¥Æ¥à¤¬¥ê¥Ö¡¼¥È¤¹¤ë¤Þ¤Ç¸ºß¤·¤Þ¤¹¡£°Ê¹ß¤Î¥Á¥ã¥Í¥ëÀܳ¤Î¤¿¤á¤Î°À­¤ä¸¢Íø¤Ï¡¢¥Á¥ã¥Í¥ëºîÀ®»þ¤Ë»ØÄꤹ¤ë»ö¤¬¤Ç¤­¤Þ¤¹¡£ ¡¡¥Á¥ã¥Í¥ë¤ÎºîÀ®¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ê¹½Ê¸¤ÇÀ¸À®¤µ¤ì¤Þ¤¹¡£À¸À®¤Ë¼ºÇÔ¤¹¤ë¤È´Ø¿ô¤Ï¡Ý£±¤òÊÖ¤·¡¢À®¸ù¤¹¤ë¤È¥Á¥ã¥Í¥ë£É£Ä¤òÊÖ¤·¤Þ¤¹¡£ if ((chan = vi_create ("chnnel_name", 1, VIP_DORMANT)) == -1) { perror ("could not create the virtual interrupt channel"); exit (1); } ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ö£é¡²£ã£ò£å£á£ô£å ¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ÎÀ¸À® ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢VICHANID vi_create(name,maxcon,perm,flags,arg) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢unsigned char *name; ¥Á¥ã¥Í¥ë¤ò»ØÄꤹ¤ë¥·¥¹¥Æ¥à¤Ç¥æ¥Ë¡¼¥¯¤Ê¥¿¥°Ì¾¤òÀßÄê ¨¢ ¨¢ ¡ÊMAXPATHLEN°Ê²¼¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡Ë ¨¢ ¨¢int maxcon; °ìÅÙ¤ËÀܳ¤Ç¤­¤ë¥Á¥ã¥Í¥ë¤ÎºÇÂçÀܳ¿ô¡Ê¥Ç¥Õ¥©¥ë¥È¤Ï 30 ¡Ë ¨¢ ¨¢unsigned int perm; ¥Á¥ã¥Í¥ëºîÀ®¤Î°À­¤È¸¢Íø¤ò°Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤·¤Æ¤¤¤ë ¨¢ ¨¢ VIP_SO_ANY ¥Á¥ã¥Í¥ë¤ËÂФ·¤ÆÀ©Ìó¤Î̵¤¤È¯¿®Àܳ¤òÁªÂò¤·¤Þ¤¹ ¨¢ ¨¢ VIP_SO_PRIV ÆÃ¸¢¥×¥í¥»¥¹¡Ê¥ë¡¼¥È£É£Ä¡ËÍѤΥ½¡¼¥¹¥Á¥ã¥Í¥ë¤ËÂФ·¤ÆÀܳ¤¹¤ë ¨¢ ¨¢ VIP_SO_KERNEL ¥«¡¼¥Í¥ëÍѤΥ½¡¼¥¹¥Á¥ã¥Í¥ë¤ËÂФ·¤ÆÀܳ¤¹¤ë ¨¢ ¨¢¡¡¡¡¡¡¡¡VIP_SE_ANY ¥æ¡¼¥¶¥×¥í¥»¥¹ÍѤΥÁ¥ã¥Í¥ë¤ò¥»¥ó¥¹¤¹¤ë ¨¢ ¨¢ VIP_SE_PRIV ÆÃ¸¢¥×¥í¥»¥¹¡Ê¥ë¡¼¥È£É£Ä¡ËÍѤΥÁ¥ã¥Í¥ë¤ò¥»¥ó¥¹¤¹¤ë ¨¢ ¨¢ VIP_SE_KERNEL ¥«¡¼¥Í¥ëÍѤΥÁ¥ã¥Í¥ë¤ò¥»¥ó¥¹¤¹¤ë ¨¢ ¨¢ VIP_DORMANT ¥Á¥ã¥Í¥ë¤òÄä»ß¾õÂ֤ˤ¹¤ë¡£¤³¤Î·ë²Ì¡¢vi_map()¤Ë¤è¤ë¥¢¥¯¥»¥¹¤¬¶Ø»ß¤µ¤ì¤ë ¨¢ ¨¢ ¥Á¥ã¥Í¥ë¤ò³èÀ­²½¤·¤Ævi_map()¤òÀ®¸ù¤µ¤»¤ë¤¿¤á¤Ë¤Ïvi_ctl()¤¬É¬ÍפǤ¢¤ë ¨¢ ¨¢unsigned int flags; ¾­Íè¤Î³ÈÄ¥ÍѤËͽÌó ¨¢ ¨¢unsigned int arg; ¾­Íè¤Î³ÈÄ¥ÍѤËͽÌó ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡À¸À®¤·¤¿¥Á¥ã¥Í¥ë¤Ï¡¢vi_delete()¤Çºï½ü¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ´Ø¿ô¸Æ¤Ó¤À¤·¤ËÀ®¸ù¤¹¤ë¤È´Ø¿ô¤Ï£±¤òÊÖ¤·¡¢¼ºÇÔ¤¹¤ë¤È£°¤òÊÖ¤·¤Þ¤¹¡£ ¡¡¤³¤³¤Ç¥Á¥ã¥Í¥ë¤Ï¡¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë°ÊÁ°¤Ëȯ¹Ô¤µ¤ì¤¿¡¢¥¤¥Ù¥ó¥È¤äÀܳÍ׵᤬¤¹¤Ù¤Æºï½ü¤µ¤ì¤¿¸å¤Çºï½ü¤µ¤ì¤Þ¤¹¡£ if (vi_delete(chanid)==0) { perror("could not delete the virtual interrupt channel"); } ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ö£é¡²£ä£å£ì£å£ô£å ¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤Îºï½ü ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢int vi_delete(chanid); ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢VICHANID chanid;¡¡¥Á¥ã¥Í¥ë¤ò»ØÄꤹ¤ë¥Á¥ã¥Í¥ë£É£Ä ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤Ï¡¢¥¤¥Ù¥ó¥È¤ÎÁ÷¿®µ¡¹½¤ò¡¢£ó£é£ç£î£á£ì¡¤£Á£Ó£Ô¡¤£Ð£Ï£Ó£É£Ø¥¤¥Ù¥ó¥È¤Î£³¤Ä¤«¤éÁªÂò¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¡Ê¤¿¤À¤·¸½ºß¤Î¥¤¥ó¥×¥ê¥á¥ó¥È¤Ë£Ð£Ï£Ó£É£Ø¥¤¥Ù¥ó¥È¤ÏÁȤ߹þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¡Ë ¤³¤ì¤é¤Î´ÉÍý¤Ï¡¢ ACTION ¹½Â¤ÂΤ˥¤¥Ù¥ó¥ÈÄÌÃε¡¹½¤òÅÐÏ¿¤¹¤ë»ö¤Ë¤è¤Ã¤Æ²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢¥æ¡¼¥¶¤Ï¼¡¤Î¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ·¤Æ ACTION ¹½Â¤ÂΤò½é´ü²½¤·¤Þ¤¹¡£ ¡¡°Ê²¼¤ÎÎã¤Ï¡¢ACTION ¹½Â¤ÂΤËÂФ·¤Æ£Á£Ó£Ô¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë½é´ü²½¤¹¤ë¤â¤Î¤Ç¡¢´Ø¿ô func ¤ò£Á£Ó£ÔÍ¥ÀèÅÙ£±£°¤È¤·¤Æ¡¢¼õ¿®³ä¹þ¤ß´Ø¿ô¤È¤·¤ÆÅÐÏ¿¤·¤Þ¤¹¡£ ¡¡¤³¤³¤Ç¥Õ¥é¥°¤Ï ACT_UPDATE ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢¥Ñ¥é¥á¡¼¥¿¤Ï¡¢Á÷¿®Â¦¤è¤êÁ÷¤é¤ì¤Æ¤­¤¿ÃͤËÃÖ¤­´¹¤¨¤ì¤Þ¤¹¤¬¡¢Á÷¿®¥Ñ¥é¥á¡¼¥¿¤¬Ìµ¤¤¾ì¹ç initial_val ¤¬´Ø¿ô func ¤Ë°ú¤­ÅϤµ¤ì¤Þ¤¹¡£ ¡¡¤Þ¤¿¡¢²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤Ç¤Ï¡¢¥¤¥Ù¥ó¥È¤Ï¡Ê¥¤¥Ù¥ó¥È¡¦¥«¥¦¥ó¥¿¤Ë¤è¤Ã¤Æ¡Ë¥­¥å¡¼¥¤¥ó¥°¤µ¤ì¤Þ¤¹¤¬¡¢¥Ç¡¼¥¿¤Ï¥­¥å¡¼¥¤¥ó¥°¤µ¤ì¤º¤Ë¾å½ñ¤­¤µ¤ì¤ë¤Î¤Ç¡¢»ÈÍѤˤ¢¤Ã¤¿¤Ã¤ÆÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ if ( !(pact = actast (NULL, func, initial_val, 10, ACT_UPDATE)) { perror ("ACTION structure could not be allocated"); exit (1); } Á÷¿®¥×¥í¥»¥¹ ACTION ¹½Â¤ÂÎ ¼õ¿®¥×¥í¥»¥¹ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¨¢ ¨¢ ¥¤¥Ù¥ó¥È¥¿¥¤¥× ¨¢ ¨¢ actast ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¥Ï¥ó¥É¥é ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢Äã¥ì¥Ù¥ë¥Ï¥ó¥É¥é¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ £Á£Ó£ÔÍ¥ÀèÅÙ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢data area ¨¢SENSE ¨¢ ¨¢ ¨¢ ¨¢ MAPSOURCE ¨¢¨£¨¡¨¤ ¨£¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¢ ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨«¨«¨¡¨©¢ª¨¢ ¡¡ £Á£Ó£Ô¥­¥å¡¼ func(arg) ¨¢ ¨¢ ¨¢ ¨¢¨¦¨¡¨¥ ¨¦¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¨¢ ¨¢ ¨¢event countor ¨¢ ¨¢ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£á£ã£ô£á£ó£ô ¡¡¥¤¥Ù¥ó¥ÈÄÌÃε¡¹½¤Ë£Á£Ó£Ô¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë¡¢ACTION¹½Â¤ÂΤò½é´ü²½¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢ACTION actast(act,func,arg,pri,flags) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢ACTION *act ACTION; ACTION ¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¡£ ¨¢ ¨¢ ¥Ý¥¤¥ó¥¿¤¬ NULL ¤Ç¤¢¤ë¾ì¹ç¡¢ACTION ¹½Â¤ÂÎ¤Ï actast()¤Ë¤è¤Ã¤Æ³ä¤êÅö¤Æ¤é¤ì¤ë¨¢ ¨¢void (*func)(); £Á£Ó£Ô¤ÎȯÀ¸»þ¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë´Ø¿ô ¨¢ ¨¢int arg; func ¤Ë°ú¤­ÅϤµ¤ì¤ëÀÅŪ¤Ê¥Ñ¥é¥á¡¼¥¿ ¨¢ ¨¢int pri; £Á£Ó£ÔÍ¥ÀèÅÙ ¨¢ ¨¢unsigned int flags; £°¤Î¾ì¹ç¤Ë¤Ï£Á£Ó£Ô¼õ¿®Â¦¤Ë¾ï¤Ë arg ¤¬°ú¤­ÅϤµ¤ì¡¢¤½¤ì°Ê³°¤Î¾ì¹ç°Ê²¼¤ÎÄÌ¤ê ¨¢ ¨¢ ACT_UPDATE £Á£Ó£Ô¤Ë¤è¤Ã¤Æ°ú¤­ÅϤµ¤ì¤¿¥Ñ¥é¥á¡¼¥¿¤¬Â¸ºß¤¹¤ë¾ì¹ç¡¢arg ¤Ë¤³¤ì¤òÂåÆþ¤¹¤ë ¨¢ ¨¢ ACT_FIRST £Æ£á£ó£ô£Á£Ó£Ô¤Ç¤¢¤ë¾ì¹ç¤Î¤ß arg ¤ËÂåÆþ¤¹¤ë ¨¢ ¨¢ ACT_NOQUEUE Á°¤Î£Á£Ó£Ô¤¬Á÷¿®¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç£Á£Ó£Ô¤òÇË´þ¤¹¤ë ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£á£ã£ô£ó£é£ç ¡¡¥¤¥Ù¥ó¥ÈÄÌÃε¡¹½¤Ë£ó£é£ç£î£á£ì¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë¡¢ACTION¹½Â¤ÂΤò½é´ü²½¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢ACTION actsig(act,sig) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢ACTION *act; ACTION ¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¡£ ¨¢ ¨¢ ¥Ý¥¤¥ó¥¿¤¬ NULL ¤Ç¤¢¤ë¾ì¹ç¡¢ACTION ¹½Â¤ÂÎ¤Ï actast()¤Ë¤è¤Ã¤Æ³ä¤êÅö¤Æ¤é¤ì¤ë¨¢ ¨¢int sig; £ó£é£ç£î£á£ìÈÖ¹æ ¨¢ ¨¢ ¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤Ï¡¢¥Ç¥Õ¥©¥ë¥Èưºî¤Ë½é´ü²½¤µ¤ì¤ë¤¿¤á¡¢¤³¤ì°Ê³°¤Îưºî¤ò ¨¢ ¨¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡É¬ÍפȤ¹¤ë¾ì¹ç¡¢signal(2),sigset(2),sigvec(2) ¤Î¤¤¤º¤ì¤«¤Ë¤è¤Ã¤Æ½é´ü²½¤ò ¨¢ ¨¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤ ¡¡¡¡¡¡ ¡¡ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¤³¤³¤ÇÃí°Õ¤·¤Æ¤Û¤·¤¤¤Î¤Ï¡¢actast() ¤ä actsig() ¤Ë¤è¤Ã¤Æ ACTION ¹½Â¤ÂΤ¬½é´ü²½¤µ¤ì¤Ê¤¤¤¦¤Á¤Ë¡¢¥¤¥Ù¥ó¥È¤Îȯ¿®¤¬µ¯¤³¤Ã¤Æ¤·¤Þ¤¦¤È¡¢°Û¾ïưºî¤òµ¯¤³¤·¤Æ¤·¤Þ¤¦»ö¤Ç¤¹¡£ ¡¡¤³¤ì¤òËɻߤ¹¤ë¤¿¤á¤Ë¡¢²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤òÀ¸À®¤¹¤ëºÝ¤Ë¡¢VIP_DOMANT ¤ò»ØÄꤷ¤Æ¥Á¥ã¥Í¥ë¤òÄä»ß¾õÂ֤ˤ·¤Æ¤ª¤­¤Þ¤¹¡£ ¡¡ACTION ¹½Â¤ÂΤ¬¡¢´õ˾¤Î¥¤¥Ù¥ó¥ÈÄÌÃε¡¹½¤Ë½é´ü²½¤Ç¤­¤¿¤é¡¢°Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ¥Á¥ã¥Í¥ë¤ÈÀܳ¤·¤Þ¤¹¡£ if ((vi_sense (chan, pact)) == -1) { perror ("could not establish a sense connection"); exit (1); } ¡¡vi_sense() ¤Ï¡¢²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤Ø¤ÎÀܳ¤ò»î¤ß¡¢½èÍý¤ËÀ®¸ù¤¹¤ë¤È¡¢vi_sense() ¤ÏÁªÂò¤µ¤ì¤¿¥Á¥ã¥Í¥ë¤Ë¸ÇÍ­¤ÎÀܳ£É£Ä¤ò¡¢¼ºÇÔ¤¹¤ë¤È¡Ý£±¤òÊÖ¤·¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ö£é¡²£ó£å£î£ó£å¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ÎÀܳ ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢VICONID vi_sense(chanid,pact,flags,arg) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢VICHANID chanid; ²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ò»ØÄꤹ¤ë ¨¢ ¨¢ ¨¢ ¨¢action pact; ACTION ¹½Â¤ÂΤؤΥݥ¤¥ó¥¿ ¨¢ ¨¢ ¨¢ ¨¢unsigned int flags; ¾­Íè¤Î³ÈÄ¥ÍѤËͽÌó ¨¢ ¨¢ ¨¢ ¨¢unsigned int arg; ¾­Íè¤Î³ÈÄ¥ÍѤËͽÌó ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡Àܳ¤ò²ò½ü¤¹¤ë¤¿¤á¤Ë¤Ï¡¢°Ê²¼¤Î´Ø¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë chan ¤«¤éÀܳ£É£Ä conid ¤Îºï½ü¤ò»î¤ß¤Þ¤¹¡£À®¸ù¤¹¤ë¤È´Ø¿ô¤Ï£°¤òÊÖ¤·¡¢¼ºÇÔ¤¹¤ë¤È¡Ý£±¤òÊÖ¤·¤Þ¤¹¡£ if ((vi_nonsense (chanid, conid)) == -1) { perror ("could not establish a nonsense deconnection"); exit (1); } ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ö£é¡²£î£ï£î£ó£å£î£ó£å¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ÎÀܳ¤ò²ò½ü¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢int vi_nonsense(chanid,conid) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢VICHANID chanid;¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ò»ØÄꤹ¤ë ¨¢ ¨¢ ¨¢ ¨¢VICONID conid; ²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ÎÀܳ£É£Ä¤ò»ØÄꤹ¤ë ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡Àܳ¤ËÀ®¸ù¤·¤¿¤é¡¢Ää»ß¾õÂ֤ˤ¢¤ë²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ò³èÀ­²½¤·¤Ê¤¯¤Æ¤Ï¤¤¤±¤Þ¤»¤ó¡£¤³¤Î¤¿¤á¤Ë¤Ï¡¢vi_ctl() ¤ò»ÈÍѤ·¤Þ¤¹¡£ ¡¡vi_ctrl() ¤Ï¡¢²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ÎÀ©¸æ¤ò¹Ô¤¦´Ø¿ô¤Ç¡¢°Ê²¼¤Î¤è¤¦¤Ë»ÈÍѤ·¤Þ¤¹¡£ if ((vi_ctl (VICTL_ACTIVATE, chanid, 1)) == -1) { perror ("channel could not be activated"); exit (1); } ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ö£é¡²£ã£ô£ì¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ÎÀ©¸æ ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢int vi_ctl(cmd,arg1,arg2) ¨¢ ¨¢ ¨¢ ¨¢int cmd,arg1,arg2;¡¡¤¿¤À¤· arg1 ¤Ï¡¢(VICHANID)arg1; ¤¢¤ë¤¤¤Ï (unsigned char*)arg1; ¤Î¾ì¹ç¤â¤¢¤ë ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢cmd ¡¡°Ê²¼¤Ë¼¨¤¹µ¡Ç½¤òÄêµÁ¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢ VICTL_MAXCHAN arg1¤Ë¥¼¥í¡¿Èó¥¼¥í¤ò»ØÄꤷ¤Æ¡¢¥Á¥ã¥Í¥ë£É£Ä¤ÎÀ©¸Â¤òÀßÄê¡¿Æþ¼ê¤¹¤ë ¨¢ ¨¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ÀßÄê¤ÏÆÃ¸¢Áàºî¤Ç¤¢¤ê¡¢arg2 ¤ËÀ©¸Â¤òÀßÄꤷ¡¢´Ø¿ô¤ÏÌá¤êÃͤȤ·¤Æ°ÊÁ°¤ÎÃͤòÊÖ¤¹¨¢ ¨¢ ¨¢ ¨¢ VICTL_MAXSECON arg1¤Ë¥¼¥í¡¿Èó¥¼¥í¤ò»ØÄꤷ¤Æ¡¢Àܳ£É£Ä¤ÎÀ©¸Â¤òÀßÄê¡¿Æþ¼ê¤¹¤ë ¨¢ ¨¢ ÀßÄê¤ÏÆÃ¸¢Áàºî¤Ç¤¢¤ê¡¢arg2 ¤ËÀ©¸Â¤òÀßÄꤷ¡¢´Ø¿ô¤ÏÌá¤êÃͤȤ·¤Æ°ÊÁ°¤ÎÃͤòÊÖ¤¹¨¢ ¨¢ ¨¢ ¨¢ VICTL_NCHAN ¸½ºßÀßÄꤵ¤ì¤Æ¤¤¤ë¥Á¥ã¥Í¥ë¤Î¿ô¤òÆÀ¤ë ¨¢ ¨¢ ¨¢ ¨¢ VICTL_IMAPSZ arg1¤Ë¥¼¥í¡¿Èó¥¼¥í¤ò»ØÄꤷ¤Æ¡¢¥Þ¥Ã¥Ô¥ó¥°¥Æ¡¼¥Ö¥ë¤Î¥µ¥¤¥º¤òÀßÄê¡¿Æþ¼ê¤¹¤ë ¨¢ ¨¢ ÀßÄê¤ÏÆÃ¸¢Áàºî¤Ç¤¢¤ê¡¢arg2 ¤Ë¥µ¥¤¥º¤òÀßÄꤹ¤ë¡£¥Æ¡¼¥Ö¥ë¤Ï´û¤Ë¸ºß¤·¤Ê¤¤¾ì¹ç¨¢ ¨¢ ¤Ë¤Î¤ßºîÀ®¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë ¨¢ ¨¢ ¨¢ ¨¢ VICTL_DELALLTASK ¤³¤ì¤ÏÆÃ¸¢Áàºî¤Ç¤¢¤ê¥æ¡¼¥¶¤¬ºîÀ®¤·¤¿¤¹¤Ù¤Æ¤Î²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤òºï½ü¤¹¤ë¨¢ ¨¢ ¨¢ ¨¢ VICTL_DELMYTASK ¸Æ¤Ó¤À¤·¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ½êÍ­¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤òºï½ü¤¹¤ë¨¢ ¨¢ ¨¢ ¨¢ VICTL_DELALL ¤³¤ì¤ÏÆÃ¸¢Áàºî¤Ç¤¢¤ê¡¢¤¹¤Ù¤Æ¤ÎÈó±Ê³¤Î¥æ¡¼¥¶¤ª¤è¤Ó¥·¥¹¥Æ¥à½êÍ­¤Î²¾ÁÛ³ä¹þ¤ß ¨¢ ¨¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¥Á¥ã¥Í¥ë¤òºï½ü¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢ VICTL_MAXSENSE (VICHANID)arg1¤Ç¼¨¤µ¤ì¤ë¥Á¥ã¥Í¥ë£É£Ä¤ÎºÇÂçÀܳÃͤò´Ø¿ô¤ÎÌá¤êÃͤȤ·¤ÆÆÀ¤ë ¨¢ ¨¢ ¨¢ ¨¢ VICTL_NSENSE (VICHANID)arg1 ¤Ç¼¨¤µ¤ì¤ë¥Á¥ã¥Í¥ë£É£Ä¤Î´ûÀܳ¿ô¤ò´Ø¿ô¤ÎÌá¤êÃͤȤ·¤ÆÆÀ¤ë ¨¢ ¨¢ ¨¢ ¨¢ VICTL_NMAP (VICHANID)arg1 ¤Ç¼¨¤µ¤ì¤ë¥Á¥ã¥Í¥ë£É£Ä¤ËÀܳ¤µ¤ì¤Æ¤¤¤ë¥¤¥Ù¥ó¥Èȯ¿®¸µ¤Î ¨¢ ¨¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¿ô¤ò´Ø¿ô¤ÎÌá¤êÃͤȤ·¤ÆÆÀ¤ë¡£ ¨¢ ¨¢ ¨¢ ¨¢ VICTL_PERM (VICHANID)arg1 ¤Ç¼¨¤µ¤ì¤ë¥Á¥ã¥Í¥ë£É£Ä¤Î¸¢Íø¤ò´Ø¿ô¤ÎÌá¤êÃͤȤ·¤ÆÆÀ¤ë ¨¢ ¨¢ ¨¢ ¨¢ VICTL_NAMETOID (unsigned char*)arg1 ¤Ç¼¨¤µ¤ì¤ë¥·¥¹¥Æ¥à¤Ç¥æ¥Ë¡¼¥¯¤Ê¥¿¥°Ì¾¤«¤é¥Á¥ã¥Í¥ë£É£Ä¤ò¨¢ ¨¢ ´Ø¿ô¤ÎÌá¤êÃͤȤ·¤ÆÆÀ¤ë¡£¤³¤³¤Ç arg1 ¤Ï¡¢vi_create() ¤Ë¤è¤Ã¤ÆÌ¿Ì¾¤µ¤ì¤¿¥¿¥° ¨¢ ¨¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ̾¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£arg2 ¤Ë¥¼¥í¡¿Èó¥¼¥í¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤ê¡¢¥Á¥ã¥Í¥ë¤ò³è¨¢ ¨¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ À­²½¡¿Èó³èÀ­²½¤¹¤ë¡£¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¨¢ ¨¢ ¨¢ ¨¢ VICTL_ACTIVATE (VICHANID)arg1 ¤Ç¼¨¤µ¤ì¤ë¥Á¥ã¥Í¥ë£É£Ä¤ò¡¢arg2 ¤Ë¥¼¥í¡¿Èó¥¼¥í¤ò»ØÄꤹ¤ë¤³¤È ¨¢ ¨¢ ¤Ë¤è¤ê¡¢¥Á¥ã¥Í¥ë¤ò³èÀ­²½¡¿Èó³èÀ­²½¤¹¤ë¡£ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡²¾ÁÛ³ä¹þ¤ß¤òȯÀ¸¤µ¤»¤ë¤¿¤á¤Ë¤Ï¡¢vi_map()¤Ë¤è¤Ã¤Æ´õ˾¤Î¥Á¥ã¥Í¥ë¤ËÂФ·¤ÆÀܳ¤ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¤³¤Î¤È¤­¡¢Àܳ¤ËÀ®¸ù¤¹¤ì¤Ð¡¢¥Á¥ã¥Í¥ë£É£Ä¤ò¥Þ¥Ã¥×¥¤¥ó¥Ç¥Ã¥¯¥¹¤ËÊÑ´¹¤·¤Þ¤¹¤¬¡¢¼ºÇÔ¤·¤¿¾ì¹ç¡Ý£±¤òÊÖ¤·¤Þ¤¹¡£ if ((map_index = vi_map (chanid, 0)) == -1) { perror ("could not perform input mapping"); exit (1); } ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ö£é¡²£í£á£ð ¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ËÀܳ¤·¥Á¥ã¥Í¥ë£É£Ä¤ò¥Þ¥Ã¥×¥¤¥ó¥Ç¥Ã¥¯¥¹¤ËÊÑ´¹¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢VIMAPID vi_map(chanid,flags) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢VICHANID chanid;¡¡ ¥Á¥ã¥Í¥ë¤ò»ØÄꤹ¤ë¥Á¥ã¥Í¥ë£É£Ä ¨¢ ¨¢ ¨¢ ¨¢unsigned int flags; (flag & VIMAP_NOWAIT)¤ò»ØÄꤹ¤ë¤È¡¢¥Á¥ã¥Í¥ë¤¬Ää»ß¾õÂ֤ˤ¢¤ë¾ì¹ç ¨¢ ¨¢ ¥Ö¥í¥Ã¥¯¤»¤º¥¨¥é¡¼¤òÊÖ¤·¡¢£°¤Ê¤é¥Ö¥í¥Ã¥¯¤¹¤ë¡£ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¤Þ¤¿¡¢¥Þ¥Ã¥×¤µ¤ì¤¿¥Á¥ã¥Í¥ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Æºï½ü¤µ¤ì¤Þ¤¹¡£ if (vi_unmap (mapid) == -1) { perror ("could not unmapping input mapping"); exit (1); } ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ö£é¡²£õ£î£í£á£ð ¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤Î¥Þ¥Ã¥×¤òºï½ü¤·¡¢¥Þ¥Ã¥Ô¥ó¥°¡¦¥Æ¡¼¥Ö¥ë¤Î¥¨¥ó¥È¥ê¤ò²òÊü¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢int vi_unmap(mapid) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢VIMAPID mapid¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ò»ØÄꤹ¤ë¥Þ¥Ã¥×£É£Ä ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¥Þ¥Ã¥×¤ËÀ®¸ù¤·¤¿¥¤¥Ù¥ó¥È¤Îȯ¿®¸µ¥×¥í¥»¥¹¤Ï¡¢°Ê²¼¤Î vi_mapsource ¤ò»ÈÍѤ·¤Æ¥¤¥Ù¥ó¥È¤òȯ¿®¤·¤Þ¤¹¡£¤³¤Î¤È¤­¡¢¥¤¥Ù¥ó¥ÈÄÌÃε¡¹½¤Ë´Ø¤·¤Æ¤Ï¡¢È¯¿®¸µ¤Ï¤¤¤Ã¤µ¤¤´ØÃΤ·¤Þ¤»¤ó¡£ if ((vi_mapsource (vir_map_indx, arg)) == -1) { perror ("could not source the interrupt"); exit (1); } ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ö£é¡²£í£á£ð£ó£ï£õ£ò£ã£å ¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ËÂФ·¤Æ¥Ñ¥é¥á¡¼¥¿¤È¶¦¤Ëȯ¿®¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢int vi_mapsource(mapid,arg) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢VIMAPID mapid;¡¡²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ò»ØÄꤹ¤ë¥Þ¥Ã¥×£É£Ä ¨¢ ¨¢ ¨¢ ¨¢int arg; ¥¤¥Ù¥ó¥È¤È¶¦¤ËÁ÷¿®¤µ¤ì¤ë£³£²¥Ó¥Ã¥È¥Ñ¥é¥á¡¼¥¿ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡ÎãÂê¤È¤·¤Æ¡¢²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤Î´Êñ¤ÊÍÑË¡¤ò¼¨¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢£²¤Ä¤Î¥×¥í¥»¥¹´Ö¤Ç¡¢Ãê¾ÝŪ¤Ê fred ¤È¸À¤¦Ì¾Á°¤ò¥¿¥°¤Ë»ÈÍѤ·¡¢²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥ó¥Í¥ë¤òÀ¸À®¤·¡¢¥³¥Í¥¯¥·¥ç¥ó¤ò³ÎΩ¤·¡¢¼õ¿®Â¦¤Ç³ä¹þ¤ß¤Çµ¯Æ°¤µ¤ì¤ë´Ø¿ô¤È¤·¤Æ printf ¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£ ¼õ¿®¥×¥í¥»¥¹¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Á÷¿®¥×¥í¥»¥¹ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¨¢ ¨¢ "fred"¤È¤¤¤¦Ì¾Á°¤Ç ¨£¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¤²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ò"fred"¤È Ää»ß¾õÂ֤β¾ÁÛ³ä¹þ¤ß ¨¢ vi_create ¨¢ ¨¢ vi_ctl ¨¢¸À¤¦Ì¾Á°¤ò»È¤Ã¤ÆÃµ¤¹¡££³ÈÖÌܤΠ¥Á¥ã¥Í¥ë¤òÀ¸À®¤¹¤ë ¨¦¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¥°ú¿ô¤¬Èó¥¼¥í(1)¤Ç¤¢¤ë¤¿¤á¡¢ ¨¢ ¨¢ ¥×¥í¥»¥¹¤Ï²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤¬ ¥¤¥Ù¥ó¥ÈÄÌÃε¡¹½¤Ë£Á£Ó£Ô¨£¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¤ ¨¢ Í×µá¤ò¼õ¤±Æþ¤ì¤ë¤Þ¤Ç¥Ö¥í¥Ã¥¯ ¤ò»ÈÍѤ·¡¢printf()¤ò³ä¤ê¨¢ actast ¨¢ ¨¢ ¤µ¤ì¤ë ¹þ¤ß´Ø¿ô¤È¤·¤Æ½é´ü²½¤¹¤ë¨¦¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¥ ¨¢ ¨¢ ¨¢ ²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤Ø ¨£¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¤ ¨¢ Àܳ¤¹¤ë ¨¢ vi_sense ¨¢<<¨¢ACTION¨¢ ¨¢ ¨¦¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¥ ¨¢¹½Â¤ÂΨ¢ ¨¢ ²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤ò ¨£¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¤ ¨¢ ¨¢ ¨¢¥Ö¥í¥Ã¥¯¤¬²ò½ü¤µ¤ì¤ë ¥¢¥¯¥Æ¥£¥Ö¤Ë¤¹¤ë ¨¢ vi_ctl ¨¢¢ª¨¢ ¨¢¢ª¢ª¢ª¢ª¢ª¨¢ ¨¦¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¥ ¨¢ ¨¢ ¨£¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¤²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤Ë ¨£¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¤ ¨¢ ¨¢<<¨¢ vi_map ¨¢Á÷¿®¥×¥í¥»¥¹¤ò¥Þ¥Ã¥×¤¹¤ë ¥¹¥ê¡¼¥×¤¹¤ë ¨¢ sleep ¨¢ ¨¢ ¨¢ ¨¦¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥ ¨¢ ³ä¹þ¤ß¤Çµ¯Æ° ¨¢ ¢­ ¨¢ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¤ ¨¢ printf ¨¢¢«¨¡¨¡¨¡¨¡¨¡¨¡¨©vi_map_source ¨¢¥¤¥Ù¥ó¥Èȯ¿® ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¥×¥í¥»¥¹´Ö¤Î²¾ÁÛ³ä¹þ¤ßµ¡¹½ ¥æ¡¼¥¶¥×¥í¥»¥¹¤Ë¤è¤ë²¾ÁÛ³ä¹þ¤ßµ¡¹½¤Î»ÈÍÑÎ㤽¤Î£± ¼õ¿®¥×¥í¥»¥¹Â¦¤¬²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤òÀ¸À®¤¹¤ë¾ì¹ç ¡ã¡ãÃí°Õ¡§¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤Î¥³¥Ô¡¼¤ò»ý¤Ã¤Æ¤¤¤ë¤¿¤á¡¢Ê¸»úÎó¤òÁ÷¿®½ÐÍè¤Þ¤¹¤¬¡¢ÊÌ¥×¥í¥»¥¹¤Î¾ì¹ç¤Ë¤Ï¡¢¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤ò¥·¥§¥¢¡¼¥É¥á¥â¥ê¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¡ä¡ä #include #include extern int printf(); /*¡¡£ã£ì£é£â¤Î´Ø¿ô printf() ¤ò³ä¹þ¤ß´Ø¿ô¤È¤·¤Æ»ÈÍѤ¹¤ë*/ extern ACTION * actast (); void main () { ACTION * pact; VICHANID chan; VIMAPID vir_map_indx; int vir_chan_id, retv; if (retv = fork ()) { /* Parent process follows */ if (retv == -1) { perror ("error forking a child process"); exit (1); } if ((vir_chan_id = vi_ctl (VICTL_NAMETOID, "fred", 1)) == -1) { perror ("parent could not find the channel"); exit (1); } if ((vir_map_indx = vi_map (vir_chan_id, 0)) == -1) { perror ("parent could not perform input mapping"); exit (1); } if ((vi_mapsource (vir_map_indx, "DYNAMIC\n")) == -1) { perror ("parent could not source the interrupt"); exit (1); } printf ("Parent process exiting normally\n"); } else { /* Child process follows */ if ((chan = vi_create ("fred", 10, VIP_DORMANT)) == -1) { perror ("child could not create the virtual interrupt channel"); exit (1); } pact = actast (NULL, printf, "STATIC\n", 10, ACT_UPDATE); if (!pact) { perror ("ACTION structure could not be allocated by child"); exit (1); } if ((vi_sense (chan, pact)) == -1) { perror ("child could not establish a sense connection"); exit (1); } if ((vi_ctl (VICTL_ACTIVATE, chan, 1)) == -1) { perror ("channel could not be activated by child"); exit (1); } if (sleep (5)) printf ("Child process exiting normally\n"); else printf ("Child process exiting abnormally\n"); } } ¥æ¡¼¥¶¥×¥í¥»¥¹¤Ë¤è¤ë²¾ÁÛ³ä¹þ¤ßµ¡¹½¤Î»ÈÍÑÎ㤽¤Î£² Á÷¿®¥×¥í¥»¥¹Â¦¤¬²¾ÁÛ³ä¹þ¤ß¥Á¥ã¥Í¥ë¤òÀ¸À®¤¹¤ë¾ì¹ç #include #include "sys/param.h" #include "sys/vi.h" extern int printf (); extern ACTION * actast (); void main () { ACTION * pact; VICHANID chan; VIMAPID vir_map_indx; int vir_chan_id, retv,i; if ((chan = vi_create ("fred", 10, VIP_DORMANT )) == -1) { perror ("child could not create the virtual interrupt channel"); exit (1); } if ((vir_map_indx = vi_map (chan, 0)) == -1) { perror ("parent could not perform input mapping"); exit (1); } for(i=0;i<100;i++){ if ((vi_mapsource (vir_map_indx, i)) == -1) { perror ("parent could not source the interrupt"); exit (1); } } printf("end\n"); pause(); } #include #include "sys/param.h" #include "sys/vi.h" extern int printf (); extern ACTION * actast (); vis_server(arg) int arg; { static int j=0; printf("%d:%d\n",j++,arg); } void main () { ACTION * pact; VICHANID chan; VIMAPID vir_map_indx; int vir_chan_id, retv; if ((chan = vi_ctl (VICTL_NAMETOID, "fred", 1)) == -1) { perror ("parent could not find the channel"); exit (1); } pact = actast (NULL, vis_server,-1 , 10, ACT_UPDATE); if (!pact) { perror ("ACTION structure could not be allocated by child"); exit (1); } if ((vi_sense (chan, pact)) == -1) { perror ("child could not establish a sense connection"); exit (1); } if ((vi_ctl (VICTL_ACTIVATE, chan, 1)) == -1) { perror ("channel could not be activated by child"); exit (1); } pause(); }

£³¡¥£µ¡¡¥¿¥¤¥Þ³ä¹þ¤ß¤Ë¤è¤ëÄê¼þ´ü¥¹¥±¥¸¥å¡¼¥ê¥ó¥°

¡¡¤³¤ì¤Ï¥¿¥¤¥Þ¤ËƱ´ü¤µ¤»¤Æ¼þ´üŪ¤Ë¥×¥í¥»¥¹¤òµ¯Æ°¤¹¤ë¤â¤Î¤Ç¡¢¥·¥ß¥å¥ì¡¼¥¿¤ä¥×¥í¥»¥¹À©¸æ¤Ê¤É¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤Ï¡¢¤³¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¡¦¥¢¥ë¥´¥ê¥º¥à¤ò¤è¤¯»ÈÍѤ·¤Þ¤¹¡£ ¡¡¥·¥ß¥å¥ì¡¼¥¿Åù¤Î¾ì¹ç£±£íÉ䫤飵£°£íÉ䰤餤¤Î¥Õ¥ì¡¼¥à¥¿¥¤¥à¤Ç½èÍý¤·¤Þ¤¹¤¬¡¢°ìÄê¼þ´ü¤Çµ¯Æ°¤Ç¤­¤ëºÇ¾®»þ´Ö¤¬¥ê¥¢¥ë¥¿¥¤¥à¥·¥¹¥Æ¥à¤ÎÀ­Ç½¤ò·èÄꤹ¤ë¤¿¤á¡¢¥æ¡¼¥¶¤ÎÍ×µá¤Ï¤è¤ê¤­¤Ó¤·¤¤¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£¡Ê£±£íÉäǤɤΤ°¤é¤¤¤Î·×»»¤¬²Äǽ¤Ç¤·¤ç¤¦¤«¡©¡Ë ¢«¡¡¡¡£±£°£í£ó¡¡ ¢ª¢«¡¡¡¡£±£°£í£ó¡¡ ¢ª¢«¡¡¡¡£±£°£í£ó¡¡ ¢ª ¥á¥¸¥ã¥µ¥¤¥¯¥ë¡¡ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¡¡¡¡¡¡¡¡¡¡¥Þ¥¤¥Ê¥µ¥¤¥¯¥ë¡¡ ¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­ ¥×¥í¥»¥Ã¥µ£±¡¡¡¡£Á¨§¨¡¨© ¨§¨¡¨© ¨§¨¡¨© ¨§¨¡¨© ¨§¨¡¨© ¨§¨¡¨© ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£Â ¨§¨¡¨© ¨§¨¡¨© ¨§¨¡¨© ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£Ã ¨§¨© ¨§¨© ¨§¨© ¥×¥í¥»¥Ã¥µ£²¡¡¡¡£Ä¨§¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨© ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£Å ¨§¨¡¨© ¨§¨¡¨© ¨§¨¡¨© Äê¼þ´ü¥¹¥±¥¸¥å¡¼¥ê¥ó¥° ¡¡¥×¥í¥»¥¹À©¸æ¤ä¥·¥ß¥å¥ì¡¼¥¿Åù¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢¤³¤Î¥á¥¸¥ã¡¼¥µ¥¤¥¯¥ë¤ÎÃæ¤Ç¡ÎÆþÎϡϡݡη׻»¡Ï¡Ý¡Î½ÐÎϡϤò½ª¤¨¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ ¡¡¤·¤¿¤¬¤Ã¤Æ¡¢¥Þ¥¤¥Ê¡¼¥µ¥¤¥¯¥ë¤Î¼þ´ü¤¬Ã»¤¯¤Ê¤ì¤Ð¡¢¥µ¥¤¥¯¥ë¤ËÀê¤á¤ë¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤Î³ä¹ç¤¬Â¿¤¯¤Ê¤ê¡¢¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É»þ´Ö¤ÎÊÑÆ°¤¬ÌäÂê¤Ë¤Ê¤ê¤Þ¤¹¡£ ¡¡¤³¤ì¤Ï¡¢Á°½Ò¤Î¤¹¤Ù¤Æ¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬±Æ¶Á¤·¤Æ¤¯¤ë¤Î¤Ë²Ã¤¨¤Æ¡¢¥«¡¼¥Í¥ë¤Î¥Á¥å¡¼¥Ë¥ó¥°¤¬¹ª¤¯¤¤¤Ã¤Æ¤¤¤Ê¤¤¤È¡¢¡Ê¤¿¤È¤¨¤Ð£±£°£°²ó¤Ë£±²ó¡¢µ¯Æ°¤¬ÃÙ¤ì¤ë¤È¤¤¤Ã¤¿¤è¤¦¤Ë¡Ë¼þ´üŪ¤Ë¸íưºî¤¹¤ë¤È¤¤¤Ã¤¿¤³¤È¤âµ¯¤³¤ë¤¿¤á¤É¤¦¤·¤Æ¤âŤ¤¥Þ¥¤¥Ê¡¼¥µ¥¤¥¯¥ë¤Ë¤Ê¤ê¤¬¤Á¤Ç¤¹¡£ ¡¡Â¿¤¯¤Î¾ì¹ç¤³¤Î¸¶°ø¤Ï¥·¥¹¥Æ¥àÀ߷פˤ¢¤ê¡¢¥¿¥¤¥Þ¤Î¥¤¥Ù¥ó¥È½èÍýÉô¤¬¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤Ç¤·¤«¼Â¹Ô¤Ç¤­¤Ê¤¤¡¢Â¾¤Î£Õ£Î£É£Ø¥¹¥±¥¸¥å¡¼¥ê¥ó¥°µ¡¹½¤È¶¥¹ç¤òµ¯¤³¤·¤Æ¤¤¤ëÅù¤¬¹Í¤¨¤é¤ì¤Þ¤¹¡£¡Ê¤³¤Î¤¿¤á¡¢¥ê¥¢¥ë¥¿¥¤¥à£Õ£Î£É£Ø¤Ç¤â¼þ´ü¥¹¥±¥¸¥å¡¼¥ëµ¡Ç½¤òÄ󶡤·¤Æ¤¤¤ë¥Ù¥ó¥À¤Ï¾¯¿ô¤Ç¤¹¡£¡Ë

£³¡¥£µ¡¥£±¡¡¥¯¥í¥Ã¥¯£Á£Ó£Ô

¡¡£Ò£Ô£Õ¤Ç¤Î¡¢¼þ´ü¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ï¡¢¥¯¥í¥Ã¥¯£Á£Ó£Ô¤È¤·¤Æ£±£íÉäǤΥµ¥¤¥¯¥ë¤ò²Äǽ¤Ë¤·¤Æ¤¤¤Þ¤¹¡£¡Ê£Ò£Ô£Õ¤Ç¤Ï¡¢¤³¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥óÍѤ˥¹¥±¥¸¥å¡¼¥ëµ¡Ç½¤ò¥Ñ¥Ã¥±¡¼¥¸²½¤·¤¿£Ó£Ð£Ó(Synthetic Period Scheduler)¤âÊ̤ËÍѰդ·¤Æ¤¤¤Þ¤¹¡£¡Ë ¡¡¥¯¥í¥Ã¥¯£Á£Ó£Ô¤Ï¡¢mpadvise() ¤Ë¤è¤ë¥·¥¹¥Æ¥à¥È¥é¥Ã¥×»þ´Ö¤ÎÊѹ¹¤Ç¡¢¥Þ¥¤¥Ê¥µ¥¤¥¯¥ë¤ò·èÄꤷ clkspec_t ¹½Â¤ÂΤǼ¡¿Þ¤Î¤è¤¦¤Ë¥á¥¸¥ã¥µ¥¤¥¯¥ë¤È¥Ý¡¼¥º»þ´Ö¤ò·èÄꤷ¤Þ¤¹¡£¤³¤Î¤È¤­¥á¥¸¥ã¥µ¥¤¥¯¥ë»þ´Ö¤¬£°¤Î»þ¤Ë¤Ï¥ï¥ó¥·¥ç¥Ã¥È¥¿¥¤¥Þ¤Îµ¡Ç½¤Ë¤Ê¤ê¤Þ¤¹¡£ clkspec_t ¹½Â¤ÂΤȻþ´Ö¤Î´Ø·¸ mpadvise(MPA_CLK_SET,cpu_mask,CLK_HZ); ¥Þ¥¤¥Ê¥µ¥¤¥¯¥ë ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­¢­ struct clkspec_t { ¨¢¢«¥á¥¸¥ã¥µ¥¤¥¯¥ë¢ª¨¢ ¡¡ struct timestruc { ¨§¨¡¨¡¨¨¨¡¨¡¨¨¨¡¨¡¨¡¨© ¡¡ unsigned long ts_sec; ¨¢¢«¢ª¨¢¢«¢ª¨¢ ¨¢ long ts_nsec; ¡¡¡¡¡¡¡¡ ¨¢ ¨¢ } cs_period; ¡¡¡¡¡¡¡¡ struct timestruc { unsigned long ts_sec; ¥×¥í¥»¥¹¼Â¹Ô»þ´Ö long ts_nsec; } cs_pause; ¥Ý¡¼¥º»þ´Ö }; ¡¡¥¯¥í¥Ã¥¯£Á£Ó£Ô¤Ï°Ê²¼¤Î¤è¤¦¤Ëµ­½Ò¤·¡¢´Ø¿ô¤Î¸Æ¤Ó¤À¤·¤ËÀ®¸ù¤¹¤ë¤È´Ø¿ô¤Ï£Á£Ó£Ô£É£Ä¤òÊÖ¤·¡¢¼ºÇÔ¤¹¤ë¤È¡Ý£±¤òÊÖ¤·¤Þ¤¹¡£¤³¤Î¤È¤­ÀßÄꤹ¤ë processor_no ¤Ï¡¢Àè¤ËÀâÌÀ¤·¤¿ processor_mask ¤È¤Ï°ã¤¤¡¢¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤ò£±¤È¤¹¤ëÀ°¿ôÃͤǤ¹¡£ if ((ast_id=clkast(_asthandler, func,CLK_PRI,&pcs, processor_no))== -1){ perror("Failed to start clock"); exit(1); } ¡¡£Ò£Ô£Õ¤Ï¡¢ÊªÍýŪ¤Ê¥¯¥í¥Ã¥¯³ä¹þ¤ß¤ò¸¡½Ð¤¹¤ë¤È¤½¤Î¥¤¥Ù¥ó¥ÈÄÌÃε¡¹½¤Ë£Á£Ó£Ô¤ò»ÈÍѤ·¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¥¯¥í¥Ã¥¯£Á£Ó£Ô¤Î»ÈÍÑÊýË¡¤Ï£Á£Ó£Ô¤ÈƱÍͤǤ¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ã£ì£ë£á£ó£ô¡¡¥¿¥¤¥Þ³ä¹þ¤ß¤Ë¤è¤ë¼þ´ü£Á£Ó£Ô¤òÀßÄê¡¿²ò½ü¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢int astid = clkast(lo_handler,func,priority,pcs,processor_no) ¨¢ ¨¢int canclkast(astid) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢int (*lo_handler)(); Ä̾ï¤Ï _asthandler()¤ò»ØÄꤹ¤ë ¨¢ ¨¢int (*func)(); ¥·¥¹¥Æ¥à¥È¥é¥Ã¥×´Ø¿ô ¨¢ ¨¢int priority; £°¡Á£³£²£·£¶£·¤ÎÃͤò»ý¤Ä£Á£Ó£ÔÍ¥ÀèÅÙ ¨¢ ¨¢struct clkspec_t pcs; Á°¿Þ»²¾È ¨¢ ¨¢int pid; Á÷¿®¥×¥í¥»¥¹¤Î¥×¥í¥»¥¹£É£Ä ¨¢ ¨¢int prosessor_no; £±¤«¤é£¸¤ÎÀ°¿ô¤Ç»ÈÍѤ¹¤ë¥×¥í¥»¥Ã¥µ¤ò»ØÄꤹ¤ë¡£ ¨¢ ¨¢ ¨¢ ¨¢int astid; ¥­¥ã¥ó¥»¥ë¤¹¤ë£Á£Ó£Ô£É£Ä ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¼¡¤ÎÎã¤Ï¡¢£±É䴤ȤΥ¯¥í¥Ã¥¯£Á£Ó£Ô¤ò£µ²ó¤¯¤ê¤«¤¨¤¹¤È¥­¥ã¥ó¥»¥ë¤·¤Æ½ªÎ»¤¹¤ë¤â¤Î¤Ç¤¹¡£ ¥¯¥í¥Ã¥¯£Á£Ó£Ô¤Î¥×¥í¥°¥é¥àÎã #include #include #include #include #define NAST 5 #define ASTPRI 10 /* £Á£Ó£ÔÍ¥ÀèÅÙ¤ò£±£°¤ËÄêµÁ */ int tick (); /*£Á£Ó£Ô¤Çµ¯Æ°¤µ¤ì¤ë³ä¹þ¤ß´Ø¿ô¤ÎÀë¸À */ int _asthandler (); /* Äã¥ì¥Ù¥ë³ä¹þ¤ß¥Ï¥ó¥É¥é¤ÎÀë¸À */ struct clkspec_t interv; int astcnt = 0; main () { int id; /* ºÇ½é¤Î£Á£Ó£Ô¤Ïµ¯Æ°Í׵ᤫ¤é£²ÉÃÃÙ¤ì¤Æ»Ï¤Þ¤ê¡¢°Ê¹ß£±ÉÃËè¤Ëµ¯Æ°¤µ¤ì¤ë */ interv.cs_period.ts_sec = 1; interv.cs_period.ts_nsec = 0; interv.cs_pause.ts_sec = 2; interv.cs_pause.ts_nsec = 0; /* ¥¯¥í¥Ã¥¯£Á£Ó£Ô¤ò£±ÉÃËè¤Î·«ÊÖ¤·µ¯Æ°¤µ¤»¤ë¡£´Ø¿ô¤ÎÌá¤êÃͤȤ·¤Æ£Á£Ó£Ô£É£Ä¤òÆÀ¤ë*/ if ((id = clkast (_asthandler, tick, ASTPRI, &interv, MASTER_ID)) == -1) perror ("clkast"), exit (1); while (astcnt < NAST) { astpause(-1, 5000); ¡¡¡¡/* astpause() ¤Ï¡¢¥¿¥¤¥à¥¢¥¦¥ÈÁ°¤Ë£Á£Ó£Ô¤Î¼õ¿®¤ò¸¡½Ð¤¹¤ë¤È£°¤òÊÖ¤·Ää»ß¾õÂÖ¤«¤éæ½Ð¤¹¤ë¡£*/ printf("main done astpause\n"); } /* ¥¯¥í¥Ã¥¯£Á£Ó£Ô¤ò£Á£Ó£Ô£É£Ä¤ò»ÈÍѤ·¤Æ¥­¥ã¥ó¥»¥ë¤¹¤ë */ if (canclkast (id) < 0) perror ("canclkast"), exit (2); if (astcnt == NAST) exit (0); else exit (3); } /* ³ä¹þ¤ß´Ø¿ôÉô¡¡*/ tick (overrun) int overrun; { /* £Á£Ó£Ô¤Î¼õ¿®²ó¿ô¤Î½ÐÎÏ */ printf("In tick, AST count = %d\n", ++astcnt); if (overrun) /* ´Ø¿ô¤Î¼Â¹Ô¤ËÃ٤줬À¸¤¸¤¿¾ì¹ç overrun ÊÑ¿ô¤Ë¥­¥å¡¼¥¤¥ó¥°¤µ¤ì¤Æ¤¤¤ë ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥¤¥Ù¥ó¥È¤Î¿ô¤¬ÂåÆþ¤µ¤ì¤ë */ fprintf (stderr, "%d clock AST backlog\n", overrun); }

£³¡¥£µ¡¥£²¡¡£Æ£á£ó£ô¥¯¥í¥Ã¥¯£Á£Ó£Ô

¡¡£Æ£á£ó£ô£Á£Ó£Ô¤Ï¡¢£Æ£á£ó£ô¥¯¥í¥Ã¥¯£Á£Ó£Ô¤«¡¢¤Þ¤¿¤Ï¥æ¡¼¥¶¤¬ºîÀ®¤·¤¿¥«¥¹¥¿¥à¥Ç¥Ð¥¤¥¹¤Î¤ß¤Ç»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ¡¡¥¯¥í¥Ã¥¯£Á£Ó£Ô¤ÏÆÃ¤Ë¿®ÍêÀ­¤ò½Å»ë¤·¤¿À߷פˤʤäƤ¤¤Þ¤¹¤¬¡¢¹â®¤Ë¥×¥í¥»¥¹¡¿¥¹¥ì¥Ã¥É¤òµ¯Æ°¤¹¤ë»ö¤ò½Å»ë¤·¤ÆÀ߷פµ¤ì¤¿¡¢£Æ£á£ó£ô¥¯¥í¥Ã¥¯£Á£Ó£Ô¤â¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£ ¡¡¤³¤ì¤Ï¡¢£Á£Ó£Ô¤Ë¤ª¤±¤ë¥­¥å¡¼¥¤¥ó¥°µ¡Ç½¤òºï½ü¤·¡¢¤µ¤é¤Ë³ä¹þ¤ß¤Ë¤è¤Ã¤ÆÊݸ¤µ¤ì¤ë¥ì¥¸¥¹¥¿¥»¥Ã¥È¤ËÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤ò´Þ¤á¤ë¤«¤É¤¦¤«¤òÁªÂò¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤Î¤¬ÆÃħ¤Ç¤¹¡£ ¡¡¤Þ¤¿¤³¤Î£Æ£á£ó£ô£Á£Ó£Ô¤Ï¡¢¥ê¥¢¥ë¥¿¥¤¥à¥¹¥ì¡¼¥Ö´Ä¶­¤Ç¤Î¤ßưºî¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¡¢¥«¡¼¥Í¥ë¤Î¤¹¤Ù¤Æ¤Î³ä¹þ¤ß¤ò mpadvise() ¤ò»ÈÍѤ·¤ÆÄä»ß¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ ¡¡¤·¤¿¤¬¤Ã¤Æ£Ò£Ô£Õ¥«¡¼¥Í¥ë¤Î£Ô£Ì£Â³ä¹þ¤ß¤â¶Ø»ß¤·¤Þ¤¹¤¬¡¢¤³¤ì¤Ï¾¤Î¥×¥í¥»¥Ã¥µ¤«¤é¤Î¥­¥ã¥Ã¥·¥å̵¸ú¥Ö¥í¡¼¥É¥­¥ã¥¹¥È³ä¹þ¤ß¤ò¶Ø»ß¤·¤Æ¤¤¤ë¤¿¤á¡¢°ÂÁ´¤Ê¥·¥¹¥Æ¥à¥³¡¼¥ë¤Îȯ¹Ô¤¬ÊݾڤǤ­¤Þ¤»¤ó¡£ ¡¡¤³¤Î¤¿¤á¥×¥í¥»¥¹¤Þ¤¿¤Ï¥¹¥ì¥Ã¥É¤Ï¡¢¾ï¤Ë¼Â¹Ô¾õÂÖ¤«¡¢fastpause()¤Î¤è¤¦¤Ê¡¢¥Ó¥¸¡¼¥¦¥§¥¤¥È¾õÂ֤Ǥʤ¯¤Æ¤Ï¤Ê¤é¤º¡¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤òȯ¹Ô¤·¤Æ¤Ï¤¤¤±¤Þ¤»¤ó¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£æ£ã£ì£ë£á£ó£ô¡¡¥¿¥¤¥Þ³ä¹þ¤ß¤Ë¤è¤ë¼þ´ü£Æ£á£ó£ô£Á£Ó£Ô¤òÀßÄê¡¿²ò½ü¤¹¤ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢#include ¨¢ ¨¢ ¨¢ ¨¢int fclkast(lo_handler,func,priority,pcs,processor_no,opt) ¨¢ ¨¢int canclkast(astid) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢int (*lo_handler)(); Ä̾ï¤Ï¡¡_fasthandler() ¤ò»ØÄꤹ¤ë ¨¢ ¨¢int (*func)(); ¥·¥¹¥Æ¥à¥È¥é¥Ã¥×´Ø¿ô ¨¢ ¨¢int priority; £°¡Á£³£²£·£¶£·¤ÎÃͤò»ý¤Ä£Á£Ó£ÔÍ¥ÀèÅÙ ¨¢ ¨¢struct clkspec_t pcs; Á°¿Þ»²¾È ¨¢ ¨¢int pid; Á÷¿®¥×¥í¥»¥¹¤Î¥×¥í¥»¥¹£É£Ä ¨¢ ¨¢int prosessor_no; £±¤«¤é£¸¤ÎÀ°¿ô¤Ç»ÈÍѤ¹¤ë¥×¥í¥»¥Ã¥µ¤ò»ØÄꤹ¤ë¡£ ¨¢ ¨¢int opt; £æ£ã£ì£ë£á£ó£ô¤ÇÉâÆ°¾®¿ôÅÀ¥ì¥¸¥¹¥¿¤òÊݸ¤¹¤ë¥ª¥×¥·¥ç¥ó¡ÊFAST_FPUSED¡¿0¡Ë¨¢ ¨¢ ¨¢ ¨¢int astid; ¥­¥ã¥ó¥»¥ë¤¹¤ë£Á£Ó£Ô£É£Ä ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£æ£á£ó£ô£ð£á£õ£ó£å¡¡£Æ£á£ó£ô£Á£Ó£ÔÍ¥ÀèÅÙÀßÄê¤È¥×¥í¥»¥¹¤ÎÄä»ß ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢ int fastpause(priority); ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢ int priority; £°¡Á£³£²£·£¶£·¤ÎÃͤò»ý¤Ä£Æ£á£ó£ô£Á£Ó£ÔÍ¥ÀèÅÙ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ £Æ£á£ó£ô¥¯¥í¥Ã¥¯£Á£Ó£Ô¤Î¥×¥í¥°¥é¥à #include #include #include #include #include #include #define RT_CPU_MASK 4 /* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤Î¥×¥í¥»¥Ã¥µ¥Þ¥¹¥¯ÃÍ */ #define RT_CPU_ID 2 /* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤Î¥×¥í¥»¥Ã¥µÈÖ¹æ */ #define AST_PRI 10 /* £Æ£á£ó£ô£Á£Ó£ÔÍ¥ÀèÅÙ */ int handler(), _fasthandler(); /* £Æ£á£ó£ô£Á£Ó£Ô¤Î³ä¹þ¤ß´Ø¿ô¤ÈÄã¥ì¥Ù¥ë¥Ï¥ó¥É¥é */ volatile int done = 0; /* ¥á¥¤¥ó½èÍý¤Î½ªÎ»¥Õ¥é¥° */ int counter = 0; int overrun = 0; main() { int pprio, ppolicy, fastid; int freq = 100; /* 100 hertz (10 ms) */ struct clkspec_t pcs; /* ¸ÇÄêÍ¥ÀèÅ٥ꥢ¥ë¥¿¥¤¥à£Æ£É£Æ£Ï¥×¥é¥¤¥ª¥ê¥Æ¥£ */ ppolicy = SCHED_FIFO; pprio = MAX_RT_PRI; if (schedset (0, &ppolicy, &pprio, NULL) < 0) perror ("schedset"), exit (1); if (mpadvise (MPA_RT_SET, RT_CPU_MASK) < 0) /* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤Ï¥ê¥¢¥ë¥¿¥¤¥à¡¦¥¹¥ì¡¼¥Ö */ perror ("MPA_RT_SET"), exit (2); /* ½èÍý¤Ï£±£°£°£È£ú¤Çưºî¤¹¤ë¡Ê¤³¤ì¤Ï£±£²£°£È£ú¤Î¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤òÄä»ß¤¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡Ë ¥×¥í¥°¥é¥à¤Î¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤È¥Æ¥­¥¹¥È¥»¥°¥á¥ó¥È¤ò¥á¥â¥ê¤Ë¾ïÃ󤵤»¤ë */ if (mpadvise(MPA_CLK_SET, RT_CPU_MASK, freq) < 0) perror ("MPA_CLK_SET"), exit (4); if (rtplock(PROCLOCK) < 0) perror ("rtplock"), exit (5); /* ¥×¥í¥»¥Ã¥µ´Ö¤Î£Ô£Ì£Â̵¸ú³ä¹þ¤ß¤òÄä»ß¤¹¤ë¡£¤³¤Î»ØÎá¤òÍ­¸ú¤Ë¤¹¤ë¤¿¤á¤Ë¤Ï¡¢ ¡¡¡¡¥·¥¹¥Æ¥à¥³¥ó¥Õ¥£¥°¥ì¡¼¥·¥ç¥ó¡¦¥Ñ¥é¥á¡¼¥¿¤Î kmempool ¤ò½½Ê¬³ÎÊݤ·¤Æ¤ª¤«¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤ */ if (mpadvise(MPA_TBINV_OFF, RT_CPU_MASK) < 0) perror ("MPA_TBINV_OFF"), exit (7); /* £±ÉäÎÃÙ¤ì¤òȼ¤Ã¤Æ¡¢£±£°¥ß¥êÉ䴤Ȥ˥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤òȯÀ¸¤µ¤»¤ë */ pcs.cs_period.ts_sec = 0; pcs.cs_period.ts_nsec = 10000000; pcs.cs_pause.ts_sec = 1; pcs.cs_pause.ts_nsec = 0; if ((fastid = fclkast(_fasthandler, handler, AST_PRI, &pcs, RT_CPU_ID, 0)) < 0) perror ("fclkast"), exit (6); while (!done) /* £Æ£á£ó£ô¤ÎȯÀ¸¤ò¥ë¡¼¥×¤ÇÂÔ¤Ä */ { if (fastpause(0) < 0) perror("fastpause"), exit (8); /* Do main loop processing (if any) */ } printf("%d fast ASTs received with %d overruns\n", counter, overrun); /* ½èÍý¤¬½ªÎ»¤¹¤ë¤È£Æ£á£ó£ô¥¯¥í¥Ã¥¯£Á£Ó£Ô¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ canclkast(fastid); } handler(param, pc, pri) int param, pc, pri; { /* Á°¤Î½èÍý¤¬½ªÎ»¤¹¤ëÁ°¤Ë³ä¹þ¤ß¤¬¤«¤«¤Ã¤¿¤«¤ò¥Á¥§¥Ã¥¯¤¹¤ë */ if (param) overrun += param; else counter++; if (counter == 10) done = 1; }

£³¡¥£¶¡¡¹âÀºÅÙ¥¿¥¤¥Þ¤È¥µ¡¼¥Ó¥¹¡¡

¡¡¤¹¤Ç¤ËÀâÌÀ¤·¤¿¤è¤¦¤Ë¡¢°ìÈÌŪ¤Ê£Õ£Î£É£Ø¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤Ï¹âÀºÅ٤Υ¿¥¤¥Þ¤òɬÍפȤ·¤Ê¤¤¤¿¤á¡¢¥×¥í¥°¥é¥à¤ÇÆÉ¤ß½Ð¤¹¤³¤È¤Î¤Ç¤­¤ë»þ´Ö¤Ï¡¢£±¡¿£µ£°ÉáÁ£±¡¿£±£²£°ÉäÎÀºÅ٤Ǥ¹¡£¤Þ¤¿ÆÃÄê¤Î¥×¥í¥»¥¹¤ËÂФ¹¤ëÊ£¿ô¤Î¥¿¥¤¥Þ³ä¹þ¤ß¤Îµ¡Ç½¤ÏÄ󶡤·¤Æ¤¤¤Þ¤»¤ó¡£ ¡¡¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤Ç¤Ï¡¢¥·¥¹¥Æ¥à¤ÇȯÀ¸¤¹¤ë¥¤¥Ù¥ó¥È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤ä»ö¾Ý¤ÎƱ´üÍѤ˹âÀºÅÙ¤ÇÈÆÍÑÀ­¤Ë¤È¤ó¤À¥¿¥¤¥Þ¥µ¡¼¥Ó¥¹¤òÄ󶡤·¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£ ¡¡¥³¥ó¥«¥ì¥ó¥È£·£°£°£°¥·¥ê¡¼¥º¤Ç¤Ï¡¢£³¤Ä¤Î¥×¥í¥»¥Ã¥µ¤ËÂФ·¤ÆÀìÍѤΣ³£²¥Ó¥Ã¥È¥¿¥¤¥Þ¡Ê£´£°£î£óÀºÅ١ˤòÍѰդ·¡¢¥æ¡¼¥¶¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¡¢Äê¼þ´ü½èÍý¤ä¥ï¥ó¥·¥ç¥Ã¥È¥¿¥¤¥Þ¤Îµ¡Ç½¤ò´Êñ¤ËÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤·¤«¤â¡¢Æ±°ì¤Î¥×¥í¥»¥¹¾å¤ÇÊ£¿ô¤Î¥¿¥¤¥Þ³ä¹þ¤ß¤Î¥µ¡¼¥Ó¥¹¤òÄ󶡤·¤Æ¤¤¤Þ¤¹¡£ ¡¡¤â¤Ã¤È¤âñ½ã¤ÊÍøÍÑÊýË¡¤È¤·¤Æ¤Ï¡¢£´£¸¥Ó¥Ã¥È¥ê¥¢¥ë¥¿¥¤¥à¥«¥¦¥ó¥¿¤òÆÉ¤ß½Ð¤¹¤³¤È¤¬¹Í¤¨¤é¤ì¤Þ¤¹¤¬¡¢¤³¤Î¥¯¥í¥Ã¥¯¥½¡¼¥¹¤Ë¤Ï¡¢¥·¥¹¥Æ¥à¥¯¥í¥Ã¥¯¤ò£±£¶Ê¬¼þ¤·¤¿¤â¤Î¤¬¶¡µë¤µ¤ì¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢£·£°£°£°¥·¥ê¡¼¥º¡Ê£²£µ£Í£È£ú¡Ë¤Î¾ì¹ç£¶£´£°£îÉäβòÁüÅ٤Dz¼¿Þ¤Î¤è¤¦¤ËǤ°Õ¤Î¥¿¥¤¥ß¥ó¥°¤ÇÆÉ¤ß½Ð¤»¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ £´£¸¥Ó¥Ã¥È¥ê¥¢¥ë¥¿¥¤¥à¥«¥¦¥ó¥¿¤Î¥¢¥¯¥»¥¹Îã ¨¢ ¨¢ ¾å°Ì¥¢¥É¥ì¥¹ ¢«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¢ª²¼°Ì¥¢¥É¥ì¥¹ ¨¢ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¨¢ 63¡¡¡¡56 ¡¡¡¡48 40 32 24 16 8 0 ¨¢ ¨¢ ¨£¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¤ ¨¢ ¨¢ ¨¦¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¥ ¨¢ ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¢ high ¡¡¡¡¡¡¡¡ ¡¡¡¡¡¡¡¡¡¡¡¡low ¨¢ ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¢ middle ¨¢ ¨¢ ¨¢ ¨¢ low = *(unsigned long int *)0xfe001004;/* ñ°Ì¡§640 ns */ ¨¢ ¨¢ middle = *(unsigned long int *)0xfe001002;/* ñ°Ì¡§640 * 2£±£¶ ns */ ¨¢ ¨¢ high = *(unsigned long int *)0xfe001000;/* ñ°Ì¡§640 * 2£³£² ns */ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ³°Éô¥²¡¼¥ÈÆþÎÏ ¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¨¢¥·¥¹¥Æ¥à¥¯¥í¥Ã¥¯¨¢ ¨¢ ¨¦¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¢­ ¨¢ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¦¨¡¨©£´¥Ó¥Ã¥È¥×¥ê¥¹¥±¡¼¥é¨§¨¨¢ª¨¢£´£¸¥Ó¥Ã¥È¥ê¥¢¥ë¥¿¥¤¥à¥«¥¦¥ó¥¿¨¢¢ª¥æ¡¼¥¶¥×¥í¥°¥é¥à¤Ç»þ¹ï¤òÆÉ½Ð¤· ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¢ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨§¢ª¨¢ £³£²¥Ó¥Ã¥ÈÊý·ÁÇÈ¥¸¥§¥Í¥ì¡¼¥¿ ¨¢¢ª¥Þ¥ë¥Á¥·¥¹¥Æ¥àƱ´üÍѳ°Éô¥¯¥í¥Ã¥¯ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¢ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¡¡ ¨¦¢ª¨¢ £²£°¥Ó¥Ã¥È¥·¥¹¥Æ¥à¥¿¥¤¥Þ ¨¢¨¡¨¡¨¡¨¡¨¨¨¨¨¤£±£²£°£È£ú¤Î ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¢¨¢¨¢¥·¥¹¥Æ¥à¥È¥é¥Ã¥×¤ò½ÐÎÏ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤¨¢¨¢¨¢ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¢ª¨£¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤¨§¨«¨«¨ª¨¨¨ª¨¡¨¡¨¡¨¡¨¡¨¤¨¢ ¢ª¨£¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤¨§¨ª¨«¨ª¨¨¨ª¨¡¨¡¨¡¨¡¨¡¨¤¨§¨¥ ¢ª ¨¢£³£²¥Ó¥Ã¥È¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥¿¥¤¥Þ¨§¨ª¨¡¨ª¨¡¨© ¥×¥í¥»¥Ã¥µ ¨§¨¥ ³°Éô¥¯¥í¥Ã¥¯ÆþÎÏ£±¡Ý£³ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¢¬¡¡¡¡¡¡¡¡³Æ¥×¥í¥»¥Ã¥µ¤ÎÊ£¿ô¥×¥í¥»¥¹¡¿¥¹¥ì¥Ã¥É¤ò ³°Éô¥²¡¼¥ÈÆþÎÏ£±¡Ý£³ ¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥¡¡¡¡¡¡¡¡Ç¤°Õ¤Î¥Õ¥ì¡¼¥à¥¿¥¤¥à¤Ç¥¹¥±¥¸¥å¡¼¥ê¥ó¥° ¡¡¡¡¡¡ ¥Þ¥ë¥Á¥·¥¹¥Æ¥àÂбþ¡¡¹â²òÁüÅÙÆâ¢¥¿¥¤¥Þ¡¦¥«¥¦¥ó¥¿ ¡¡£¸£°£°£°¥·¥ê¡¼¥º¤Ç¤Ï¡¢¥·¥¹¥Æ¥à¹½À®¤Ë¤è¤Ã¤Æ»ÈÍѤǤ­¤ë¹â²òÁüÅÙ¥«¥¦¥ó¥¿¡¿¥¿¥¤¥Þ¤¬°ã¤¤¤Þ¤¹¡£ ɸ½à¹½À®¤Ç¤Ï£É£Ï£Ð¤Î¤â¤Î¤ò¡¢¥ª¥×¥·¥ç¥ó¤È¤·¤Æ£Í£Ö£É£Ï¡Ý£±¤Î¤â¤Î¤¬¥æ¡¼¥¶¤Ç»ÈÍѲÄǽ¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢ilt(4) ¤ò¤´Í÷¤¯¤À¤µ¤¤¡£ ¡¡°Ê²¼¤Î¥×¥í¥°¥é¥à¤Ï¡¢£·£°£°£°¡¿£¸£°£°£°¥·¥ê¡¼¥º¾å¤Ç£Ã¤È£æ£·£·¤Ç¶¦Ä̤˻ÈÍѤǤ­¤ë£²¤Ä¤Î´Ø¿ô readtime_()¤È adjust_() ¤ÎÎã¤Ç¤¹¡£ /* readtime.c */ #include #include #include adjust_(start,finish,realtime) unsigned long *start,*finish; float *realtime; { #ifdef mc7000 *realtime = (float)( *finish - *start ) * 640.0 / 1000.0; #endif #ifdef mc8000 #ifdef MVIO if (*start < *finish) { /* account for underflow */ *start += 0x1000000; } *realtime = (float)( *start - *finish ); #else *realtime = (float)( *finish - *start ) * 62.50 / 1000.0; #endif #endif } readtime_(nowtime) unsigned long *nowtime; { #ifdef mc7000 *nowtime = *(unsigned long int *)0xfe001004; #endif #ifdef mc8000 #ifdef MVIO *nowtime = *(unsigned long int *)MAPPED_ILT_PAGE; #else *nowtime = *(unsigned long int *)MAPPED_COUNTER_PAGE; #endif #endif } ¡¡¥³¥ó¥Ñ¥¤¥ëÊýË¡ cc -c readtime.c £Ã¸À¸ì £æ£·£· ¡¡¥ê¥ó¥¯ÊýË¡ cc xxx.c readtime.o f77 xxx.f readtime.o ¡¡¸Æ¤Ó¤À¤·ÊýË¡ unsigned long int t0,t1; INTEGER*4 T0,T1; float realtime,overhead; REAL*4 REALTIME,OVERHEAD; /* ¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É»þ´Ö¤Î·×¬ */ readtime_(&t0); CALL READTIME(T0) readtime_(&t1); CALL READTIME(T1) adjust_(&t0,&t1,&overhead); CALL ADJUST(OVERHEAD) readtime_(&t0); CALL READTIME(T0) ¨¢ ¨¢ ¨¢ ¨¢ readtime_(&t1); CALL READTIME(T1) adjust_(&t0,&t1,&realtime); CALL ADJUST(REALTIME) printf("elapsed time was %g microseconds\n", PRINT *,"ELAPSED TIME WAS ",REALTIME-OVERHED, realtime-overhead); " MICROSECONDS"

¡ø£´¡¡¥Õ¥¡¥¤¥ë´ÉÍý

¡¡£Õ£Î£É£Ø¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢£é¥Î¡¼¥É¤È¸Æ¤Ð¤ì¤ë¸ÇÄêĹ¤Î¥Ö¥í¥Ã¥¯¤Ç´ÉÍý¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢ÍÆÎ̤ÎÂ礭¤¤¥Õ¥¡¥¤¥ë¤Ï¥Ç¥£¥¹¥¯¤ÎʪÍýŪ¤ËϢ³¤·¤Æ¤¤¤Ê¤¤Îΰè¤ËÇÛÃÖ¤µ¤ì¤Æ¤·¤Þ¤¦¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ¡¡¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¢¥¯¥»¥¹¤·¤¿¾ì¹ç¡¢¥Ç¥£¥¹¥¯¤Î¥·¡¼¥¯»þ´Ö¤¬¥Õ¥¡¥¤¥ë¥Ö¥í¥Ã¥¯¤ÎʪÍýŪ¤Ê°ÌÃ֤˱ƶÁ¤µ¤ì¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬°ìÄê¤Ç¤Ê¤¯¤Ê¤ê¡¢¹â®¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥àÀ߷פξ㳲¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤³¤Ç¥ê¥¢¥ë¥¿¥¤¥à¥·¥¹¥Æ¥à¤Î¥Õ¥¡¥¤¥ë¹½Â¤¤Ï¡¢ÊªÍýŪ¤ËϢ³¤·¤¿°ÌÃ֤˥ե¡¥¤¥ë¤ò³ä¤êÅö¤Æ¤ëµ¡Ç½¤¬¤¢¤ê¤Þ¤¹¡£ ¡¡£Ð£Ï£Ó£É£Ø¤Ç¤Ï¡¢¤³¤Î¤è¤¦¤ÊʪÍýŪ¤ËϢ³¤·¤¿Îΰè¤Ë¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ëµ¡Ç½¤ò¥ê¥¢¥ë¥¿¥¤¥à¡¦¥Õ¥¡¥¤¥ë¤È¸Æ¤ó¤Ç¤¤¤Þ¤¹¡£ ¡¡£Ò£Ô£Õ¤Ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Æ¥£¥®¥ã¥¹¡¦¥Õ¥¡¥¤¥ë¤È¸Æ¤ó¤Ç¤¤¤Þ¤¹¤¬¡¢¤³¤ì¤ò¥·¥¹¥Æ¥à¤Î¥¹¥ï¥Ã¥×¥Õ¥¡¥¤¥ë¤Ë¤âÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£¤µ¤é¤Ë¥Þ¥ë¥Á¡¦¥¹¥ï¥Ã¥×¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤¿¤á¥¿¥¤¥à¥·¥§¥¢¥ê¥ó¥°¤Î¥×¥í¥»¥¹¤¬¥¹¥ï¥Ã¥×¤µ¤ì¤ë»þ¤Ë¹â®¤Ëưºî¤·¤Þ¤¹¡£¤Þ¤¿¡¢¥Õ¥ê¡¼¥ê¥¹¥È¤Î´ÉÍý¤òÆâÉôŪ¤Ë¥Ó¥Ã¥È¥Þ¥Ã¥×´ÉÍý¤ò¤·¤Æ¤¤¤ë¤¿¤á¡¢£é¥Î¡¼¥É¤Î¥Ý¥¤¥ó¥¿¤ò¤¿¤É¤ëɬÍפ¬¤Ê¤¯Ï¢Â³¤·¤¿¥Ö¥í¥Ã¥¯¤ò¹â®¤ËÆÀ¤ë»ö¤¬¤Ç¤­¡¢¤¹¤Ù¤Æ¤Î¥×¥í¥»¥¹¤¬¤³¤Î¸ú²Ì¤òÆÀ¤ë»ö¤¬¤Ç¤­¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¥Ö¡¼¥È¥Ö¥í¥Ã¥¯ ¨¢ ¨¢ ¥Ö¡¼¥È¥Ö¥í¥Ã¥¯ ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¥¸¥ª¥á¥È¥ê¥Ö¥í¥Ã¥¯ ¨¢ ¨¢ ¥¹¡¼¥Ñ¥Ö¥í¥Ã¥¯ ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¥Ç¥£¥¹¥¯¡¦¥Ñ¡¼¥Æ¥£¥·¥ç¥ó£°¡Ý£¶ ¨¢ ¨¢ ºÆÇÛÃÖ²Äǽ£é¥Î¡¼¥É¥ê¥¹¥È ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡ ¨¢ ¨¢ ½ÅÊ£¥¸¥ª¥á¥È¥ê¡¦¥Ö¥í¥Ã¥¯ ¨¢ ¨¢ ÉÔÎÉ£é¥Î¡¼¥É¥Ö¥í¥Ã¥¯ ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡ ¨¢ ¨¢ ¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×ÎÎ°è ¨¢ ¨¢ ¥ë¡¼¥È£é¥Î¡¼¥É ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡ ¨¢ ¨¢ ¥À¥ó¥×ÎÎ°è ¨¢ ¨¢¥Õ¥¡¥¤¥ë¤È¥Ç¥£¥ì¥¯¥È¥êÍÑ£é¥Î¡¼¥É¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ÊݼéÎÎ°è ¨¢ ¨¢ ¥Ó¥Ã¥È¥Þ¥Ã¥× ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¥Ï¡¼¥É¥¦¥§¥¢ÉÔÎÉ¥Ö¥í¥Ã¥¯¥ê¥¹¥È ¨¢ ¨¢ ¥Ç¡¼¥¿¥Ö¥í¥Ã¥¯ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ½ÅÊ£¥¹¡¼¥Ñ¥Ö¥í¥Ã¥¯ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡£Ò£Ô£Õ¤Ï¡¢¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤ò¿Þ¤Î¤è¤¦¤Ê¥¸¥ª¥á¥È¥ê¡¦¥Ö¥í¥Ã¥¯¤È£Õ£Î£É£Ø¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¤òÍøÍѤ·¤ÆÊªÍý¥Ç¥£¥¹¥¯¤Î¾ðÊó¤ò´ÉÍý¤·¤Æ¤¤¤Þ¤¹¡£ ¡¡¥¸¥ª¥á¥È¥ê¡¦¥Ö¥í¥Ã¥¯¤Ï¡¢¥Ö¡¼¥È¥×¥í¥°¥é¥à¤Î¾ì½ê¡¢ÉÔÎÉ¥Ö¥í¥Ã¥¯¤Î¥ê¥¹¥È¡¢¤ª¤è¤Ó¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¡¦¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤ò´Þ¤à¥Ç¥£¥¹¥¯¹½Â¤¤ò°Ý»ý¤·¡¢ÊªÍý¥Ç¥£¥¹¥¯¤Î¥Ö¥í¥Ã¥¯£±¤Ë¸ºß¤·¡¢¥Ö¥í¥Ã¥¯£°¤Ï¡¢¥Ö¡¼¥È¡¦¥Ö¥í¥Ã¥¯ÍѤ˳ÎÊݤµ¤ì¤Æ¤¤¤Þ¤¹¡£ ¡¡¤³¤Î¥¸¥ª¥á¥È¥ê¥Ö¥í¥Ã¥¯¤Ë¤è¤ê¡¢Ã±°ìʪÍý¥Ç¥£¥¹¥¯¤òºÇÂ磷¤Ä¤Î¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤Ëʬ³ä´ÉÍý¤·¤Æ¡¢ÏÀÍý¥Ç¥£¥¹¥¯ÁõÃ֤Ȥ·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£ ¡¡³Æ¥Ç¥£¥¹¥¯¡¦¥Ñ¡¼¥Æ¥£¥·¥ç¥ó¤Ï¡¢¼¡¤ËÀâÌÀ¤¹¤ë£¶¤Ä¤ÎÎΰè¤ò¤â¤Ã¤Æ¤¤¤Þ¤¹¡£ ¥Ö¡¼¥È¥Ö¥í¥Ã¥¯¡§ ¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¥í¡¼¥ÀÍѤÎÎΰ衢ɬ¤º¤·¤âÆâÍÆ¤Ï¸ºß¤·¤Ê¤¤¡£ ¥¹¡¼¥Ñ¥Ö¥í¥Ã¥¯¡§ ¤³¤³¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Ê¥Ç¥£¥¹¥¯¡¦¥Õ¥¡¥¤¥ë¹½Â¤¤Ë´Ø¤¹¤ëÁ´ÂξðÊó¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¡£ ¡¦ºîÀ®¤Ç¤­¤ë¥Õ¥¡¥¤¥ë¿ô ¡¦¥Ç¥£¥¹¥¯¾å¤Î¥Ö¥í¥Ã¥¯¿ô ¡¦¸½ºßÍøÍѤǤ­¤ë¶õ¤­¥Ö¥í¥Ã¥¯¤Ë¿ô ¡¦ºÆÇÛÃÖ²Äǽ¤Ê£é¥Î¡¼¥É¥ê¥¹¥È¤Î°ÌÃÖ ºÆÇÛÃÖ²Äǽ¤Ê£é¥Î¡¼¥É¥ê¥¹¥È¡§ ¥Ç¥£¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¹¡¼¥Ñ¥Ö¥í¥Ã¥¯¤Î¼¡¤Ë¡¢ºÆÇÛÃÖ²Äǽ¤Ê£é¥Î¡¼¥É¥ê¥¹¥È¤¬Â¸ºß¤¹¤ë¡£ ³Æ£é¥Î¡¼¥É¤Ï¡¢£¶£´¥Ð¥¤¥È¤Î¾ðÊó¤ò»ý¤Á¡¢ÉÔÎɥǥ£¥¹¥¯¥Ö¥í¥Ã¥¯¤Î¸ºß¤·¤Ê¤¤°ÌÃÖ¤ËÃÖ¤«¤ì¤Æ¤¤¤ë¡£ ³Æ£é¥Î¡¼¥É¤Ë¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ë´Ø¤¹¤ë¾ðÊ󤬳ÊǼ¤µ¤ì¤Æ¤¤¤ë¤È¶¦¤Ë¡¢¥Õ¥¡¥¤¥ë¤Î¥Ç¡¼¥¿¡¦¥Ö¥í¥Ã¥¯¤Î°ÌÃÖ¤¬³ÊǼ¤µ¤ì¤Æ¤¤¤ë¡£ ¡¦¥Õ¥¡¥¤¥ë¤Î¼ïÎà¡Ê¥Õ¥¡¥¤¥ë¡¢¥Ç¥£¥ì¥¯¥È¥ê¡¢¥¹¥Ú¥·¥ã¥ë¥Õ¥¡¥¤¥ë¡Ë ¡¦½êÍ­¼Ô ¡¦¥Õ¥¡¥¤¥ë¡¦¥×¥í¥Æ¥¯¥·¥ç¥ó ¡¦¥Õ¥¡¥¤¥ë¤Î¥ê¥ó¥¯¿ô ¡¦Â礭¤µ ¡¦ºÇ½ª¹¹¿·»þ¹ï ¡¦ºÇ½ª¥¢¥¯¥»¥¹»þ´Ö ¥Ó¥Ã¥È¥Þ¥Ã¥×¡§ ¡¡£é¥Î¡¼¥É¥ê¥¹¥È¤Ë³¤­¡¢¥Ç¥£¥¹¥¯¡¦¥Ö¥í¥Ã¥¯ÍøÍѾõ¶·¤ò´ÉÍý¤·¤Æ¤¤¤ë¥Ó¥Ã¥È¥Þ¥Ã¥×¤¬Â¸ºß¤¹¤ë¡£ ¥Ó¥Ã¥È¥Þ¥Ã¥×¤Ë¤è¤ê¡¢¥Ç¥£¥¹¥¯¥Ö¥í¥Ã¥¯¤Î³äÅö¤Æ¤¬¹â®¤Ë¤Ê¤ê¡¢Ï¢Â³Îΰè¥Õ¥¡¥¤¥ë¤Î³äÅö¤Æ¤¬²Äǽ¤Ë¤Ê¤ë¡£ ¥Ç¡¼¥¿¥Ö¥í¥Ã¥¯¡§ ¡¡¾åµ­¥Ö¥í¥Ã¥¯°Ê³°¤Î¥Ç¥£¥¹¥¯¥Ö¥í¥Ã¥¯¤Ï¡¢¤³¤Î¥Ç¡¼¥¿¥Ö¥í¥Ã¥¯¤Ë³ä¤êÅö¤Æ¤é¤ì¤ë¡£ ½ÅÊ£¥¹¡¼¥Ñ¥Ö¥í¥Ã¥¯¡§ ¡¡¤³¤Î¥Ç¥£¥¹¥¯¥Ö¥í¥Ã¥¯¤Ï¡¢¥¹¡¼¥Ñ¥Ö¥í¥Ã¥¯¤Î¥³¥Ô¡¼¤Ç¤¢¤ë¡£¤³¤ì¤Ï¡¢¸µ¤Î¥¹¡¼¥Ñ¥Ö¥í¥Ã¥¯¤¬¼º¤ï¤ì¤¿¾ì¹ç¤Ë¡¢¥Ç¥£¥¹¥¯¥æ¡¼¥Æ¥£¥ê¥£¥Æ¥£¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ë¡£

£´¡¥£±¡¡Ï¢Â³Îΰè¥Õ¥¡¥¤¥ë

¡¡Ï¢Â³Îΰè¥Õ¥¡¥¤¥ë¤¬¤È¤¯¤Ë°ÕÌ£¤ò»ý¤Ä¤Î¤Ï¡¢¥¢¥¯¥»¥¹¤¹¤ë¥Õ¥¡¥¤¥ë¤¬Â礭¤¤¾ì¹ç¤Ç¤¹¤¬¡¢¤³¤Î¤È¤­¤Ë£²¤Ä¤ÎÌäÂ꤬¥¯¥í¡¼¥º¥¢¥Ã¥×¤µ¤ì¤Þ¤¹¡£ ¡¡£±¤ÄÌܤÎÌäÂê¤Ï¡¢£ò£å£á£ä¡¿£÷£ò£é£ô£å¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï¡¢¥«¡¼¥Í¥ëÆâÉô¤Ë¥Ç¥£¥¹¥¯Å¾Á÷¥Ð¥Ã¥Õ¥¡¤ò»ý¤Ã¤Æ¤¤¤ë¤¿¤á·ë²Ì¤È¤·¤Æ¥Ç¡¼¥¿Å¾Á÷¤¬£²²óµ¯¤³¤Ã¤Æ¤·¤Þ¤¤¤Þ¤¹¡£¡Ê¥æ¡¼¥¶¥Ç¡¼¥¿Îΰ袪¥«¡¼¥Í¥ë¥Ð¥Ã¥Õ¥¡¢ª¥Ç¥£¥¹¥¯¥Ö¥í¥Ã¥¯¡Ë ¡¡¤³¤Î¤è¤¦¤ÊÀèÆÉ¤ß¸å½ñ¤­µ¡¹½¡Êread-ahead/write-behind¡Ë¤Ï¡¢¥¢¥¯¥»¥¹¤¹¤ë¥Ç¡¼¥¿¤¬¾®¤µ¤¤¾ì¹ç¤Ï¥­¥ã¥Ã¥·¥ó¥°¤Î¸ú²Ì¤¬¤¢¤ê¤Þ¤¹¤¬¡¢¥Ç¡¼¥¿¤¬Â礭¤¤¾ì¹ç¤¢¤­¤é¤«¤Ê̵ÂÌ»þ´Ö¤Ë¤Ê¤ê¡¢Æþ½ÐÎÏ»þ´Ö¤Îͽ¬¤òÆñ¤·¤¯¤·¤Þ¤¹¡£ ¡¡¤³¤ÎÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¤Ï¡¢¥·¥¹¥Æ¥à¤Î¥Ð¥Ã¥Õ¥¡¥­¥ã¥Ã¥·¥å¤ÎÍøÍѤò¶Ø»ß¤·¡¢¥æ¡¼¥¶¥Ç¡¼¥¿Îΰè¤È¥Ç¥£¥¹¥¯¥Ö¥í¥Ã¥¯¤È¤ÎľÀÜŪ¤Ê£Ä£Í£ÁžÁ÷¤ò¹Ô¤¦¡¢Ä¾Àܥǥ£¥¹¥¯Å¾Á÷¤ò²Äǽ¤Ë¤·¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£Ä̾盧¤Î¤è¤¦¤Êµ¡Ç½¤Ï¡¢¥Ç¥£¥¹¥¯ÁõÃÖ¤ò£ò£á£÷¥Ç¥Ð¥¤¥¹¤È¤·¤Æ°·¤¦¤³¤È¤Ë¤è¤Ã¤Æ²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤òÎ¥¤ì¤Æ¡¢¥Õ¥¡¥¤¥ë¤ò´ÉÍý¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤¿¤á¡¢Èó¾ï¤Ëº¤Æñ¤Ç¤¢¤ë¤Ð¤«¤ê¤Ç¤Ê¤¯´í¸±¤Ç¤â¤¢¤ê¤Þ¤¹¡£ ¡¡£Ò£Ô£Õ¤Ç¤Ï¡¢¤³¤ÎϢ³Îΰè¥Õ¥¡¥¤¥ë¤ËÂФ¹¤ëľÀܥǥ£¥¹¥¯Å¾Á÷¤Îµ¡Ç½¤Ï¡¢¥Õ¥¡¥¤¥ëºîÀ®»þ¤Î¥â¡¼¥É¤ÎÄɲäΤߤÇÍøÍѤǤ­¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢°ÂÁ´¤Ç¤«¤ÄºÇ¾®¤ÎÊѹ¹¤ÇϢ³Îΰè¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ï£ð£å£î¡¡¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤¹¤ë¡ÊϢ³Îΰè¥Õ¥¡¥¤¥ë´Ø·¸¤Î¤ßÀâÌÀ¡Ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢ #include ¨¢ ¨¢ ¨¢ ¨¢ int open(path,oflag[,mode[,size]]); ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢ char *path; ÂоΥե¡¥¤¥ë¤Î¥Ñ¥¹Ì¾¤Ø¤Î¥Ý¥¤¥ó¥¿ ¨¢ ¨¢ int oflag; À©¸æ¥Õ¥é¥°¡£°Ê²¼¤Î¤¤¤º¤ì¤«¤òñÆÈ¡¢¤¢¤ë¤¤¤ÏÁȤ߹ç¤ï¤»¤Æ»ØÄꤹ¤ë ¨¢ ¨¢ O_CTG Ϣ³¥Õ¥¡¥¤¥ëÎΰè¤Î¥ª¡¼¥×¥ó ¨¢ ¨¢ O_TRCTG Ϣ³¥Õ¥¡¥¤¥ëÎΰè¤Î¥µ¥¤¥º¤ÎÊѹ¹ ¨¢ ¨¢ O_DIRIO ¥«¡¼¥Í¥ë¥Ð¥Ã¥Õ¥¡¤ò¥Ð¥¤¥Ñ¥¹¤·¤ÆÄ¾ÀÜ¥Õ¥¡¥¤¥ëÆþ½ÐÎϤò²Äǽ¤Ë¤¹¤ë ¨¢ ¨¢ O_SYNC Ϣ³¥Õ¥¡¥¤¥ëÎÎ°è¤Ø¤ÎƱ´ü£×£Ò£É£Ô£Å¤ò¥»¥Ã¥È¤¹¤ë ¨¢ ¨¢ int mode; ¥Õ¥¡¥¤¥ë¡¦¥â¡¼¥É ¨¢ ¨¢ size; O_CTG ¤ò»ØÄꤷ¤¿¾ì¹ç¤Ë³ÎÊݤ¹¤ë¥Õ¥¡¥¤¥¹¥µ¥¤¥º¤ò»ØÄꤹ¤ë ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ Ϣ³Îΰè¥Õ¥¡¥¤¥ë¤ËÂФ¹¤ëľÀܥǥ£¥¹¥¯Å¾Á÷¥×¥í¥°¥é¥à #include /* ¥ª¡¼¥×¥ó¥Õ¥é¥°¤òÄêµÁ */ #include /* NBPG ¤ò»ÈÍѡݥá¥â¥ê´ÉÍý¤Î£±¥Ú¡¼¥¸¥µ¥¤¥º */ #define FSIZE 1048576 /* Ϣ³Îΰè¥Õ¥¡¥¤¥ë¤ÎÂ礭¤µ */ main () { int fd, oflags, ret; long offset = 0; ¡¡¡¡union {/* union ¤ò»ÈÍѤ·¤Æ¡¢¥Ç¡¼¥¿Îΰè¤ò¥Ú¡¼¥¸¥Ð¥¦¥ó¥À¥ê¤ËÀßÄꤹ¤ë */ char buf[NBPG]; short dummy[NBPG/2]; } mybuf; /* £±£Í¥Ð¥¤¥È¤ÎϢ³Îΰè¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë */ oflags = O_CREAT | O_CTG; if ((fd = open ("newfile", oflags, 0600, FSIZE)) < 0) perror ("Open O_CTG with FSIZE bytes"), exit (1); close (fd); /* ¤³¤Î¸å¤ÎľÀÜÆþ½ÐÎϤΤ¿¤á¤Ë¥¯¥í¡¼¥º¤¹¤ë */ /* ľÀÜÆþ½ÐÎϤΤ¿¤á¤ËϢ³Îΰè¥Õ¥¡¥¤¥ë¤òºÆ¥ª¡¼¥×¥ó¤¹¤ë */ oflags = O_DIRIO | O_WRONLY; if ((fd = open ("newfile", oflags, 0600)) < 0) perror ("open O_DIRIO"), exit (2); while (offset < FSIZE){ if ((ret = write (fd, mybuf.buf, NBPG)) == -1) perror("write"), exit(3); if (ret != NBPG) printf ("Write failed to transfer complete data\n"); offset += ret; } }

£´¡¥£²¡¡È󯱴üÆþ½ÐÎÏ

¡¡£²¤ÄÌܤÎÌäÂê¤ÏÆþ½ÐÎÏÁàºî¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤¬¡¢£Õ£Î£É£Ø¤Ç¤Ï´°Î»Éüµ¢·¿¤ÎÀ߷פˤʤäƤ¤¤ë¤¿¤á¸Æ¤Ó¤À¤·¤¿¥×¥í¥»¥¹¤¬Ä¹»þ´ÖÉõº¿¤µ¤ì¤ë¤³¤È¤Ç¤¹¡£Ê£¿ô¤Î¥×¥í¥»¥¹¤«¤é¤Î¥¢¥¯¥»¥¹¤¬¶¥¹ç¤·¤¿¾ì¹ç¡¢ºÇ¸å¤Ë¥·¥¹¥Æ¥à¥³¡¼¥ë¤òȯ¹Ô¤·¤¿¥×¥í¥»¥¹¤Ï¡¢¤¹¤Ù¤Æ¤ÎÆþ½ÐÎÏÆ°ºî¤¬½ªÎ»¤¹¤ë¤Þ¤ÇÉõº¿¤µ¤ì¡¢µ®½Å¤Ê¼Â»þ´Ö¤ò̵°Ù¤ËÈñ¤ä¤¹·ë²Ì¤Ë¤Ê¤ê¤Þ¤¹¡£ ¡¡Æþ½ÐÎϽèÍý¤¬È󯱴ü¤Ë¼Â¹Ô¤Ç¤­¤ë¾ì¹ç¡¢¿Þ¤Î¤è¤¦¤Ë¼ÂºÝ¤ÎÆþ½ÐÎÏÁàºî»þ´Ö¤ÏƱ¤¸¤Ç¤â½èÍýÁ´ÂΤλþ´Ö¤Ïû¤¯¤Ê¤ê¤Þ¤¹¡££Ò£Ô£Õ¤Î¾ì¹ç¡¢¥Æ¡¼¥×¥Ç¥Ð¥¤¥¹¤ËÂФ·¤Æ¤³¤Îµ¡Ç½¤¬Ä󶡤µ¤ì¡¢¥Ç¥£¥¹¥¯¥Õ¥¡¥¤¥ë¤ÎÆþ½ÐÎϤËÂФ·¤Æ¤Ï¡¢¸å¤ÇÀâÌÀ¤¹¤ë¥¹¥ì¥Ã¥É¤ò»ÈÍѤ·¤Æ¼Â¸½¤·¤Æ¤¤¤Þ¤¹¡£ ­¡­¢­£¡¡¡¡¡¡¡¡¡¡¡¡¡¡­¤­¥­¦­§­¨­© ¥×¥í¥»¥¹¡¡£Á ¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¡ ¨¢ ¨¢ ¥Ç¥£¥¹¥¯½ÐÎÏ ¨¦¨¡¨¡¨¨¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¤ ¨¢ ¨¢ ­¡ ¨¢ ¨¢ ½ñ¤­¹þ¤ß¥Ç¡¼¥¿¤Î½àÈ÷ ¥×¥í¥»¥¹¡¡£Â ¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡ ­¢ ¡¡¡¡¡¡­¡­¢­£¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡­¤­¥­¦­§­¨­© ­£¡¡¡¡¥Ç¥£¥¹¥¯½ñ¤­¹þ¤ß ­¤ ¡¡¡¡¡¡ ´°Î»Éüµ¢·¿¥·¥¹¥Æ¥à¥³¡¼¥ë¡ÊƱ´üÆþ½ÐÎϽèÍý¡Ë ­¥ ¥Ç¥£¥¹¥¯Áàºî¤È¤Ï´Ø·¸Ìµ¤¯¼Â¹Ô²Äǽ ­¦ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ­¡­¢­£¡¡­¤­¥­¦­ó¡¡¡¡­§­¨­© ­§ ¥×¥í¥»¥¹¡¡£Á ¨¡¨¡¨¡¨¤¨£¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡ ­¨ ¥Ç¥£¥¹¥¯Áàºî¸å¤·¤«¼Â¹Ô¤Ç¤­¤Ê¤¤ ¨¢¨¢ ¨¢ ¨¢ ­© ¥Ç¥£¥¹¥¯½ÐÎÏ ¨¦¨ª¨¡¨¨¨¨¨ª¨¡¨ª¨¨¨¡¨¡¨¤ ­ó ½ñ¤­¹þ¤ß´°Î»ÂÔ¤Á¥·¥¹¥Æ¥à¥³¡¼¥ë ¨¢¨¢ ¨¢ ¨¢ ¥×¥í¥»¥¹¡¡£Â ¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡ ¡¡¡¡¡¡­¡­¢­£¡¡­¤­¥­¦­ó¡¡¡¡¡¡­§­¨­© ¡¡¡¡¡¡¡¡¡¡¡¡¡¡Èó´°Î»Éüµ¢·¿¥·¥¹¥Æ¥à¥³¡¼¥ë¡ÊÈ󯱴üÆþ½ÐÎϽèÍý¡Ë ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£é£ï£ã£ô£ì¡¡ÁõÃÖ¤ÎÀ©¸æ¡ÊÈ󯱴üÆþ½ÐÎϽèÍý¤Î¤ßÀâÌÀ¡Ë ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢¡¡¡¡#include ¨¢ ¨¢ ¨¢ ¨¢¡¡¡¡int ioctl(fildes,request,arg) È󯱴üÆþ½ÐÎϡʥ֥í¥Ã¥¯¥Ç¥Ð¥¤¥¹¤Ï¥Æ¡¼¥×¤Î¤ß¡Ë ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢¡¡¡¡int fildes; ¥Õ¥¡¥¤¥ëµ­½Ò»Ò ¨¢ ¨¢¡¡¡¡request; FIOASYNC È󯱴üÆþ½ÐÎϤδ°Î»¤òÂԤġʥ֥í¥Ã¥¯¥Ç¥Ð¥¤¥¹¡Ë ¨¢ ¨¢¡¡¡¡ FIOAWRITE È󯱴ü£×£Ò£É£Ô£Å¤ò¹Ô¤Ê¤¦¡Ê¥Ö¥í¥Ã¥¯¥Ç¥Ð¥¤¥¹¡Ë ¨¢ ¨¢¡¡¡¡ FIOAREAD È󯱴ü£Ò£Å£Á£Ä¤ò¹Ô¤Ê¤¦¡Ê¥Ö¥í¥Ã¥¯¥Ç¥Ð¥¤¥¹¡Ë ¨¢ ¨¢¡¡¡¡ FIONBIO Èó¥Ö¥í¥Ã¥¯¥Ç¥Ð¥¤¥¹¤ÎÈ󯱴ü¥Õ¥¡¥¤¥ëÆþ½ÐÎϤòÀ©¸æ¤¹¤ë ¨¢ ¨¢¡¡¡¡arg; struct _io { ¨¢ ¨¢¡¡¡¡ char *io_address; ¥Ç¡¼¥¿¥Ð¥Ã¥Õ¥¡¥¢¥É¥ì¥¹ ¨¢ ¨¢¡¡¡¡ int io_count; žÁ÷¥Ç¡¼¥¿¿ô ¨¢ ¨¢¡¡¡¡ struct io_result { ¨¢ ¨¢¡¡¡¡ int io_acount; ¼ÂºÝ¤ËžÁ÷¤µ¤ì¤¿¥Ð¥¤¥È¿ô ¨¢ ¨¢¡¡¡¡ int io_error; ¥¨¥é¡¼¥³¡¼¥É ¨¢ ¨¢¡¡¡¡ } io_result; ¨¢ ¨¢¡¡¡¡ int (*lo_handler)(); Äã¥ì¥Ù¥ë¥È¥é¥Ã¥×¥Ï¥ó¥É¥é¤Ø¤Î¥Ý¥¤¥ó¥¿ ¨¢ ¨¢¡¡¡¡ int (*func)(); žÁ÷½ªÎ»»þµ¯Æ°´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿ ¨¢ ¨¢¡¡¡¡ int io_param; ¥Ñ¥é¥á¡¼¥¿ ¨¢ ¨¢¡¡¡¡ int io_priority; £Á£Ó£Ô¥×¥é¥¤¥ª¥ê¥Æ¥£ ¨¢ ¨¢¡¡¡¡ }; ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡°Ê²¼¤Ë¡¢£Á£Ó£Ô¤ò»ÈÍѤ·¤¿È󯱴üÆþ½ÐÎÏ¥×¥í¥°¥é¥à¤ÎÎã¤òÀâÌÀ¤·¤Þ¤¹¡£ ¡¡¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¢£Ò£Ô£Õ¤Î¥Æ¡¼¥×¥É¥é¥¤¥Ð¤ÎÈ󯱴üÆþ½ÐÎϵ¡Ç½¤ò»ÈÍѤ·¡¢¥¹¥È¥ê¡¼¥ß¥ó¥°¡¦¥Æ¡¼¥×¡¦¥Ç¥Ð¥¤¥¹¤Ø¤ÎÆþ½ÐÎϤò¼Â¹Ô¤·¤Þ¤¹¡£¤³¤Î¥×¥í¥°¥é¥à¤Î¥³¥Þ¥ó¥É¹Ô¤Î°ú¿ô¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ a.out [-f device] record_size "device" ¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¡¢/dev/rmt0 ¤Ç¤¢¤ê "record_size" ¤Ï¡¢³Æ½ñ¹þ¤ß¤Î¥µ¥¤¥º¤ò¥Ð¥¤¥Èñ°Ì¤Ç»ØÄꤷ¤Þ¤¹¡£ ¤³¤Î¥µ¥¤¥º¤Ï¡¢£±¡Á£¶£³¥­¥í¥Ð¥¤¥È¤ÎÈϰϤǤʤ±¤ì¤Ð¤Ê¤é¤º¡¢¤¿¤È¤¨¤Ð°Ê²¼¤Î¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ a.out -f /dev/rctp 1024 #include #include #include #include #include #define MIN_SIZE 1024 #define MAX_SIZE (63 * 1024) /* This is our I/O buffer structure. It ties the disk * buffer in with the async I/O packet. */ typedef struct ioq { struct _io m; /* The asyncio structure */ struct ioq *next; /* Forward pointer for chaining on lists */ char *buffer; /* Pointer to the actual I/O buffer */ } IOQ; int _asthandler(); /* C-language low level handler */ char *malloc(); int completion(); /* AST completion routine */ int aborted(); /* ^C trap routine. */ IOQ *get_free_io_buffer(); /* Routine to return a free I/O buffer */ int tape; /* Channel to perform tape I/O on */ char asyncio; /* Holds total number of I/O buffers */ char iofree; /* Holds # of free buffers at any time */ IOQ *ioq_list = 0; /* The head of the free buffer list */ IOQ *pending_io = 0; /* Special list for better performance */ IOQ *last_pending = 0; /* Look in the write-track subr for info */ int record_size; /* Size in bytes of each I/O buffer */ int bytes_transferred; /* Total # bytes xferred for statistics */ char exit_flag = 0; /* Global flag gets set by ^C */ char *tape_name = "/dev/rmt0"; /* Default tape device to use */ /* ASYNC IO TAPE PROGRAM */ main(argc,argv) int argc; char **argv; { register short i; register IOQ *io; register int buffer_count; int start_time,finish_time; double xfer_rate; /* First, decode the command line looking for record size and tape */ /* drive name. Record size must be specified, tape name is optional */ for(i = 1; i < argc; i++){ /* Read command line arguments */ if(strcmp(argv[i],"-f") == 0){ /* Tape drive flag */ tape_name = argv[++i]; /* Point to tape drive name */ continue; /* Go to next argument */ } record_size = decode_size(argv[i]); /* Get size of records */ } /* Insure that record size is in 1\-63 Kbyte range */ if(record_size < MIN_SIZE || record_size > MAX_SIZE){ printf("Illegal record size %d\n",record_size); exit(2); } if((tape = open(tape_name, O_WRONLY)) < 0){ /* Open raw tape device */ printf("Open failed for tape drive %s\n", tape_name); exit(1); } init_tapeio(tape); /* Call routine to init async I/O */ buffer_count = (40 * 1024 * 1024) / record_size; /* Calc buffers required */ bytes_transferred = 0; /* Init number of bytes transferred so far */ sigset( SIGINT, aborted ); /* Set up the interrupt trap routine */ time(&start_time); /* Record starting time of day */ while(1){ /* Loop until all records written */ io = get_free_io_buffer(); /* Get an I/O buffer to use */ write_track_to_tape(io); /* Dump buffer to tape */ if(--buffer_count <= 0) { break; /* If done, quit loop */ } if(exit_flag) { break; /* If interrupt, quit loop */ } } flush_pending_io(); /* Flush any I/O still waiting */ close(tape); /* Close the tape drive */ time(&finish_time); finish_time -= start_time; /* Get delta seconds it took to do */ xfer_rate = (bytes_transferred / finish_time) / 1024.0; printf("%d seconds = %7.3f Kbytes/Second\n",finish_time, xfer_rate); } /* INIT_TAPEIO - Routine to set up the async I/O data structures */ init_tapeio(channel) int channel; { register int i; register IOQ *io; /* Next several lines figure out how many "record_size" I/O buffers to * use. The driver has a limited number of buffers, and the FIOASYNC * ioctl returns this to us. We then figure out, with that as a maximum, * how many buffers we want to have so that we end up with about 200K of * buffer space. */ /* Get maximum number of outstanding async i/o requests the device * can support. This becomes our maximum number of buffers. */ asyncio = ioctl(channel,FIOASYNC,0); if(asyncio == 0) { printf("Driver does not support async I/O\n"); exit(1); } /* Try for 200K worth of buffer space, if possible */ if((asyncio * record_size) > (200 * 1024)){ asyncio = (200 * 1024) / record_size; } printf("Using %d buffers\n",asyncio); /* Initialize # of free I/O buffers and allocate packet identifiers */ iofree = asyncio; ioq_list = (IOQ *)malloc(asyncio * sizeof(IOQ)); io = ioq_list; /* Get address of first packet */ for(i = 0; i < asyncio; i++){ /* Initialize packets */ io->m.io_count = record_size; /* Byte count for transfer */ io->m.io_handler = _asthandler; /* Address of std AST handler */ io->m.io_param1 = completion; /* Address of our AST handler */ io->m.io_param2 = (int)io; /* Address of this packet */ io->m.io_priority = 10; /* AST priority */ io->next = &io[1]; /* Point to the next packet */ io->buffer = malloc(record_size); /* Allocate a disk buffer */ /* Lock buffers in core so we don't lose time page-faulting them in */ if(plockin(io->buffer,record_size) < 0){ printf("Cannot lock down I/O buffer\n"); exit(2); } io++; /* Point this to the next packet */ } io--; /* Back this up to the last packet */ io->next = 0; /* No next pointer on the last packet */ } /* GET_FREE_IO_BUFFER - This routine returns an I/O buffer to use */ IOQ * get_free_io_buffer() { register IOQ *io; setpri(10); /* Block asts while we manipulate list */ while((io = ioq_list) == 0){ /* Loop while there are no free buffers */ astpause(0,1000); /* Sleep at low priority until an AST */ setpri(10); /* Pop priority back up */ } ioq_list = io->next; /* Unchain first block from the list */ iofree--; /* Decrement number of free buffers */ setpri(0); /* Lower priority */ return(io); } /* FLUSH_PENDING_IO - Routine to insure all remaining buffers get written */ flush_pending_io() { register IOQ *io; setpri(10); /* Avoid conflict with ASTs */ io = pending_io; /* Get beginning of pending list */ while(io){ /* Dump entire list to the driver */ io->m.io_address = io->buffer; /* Load address of the buffer */ ioctl(tape,FIOAWRITE, &io->m); /* Send it to the driver */ io = io->next; /* Chain to next packet on list */ } pending_io = last_pending = 0; /* Zero the pending list */ setpri(0); /* Drop priority back down */ return; } /* WRITE_TRACK_TO_TAPE - Routine to send an I/O buffer to the tape driver */ write_track_to_tape(io) register IOQ *io; /* The I/O buffer to be sent */ { static int stream_count = 0; /* Remembers xfers and re-positions */ setpri(10); /* Block ASTs */ /* If no buffers are outstanding, then a re-position has occurred. Use the pending list instead of immediately queuing packet */ if(iofree == (asyncio-1)){ /* We have 1 buffer, io */ io->next = 0; if(pending_io) last_pending->next = io; else pending_io = io; /* Insert onto the end of the pend list */ last_pending = io; /* since the order that the buffers get */ setpri(0); /* written to tape is important. */ printf("Begin New pending list (%d records written)\n",stream_count); stream_count = 1; /* Reset count of buffers per reposition*/ return; /* Ok, just leave it on the pend list */ } /* We get here if all of the buffers are not free. However, we may still * have just had a re-position. If there is anything on the pending list, this * is the case. Therefore, if anything is on the pending list, we put this * buffer on it also. */ stream_count += 1; /* Count number of records / reposition */ if(pending_io){ /* If pending IO already */ io->next = 0; /* just chain onto the end of the list */ last_pending->next = io; /* until we have a lot of disk built up */ last_pending = io; /* Indicate we are now final packet */ } /* Else, if there is nothing on the pending list, the tape drive is still * moving. In this case, we want to get this packet to the driver quickly * so that it helps to keep the drive moving. */ else { io->m.io_address = io->buffer; /* io_address to track buff */ ioctl(tape, FIOAWRITE, &io->m); /* Give the packet to the driver */ setpri(0); /* Unblock ASTs now */ return; /* Go back to get more disk blocks */ } /* Here we know there is I/O on the pending list. Check whether * we need to send the list because all I/O buffers are on the list. */ if(iofree == 0) { /* If all I/O Packets are exhausted... */ io = pending_io; /* Get the beginning of the pending list */ while(io) { /* Dump entire list to the driver */ io->m.io_address = io->buffer; /* Load address of buffer */ ioctl(tape,FIOAWRITE, &io->m); /* Send it to the driver */ io = io->next; /* Chain to next packet on list */ } pending_io = last_pending = 0; /* Zero the pending list */ } setpri(0); /* Drop priority back down */ return; } /* COMPLETION - AST routine entered when a buffer has finished */ completion(io, pc, pri) register IOQ *io; /* Address of finished I/O buffer */ int pc; int pri; { register struct _io *m; /* Pointer to _io structure */ m = &io->m; /* Set to address of the _io structure */ /* if no errors, increment count of number of bytes transferred */ if(m->io_result.io_acount == m->io_count) { bytes_transferred += m->io_count; } else { /* Else, there WAS an error */ if(m->io_result.io_acount == 0) { /* If end of tape error */ exit_flag = 1; /* Then quit now */ } else { printf("Error %d\n",m->io_result.io_error); } } io->next = ioq_list; /* Chain beginning of list to our packet */ ioq_list = io; /* Put our packet back at the beginning */ iofree++; /* Increment count of free buffers */ } /* ABORTED - Here on a CTRL-C (interrupt) from the user */ aborted() { exit_flag = 1; /* Tell the main loop to stop */ } /* DECODE_SIZE - Here to perform an atoi function * * Function: * * This routine acts like atoi, except that it recognize * a 'K' to mean times 1024. Called by code in "main" that * reads arguments. */ decode_size(string) register char *string; { register int value; register int c; value = 0; /* Initialize value */ while(c = *string++){ /* Run until we hit a null */ if(c >= '0' && c <= '9'){ /* If a numeric digit */ value *= 10; /* multiply value up by the base */ value += c - '0'; /* Take out ASCII offset, add digit */ continue; /* Go process next character */ } if(c == 'K' || c == 'k') { /* If he is specifying in K-bytes */ value *= 1024; /* Then multiply by a K */ continue; } printf("?Illegal character [%c] in numeric string\n",c); } return(value); }

¡ø£µ¡¡¥á¥â¥ê´ÉÍý¤È¥­¥ã¥Ã¥·¥å ¨¢

¡¡£Õ£Î£É£Ø¤Î¥×¥í¥»¥¹¤Ï¼çµ­²±¤òÂçÎ̤˾ÃÈñ¤·¤Þ¤¹¡££Õ£Î£É£Ø¤¬½Ð²ó¤ê»Ï¤á¤¿Åö½é¤Ï¾¯¤Ê¤¤¼çµ­²±¤ÈÃÙ¤¤Æó¼¡µ­²±ÁõÃ֤Ǥ¢¤Ã¤¿¤¿¤á¤Ë¡¢¾¯¤·Â礭¤Ê¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤¹¤ë¤È¥·¥¹¥Æ¥à¤¬¥¹¥ï¥Ã¥×¥¤¥ó¡¿¥¹¥ï¥Ã¥×¥¢¥¦¥È¤ò·«¤êÊÖ¤·¡¢¤½¤Î¼Â¹Ô®ÅÙ¤ÎÃÙ¤µ¤ËÂѤ¨¤é¤ì¤Ê¤¤¥æ¡¼¥¶¤¬Â¿¤¯¤¤¤Þ¤·¤¿¡£ ¡¡¥á¥â¥ê¤È¥Ç¥£¥¹¥¯¤¬Â®¤¯°Â¤¯ÂçÍÆÎ̤ˤʤ俸½ºß¡¢¤³¤ó¤Ê¤³¤È¤¬ÌäÂê¤Ë¤Ê¤ë¥±¡¼¥¹¾¯¤Ê¤¤¤Ç¤·¤ç¤¦¤¬¡¢¥ê¥¢¥ë¥¿¥¤¥à£Õ£Î£É£Ø¤Ç¤Ï¡¢¤Á¤ç¤¦¤ÉƱ¤¸¤è¤¦¤Ê¸½¾Ý¤¬¤ª¤³¤ê¤Þ¤¹¡£ ¡¡¤³¤Î¾ì¹çÂѤ¨¤é¤ì¤Ê¤¤¤Î¤Ï¿Í´Ö¤Ç¤Ï¤Ê¤¯¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤Ç¤¹¡£¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹¤¬¥Ú¡¼¥¸¥ó¥°¡¿¥¹¥ï¥Ã¥Ô¥ó¥°¤µ¤ì¤ë¤È¥Ç¥£¥¹¥¯ÁõÃÖ¤«¤é¥¹¥ï¥Ã¥×¥¤¥ó¤µ¤ì¤ëʬ¤À¤±±þÅú»þ´Ö¤¬ÃÙ¤¯¤Ê¤ê¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹¤Ï¡¢¼çµ­²±¤Ë¾ïÃ󤵤»¤ëµ¡¹½¤¬É¬ÍפǤ¹¡£ ¡¡£Ó£Ö£Ò£´¤Ç¤Ï¡¢¤³¤Î¥á¥â¥ê¥í¥Ã¥¯µ¡¹½¤¬£ð£ì£ï£ã£ë¥·¥¹¥Æ¥à¥³¡¼¥ë¤È¤·¤Æ¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ¤³¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ç¤Ï¡¢¥×¥í¥»¥¹¤Î¥Æ¥­¥¹¥È¥»¥°¥á¥ó¥È¡¢¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤Î¤É¤Á¤é¤«¤¢¤ë¤¤¤Ï¤½¤ÎξÊý¤ò¥í¥Ã¥¯¤·¤Þ¤¹¡£¤±¤ì¤É¤â¤³¤ÎÊýË¡¤À¤±¤Ç¤Ï¡¢Èó¾ï¤ËÂ礭¤¤¥Ç¡¼¥¿¹½Â¤¤ò¤¢¤Ä¤«¤¦¾ì¹ç¤¿¤¤¤Ø¤óÉÔÍø¤Ç¤¹¡£¤â¤·¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤¬Â礭¤¹¤®¡¢¼çµ­²±¤Ë¾ïÃó¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥í¥Ã¥¯µ¡¹½¼«ÂΤ¬»ÈÍѤǤ­¤Ê¤¯¤Ê¤ë¤«¤é¤Ç¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¸½¼ÂŪ¤Ë¤Ï¡¢£Ò£Ô£Õ¤Î¤è¤¦¤Ë£Ó£Ö£Ò£´¤Î¥í¥Ã¥¯µ¡¹½¤Ë²Ã¤¨¤Æ¡¢¥Ç¡¼¥¿¤ò¥Ú¡¼¥¸Ã±°Ì¤Ç¥í¥Ã¥¯¤¹¤ëµ¡¹½¤ò²Ã¤¨¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢pinfo(address,size,ptevec,cmapvec) ¨¢¥«¥ì¥ó¥È¥×¥í¥»¥¹¤Î²¾ÁÛ¶õ´Ö¤Î¥Ú¡¼¥¸¥Æ¡¼¥Ö¥ë¤È¥³¥¢¥Þ¥Ã¥×¤òÆÀ¤ë ¨¢ ¨¢plock(op) ¨¢¥Æ¥­¥¹¥È¡¢¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤Î¤É¤Á¤é¤«¤¢¤ë¤¤¤ÏξÊý¤ò¥í¥Ã¥¯¤¹¤ë ¨¢ ¨¢rtplock(op) ¨¢¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹ÀìÍÑ plock ¥·¥¹¥Æ¥à¥³¡¼¥ë ¨¢ ¨¢plockin(address,size) ¨¢¥á¥â¥ê¤ò¥Ú¡¼¥¸Ã±°Ì¤Ç¥í¥Ã¥¯¤¹¤ë ¨¢ ¨¢punlock(address,size) ¨¢¥á¥â¥ê¤ò¥Ú¡¼¥¸Ã±°Ì¤Ç¥¢¥ó¥í¥Ã¥¯¤¹¤ë ¨¢ ¨¢brk(end_datasegment) ¨¢¥×¥í¥»¥¹¤Î¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤ò³ÈÄ¥¤¹¤ë ¨¢ ¨¢sbrk(increases_size) ¨¢¥×¥í¥»¥¹¤Î¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤Î¥¢¥É¥ì¥¹¤òÆÀ¤ë ¨¢ ¨¢mmap(addr,len,prot,share,fd,off) ¨¢¥×¥í¥»¥¹¤Î²¾ÁÛ¶õ´Ö¤Ë¥á¥â¥ê¤«¥·¥¹¥Æ¥à¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Þ¥Ã¥×¤¹¤ë ¨¢ ¨¢munmap(addr,len) ¨¢¥×¥í¥»¥¹¤Î²¾ÁÛ¶õ´Ö¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥ó¥Þ¥Ã¥×¤¹¤ë ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¥á¥â¥ê´ÉÍý¤ò¹Í¤¨¤ë¤È¤­¤Ë¡¢¤â¤¦°ì¤ÄÌäÂê¤Ë¤Ê¤ë¤Î¤Ï¡¢¥­¥ã¥Ã¥·¥å¤Î°ìÃ×À­¤È¥Ð¥¹¥¢¥¯¥»¥¹¶¥¹ç¤ÎÌäÂê¤Ç¤¹¡£ ¸½ºß£Õ£Î£É£Ø¤Ç»ÈÍѤµ¤ì¤ë¡¢¤Û¤È¤ó¤É¤ÎÂåɽŪ¤Ê¥Þ¥¤¥¯¥í¥×¥í¥»¥Ã¥µ¤Ë¤Ï¥­¥ã¥Ã¥·¥å¤¬Æâ¢¤µ¤ì¤Æ¤¤¤Þ¤¹¤·¡¢¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¹½À®¤Î¥ï¡¼¥¯¥¹¥Æ¡¼¥·¥ç¥ó¤â°ìÈÌŪ¤Ë¤Ê¤Ã¤Æ¤­¤Þ¤·¤¿¡£ ¡¡¥­¥ã¥Ã¥·¥å¤ÎÉÔ°ìÃ×ÌäÂê¤Ï¡¢¤³¤Î¤è¤¦¤Ê¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¹½À®¤Ï¤â¤È¤è¤ê¥·¥ó¥°¥ë¥×¥í¥»¥Ã¥µ¤Ç¤â£Ä£Í£Á¥³¥ó¥È¥í¡¼¥éÅù¤Î¥Þ¥ë¥Á¥Þ¥¹¥¿¹½À®¤À¤È¤³¤Î¥­¥ã¥Ã¥·¥å¤ÎÉÔ°ìÃפ¬µ¯¤³¤ê¤Þ¤¹¡£ ¡¡¡Ê¥­¥ã¥Ã¥·¥å¤Î¥×¥í¥È¥³¥ë¤Ï³Æ¼ï¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢¤³¤³¤Ç¤Ï¥â¥È¥í¡¼¥é£¶£¸£°£Ø£°¤ÇºÎÍѤµ¤ì¤Æ¤¤¤ë¥×¥í¥È¥³¥ë¤Ë¤Ä¤¤¤Æ²òÀ⤷¤Þ¤¹¡£¡Ë ¡¡¥­¥ã¥·¥å¤ÎÉÔ°ìÃ×ÌäÂê¤È¤Ï¿Þ¤Î½é´ü¾õÂ֤Τ褦¤ËÀµ¤·¤¤¾õÂ֤ǡ¢Æ±°ì¥Ç¡¼¥¿¤ò¶¦Í­¤·¤Æ¤¤¤ë¤È¤­¤Ë¡¢¤¤¤º¤ì¤«¤Î¥×¥í¥»¥Ã¥µ¤¬¡¢¥Ç¡¼¥¿¤ò¹¹¿·¤¹¤ë¤È¿Þ¤ÎÃæ´Ö¾õÂ֤Τ褦¤Ë¡¢¥­¥ã¥Ã¥·¥å¤ÎÆâÍÆ¤¬ÉÔ°ìÃ×¾õÂ֤ˤʤ뤳¤È¤ò¤¤¤¤¤Þ¤¹¡£ ¡¡¿Þ£Á¤Ç¼¨¤·¤¿¥é¥¤¥È¥¹¥ë¡¼¥×¥í¥È¥³¥ë¤Î¾ì¹ç¤¿¤À¤Á¤ËƱÍͤΥǡ¼¥¿¤ò¥á¥â¥ê¤Ë½ñ¤­½Ð¤·¡¢Â¾¤Î¥­¥ã¥Ã¥·¥å¤Î¥¿¥°¤ò¥À¡¼¥Æ¥£¾õÂ֤ˤ·¤Þ¤¹¡£¤½¤Î¸å¥À¡¼¥Æ¥£¾õÂ֤Υ­¥ã¥Ã¥·¥å¤òÆÉ¤ß¤À¤½¤¦¤È¤¹¤ë¤È¥á¥â¥ê¤«¤éÀµ¤·¤¤¥Ç¡¼¥¿¤òÆÉ¤ß½Ð¤·¥­¥ã¥Ã¥·¥å¤ò¹¹¿·¤·¤Þ¤¹¡£ ¡¡¤³¤Î¥×¥í¥È¥³¥ë¤Î·çÅÀ¤Ï¡¢¥­¥ã¥Ã¥·¥å¹¹¿·»þ¤Ëɬ¤º¥Ç¡¼¥¿¤ò¥á¥â¥ê¤Ë½ñ¤­½Ð¤¹¤¿¤á¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¡Ê¥Þ¥¹¥¿¡Ë¹½À®»þ¤Ë¥Ð¥¹¥È¥é¥Õ¥£¥Ã¥¯¤òÁý²Ã¤µ¤»¤ë¸¶°ø¤Ë¤Ê¤ë¤³¤È¤Ç¤¹¡£ ¡¡¤Þ¤¿£Ä£Í£Á¤Ê¤É¤Ç¥á¥â¥ê¤ÎÆâÍÆ¤òľÀܽñ¤­´¹¤¨¤¿¾ì¹ç¡¢¥­¥ã¥Ã¥·¥å¤Ï¹¹¿·¤µ¤ì¤Þ¤»¤ó¤Î¤Ç¡¢ÆÃÊ̤ÊÁàºî¤Ç¥­¥ã¥Ã¥·¥å¤ò¥Õ¥é¥Ã¥·¥å¤·Àµ¾ï¤Êưºî¤òÊݾڤ·¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£¡Ê¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥Ð¤Ç¥­¥ã¥Ã¥·¥å¤ò¥Õ¥é¥Ã¥·¥å¤·¤Þ¤¹¡Ë ¡¡¤³¤ì¤é¤Î·çÅÀ¤ò²ò·è¤·¤¿¤Î¤¬¥³¥Ô¡¼¥Ð¥Ã¥¯¡¦¥×¥í¥È¥³¥ë¤Ç¤¹¡£¡Ê¥¹¥Ì¡¼¥Ô¥ó¥°¡¦¥×¥í¥È¥³¥ë¤È¤â¸Æ¤Ö¤Þ¤¹¡Ë ¤³¤Î¥×¥í¥È¥³¥ë¤ò¼Â¸½¤¹¤ë¤¿¤á¤Ë¤Ï¡¢¥Ð¥¹¤ò´Æ»ë¤¹¤ëÀìÍѥ⥸¥å¡¼¥ë¤¬Â¸ºß¤¹¤ë¤³¤È¤òÁ°Äó¤Ë¤·¤Æ¤¤¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥³¥ó¥È¥í¡¼¥é¤ò¥¹¥Ì¡¼¥Ô¥ó¥°¡¦¥³¥ó¥È¥í¡¼¥é¤È¸Æ¤Ó¡¢£Í£Ã£¶£°£¸£°£´£°¥×¥í¥»¥Ã¥µ¤Ï¤³¤ì¤òÆâ¢¤·¤Æ¤¤¤Þ¤¹¡£ ¡¡´ðËÜŪ¤Ê¹Í¤¨Êý¤Ï¡¢¥á¥â¥ê¥¢¥¯¥»¥¹¤òºÇ¾®¸Â¤Ë¤ª¤µ¤¨¤ë¤¿¤á¡¢¥­¥ã¥Ã¥·¥å¤Î¹¹¿·»þ¤Ë¥­¥ã¥Ã¥·¥å¤Î¤ß½ñ´¹¤¨¤ò¤ª¤³¤Ê¤¤¡¢¥á¥â¥ê¤ÎÆâÍÆ¤Ï¥À¡¼¥Æ¥£¾õÂ֤Τޤޤˤ·¤Æ¤ª¤­¤Þ¤¹¡£¥á¥â¥ê¤ÎÆâÍÆ¤¬¹¹¿·¤µ¤ì¤ë¤Î¤Ï¡¢¥­¥ã¥Ã¥·¥å¤ÎÆâÍÆ¤¬¥­¥ã¥Ã¥·¥å¤«¤éÇӽФµ¤ì¤ëºÝ¤Ë¥á¥â¥ê¤Ë½ñ¤­Ìᤵ¤ì¤Þ¤¹¡£ ¡¡Â¾¤Î¥×¥í¥»¥Ã¥µ¤Î¥­¥ã¥Ã¥·¥å¤Î¹¹¿·¤Ï¡¢¥¹¥Ì¡¼¥Ô¥ó¥°¥³¥ó¥È¥í¡¼¥é¤Ë¤è¤ê¥­¥ã¥·¥å´Ö¤Ç¹â®¤Ë¹Ô¤ï¤ì¡¢Â¾¤Î¥Ð¥¹¥Þ¥¹¥¿¡Ê£Ä£Í£ÁÅù¡Ë¤Î¥¢¥¯¥»¥¹¤ËÂФ·¤Æ¤âƱÍÍ¤ÎÆ°ºî¤Ë¤Ê¤ê¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¡¡¡¡¡¡¡¡¼çµ­²±¨¢¡û A=0 ¨¢ ¨¢¡ß A=0 ¨¢ ¨¢¡û A=1 ¨¢ ¨¢¡û A=1 ¨¢ ¨¦¨¡¨¡¨¨¨¡¨¡¨¥ ¨¦¨¡¨¡¨¨¨¡¨¡¨¥ ¨¦¨¡¨¡¨¨¨¡¨¡¨¥ ¨¦¨¡¨¡¨¨¨¡¨¡¨¥ ¨¡¨¨¨¡¨¡¨ª¨¡¨¡¨¨¨¡ ¨¡¨¨¨¡¨¡¨ª¨¡¨¡¨¨¨¡ ¨¡¨¨¨¡¨¡¨ª¨¡¨¡¨¨¨¡ ¨¡¨¨¨¡¨¡¨ª¨¡¨¡¨¨¨¡ ¨£¨¡¨ª¨¡¨¤ ¨£¨¡¨ª¨¡¨¤¨£¨¡¨ª¨¡¨¤ ¨£¨¡¨ª¨¡¨¤ ¨£¨¡¨ª¨¡¨¤¢¬¨£¨¡¨ª¨¡¨¤¨£¨¡¨ª¨¡¨¤¢­¨£¨¡¨ª¨¡¨¤ ¥­¥ã¥Ã¥·¥å¨¢¡û A=0¨¢ ¨¢¡û A=0¨¢¨¢¡û A=1¨¢ ¨¢¡ß A=0¨¢ ¨¢¡û A=1¨¢¢¬¨¢¡ß A=0¨¢¨¢¡û A=1¨¢¢­¨¢¡û A=1¨¢ ¨§¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨©¨§¨¡¨¡¨¡¨©¢¬¨§¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨©¨§¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨© ¥×¥í¥»¥Ã¥µ¨¢ ¨¢ ¨¢ ¨¢¨¢ A++ ¨¢¢¬¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢¨¢ ¨¢ ¨¢ B=A ¨¢ DMA ¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Î¥Ç¡¼¥¿¹¹¿·¡Ï ¡Î¥á¥â¥ê¤Ë½ñ¤­½Ð¤¹¡Ï¡¡¡¡ ¡Î¥­¥ã¥Ã¥·¥å¤ò¹¹¿·¡Ï ¡¡¡¡¡¡½é´ü¾õÂÖ ¡¡¡¡¡¡¡¡¡¡¡¡Ãæ´Ö¾õÂÖ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ºÇ½ª¾õÂÖ ¿Þ£Á¡¡¥é¥¤¥È¥¹¥ë¡¼Êý¼°¤Î¥­¥ã¥Ã¥·¥åÀ©¸æ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¡¡¡¡¡¡¡¡¼çµ­²±¨¢¡û A=0 ¨¢ ¨¢¡ß A=0 ¨¢ ¨¢¡ß A=0 ¨¢ ¨¢¡û A=1 ¨¢ ¨¦¨¡¨¡¨¨¨¡¨¡¨¥ ¨¦¨¡¨¡¨¨¨¡¨¡¨¥ ¨¦¨¡¨¡¨¨¨¡¨¡¨¥ ¨¦¨¡¨¡¨¨¨¡¨¡¨¥ ¨¡¨¨¨¡¨¡¨ª¨¡¨¡¨¨¨¡ ¨¡¨¨¨¡¨¡¨ª¨¡¨¡¨¨¨¡ ¨¡¨¨¨¡¨¡¨ª¨¡¨¡¨¨¨¡ ¨¡¨¨¨¡¨¡¨ª¨¡¨¡¨¨¨¡ ¨£¨¡¨ª¨¡¨¤ ¨£¨¡¨ª¨¡¨¤¨£¨¡¨ª¨¡¨¤ ¨£¨¡¨ª¨¡¨¤ ¨£¨¡¨ª¨¡¨¤ ¨£¨¡¨ª¨¡¨¤¨£¨¡¨ª¨¡¨¤¢¬¨£¨¡¨ª¨¡¨¤ ¥­¥ã¥Ã¥·¥å¨¢¡û A=0¨¢ ¨¢¡û A=0¨¢¨¢¡û A=1¨¢ ¨¢¡ß A=0¨¢ ¨¢¡û A=1¨¢¢ª¨¢¡û A=1¨¢¨¢ ¨¢¢¬¨¢ ¨¢ ¨§¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨©¨§¨¡¨¡¨¡¨©¢¬¨§¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨©¨§¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨© ¥×¥í¥»¥Ã¥µ¨¢ ¨¢ ¨¢ ¨¢¨¢ A++ ¨¢¢¬¨¢ ¨¢ ¨¢ ¨¢ ¨¢ B=A ¨¢¨¢ ¨¢ ¨¢ ¨¢ DMA ¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Î¥Ç¡¼¥¿¹¹¿·¡Ï ¡Î¥­¥ã¥Ã¥·¥å´Ö¥³¥Ô¡¼¡Ï¡¡¡¡¡Î¥á¥â¥ê¤ò¹¹¿·¡Ï ¡¡¡¡¡¡½é´ü¾õÂÖ Ãæ´Ö¾õÂÖ£± Ãæ´Ö¾õÂÖ£²¡¡¡¡¡¡¡¡¡¡¡¡ ºÇ½ª¾õÂÖ ¿Þ£Â¡¡¥³¥Ô¡¼¥Ð¥Ã¥¯Êý¼°¤Î¥­¥ã¥Ã¥·¥åÀ©¸æ ¡¡£Ò£Ô£Õ¤Ç¤Ï¡¢£µ£°£°£°¡¿£¶£°£°£°¥·¥ê¡¼¥º¤Ë¤Ï¡¢¥é¥¤¥È¥¹¥ë¡¼Êý¼°¤Î¥­¥ã¥Ã¥·¥å¤ò¡¢£·£°£°£°¡¿£¸£°£°£°¥·¥ê¡¼¥º¤Ë¤Ï¡¢¥³¥Ô¡¼¥Ð¥Ã¥¯Êý¼°¤Î¥­¥ã¥Ã¥·¥å¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ ¡¡¤³¤ì¤é¤Î¥­¥ã¥Ã¥·¥åÀ©¸æ¤Ï¡¢chpage(2) ¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»ÈÍѤ·¤Æ¡¢»ØÄꤵ¤ì¤¿¥¢¥É¥ì¥¹¤Ç³«»Ï¤¹¤ë¥Ú¡¼¥¸¤Î°À­¤òÊѹ¹¤Ç¤­¡¢¥­¥ã¥Ã¥·¥ó¥°¤ò»ÈÍѲÄǽ¤Ë¤·¤¿¤ê¡¢¶Ø»ß¤·¤¿¤ê¤Ç¤­¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£ã£è£ð£á£ç£å¡¡¥Ú¡¼¥¸Êݸî°À­¤ÎÊѹ¹ ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢¡¡¡¡#include ¨¢ ¨¢ ¨¢ ¨¢¡¡¡¡int chpage(address,size,attr,sel) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢¡¡¡¡unsigned int address; ¥Ú¡¼¥¸Êݸî°À­¤ÎÊѹ¹¤ò³«»Ï¤¹¤ë²¾ÁÛ¶õ´Ö¤Î¥¢¥É¥ì¥¹ ¨¢ ¨¢ int size; ¥Ð¥¤¥Èñ°Ì¤Î¥Ç¡¼¥¿¥µ¥¤¥º ¨¢ ¨¢ unsigned int attr; ÀßÄꤹ¤ëÊݸî°À­¥Ó¥Ã¥È ¨¢ ¨¢ unsigned int sel; ÁªÂò¤¹¤ëÊݸî°À­¥Ó¥Ã¥È ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡address ¤ª¤è¤Ó size ¤Ï¡¢¸Æ¤Ó¤À¤·¤Î±Æ¶Á¤ò¼õ¤±¤ë¥¢¥É¥ì¥¹¶õ´Ö¤òɽ¤·¤Þ¤¹¡£attr ¤È sel ¤Ï¡¢Êѹ¹¤µ¤ì¤ë¥Ú¡¼¥¸Â°À­¤òÀßÄꤪ¤è¤ÓÁªÂò¤·¤Þ¤¹¡£¤É¤ÎÉôʬ¤â»ØÄꤵ¤ì¤¿¥¢¥É¥ì¥¹ÈÏ°ÏÆâ¤ÇÀ¸À®¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤¬¸Æ½Ð¤·¤Î±Æ¶Á¤ò¼õ¤±¤Þ¤¹¡£ ¡¡chpage ¤Ï¡¢Êݸî¥Ó¥Ã¥È¤Þ¤¿¤Ï¡¢¥­¥ã¥Ã¥·¥å¥Ó¥Ã¥È¤¬ÀßÄꤵ¤ì¤¿¥Ú¡¼¥¸¤ÎÀ°¿ô¤ò´Ø¿ô¤ÎÌá¤êÃͤȤ·¤ÆÊÖ¤·¤Þ¤¹¡£ ¡¡attr ¤È sel ¤ÎÃͤϡ¢°Ê²¼¤ÎÁȹ礻¤ÎÏÀÍýϤˤè¤Ã¤Æ³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ ¡¡CP_READ ÆÉ¹þ¤ß¥¢¥¯¥»¥¹¸¢¤òÀßÄê¤Þ¤¿¤ÏÁªÂò¤¹¤ë¡£ ¡¡CP_WRITE ½ñ¹þ¤ß¥¢¥¯¥»¥¹¸¢¤òÀßÄê¤Þ¤¿¤ÏÁªÂò¤¹¤ë¡£ ¡¡CP_EXEC ¼Â¹Ô¥¢¥¯¥»¥¹¸¢¤òÀßÄê¤Þ¤¿¤ÏÁªÂò¤¹¤ë¡£¤¹¤Ù¤Æ¤Î£Ò£Ô£Õ¥·¥¹¥Æ¥à¤Ç¡¢CP_EXEC ¤Ï¡¢CP_READ ¤ÈƱ»þ¤Ë»ØÄꤵ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤ ¡¡CP_CHACHE ¤¹¤Ù¤Æ¤Î¥­¥ã¥·¥å¤Ë¥¢¥¯¥»¥¹¤µ¤ì¤ë¥¢¥¯¥»¥¹¸¢¤òÀßÄê¤Þ¤¿¤ÏÁªÂò¤¹¤ë¡£ CP_FPP ÉâÆ°¾®¿ôÅÀ¥×¥í¥»¥Ã¥µ¶õ´Ö¤Î¥¢¥¯¥»¥¹¤òÀßÄê¤Þ¤¿¤ÏÁªÂò¤¹¤ë¡£¤³¤ÎÃͤϣµ£°£°£°¡¿£¶£°£°£°¥·¥¹¥Æ¥à¤Î¤ß¸ºß¤¹¤ë¡£ ¡¡CP_DI ¡É¥­¥ã¥·¥å¤Ç¥Ú¡¼¥¸¤Ï̵¸ú²½¤µ¤ì¤Ê¤¤¡É¤òÀßÄê¤Þ¤¿¤ÏÁªÂò¤¹¤ë¡£¤³¤ì¤Ë¤è¤êÂåÆþ¤µ¤ì¤¿¥Ï¡¼¥É¥¦¥§¥¢ÀßÄêÃͤò½Å¤Í½ñ¤­¤Ç¤­¤ë¡££¸£°£°£°¥·¥ê¡¼¥º¤Ë¤Ï¡¢Å¬ÍѤµ¤ì¤Ê¤¤¡£ ¡¡°Ê¾å¤ÎÃͤ˲䨤ƣ·£°£°£°¥·¥ê¡¼¥º¤Ç¤Ï°Ê²¼¤ÎÀßÄê¤ò»ÈÍѤǤ­¤Þ¤¹¡£¤³¤ì¤é¤ÎÃͤȾ嵭¤ÎÃͤÎÏÀÍýϤˤè¤Ã¤Æ£·£°£°£°¥·¥ê¡¼¥º¤Î¥­¥ã¥Ã¥·¥å¥â¡¼¥É¤òÁªÂò¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î£²¤Ä°Ê¾å¤ÎÃͤÎÏÀÍýϱ黻¤ò¹Ô¤¦¤È¡¢£Ò£Ô£Õ¤¬¥·¥¹¥Æ¥àÀ­Ç½¤¬ºÇÂç¤È¤Ê¤ëÃͤòÁªÂò¤·¤Þ¤¹¡£°Ê²¼¤Î½çÈ֤ϡ¢À­Ç½¤¬Ä㤤½çÈÖ¤Ëʤ٤Ƥ¢¤ê¤Þ¤¹¡£ ¡¡CP_SERIAL ľÎó¥­¥ã¥Ã¥·¥å¡¦¥â¡¼¥É¤òÀßÄê¤Þ¤¿¤ÏÁªÂò¤¹¤ë CP_NSERIAL ÈóľÎó¥­¥ã¥Ã¥·¥å¡¦¥â¡¼¥É¤òÀßÄê¤Þ¤¿¤ÏÁªÂò¤¹¤ë ¡¡CP_WRTHRU ¥é¥¤¥È¥¹¥ë¡¼¡¦¥­¥ã¥Ã¥·¥å¡¦¥â¡¼¥É¤òÀßÄê¤Þ¤¿¤ÏÁªÂò¤¹¤ë ¡¡CP_CPYBCK ¥³¥Ô¡¼¥Ð¥Ã¥¯¡¦¥­¥ã¥Ã¥·¥å¡¦¥â¡¼¥É¤òÁªÂò¤Þ¤¿¤ÏÀßÄꤹ¤ë Ãí°Õ¡§Â°À­¤òÊѹ¹¤¹¤ë¥×¥í¥»¥¹¤Ï¡¢¾¯¤Ê¤¯¤È¤â¥Ú¡¼¥¸¤ÎÆÉ¹þ¤ßµö²Ä¡ÊCP_READ¡Ë¤ò»ý¤Ã¤Æ¤¤¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£¥×¥í¥»¥¹¤¬¤Ò¤È¤¿¤Ó¸¢Íø¤ò CP_READ °Ê²¼¤ËÀßÄꤹ¤ë¤È¡¢ÆóÅ٤ȸ¢Íø¤ò²óÉü¤Ç¤­¤Þ¤»¤ó¡£ ¡¡¥×¥í¥»¥¹¤Ï¡¢°Ê²¼¤Î¸Æ¤Ó¤À¤·¤ò¹Ô¤Ã¤Æ¥×¥í¥»¥¹¤ÎºÇ½é¤Î¥Æ¥­¥¹¥È¡¦¥Ú¡¼¥¸¤òÆÉ¹þ¤ßÀìÍѤˤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ numpages = chpage(0,NBPG,CP_READ,CP_READ|CP_WRITE|CP_EXEC[|CP_CPYBCK]); ¡¡¥Ú¡¼¥¸¤òÆÉ¹þ¤ßÀìÍѤˤ·¤Æ¡¢¥­¥ã¥Ã¥·¥ó¥°¤ò¥ª¥Õ¤Ë¤¹¤ë¤Ë¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£ numpages = chpage(0,NBPG,CP_READ,CP_READ|CP_WRITE|CP_EXEC|CP_CHACHE[|CP_CPYBCK]); ¡¡µÕ¤Ë¡¢ÆÉ¹þ¤ß¡¢½ñ¹þ¤ß¡¢¼Â¹Ôµö²Ä¤òÉü¸µ¤·¡¢¥­¥ã¥Ã¥·¥ó¥°¤ò¥ª¥ó¤ËÌ᤹¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£ numpages = chpage(0,NBPG,CP_READ|CP_WRITE|CP_EXEC|CP_CHACHE[|CP_CPYBCK] ,CP_READ|CP_WRITE|CP_EXEC|CP_CHACHE[|CP_CPYBCK]);

£µ¡¥£²¡¡¶¦Í­¥á¥â¥ê

¡¡£Ò£Ô£Õ¤Ë¤ª¤¤¤Æ¶¦Í­¥á¥â¥ê¤Ï¡¢°Ê²¼¤Î£³¤Ä¤ÎÊýË¡¤Ç¼Â¸½¤Ç¤­¤Þ¤¹¡£¤¤¤º¤ì¤âƱÍͤε¡Ç½¤òÄ󶡤·¤Þ¤¹¤¬¡¢¤½¤ì¤¾¤ìÆÃħ¤¬¤¢¤ê¤Þ¤¹¡£ £±¡Ë£Ó£Ö£Ò£´Âбþ¤Î¥·¥§¥¢¡¼¥É¥á¥â¥ê ¡¡shmem(2)¥³¡¼¥ë¤Î·Á¤Ç¤Îɸ½à¶¦Í­¥á¥â¥ê¡£¤³¤ÎÊýË¡¤Ë¤è¤ê¥×¥í¥»¥¹¤Ï¡¢¥Ç¡¼¥¿¤ò¶¦Í­¥Ç¡¼¥¿¤È¤·¤ÆÀë¸À¤Ç¤­¤½¤ÎÍøÅÀ¤Ï°Ü¿¢À­¤Ë¤¢¤ê¤Þ¤¹¡£ £²¡Ë¥Ð¡¼¥¯¥ì¥¤µ¬³Ê¤Î¥á¥â¥ê¥Þ¥Ã¥Ô¥ó¥° ¡¡£Ó£Ö£Ò£´¥·¥§¥¢¡¼¥É¥á¥â¥ê¤ÈƱÍͤˡ¢¥×¥í¥»¥¹¤Ï¥Ç¡¼¥¿¤ò¶¦Í­¤Ç¤­¤Þ¤¹¤¬¡¢°Ü¿¢À­¤¬Ä㤤¤¿¤á£Ö£Í£Å¥Ð¥¹¾å¤Î³°Éô¥Ç¥Ð¥¤¥¹ÍѤ˻ÈÍѤ¹¤ë¾ì¹ç¤ËÂ礭¤Ê¸ú²Ì¤òÀ¸¤ß¤Þ¤¹¡£ £³¡Ë£Ò£Ô£Õ¤Î³ÈÄ¥¤Ç¤¢¤ë¥¹¥ì¥Ã¥É ¡¡Â¿½Å¥¹¥ì¥Ã¥É¤Ï¡¢¤¢¤Þ¤ê¥·¥¹¥Æ¥à»ñ¸»¤òɬÍפȤ»¤º¡¢¥×¥í¥»¥¹¤è¤êÀ©¸æ¤¬Íưפʤâ¤Ã¤È¤âÊØÍø¤Ç¸ú²ÌŪ¤Ê¥Ç¡¼¥¿¤Î¶¦Í­ÊýË¡¤Ç¤¹¡£¤·¤«¤·°Ü¿¢À­¤ÏÎɤ¯¤¢¤ê¤Þ¤»¤ó¡£ ¡¡Ê£¿ô¤Î¥×¥í¥»¥¹¤¬¡¢¶¦Í­¥á¥â¥ê¤ËÂФ·¤Æ¥¢¥¯¥»¥¹¤¹¤ë¾ì¹ç¡¢Ä̾ï¤Ê¤ó¤é¤«¤Îµ¡¹½¤Ë¤è¤Ã¤ÆÇÓ¾À©¸æ¤ò¹Ô¤ï¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡££Ò£Ô£Õ¤Ç¤Ï¡¢¤³¤ÎÇÓ¾À©¸æµ¡¹½¤Ë£²¤Ä¤ÎÊýË¡¤òÍѰդ·¤Æ¤¤¤Þ¤¹¡£ ¡¦£Ó£Ö£Ò£´É¸½à¤Î¥»¥Þ¥Õ¥©¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ë¤è¤ëÊýË¡ ¡¦¥×¥í¥»¥Ã¥µ¤Ë¸ÇÍ­¤Î¥Æ¥¹¥È¡õ¥»¥Ã¥È¡Ê£ô£á£ó¡ËÌ¿Îá¤ò»ÈÍѤ¹¤ëÊýË¡ ¡¡¤É¤Á¤é¤ÎÊýË¡¤â¡¢¾åµ­¤Î¶¦Í­¥á¥â¥ê¤ËÂФ¹¤ëÇÓ¾À©¸æµ¡¹½¤ËÂФ·¤ÆÍ­¸ú¤Ç¤¹¤¬¡¢¥¹¥ì¥Ã¥É¤ËÂФ·¤Æ¤ÏÀìÍѤΥ饤¥Ö¥é¥ê¤¬Ê̤ËÍѰդµ¤ì¤Æ¤¤¤Þ¤¹¡£ ¡¡¤Þ¤¿¡¢£ô£á£óÌ¿Îá¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¥í¥Ã¥¯¤òÀßÄꤪ¤è¤Ó²ò½ü¤¹¤ë¤¿¤á¤ËɬÍפʥ¢¥»¥ó¥Ö¥ê¸À¸ì¤òµ­½Ò¤·¡¢¤½¤Î¥³¡¼¥É¤ò¹â¿å½à¸À¸ì¥×¥í¥°¥é¥à¤Ë¥ê¥ó¥¯¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£°Ê²¼¤Ë£µ£°£°£°¡¿£¶£°£°£°¡¿£·£°£°£°¥·¥ê¡¼¥º¤Ë¤ª¤±¤ë¥Æ¥¹¥È¡õ¥»¥Ã¥ÈÌ¿Îá¤Î¥×¥í¥°¥é¥à¤ò¼¨¤·¤Þ¤¹¡£¤Ê¤ª£¸£°£°£°¥·¥ê¡¼¥º¤Ç¤Ï¡¢É¸½à£Ã¥é¥¤¥Ö¥é¥ê¤Ë tset(3),tclr(3) ¥ë¡¼¥Á¥ó¤¬¤¹¤Ç¤ËÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£¡Ê£·£°£°£°¥·¥ê¡¼¥º°Ê³°¤Î¥·¥¹¥Æ¥à¤Ç¤Ï¡¢³°Éô¥á¥â¥ê¤ËÂФ·¤Æ¤Î¥Æ¥¹¥È¡õ¥»¥Ã¥ÈÌ¿Îá¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¡Ë ¡¡¥é¥¤¥È¥¹¥ë¡¼¥­¥ã¥Ã¥·¥å¤ò»ÈÍѤ·¤Æ¤¤¤ë£µ£°£°£°¡¿£¶£°£°£°¥·¥ê¡¼¥º¾å¤Ç¥Æ¥¹¥È¡õ¥»¥Ã¥ÈÌ¿Îá¤òŬÀڤ˼¹Ԥ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥Æ¥¹¥È¤¹¤ë¥Ð¥¤¥È¤Î¤¢¤ë¥á¥â¥ê¡¦¥Ú¡¼¥¸¤Î¥­¥ã¥Ã¥·¥å¤ò»ÈÍÑÉԲĤˤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¡¡¤³¤Î¤¿¤á¡¢£Ò£Ô£Õ¤Ç¤Ï¥×¥í¥°¥é¥à¤Î¸ß´¹À­¤ò½Å»ë¤·¤Æ¡¢¶¦Í­¥á¥â¥ê¤ËÂФ·¤Æ¥­¥ã¥Ã¥·¥å¤Ï»ÈÍÑÉԲĤˤʤäƤ¤¤Þ¤¹¤¬¡¢chpage(2) ¤ò»ÈÍѤ·¤Æ¥æ¡¼¥¶¥×¥í¥°¥é¥à¤«¤é»ÈÍѲÄǽ¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡tset() & tclr() ¥ë¡¼¥Á¥ó ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢tset() & tclr() »ÈÍÑÎã ¨¢ ¡¡ .text ¨¢ ¨¢ .globl _tset ¨¢ int lock; ¨¢ _tset: ¨¢ ¨¢ movl sp@(4),a0 ¨¢ lock = 0;/* ½é´ü²½ */ ¨¢ 1$: ¨¢ ¨¢ ¨¢ tas a0$@ ¨¢ ¨¢ ¨¢ jpl 2$ ¨¢ tset(&lock); ¨¢ moveq #1,d0 ¨¢ ¡ã¥¯¥ê¥Æ¥£¥«¥ë¡¦¥»¥¯¥·¥ç¥ó¡ä ¨¢ divs d0,d0 ¨¢ tclr(&lock); ¨¢ divs d0,d0 ¨¢ ¨¢ jra 1$ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ 2$ rts .globl _tclr _tclr: movl sp@(4),a0 movw a0@,d0 movq #0,d1 1$ cas.w d0,d1,a0@ jne 1$ rts

£µ¡¥£²¡¥£±¡¡£Ó£Ö£Ò£´Âбþ¤Î¥·¥§¥¢¡¼¥É¥á¥â¥ê

¡¡£Ó£Ö£Ò£´¶¦Í­¥á¥â¥ê¡Êshared memory:shm¡Ë¤Ï¡¢Ê£¿ô¤Î¥×¥í¥»¥¹´Ö¤Ç¶¦Ä̤˻²¾È¤µ¤ì¤ë¥á¥â¥ê¶õ´Ö¤Ç¡¢³Æ¥×¥í¥»¥¹¤ËƱ°ì¥á¥â¥ê¶õ´Ö¤¬¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹¡Ë¡£ ¡¡£Ò£Ô£Õ¤Ç¤Î¼ÂÁõ¾å¤ÎÆÃħ¤Ï¥·¥ó¥á¥È¥ê¥Ã¥¯¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¿¤á¤É¤Î¥×¥í¥»¥Ã¥µ¤«¤é¤Ç¤âƱ»þ¤Ë¼Â¹Ô¤Ç¤­¤ë¤¿¤á¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¸þ¾å¤·¤Æ¤¤¤Þ¤¹¡£ ¡¡¡¡ ¥×¥í¥»¥¹£Á ¥×¥í¥»¥¹£Â ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢¥Æ¥­¥¹¥È¥»¥°¥á¥ó¥È¨¢ ¨¢¥Æ¥­¥¹¥È¥»¥°¥á¥ó¥È¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¥Ç¡¼¥¿¥»¥°¥á¥ó¥È ¨¢ ¨¢ ¥Ç¡¼¥¿¥»¥°¥á¥ó¥È ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¶¦Í­¥á¥â¥ê ¨¢ ¥Þ¥Ã¥Ô¥ó¥° ¨¢ ¶¦Í­¥á¥â¥ê ¨¢ ¨¢ ¥»¥°¥á¥ó¥È ¨¢ ¨¢ ¥»¥°¥á¥ó¥È ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¼Âµ­²± ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¨¢ ¨¢ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¶¦Í­¥á¥â¥ê¤òÁàºî¤¹¤ë¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï¡¢¼¡¤Î£´¤Ä¤Ç¤¹¡£ ¡¡shmget() ¶¦Í­¥á¥â¥ê¤òÆÀ¤ë shmat() ¶¦Í­¥á¥â¥ê¤ò³ä¤êÉÕ¤±¤ë shmdt() ¶¦Í­¥á¥â¥ê¤Î³äÉÕ¤±¤ò²ò½ü¤¹¤ë shmctl() ¶¦Í­¥á¥â¥ê¤òÁàºî¤¹¤ë ¡¡¤Þ¤¿¡¢»ÈÍѤˤª¤±¤ëÀ©¸Â¤Ï¡¢¥«¡¼¥Í¥ë¤Î°Ê²¼¤Î¥·¥¹¥Æ¥à¥³¥ó¥Õ¥£¥°¥ì¡¼¥·¥ç¥ó¤Ë¤è¤Ã¤Æ·èÄꤵ¤ì¤Þ¤¹¡£ shmmax ¥Ð¥¤¥Èñ°Ì¤Ç¤Î¶¦Í­¥á¥â¥ê¥»¥°¥á¥ó¥È¤ÎºÇÂ祵¥¤¥º shmmin ¥Ð¥¤¥Èñ°Ì¤Ç¤Î¶¦Í­¥á¥â¥ê¥»¥°¥á¥ó¥È¤ÎºÇ¾®¥µ¥¤¥º shmmni ¥·¥¹¥Æ¥à¤¬Ä󶡤¹¤ë¶¦Í­¥á¥â¥ê¥»¥°¥á¥ó¥È¤ÎºÇÂç¿ô shmall Ʊ»þ¤Ë»ÈÍѤǤ­¤ë¶¦Í­¥á¥â¥ê¥»¥°¥á¥ó¥È¤ÎºÇÂç¿ô shmseg Ǥ°Õ¤Î¥×¥í¥»¥¹¤Ë£±Å٤˳ä¤êÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤ë¶¦Í­¥á¥â¥ê¤ÎºÇÂç¿ô shmbrk £Ò£Ô£ÕÍѤËͽÌó £Ó£Ö£Ò£´¶¦Í­¥á¥â¥ê¤È¥»¥Þ¥Õ¥©¤ÎÎãÂê ¡¡¤³¤ÎÎã¤Ç¤Ï¡¢£±¤Ä¤ÎÀ©¸æ¥×¥í¥»¥¹¤«¤é¡¢ÏÀÍýŪ¤ËƱ°ì¤Î¥µ¡¼¥Ð¤È¤·¤Æµ¡Ç½¤¹¤ë£³¤Ä¤Î»Ò¥×¥í¥»¥¹¤¬À¸À®¤µ¤ì¤Æ¤¤¤Þ¤¹¡£À©¸æ¥×¥í¥»¥¹¤Ï¡¢¤Ò¤È¤Ä¤Î¥­¥å¡¼¤Ë¤è¤Ã¤Æ¥µ¡¼¥Ð¤Ë¥³¥Þ¥ó¥É¤òÁ÷¤ê¡¢¥µ¡¼¥Ð¤Ï£²¤ÄÌܤΥ­¥å¡¼¤Ë¤è¤Ã¤ÆÀ©¸æ¥×¥í¥»¥¹¤Ë±þÅú¤òÊÖ¤·¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥×¥í¥»¥¹¤¬½é´ü²½¤µ¤ì¤ë¤È¡¢À©¸æ¥×¥í¥»¥¹¤«¤é³Æ¥µ¡¼¥Ð¤Ë STAT ¥á¥Ã¥»¡¼¥¸¤¬Á÷¿®¤µ¤ì¤Þ¤¹¡£¤³¤Î¥á¥Ã¥»¡¼¥¸¤ò¼õ¿®¤¹¤ë¤È¡¢¥µ¡¼¥Ð¤Ï½èÍý¤ò¥·¥ß¥å¥ì¡¼¥È¤¹¤ë¤¿¤á¤ËÄä»ß¤·¡Ê¼ÂºÝ¤Î½èÍý¤Ï¸ºß¤·¤Þ¤»¤ó¡Ë¡¢À©¸æ¥×¥í¥»¥¹¤Ë±þÅú¤òÊÖ¤·¤Þ¤¹¡£ºÇ¸å¤ËÀ©¸æ¥×¥í¥»¥¹¤«¤é¥µ¡¼¥Ð¤Ë¡¢ END ¥á¥Ã¥»¡¼¥¸¤¬Á÷¿®¤µ¤ì¥µ¡¼¥Ð¥×¥í¥»¥¹¤Ï½ªÎ»¤·¤Þ¤¹¡£¤³¤Î¤È¤­¥»¥Þ¥Õ¥©¤ª¤è¤Ó¶¦Í­¥á¥â¥ê¤Ï¥×¥í¥°¥é¥à½ªÎ»Á°¤Î¥¯¥ê¡¼¥ó¥¢¥Ã¥×¤Ë¤è¤Ã¤Æ²òÊü¤µ¤ì¤Þ¤¹¡£ ¡¡£´¤Ä¤Î¥×¥í¥»¥¹¤Ï¡¢¤¹¤Ù¤Æ£±¤Ä¤Î¶¦Í­¥á¥â¥ê¥»¥°¥á¥ó¥È¤ò¶¦Í­¤·¡¢¤³¤Î¥»¥°¥á¥ó¥È¤Ë¤ÏÍ׵ᥭ¥å¡¼¤È±þÅú¥­¥å¡¼¤Î£²¤Ä¤¬Â¸ºß¤·¤Þ¤¹¡£Í׵ᥭ¥å¡¼¤Ï¡¢À©¸æ¥×¥í¥»¥¹¤«¤é¥µ¡¼¥Ð¤Ø¤Î¥á¥Ã¥»¡¼¥¸¤òÊÝ»ý¤·¡¢±þÅú¥­¥å¡¼¤Ï¥µ¡¼¥Ð¤«¤éÀ©¸æ¥×¥í¥»¥¹¤Ø¤Î±þÅú¤òÊÝ»ý¤·¤Þ¤¹¡£³Æ¥­¥å¡¼¤Ë¤Ï£²¤Ä¤Î¥»¥Þ¥Õ¥©¤«¤é¤Ê¤ë¡¢¥»¥Þ¥Õ¥©¥»¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£¥»¥Þ¥Õ¥©¤Ï¡¢¾ï¤Ë£±¤Ä¤Î¥µ¡¼¥Ð¤Î¤ß¤¬Í׵ᥭ¥å¡¼¤òÆÉ¤ß¤È¤ë¤«¡¢¤Þ¤¿¤Ï±þÅú¥­¥å¡¼¤Ë½ñ¤­¹þ¤à¤è¤¦¤ËÇÓ¾À©¸æ¤·¤Þ¤¹¡£ÂÔµ¡¥»¥Þ¥Õ¥©¤Ï¡¢¥­¥å¡¼¤Ë¥á¥Ã¥»¡¼¥¸¤¬Â¸ºß¤¹¤ë¾ì¹ç¤ËÆÉ¼è¤ê¥×¥í¥»¥¹¤òÀ©¸æ¤·¤Þ¤¹¡£ ¡¡À©¸æ¥×¥í¥»¥¹¤È¥µ¡¼¥Ð¤¬±þÅú¤Þ¤¿¤ÏÍ×µá¤Î¸¡º÷Ãæ¤Î¾ì¹ç¤Ë¤Ï¡¢ÂÔµ¡¥»¥Þ¥Õ¥©¤ÇÂÔµ¡¾õÂ֤ˤʤäƤ¤¤Þ¤¹¡£À©¸æ¥×¥í¥»¥¹¤Ï¡¢¥µ¡¼¥Ð¤Ø¤ÎÍ×µá¤òÀ¸À®¤¹¤ë¤È¡¢Í׵ᥭ¥å¡¼¤ÎÂÔµ¡¥»¥Þ¥Õ¥©¤Ë¤³¤ì¤òÄÌÃΤ·¡¢¥µ¡¼¥Ð¤ÏÀ©¸æ¥·¥¹¥Æ¥à¤Î±þÅú¤¬¤¢¤ë¾ì¹ç¤Ë±þÅú¥­¥å¡¼¤Î¥»¥Þ¥Õ¥©¤ËÄÌÃΤ·¤Þ¤¹¡£ #include #include #include #include #include #include struct queue { short load; /* load pointer as index into qentry */ short unload; /* unload pointer, load == unload means full */ short size; /* number of qentrys in queue */ int semid; /* semaphore identifier */ struct qentry *qstart; /* start of queue */ }; struct qentry { short command; /* what to do */ short argument; /* what to do it to */ short response; /* how it did */ short server; /* which one did it */ }; struct queue *qrequest, *qresponse; /* in shared memory */ /* queueing macros */ #define qincr(q,ptr) q->ptr = (q->ptr + 1) % q->size #define qptr(q,ptr) (q->qstart + q->ptr) /* commands for queue */ #define START 1 #define COMPL 2 #define END 3 /* number of servers */ #define NCHILD 3 #define RSPQSIZE (NCHILD + 1) #define REQSIZE (NCHILD + 1) /* protections on ipc stuff */ #define RUSER 0400 #define WUSER 0200 /* which semaphore in set is which */ #define WAITING 0 #define MUTEX 1 /* semaphore macros: P is wait, V is signal */ struct sembuf psemop[] = { { WAITING, -1, 0 }, { MUTEX, -1, 0 } }; struct sembuf vsemop[] = { { WAITING, 1, 0 }, { MUTEX, 1, 0 } }; #define P(q,sem) semop(q->semid, &psemop[sem], 1) #define V(q,sem) semop(q->semid, &vsemop[sem], 1) char *shmaddr, *sbrk(); /* address shared memory attached at */ int shmid, shmsize; main () { char *shmat(); int i; int pid; int status; int nchild = 0; struct qentry *qp; int nbytes; /* round up end of data segment to nearest page boundary * and allocate pages */ shmsize = 2 * sizeof (struct queue) + ((RSPQSIZE + REQSIZE) * sizeof (struct qentry)); shmaddr = (char *) (((unsigned) sbrk(0) + 0xfff) & ~0xfff); /* get the amount of memory we need (rounded up to page boundary) */ nbytes = btoc(shmsize) * NBPG; if (brk (shmaddr + nbytes)) { perror ("could not break"); exit (1); } /* get a shared memory segment rounded up to nearest page size */ if ((shmid = shmget (IPC_PRIVATE, nbytes, RUSER | WUSER)) == -1) { perror("Could not grab shared memory segment"); exit (1); } /* attach to nearest page boundary (round down) */ shmaddr = sbrk(0) - nbytes; if ((shmaddr = shmat (shmid, shmaddr, SHM_RND)) == (char *) -1) { perror ("Could not attach shared memory segment"); goto freeseg; } /* Initialize queue data structures, allocate semaphore sets */ qrequest = (struct queue *) shmaddr; qresponse = qrequest + 1; qrequest->size = REQSIZE; qrequest->qstart = (struct qentry *) (qresponse + 1); qrequest->load = qrequest->unload = 0; qrequest->semid = -1; qresponse->size = RSPQSIZE; qresponse->qstart = qrequest->qstart + REQSIZE; qresponse->load = qrequest->unload = 0; qresponse->semid = -1; /* Allocate the semaphores for each queue */ if ((qrequest->semid = semget (IPC_PRIVATE, 2, RUSER | WUSER)) == -1) { perror ("Could not grab request semaphore"); goto freesem; } if ((qresponse->semid = semget(IPC_PRIVATE, 2, RUSER | WUSER)) == -1) { perror ("Could not allocate response semaphore"); goto freesem; } /* Initialize waiting semaphores to 0 (nothing in queue), * and mutex semaphores to 1 (nobody playing with queue). */ semctl(qrequest->semid, WAITING, SETVAL, 0); semctl(qrequest->semid, MUTEX, SETVAL, 1); semctl(qresponse->semid, WAITING, SETVAL, 0); semctl(qresponse->semid, MUTEX, SETVAL, 1); /* fork off children */ for (i = 0; i < NCHILD; i++) switch (pid = fork()) { case 0: child (i, qrequest, qresponse); break; case -1: perror ("error forking child"); goto zapchild; default: nchild++; break; } /* send "START" messages to all children */ for (i = 0; i < NCHILD; i++) { qp = qptr(qrequest, load); qp->command = START; qp->argument = i; qincr(qrequest, load); /* signal a child that now there's a request */ V(qrequest, WAITING); } /* now wait for "COMPLETION" messages */ for (i = 0; i < NCHILD; i++) { P(qresponse, WAITING); qp = qptr(qresponse, unload); printf ("response received, child %d, response %d\n", qp->server, qp->response); qincr(qresponse, unload); } zapchild: /* send END messages to each child */ for (i = 0; i < nchild; i++) { qp = qptr(qrequest, load); qp->command = END; qp->argument = i; qincr(qrequest, load); V(qrequest, WAITING); } /* wait for children to exit */ for (i = 0; i < nchild; i++) { pid = wait (&status); printf ("child process %d exited, status %d\n", pid, status); } freesem: /* free up the semaphores for both queues */ if (qrequest->semid != -1) semctl (qrequest->semid, IPC_RMID, 0); if (qresponse->semid != -1) semctl (qresponse->semid, IPC_RMID, 0); freeseg: shmdt (shmaddr); shmctl (shmid, IPC_RMID, 0); exit (0); } child (number, qrequest, qresponse) int number; struct queue *qrequest; struct queue *qresponse; { struct qentry *qp; int req, arg; int retarg; shmat(shmid, shmaddr, SHM_RND); /* wait for there to be a request */ P(qrequest, WAITING); /* wait to be the only one manipulating the unload pointer */ P(qrequest, MUTEX); /* pull the request off the queue */ qp = qptr(qrequest, unload); req = qp->command; arg = qp->argument; /* bump the unload pointer */ qincr (qrequest, unload); /* signal that others can get into the queue */ V(qrequest, MUTEX); if (req == START) { /* fake some processing time */ sleep (arg * 2 + 1); /* prepare a response and put it on the response queue */ P(qresponse, MUTEX); qp = qptr(qresponse, load); qp->command = COMPL; qp->argument = arg; qp->response = arg * 2; qp->server = number; /* bump the load pointer */ qincr(qresponse, load); /* no longer manipulating the queue */ V(qresponse, MUTEX); /* signal the response queue waiting semaphore */ V(qresponse, WAITING); /* wait for an END message */ P(qrequest, WAITING); P(qrequest, MUTEX); qp = qptr(qrequest, unload); if (qp->command != END) printf ("server %d got message %d instead of end\n", qp->command); V(qrequest, MUTEX); retarg = 0; } else retarg = 1; shmdt(shmaddr); exit(retarg); }

£µ¡¥£²¡¥£²¡¡£Ò£Ô£Õ¤Ë¤ª¤±¤ë³ÈÄ¥¥á¥â¥ê

¡¡³ÈÄ¥¥á¥â¥ê¤Ï£Â£Ó£ÄÈǣգΣɣؤ˴ðÁäòÃÖ¤­¡¢É¸½à¤Î¶¦Í­¥á¥â¥ê¡Ê¥·¥¹¥Æ¥à¥³¡¼¥ë¡Ë¤ÈƱÍͤε¡Ç½¤òÄ󶡤·¤Þ¤¹¡£ ¡¡¤³¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ï¡¢¥Ï¡¼¥É¥¦¥§¥¢¤«¤éÆÈΩ¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¥á¥â¥ê¥Þ¥Ã¥Ô¥ó¥°¤ò»ÈÍѤ¹¤ë¥×¥í¥°¥é¥à¤Ï¡Ê¥Ï¡¼¥É¥¦¥§¥¢¤ÎÀßÄêÊѹ¹¤¬¤¢¤Ã¤Æ¤â¡Ë¥·¥¹¥Æ¥à¡¦¥³¥ó¥Õ¥£¥°¥ì¡¼¥·¥ç¥ó¡¦¥Õ¥¡¥¤¥ë¤ä¥×¥í¥°¥é¥à¤òÊѹ¹¤»¤º¤Ë£Ò£Ô£Õ¥·¥¹¥Æ¥à¤Ç¼Â¹Ô¤Ç¤­¤ëÆÃŤò»ý¤Á¡¢¼ç¤ÊÍÑÅӤȤ·¤Æ°Ê²¼¤Î£²¤Ä¤¬¤¢¤ê¤Þ¤¹¡£ ¡¦¥á¥¤¥ó¥á¥â¥ê¤Î°ìÉô¤ò£Ò£Ô£Õ¤Î´ÉÍý²¼¤«¤é³°¤·¡¢Í½Ì󤵤줿¥á¥â¥ê¡Ê¥ê¥¶¡¼¥Ö¥É¥á¥â¥ê¡Ë¤È¤·¤Æ¥×¥í¥»¥¹´ÖÄÌ¿®¤Ë»ÈÍѤ¹¤ë¡£ ¡¦£Ö£Í£Å£â£õ£ó¥Ç¥Ð¥¤¥¹¤ò³°Éô¥á¥â¥ê¤È¤·¤Æ»ÈÍѤ·¡¢¥×¥í¥»¥¹´ÖÄÌ¿®¤¢¤ë¤¤¤Ï¥×¥í¥°¥é¥à£É¡¿£Ï¥Ç¥Ð¥¤¥¹¤È¤·¤Æ»ÈÍѤ¹¤ë¡£ ¡¡¥ê¥¶¡¼¥Ö¥É¥á¥â¥ê¤Ï¡¢¥á¥¤¥ó¥á¥â¥ê¤Î°ìÉô¤òͽÌó¥á¥â¥ê¤È¤·¤Æ¡¢£Ò£Ô£Õ¤Î¥á¥â¥ê´ÉÍý¤«¤é½ü³°¤·¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¼çµ­²±¤òʪÍýŪ¤Ë¸º¾¯¤µ¤»¤ë¤¿¤á¡¢¥·¥¹¥Æ¥à¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤òÎô²½¤µ¤»¤ë¾ì¹ç¤â¤¢¤ê¤Þ¤¹¤¬¡¢£Ò£Ô£Õ¤Î´ÉÍý¤òÎ¥¤ì¤Þ¤¹¤Î¤Ç¡¢¥×¥í¥»¥¹½ªÎ»¸å¤Ë¤â¥á¥â¥ê¥¤¥á¡¼¥¸¤¬Â¸ºß¤·¡¢»ÈÍÑÊýË¡¤¬´°Á´¤Ë¥æ¡¼¥¶¥×¥í¥»¥¹¤ËǤ¤µ¤ì¤Þ¤¹¡£ ¡¡¤³¤Îµ¡Ç½¤Ï¡¢£Ö£Í£Å£â£õ£ó¾å¤Î¥á¥â¥ê¡¢¤¢¤ë¤¤¤Ï¥×¥í¥°¥é¥à£É¡¿£Ï¥Ç¥Ð¥¤¥¹¤È¤·¤Æ¤â»ÈÍѤǤ­¤ë¤¿¤á¡¢²¾ÁÛµ­²±¤ò»ÈÍѤ»¤ºÂçÍÆÎ̤ζ¦Í­¥á¥â¥ê¤ò»ÈÍѤ·¤¿¤¤¾ì¹ç¤ä¡¢¥ê¥Õ¥ì¥¯¥Æ¥£¥Ö¥á¥â¥ê¤ò»ÈÍѤ·¤Æ¥Þ¥ë¥Á¥·¥¹¥Æ¥à¤ò¹½À®¤¹¤ë¾ì¹ç¤Ë¤â»ÈÍѤµ¤ì¤Þ¤¹¡£ ¡¡¤³¤Îµ¡Ç½¤òưºî¤µ¤»¤ë¤¿¤á¤Ë¤Ï¡¢°Ê²¼¤Ë¼¨¤¹¼ê½ç¤Ç¡¢¥«¡¼¥Í¥ë¤òºÆ¥³¥ó¥Õ¥£¥°¥ì¡¼¥·¥ç¥ó¤·¤Æ¡¢ºÆÎ©¤Á¾å¤²¤ò¤ª¤³¤Ê¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ¡¦°Ê²¼¤Î¥¨¥ó¥È¥ê¤Ç£î¥Ú¡¼¥¸Ê¬¤Î¥ê¥¶¡¼¥Ö¥É¥á¥â¥ê¤ò³ÎÊݤ·¡¢¥Þ¥¤¥Ê¡¼ÈÖ¹æ 255 ¤Ç¡¢£î¤Ï£±£¶¿Ê¤Ç 0x1000 ¤ÎÀ°¿ôÇܤǤ¢¤ë¤³¤È¡Ë extmem 255 sys:0 n sys ¡¦mknod(8) ¤ò»ÈÍѤ·¤Æ ¥á¥¸¥ã¡¼Èֹ棳 ¥Þ¥¤¥Ê¡¼ÈÖ¹æ 255 ¤Î¥­¥ã¥é¥¯¥¿·¿¥Ç¥Ð¥¤¥¹¤È¤·¤Æ "/dev/resmem"¤òÀ¸À®¤¹¤ë % mknod /dev/resmem c 3 255 ¡Ê̾Á°¤Ï²¿¤Ç¤âÎɤ¤¡Ë % chmod 666 /dev/resmem % config MASSCOMP % make -f uts.mk % chmod 544 unix % mv /unix /unix.old % mv unix /unix % reboot ¥æ¡¼¥¶¤Ë²òÊü¤µ¤ì¤Æ¤¤¤ë£Ö£Í£Å£â£õ£ó¥¢¥É¥ì¥¹ÎÎ°è £·£°£°£° £¸£°£°£° A16 C000 - FFFF C000 - FFFF A24 200000 - 7FFFFF C00000 - FFFFFF A32 C0000000 - FFFFFFFF 2E000000 - 2FFFFFFF ¡¡¥æ¡¼¥¶¥×¥í¥»¥¹¤Ï¡¢mmap(2) ¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»È¤Ã¤Æ¡¢Í½Ì󤵤줿¥á¥â¥ê¥»¥°¥á¥ó¥È¤Î¤É¤ÎÉôʬ¤Ç¤â¥æ¡¼¥¶¼«¿È¤Î¥Ç¡¼¥¿¶õ´Ö¤Ë¥Þ¥Ã¥×¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°Ê²¼¤Ëmmap(2)¤Î»ÈÍÑÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢£í£í£á£ð¡¡ÊªÍý¥á¥â¥ê¶õ´Ö¤Î²¾ÁÛ¥á¥â¥ê¶õ´Ö¤Ø¤Î¥Þ¥Ã¥×¡¿¥¢¥ó¥Þ¥Ã¥× ¨¢ ¨¢ ¨¢ ¨¢·Á¼° ¨¢ ¨¢ ¨¢ ¨¢ #include ¨¢ ¨¢ #include ¨¢ ¨¢ ¨¢ ¨¢ int mmap(addr,len,prot,share,fd,off) ¨¢ ¨¢ int munmap(addr,len) ¨¢ ¨¢ ¨¢ ¨¢°ú¿ô ¨¢ ¨¢ ¨¢ ¨¢¡¡chaddr_t addr;¡¡¥Þ¥Ã¥×¤¹¤ë²¾ÁÛ¥á¥â¥ê¶õ´Ö¤ÎÀèÆ¬¥¢¥É¥ì¥¹¤Ç¥Ú¡¼¥¸¥Ð¥¦¥¦¥ó¥À¥ê¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤ ¨¢ ¨¢ int len; ¥·¥¹¥Æ¥à¥Ú¡¼¥¸¥µ¥¤¥º¤ÎÇÜ¿ô¤Ç¤¢¤ë¥Ð¥¤¥È¿ô¡ÊNBPG=4096¡Ë ¨¢ ¨¢ int prot; Êݸî°À­¡Ê¸½ºß¤Î¥¤¥ó¥×¥ê¥á¥ó¥È¤Ç¤Ï¡¢Ìµ»ë¤µ¤ì PROT_READ|PORT_WRITE ¤Ë¤Ê¤ë¡Ë ¨¢ ¨¢ int share; ¶¦Í­¤Î̵ͭ¡Ê¸½ºß¤Î¥¤¥ó¥×¥ê¥á¥ó¥È¤Ç¤Ï¡¢Ìµ»ë¤µ¤ì MAP_SHARED ¤Ë¤Ê¤ë¡Ë ¨¢ ¨¢ int fd; ¥Õ¥¡¥¤¥ëµ­½Ò»Ò ¨¢ ¨¢ int off; ¥ª¥Õ¥»¥Ã¥ÈÃÍ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡°Ê²¼¤Î¥×¥í¥°¥é¥àÎã¤Ç¤Ï¡¢brk() ¤Ë¤è¤Ã¤Æ¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤ÎºÇ½ª¥¢¥É¥ì¥¹¤òÆÀ¤¿¸å¡¢roundup ¥Þ¥¯¥í¤Ç¥Ú¡¼¥¸¶­³¦¤Ë¤½¤í¤¨¤Æ¡¢sbrk() ¤Ë¤è¤Ã¤Æ SIZE ¥Ð¥¤¥Èʬ¡Ê¤³¤ì¤Ï¥Ú¡¼¥¸¥µ¥¤¥º¤ÎÇÜ¿ô¡Ë¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤ò³ÈÄ¥¤·¤Þ¤¹¡£ ¡¡¤½¤Î¸å¡¢mmap() ¤Ë¤è¤Ã¤Æ¡¢¥Þ¥Ã¥×¤·¤¿¤¤¥¹¥Ú¥·¥ã¥ë¥Õ¥¡¥¤¥ë¤ò¥Þ¥Ã¥×¤·¤Þ¤¹¡£ ¡¡¡¡¡¡¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤Î ¥Ú¡¼¥¸¶­³¦¤ò¡¡¡¡¥Ç¡¼¥¿¥»¥°¥á¥ó¥È ¼Â¥Ç¥Ð¥¤¥¹¤ò ¡¡¡¡¡¡¡¡¥¢¥É¥ì¥¹¤òÆÀ¤ë ·×»»¤¹¤ë ¡¡¤ò¿­Ä¥¤¹¤ë ²¾ÁÛ¶õ´Ö¤Ë¥Þ¥Ã¥×¤¹¤ë ¨£¨¡¨¡¨¤ ¨£¨¡¨¡¨¤ ¨£¨¡¨¡¨¤ ¨£¨¡¨¡¨¤ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ sbrk¢ª¨¦¨¡¨¡¨¥ roundup¢­¨§¨¡¨¡¨© ¨§¨¡¨¡¨© ¨¢ ¨¢ /dev/resmem addr¢ª¨¦¨¡¨¡¨¥ brk¨§¨¡¨¡¨© ¨§¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¤ ¢­¨¢SIZE¨¢ ¥Ú¡¼¥¸ ¨¢ ¨¢ mmap ¢ª¨¢ ¨¢ ¼Â¥Ç¥Ð¥¤¥¹ addr+SIZE¢ª¨¦¨¡¨¡¨¥¡¡¥µ¥¤¥º ¨¦¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¥ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ­¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡­¢ ­£ ­¤ #include #include #include #include #define SIZE 0x80000 /* size of external memory (bytes) */ #define roundup(x) (((int)(x) + NBPG - 1) & ~(NBPG - 1)) char *addr; main() { int memfd, fildes, status, size; char *sbrk(); ­¡ addr = sbrk(0); ­¢ addr = (char *)roundup(addr); status = brk(addr+SIZE); ¡¡ ­£ if (status != 0) { perror("brk failed"); exit(1); } if ((memfd=open("/dev/resmem",O_RDWR))==-1) { ­¤ perror("mem open failed"); exit(1); } status=mmap(addr, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, memfd, 0); if (status < 0 ) { perror("mmap"); exit(2); } ¡ã¡ã¤³¤Î¶è´Ö addr ¤«¤é SIZE ʬ¤Î¶õ´Ö¤¬³ÈÄ¥¥á¥â¥ê¤Ë¥Þ¥Ã¥×¤µ¤ì¤Æ¤¤¤ë¡ä¡ä status = munmap(addr, SIZE); if (status < 0) { perror("munmap"); exit(1); } }

£µ¡¥£²¡¥£³¡¡¥·¥¹¥Æ¥à¡¦¥¢¥É¥ì¥¹¶õ´Ö¤È£Ö£Í£Å¡²£Á£³£²

¡¡£Ò£Ô£Õ¤Ë¤ª¤±¤ë¥á¥â¥ê¥Þ¥Ã¥×¤Ç¤Ï¡¢°Ê²¼¤Î¿Þ¤Î¤è¤¦¤Ë¥á¥â¥ê¤Î¥Ü¥È¥à¤«¤é£Ò£Ô£Õ¤¬¾ïÃó¤·¡¢¥á¥â¥ê¤Î¥È¥Ã¥×¤«¤éͽÌó¥á¥â¥ê¤¬¤È¤é¤ì¤Þ¤¹¡£ FFFFFFFF¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤FFFFFFFF ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¨¢ ¨¢ VBA ¨¢ ¨¢ ¨¢ ¨¢Í½Ìó¥á¥â¥ê¨¢ ¨¢ £Ö£Í£Å¡²£Á£³£² ¨¢ ¨¢ ¨¢ ¨¢¥æ¡¼¥¶»ÈÍÑÎΰ訢 ¨§¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ 80000000¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨©C0000000 ¨¢ ¥×¥í¥»¥¹ ¨¢ ¨¢ ̤»ÈÍÑ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ÍøÍѲÄǽ ¨¢ n7FFFFFF¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ÎÎ°è ¨¢ ¨¢ ¥·¥¹¥Æ¥à¥á¥â¥ê ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ n4000000¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢¢« DMA¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨©1FFFFFFF ¨§¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ̤»ÈÍÑ ¨¢ ¨¢ ¨¢ ¨¢ ľÀÜ¥¢¥¯¥»¥¹ ¨¢ ¨¢ ¨¢ n2FFFFFF¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¢ ¨¢ ÎÎ°è ¨¢ ¨¢ £Ò£Ô£Õ ¨¢ ¨¢ £Ö£Í£Å¡²£Á£²£´ ¨¢ ¨¢ ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨©14000000 ¨¦¨¡¨¡¨¡¨¡¨¡¨¥ n2000000¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ̤»ÈÍÑ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ n0FEFFFF¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ £Ö£Í£Å¡²£Á£±£¶ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¡Ê£î¡§¥×¥í¥»¥Ã¥µÈÖ¹æ¡Ë n0FE0000¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¨¢ ¨¢ ¨¢ ¨¢¥í¡¼¥«¥ë¥Ç¥Ð¥¤¥¹¨¢ ¨¢ ¨¢ ¨¢ ¨¢ n0000000¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¥·¥¹¥Æ¥à¡¦¥¢¥É¥ì¥¹¶õ´Ö £Ö£Í£Å¡²£Á£³£²¥¢¥É¥ì¥¹¶õ´Ö ¡¡¤³¤Î¥á¥¤¥ó¥á¥â¥ê¤ÎÍøÍѾõ¶·¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ë /usr/adm/messages ¥Õ¥¡¥¤¥ë¤Îɽ¼¨¤ò¤ß¤ë¤³¤È¤Ç³Îǧ¤Ç¤­¤Þ¤¹¡£ UNIX/6.1: mc7000 unix generic CPU1 CPU2 CPU3 are 68040's MEMORY SUMMARY POOL CPU PAGES (BYTES) 33554432 installed 0 1 6896 (28246016) 4096 reserved 33550336 real 28246016 available ¨¢ ¨¢ ¡¡¤·¤¿¤¬¤Ã¤Æ¡¢¥·¥¹¥Æ¥à¡¦¥¢¥É¥ì¥¹¶õ´Ö¤Î¡¡0x40000000 + 33550336 ¤«¤é 4096¡¡¥Ð¥¤¥È¤¬¥ê¥¶¡¼¥Ö¥É¥á¥â¥ê¤È¤·¤Æ³ÎÊݤµ¤ì¤Æ¤¤¤ë¤Î¤¬Íý²ò¤Ç¤­¤Þ¤¹¡£ ¡¡£Ö£Í£Å¡²£Á£³£²¤«¤é¤³¤Î¶õ´Ö¤ò¸«¤ë¤È¡¡0x14000000 + 33550336 ¤«¤é 4096 ¥Ð¥¤¥È¥ê¥¶¡¼¥Ö¥É¥á¥â¥ê¤ò³ÎÊݤ·¤¿¤è¤¦¤Ë¸«¤¨¤Þ¤¹¡£ ¡¡¤³¤Î¶õ´Ö¤Ï¡¢£Ö£Í£Å£â£õ£ó¤«¤é¡¢£Ö£Â£Á¤Î¥Þ¥Ã¥×¥ì¥¸¥¹¥¿¤ò·Ðͳ¤»¤º¤Ë¥¢¥¯¥»¥¹½ÐÍè¤ë¡¢¥À¥¤¥ì¥¯¥È¥¢¥¯¥»¥¹Îΰè¤Ç¤¹¤Î¤Ç¡¢£Ö£Í£Å¡²£Á£³£²¾å¤Î¤³¤ÎÎΰè¤Ë£Ä£Í£ÁžÁ÷¤ò¹Ô¤¨¤Ð¡¢¥·¥¹¥Æ¥à¥á¥â¥ê¾å¤Ë£Ä£Í£ÁžÁ÷¤Ç¤­¤ëÌõ¤Ç¤¹¡£ ¡¡¸å¤Ï¡¢£Ä£Í£Á¥Ç¥Ð¥¤¥¹¤ò£Ö£Í£Å£â£õ£ó¤Ë¥×¥í¥°¥é¥à£É¡¿£Ï¥Ç¥Ð¥¤¥¹¤È¤·¤ÆÅÐÏ¿¤·¡¢À©¸æ¤¹¤ì¤ÐÎɤ¤¤ï¤±¤Ç¤¹¤¬¡¢Ãí°Õ¤·¤Ê¤±¤ì¤Ð¹Ô¤±¤Ê¤¤»ö¤¬£±¤Ä¤À¤±¤¢¤ê¤Þ¤¹¡£ ¡¡¤½¤ì¤Ï¡¢³ä¹þ¤ß¤ò¶Ø»ß¤·¤Æ£Ä£Í£ÁžÁ÷¤ò¼Â¹Ô¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤Ç¤¹¡£¥×¥í¥°¥é¥à£É¡¿£Ï¥Ç¥Ð¥¤¥¹¤Ç»ÈÍѤµ¤ì¤ë extmem ¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥Ð¤Ë¤Ï¡¢³ä¹þ¤ß¤ò¥Ï¥ó¥É¥ê¥ó¥°¤¹¤ëµ¡Ç½¤¬´Þ¤Þ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢£Ä£Í£Á½ªÎ»³ä¹þ¤ß¤Ê¤É¤Î³ä¹þ¤ß¤Ïǧ¼±¤µ¤ì¤Ê¤¤¥¹¥×¥ê¥¢¥¹³ä¹þ¤ß¤È¤·¤Æ½èÍý¤µ¤ì¤ë¤¿¤á¡¢¥·¥¹¥Æ¥à¤ËÃ×̿Ū¤Ê¾ã³²¤òÍ¿¤¨¤Æ¤·¤Þ¤¤¤Þ¤¹¡£¤è¤Ã¤Æ¡¢É¬¤º³ä¹þ¤ß¤Ï¶Ø»ß¤·¤Æ»ÈÍѤ·¤Æ²¼¤µ¤¤¡£ ¡¡¤Þ¤¿¡¢Ä̾ï¤Î¥Ç¥Ð¥¤¥¹¡¦¥É¥é¥¤¥Ð¤ÇɬÍפˤʤ롢¥ª¡¼¥×¥ó¡¿¥¯¥í¡¼¥º¡¿°Û¾ï½ªÎ»»þ¤Î½èÍý¤ä¥¿¥¤¥à¥¢¥¦¥È¤Îµ¡Ç½¤Ï¤¹¤Ù¤Æ¥æ¡¼¥¶¥×¥í¥°¥é¥à¤Ç»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¡¡°Ê²¼¤Ë¡¢£É£Ã£Ï£Î¼Ò¤Î£Ä£Ò£±£±£×¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò»ÈÍѤ·¤¿¥×¥í¥°¥é¥à¤ò·Ç¤²¤Þ¤¹¡£ ¥×¥í¥°¥é¥à£É¡¿£Ï¤È¥ê¥¶¡¼¥Ö¥É¥á¥â¥ê¤Ë¤è¤ë£Ä£Í£ÁžÁ÷¤Î¥×¥í¥°¥é¥àÎã #include #include #include #include #include #include #include #define RESMEM_SIZE 0x1000 /* size of reserved memory (bytes) */ #define DR11W_SIZE 0x1000 #define roundup(x) (((int)(x) + NBPG - 1) & ~(NBPG - 1)) #define RDMA 0x8000 #define RATN 0x4000 #define RPER 0x2000 #define MCLR 0x1000 #define CYCL 0x0100 #define TERM 0x0080 #define IENB 0x0040 #define SDIR 0x0010 #define FNC3 0x0008 #define FNC2 0x0004 #define FNC1 0x0002 #define GO 0x0001 #define ADD_MOD 0x09 struct DR11W_REGISTER { ushort dr_icr; ushort dr_data; unsigned char dr_ad_mod; unsigned char dr_vec; ushort dr_pulse_cmds; ushort dr_pad0[5]; ushort dr_setaddrl; ushort dr_countl; ushort dr_curaddrl; ushort dr_pad1; ushort dr_setaddrh; ushort dr_counth; ushort dr_curaddrh; }; struct RESMEM { ushort data[RESMEM_SIZE/2]; }; #define DATACNT (4096/2) struct DR11W_REGISTER *dp; struct RESMEM *bp; struct RESMEMf *bpf; trap() {/* ¡°£Ã¤Î½èÍý */ dp->dr_icr = TERM; /*£Ä£Í£ÁžÁ÷¤ò¶¯À©½ªÎ»*/ dp->dr_pulse_cmds = MCLR; /*¥Ü¡¼¥É¥ê¥»¥Ã¥È*/ exit(1); } main() { unsigned long addr; int i,drfd,drstatus; static caddr_t draddr; int bffd,bfstatus; static caddr_t bfaddr; /*£Ä£Ò£±£±£×¤ò¥×¥í¥°¥é¥à£É¡¿£Ï¥Ç¥Ð¥¤¥¹¤È¤·¤Æ¥Þ¥Ã¥×¤¹¤ë*/ draddr = (caddr_t)sbrk(0); draddr = (caddr_t)roundup(draddr); drstatus = brk(draddr + DR11W_SIZE); if(drstatus < 0){ fprintf(stderr,"Memory Alocation error status is %d\n",drstatus); return(1); } if((drfd = open("/dev/dr11w",O_RDWR)) == -1){ fprintf(stderr,"open error:DR11W\n"); return(1); } drstatus = mmap(draddr,DR11W_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,drfd,0); if(drstatus < 0) { fprintf(stderr,"mmap io error status is %d\n",drstatus); return(1); } dp = (struct DR11W_REGISTER *)draddr; /*¥Ç¥Ð¥¤¥¹¤ò½é´ü²½¤¹¤ë*/ dp->dr_pulse_cmds = MCLR; dp->dr_ad_mod = (unsigned char)ADD_MOD; dp->dr_vec = 0x0; dp->dr_icr = 0; /* desable interrupt */ /*£Ä£Í£ÁžÁ÷¥¢¥É¥ì¥¹¤ò½é´ü²½¤¹¤ë*/ addr = 0x14000000 + 16773120 ; addr = (addr - 1) >> 1; dp->dr_setaddrl = (addr & 0x0000ffff); dp->dr_setaddrh = ((addr & 0xffff0000) >> 16); dp->dr_countl = (unsigned short int)0; dp->dr_counth = (unsigned short int)0; /*¡°£Ã³ä¹þ¤ß¤Ë¤è¤ë¥È¥é¥Ã¥×´Ø¿ô¤òÄêµÁ*/ signal(SIGINT ,trap); /*¥ê¥¶¡¼¥Ö¥É¥á¥â¥ê¤ò¥Þ¥Ã¥×¤¹¤ë*/ bfaddr = (caddr_t)sbrk(0); bfaddr = (caddr_t)roundup(bfaddr); bfstatus = brk(bfaddr + RESMEM_SIZE); if(bfstatus<0){ fprintf(stderr,"Memory Alocation error status is %d\n",bfstatus); return(1); } if((bffd = open("/dev/resmem",O_RDWR)) == -1) { fprintf(stderr,"open errojr: reserved memtory\n"); return(1); } bfstatus = mmap(bfaddr,RESMEM_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,bffd,0); if(bfstatus < 0){ fprintf(stderr,"mmap io error status is %d\n",bfstatus); } bp =(struct RESMEM *)bfaddr; bpf =(struct RESMEMf *)bfaddr; /*¥ê¥¶¡¼¥Ö¥É¥á¥â¥êÎΰè¤Ë¥Ç¡¼¥¿¤ò¥»¥Ã¥È¤¹¤ë*/ for(i=0;i< DATACNT;i++){ bp->data[i] = i; } /*£Ä£Í£ÁžÁ÷¥¢¥É¥ì¥¹¤ò¥»¥Ã¥È¤¹¤ë*/ dp->dr_setaddrl = addr & 0x0000ffff; dp->dr_setaddrh = ((addr & 0xffff0000) >> 16); dp->dr_countl = (unsigned short int )DATACNT; dp->dr_counth = 0; /*£Ä£Í£ÁžÁ÷¤ÎÊý¸þ¤òÀ©¸æ¤¹¤ë*/ #if READ dp->dr_icr = SDIR; #else dp->dr_icr = 0; #endif /*£Ä£Í£ÁžÁ÷¤ò¹Ô¤¦*/ dp->dr_pulse_cmds = GO|CYCL|RDMA; /*£Ä£Í£ÁžÁ÷¤Î½ªÎ»¤ò¥Õ¥é¥°¥¹¥­¥ã¥ó¤·¤ÆÂÔ¤Ä*/ while(1){ if(dp->dr_icr & RDMA) break; } #if READ for(i=0;idata[i]); } #endif /* £Ä£Ò£±£±£×¤ò¥ê¥»¥Ã¥È¤·¥Ç¥Ð¥¤¥¹¤ò¥¯¥í¡¼¥º¤¹¤ë */ dp->dr_pulse_cmds = MCLR; close(drfd); close(bffd); }

£µ¡¥£²¡¥£´¡¡¥¹¥ì¥Ã¥É¤ÎÀÅŪÊÑ¿ô

¡¡£¶¾Ï¤Ç¡¢ÀâÌÀ¤¹¤ë¥¹¥ì¥Ã¥É¤ò»ÈÍѤ¹¤ë¤È¡¢Ê£»¨¤Ê¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»ÈÍѤ»¤º¤Ë¶¦Í­¥á¥â¥ê¤ò¼«Á³¤Ë¼Â¸½¤Ç¤­¤ë¤¿¤á¡¢¥»¥Þ¥Õ¥©Åù¤ÎÇÓ¾À©¸æµ¡¹½¤ÈÁȤ߹ç¤ï¤»¤ë¤³¤È¤Ç¡¢ÂçÎ̤Υǡ¼¥¿¤ò¸úΨ¤è¤¯¶¦Í­¤Ç¤­¤Þ¤¹¡£ ¡¡£Ò£Ô£Õ¤Î¥¹¥ì¥Ã¥É¤Ç¤Ï¡¢£Õ£Î£É£ØÉ¸½à¤Î£ó£é£ç£î£á£ì¤Ë²Ã¤¨¤Æ£Á£Ó£Ô¤ò¤â¥¹¥ì¥Ã¥Éñ°Ì¤Ç¥µ¥Ý¡¼¥È¤·¡¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤â¿¿ô¥¹¥ì¥Ã¥ÉÂбþ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ ¡¡¥¹¥ì¥Ã¥ÉÂбþ¤È¸À¤¦°ÕÌ£¤Ï¡¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î¼Â¹Ô¤ò¥¹¥ì¥Ã¥Éñ°Ì¤Ç¼Â¹Ô½ÐÍè¤ë¤¿¤á¡¢Â¾¤Î¥¹¥ì¥Ã¥É¤Ë±Æ¶Á¤òÍ¿¤¨¤ë»ö̵¤¯¡¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò¸Æ¤Ó½Ð¤»¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¸Æ¤Ó¤À¤·¤¿·ë²Ì¡¢Éõº¿¤µ¤ì¤ë¤Î¤Ï¡¢¥×¥í¥»¥¹Á´ÂΤǤϤʤ¯¥¹¥ì¥Ã¥É¤À¤±¤Ç¤¹¡£ ¥¹¥ì¥Ã¥ÉÂбþ¥·¥¹¥Æ¥à¥³¡¼¥ë _getuptime adjtime alarm astpause canclkast chpage clkast dup exit fchmod fchown fclkast *fcntl flock fstat fstatfs *fsync ftime *ftruncate getdirentries getdtablesize getid getgroups gethostid gettimer getpagesize getpid getpriority getrusage gettimeofday gettimer getuid hold ioctl kill lock lockf madvise mincore *mpadvise mprotect mremap nice oldstat oldselect olockf osigvec pause pprotect prof ptrace *read *readv release rlockf rread rwrite schedget schedset seek select _sendast setgid setgroups sethostid setitimer setpgrp setpri setpriority setregid setreuid settimeofday settimer setuid sig sigblock sigpause sigsetmask sigstack sigvec sps_creat sps_ctl sps_cycend sps_map t_create t_csleep t_cwake1 t_cwakeup t_cwant t_exit t_getdata t_getdptr t_geterror t_gettid t_kill t_ncancel t_nhandler t_notify t_nowait t_sendast t_setdata t_setname t_wakeup t_wait time times ucbfcntl umask utssys vi_create vi_ctl vi_delete vi_map vi_mapsource vi_nonsense vi_sense vi_unmap wait *write *writev yield ¡ö¡¡¤Ï¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤Ë¥¹¥¤¥Ã¥Á¤·¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤¬¤¢¤ë ¡¡¥¹¥ì¥Ã¥É¤Ë¤è¤ë¶¦Í­¥á¥â¥ê¤ÎÀ©¸Â¤Ï¡¢¥×¥í¥°¥é¥à¤Î²¾ÁÛ¶õ´Ö¤ÈƱ°ì¤Ç¤¹¤Î¤Ç¡¢£Ò£Ô£Õ¤Î¥½¥Õ¥È¥¦¥§¥¢¥ê¥ß¥Ã¥È¤ª¤è¤Ó¥Ï¡¼¥É¥¦¥§¥¢¥ê¥ß¥Ã¥È¤Ë¤è¤Ã¤ÆÀ©¸Â¤ò¤¦¤±¤Þ¤¹¡£¥Ï¡¼¥É¥¦¥§¥¢¥ê¥ß¥Ã¥È¤Ï¡¢¥³¥ó¥Õ¥£¥°¥ì¡¼¥·¥ç¥ó¥Õ¥¡¥¤¥ë¤Î°Ê²¼¤Î¾ðÊó¤Ë°Í¸¤·¤Æ¤¤¤Þ¤¹¡£ maxtsiz ²¾ÁÛ¶õ´Ö¤Ç»ÈÍѤǤ­¤ë¥Æ¥­¥¹¥È¡¦¥»¥°¥á¥ó¥È¤ÎºÇÂ祵¥¤¥º maxdsiz ²¾ÁÛ¶õ´Ö¤Ç»ÈÍѤǤ­¤ë¥Ç¡¼¥¿¡¦¥»¥°¥á¥ó¥È¤ÎºÇÂ祵¥¤¥º maxssiz ²¾ÁÛ¶õ´Ö¤Ç»ÈÍѤǤ­¤ë¥¹¥¿¥Ã¥¯¡¦¥»¥°¥á¥ó¥È¤ÎºÇÂ祵¥¤¥º

¡ø£¶¡¡ÊÂÎó½èÍý

£¶¡¥£±¡¡¥·¥ó¥á¥È¥ê¥·¥¹¥Æ¥à¥³¡¼¥ë

¡¡¤¹¤Ç¤Ë½Ò¤Ù¤¿¤è¤¦¤Ë¡¢£Ò£Ô£Õ¤Ï¤¹¤Ù¤Æ¤Î¥×¥í¥»¥Ã¥µ¤Ç¶¨Ä´¤·¤ÆÆ°ºî¤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¤¹¤Ù¤Æ¤Î¥×¥í¥»¥Ã¥µ¤ÇƱ»þÊÂÎó¤Ë¼Â¹Ô¤µ¤ì¡¢¥æ¡¼¥¶¤Ï¡¢¤½¤ì¤ò°Õ¼±¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ ¡¡¤·¤¿¤¬¤Ã¤Æ¡¢´ðËÜŪ¤Ë¤Ï¤¹¤Ù¤Æ¤Î¥×¥í¥»¥Ã¥µ¤ÇƱÅù¤Î½èÍý¤¬¤Ç¤­¤Þ¤¹¤¬¡¢ÆâÉôŪ¤Ë¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤Ç¼Â¹Ô¤µ¤ì¤ë¥·¥¹¥Æ¥à¥³¡¼¥ë¤â¤¢¤ê¤Þ¤¹¤¬¡¢¤³¤ì¤âÆâÉô¤Ç¼«Æ°Åª¤Ë¥¹¥¤¥Ã¥Á¥ó¥°¤µ¤ì¤ë¤¿¤á¥æ¡¼¥¶¤Ï¤½¤ì¤ò°Õ¼±¤¹¤ë¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£¡Ê¾ÜºÙ¤ò²¼É½¤Ë¼¨¤·¤Þ¤¹¡£¡Ë ¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤Î¤ß¤Ç¼Â¹Ô¤Ç¤­¤ë¥·¥¹¥Æ¥à¥³¡¼¥ë accept acct bind break cinfo close connect create exec exece fork gethostname getpeername getsockname getsockopt link listen mkdir mknod mmap mount munmap nfs_svc open pinfo plockin pmapm punlock punmap reboot recv recvfrom recvmsg rename rmdir send sendmsg sendto sethostname setsockopt shutdown socket socketpair symlink sync umount unlink unmount vadvise vfork vswapon ¤¹¤Ù¤Æ¤Î¥×¥í¥»¥Ã¥µ¤Ç¼Â¹Ô¤Ç¤­¤ë¥·¥¹¥Æ¥à¥³¡¼¥ë access chdir chmod chown chroot exportfs getcwd getmsg getpmsg getrlimit getuniverse gtty lstat msgctl msgget msggrcv msgsnd nfs_getfh oldstat openobject pipe poll putmsg putpmsg quota readlink sem semctl semget semop setquota setrlimit setuniverse shm sinfo stat statfs stime stty truncate ulimit utime utimes vhangup vlimit vsetpgrp vtime async_daemon setdomainname getdomainname Îã³°¾ò·ï¤È¤·¤Æ¤Ï¡¢°Ê²¼¤Î£²¤Ä¤¬¤¢¤ê¤Þ¤¹¡£ ¡¡£±¡Ë¥·¥¹¥Æ¥à¤ÎΩ¤Á¾å¤²¤Ï¡¢¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤Î¤ß¤Ç¹Ô¤¨¤ë¡£ ¡¡£²¡Ë¥ê¥¢¥ë¥¿¥¤¥à¥¹¥ì¡¼¥Ö¤Îµ¡Ç½¤Ï¡¢Èó¥Ö¡¼¥È¥×¥í¥»¥Ã¥µ¤Î¤ß¤Ç¼Â¹Ô¤Ç¤­¤ë¡£ ¤Þ¤¿£Ò£Ô£Õ¤Ë¤ª¤±¤ëÆþ½ÐÎÏÌ¿Îá¤Ë´Ø¤·¤Æ¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ë£²¤Ä¤ÎÊýË¡¤¬Â¸ºß¤·¤Þ¤¹¡£ ¡¡£±¡Ë£Ò£Ô£Õ¤Î¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥Ð¤ò²ð¤¹¤ëÊýË¡¡£ ¡¡£²¡Ë¥á¥â¥ê¥Þ¥Ã¥×¥Ç¥Ð¥¤¥¹¤È¤·¤Æ¥×¥í¥°¥é¥à£É¡¿£Ï¤ò»ÈÍѤ¹¤ëÊýË¡¡£ ¡¡¤¤¤º¤ì¤ÎÊýË¡¤Ç¤â¡¢¤É¤Î¥×¥í¥»¥Ã¥µ¤«¤é¤Ç¤â¼Â¹Ô²Äǽ¤Ç¤¹¡£¤¿¤À¤·¡¢Îã³°¤È¤·¤Æ¡¢¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥Ð¤¬ÈóÂоη¿¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï½ü¤­¤Þ¤¹¡£É¸½àŪ¤Ê£Ò£Ô£Õ¤Î¥Ç¥Ð¥¤¥¹¡¦¥É¥é¥¤¥Ð¤Ï¤¹¤Ù¤ÆÂоη¿¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢¤¿¤È¤¨¤Ð¥Ç¥£¥¹¥¯¤ËÂФ¹¤ë read,write ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï¡¢¤¹¤Ù¤Æ¤Î¥×¥í¥»¥Ã¥µ¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£

£¶¡¥£²¡¡Â¿½Å¥¹¥ì¥Ã¥É

¡¡Â¿½Å¥¹¥ì¥Ã¥É¤Ï¡¢¥é¥¤¥È¥¦¥§¥¤¥È¥×¥í¥»¥¹¤È¤â¸Æ¤Ð¤ì¡¢£Í£Á£Ã£È¡¢£Ó£õ£î£Ï£Ó£µ¡¥£°¡¢£Ò£Ô£ÕÅù¤Ë¼ÂÁõ¤µ¤ì¡¢£Ð£Ï£Ó£É£Ø¤Ë¤ª¤¤¤Æ¤â¡¢¥¹¥ì¥Ã¥É¤Îµ¡¹½¤¬¥ê¥¢¥ë¥¿¥¤¥à¾®°Ñ°÷²ñ¤Ç¸¡Æ¤¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥·¥ó¥°¥ë¥×¥í¥»¥Ã¥µ¤Ë¤ª¤¤¤Æ¤â¥¹¥ì¥Ã¥É¤Ï¶½Ì£¿¼¤¤ÆÃħ¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¤¬¡¢ËÜÅö¤Ë¤½¤Î¸ú²Ì¤òȯ´ø¤¹¤ë¤Î¤Ï¡¢¶¦Í­¥á¥â¥ê·¿¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¤Ç¡¢¥¹¥ì¥Ã¥É¤ò°Û¤Ê¤ë¥×¥í¥»¥Ã¥µ¤ÇÊÂÎó¤Ë¼Â¹Ô¤·¤¿¾ì¹ç¤Ç¤¹¡£¡Ê¤³¤ì¤ò¿½Å¥¹¥ì¥Ã¥É¤È¸Æ¤Ó¤Þ¤¹¡Ë ¡¡¤³¤¦¤¤¤Ã¤¿¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¾å¤Ë¼Â¸½¤µ¤ì¤¿Â¿½Å¥¹¥ì¥Ã¥É¤Ï¡¢¥ê¥¢¥ë¥¿¥¤¥à£Õ£Î£É£Ø¤Ë¤ª¤¤¤Æ¡¢¤¿¤¤¤Ø¤óÂ礭¤Ê°ÕÌ£¤ò¤â¤Ã¤Æ¤¤¤Þ¤¹¡£¤½¤ì¤Ï¡¢¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤Ë¤ª¤¤¤ÆËþ¤¿¤µ¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤´ðËÜ»ÅÍͤò¿½Å¥¹¥ì¥Ã¥É¤ò»È¤Ã¤Æ¡¢¸ú²ÌŪ¤Ë¼Â¸½¤Ç¤­¤ë¤«¤é¤Ë¤Û¤«¤Ê¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£ ¡¡¤¿¤È¤¨¤Ð¥¹¥ì¥Ã¥É¤Ï¡¢¥×¥í¥»¥¹¤Î¤â¤Ä¤¹¤Ù¤Æ¤Î¥Ç¡¼¥¿¹½Â¤¤ò¼õ¤±·Ñ¤®¤Ê¤¬¤é¡¢Â¾¤Î¥¹¥ì¥Ã¥É¤Ë±Æ¶Á¤òÍ¿¤¨¤ë»ö̵¤¯Éõº¿¤Ç¤­¤ë¤¿¤á¡¢¿®ÍêÀ­¤Î¹â¤¤È󯱴ü¥¤¥Ù¥ó¥ÈÄÌ¿®µ¡¹½¤ÈÁȤ߹ç¤ï¤»¤ë»ö¤Ë¤è¤êÀè¤ËÀâÌÀ¤·¤¿È󯱴üÆþ½ÐÎϵ¡¹½¤ò´Êñ¤Ë¼Â¸½¤Ç¤­¤Þ¤¹¡£ ¡¡¤³¤¦¤¤¤Ã¤¿ÆÃħ¤òÍøÍѤ¹¤ì¤Ð¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¾å¤Ç¡¢·×»»¤Î¥Ù¥¯¥¿²½¤ä¡¢¥Ç¡¼¥¿°Üư¤Î¥À¥Ö¥ë¥Ð¥Ã¥Õ¥¡Ë¡¡¢¥Ñ¥¤¥×¥é¥¤¥Ë¥ó¥°¤ä¥­¥å¡¼¥¤¥ó¥°Åù¤Î¼êË¡¤ò¸úΨ¤è¤¯¼Â¸½¤Ç¤­¤Þ¤¹¡£ ¡¡¤³¤³¤Ç¤Ï¡¢£Ò£Ô£Õ¤Ë¼ÂÁõ¤µ¤ì¤¿Â¿½Å¥¹¥ì¥Ã¥É¤òÃæ¿´¤Ë£Í£Á£Ã£È¤È¤ÎÈæ³Ó¤ò¤Þ¤¸¤¨´Êñ¤Ë²òÀ⤷¤Þ¤¹¡£ ²¼¤Îɽ¤Ë£Ò£Ô£Õ¤Ç»ÈÍѤµ¤ì¤ë¥¹¥ì¥Ã¥É´Ø·¸¤Î¥×¥ê¥ß¥Æ¥£¥Ö¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò¤Þ¤È¤á¤Æ¤ª¤­¤Þ¤¹¡£ ¿½Å¥¹¥ì¥Ã¥É¤ÎƱ´ü¤ÈÇÓ¾À©¸æ¤Ë»ÈÍѤµ¤ì¤ë¥×¥ê¥ß¥Æ¥£¥Ö¥·¥¹¥Æ¥à¥³¡¼¥ë ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢t_getdptr(); ¨¢¥¹¥ì¥Ã¥ÉÍѤΥץ饤¥Ù¡¼¥È¹½Â¤ÂΤΥݥ¤¥ó¥¿¤òÆÀ¤ë ¨¢ ¨¢t_setdata(data); ¨¢»Ò¥¹¥ì¥Ã¥É¤Ë°úÅϤ¹À°¿ô¥Ç¡¼¥¿¤ò¥×¥é¥¤¥Ù¡¼¥È¹½Â¤ÂΤ˥»¥Ã¥È¤¹¤ë ¨¢ ¨¢t_getdata(); ¨¢¿Æ¥¹¥ì¥Ã¥É¤«¤é°úÅϤµ¤ì¤¿À°¿ô¥Ç¡¼¥¿¤ò¥×¥é¥¤¥Ù¡¼¥È¹½Â¤ÂΤ«¤éÆÀ¤ë¨¢ ¨¢t_geterror(); ¨¢¥«¥ì¥ó¥È¥¹¥ì¥Ã¥É¤ËÄÌÃΤµ¤ì¤¿¥·¥¹¥Æ¥à¥¨¥é¡¼¥³¡¼¥É¤òÆÀ¤ë ¨¢ ¨¢t_gettid(); ¨¢¥«¥ì¥ó¥È¥¹¥ì¥Ã¥É¤Î¥¹¥ì¥Ã¥É£É£Ä¤òÆÀ¤ë ¨¢ ¨¢t_setname(id,thread_name); ¨¢¥¹¥ì¥Ã¥É£É£Ä¤Ç»ØÄꤷ¤¿¥¹¥ì¥Ã¥É¤Ë̾Á°¤ò¤Ä¤±¤ë ¨¢ ¨¢struct threaddata { ¨¢¥×¥é¥¤¥Ù¡¼¥È¹½Â¤ÂÎ ¨¢ ¨¢ int td_data; ¨¢t_create,t_getdata,t_setdata ¤Ç»ÈÍѤ¹¤ëÀ°¿ô¥Ç¡¼¥¿ ¨¢ ¨¢ int td_errno; ¨¢¥·¥¹¥Æ¥à¤¬¥»¥Ã¥È¤¹¤ë¥¨¥é¡¼ÈÖ¹æ t_geterror ¤ÇÆÀ¤ë ¨¢ ¨¢ int td_tid; ¨¢¥·¥¹¥Æ¥à¤Ë¤¿¤À£±¤Ä¤Î¥¹¥ì¥Ã¥É£É£ÄÈÖ¹æ t_gettid ¤ÇÆÀ¤ë ¨¢ ¨¢ char *td_staacktop; ¨¢¥¹¥ì¥Ã¥É¤Î¥×¥é¥¤¥Ù¡¼¥È¥¹¥¿¥Ã¥¯¥¢¥É¥ì¥¹¤¬ t_create ¤Ç¥»¥Ã¥È ¨¢ ¨¢ char td_comm[MAXCOMLEN]; ¨¢t_create,t_setname ¤Ç»ÈÍѤ¹¤ë¥¹¥ì¥Ã¥É̾ ¨¢ ¨¢} threaddata_t; ¨¢ ¨¢ ¨¢t_create(func,stkptr,arg); ¨¢¥¹¥ì¥Ã¥É¤òÀ¸À®¤¹¤ë stkptr ¤Ï¡¢¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¥È¥Ã¥×¤ò»ØÄê ¨¢ ¨¢t_exit(status); ¨¢¥«¥ì¥ó¥È¥¹¥ì¥Ã¥É¤ò½ªÎ»¤¹¤ë ¨¢ ¨¢t_wait(thread_id); ¨¢»ØÄꥹ¥ì¥Ã¥É¤Î»ñ¸»¤ò t_exit »þ¤Ë²òÊü¤µ¤»¡¢¤½¤Î½ªÎ»¤òÂÔ¤Ä ¨¢ ¨¢t_nowait(thread_id); ¨¢»ØÄꥹ¥ì¥Ã¥É¤Î»ñ¸»¤ò t_exit »þ¤Ë²òÊü¤µ¤»¡¢¤½¤Î½ªÎ»¤òÂÔ¤¿¤Ê¤¤ ¨¢ ¨¢t_csleep(condition); ¨¢¥«¥ì¥ó¥È¥¹¥ì¥Ã¥É¤ò condition ¤ò³ÍÆÀ¤Þ¤Ç¥¹¥ê¡¼¥×¾õÂ֤ˤ¹¤ë ¨¢ ¨¢t_cwake1(condition); ¨¢condition ¤Ç¥¹¥ê¡¼¥×¤·¤Æ¤¤¤ë¥¹¥ì¥Ã¥É¤ò£±¤Ä¼Â¹Ô²Ä¾õÂ֤ˤ¹¤ë ¨¢ ¨¢t_cwakeup(condition); ¨¢condition ¤Ç¥¹¥ê¡¼¥×¤·¤Æ¤¤¤ë¥¹¥ì¥Ã¥É¤ò¤¹¤Ù¤Æ¼Â¹Ô²Ä¾õÂ֤ˤ¹¤ë ¨¢ ¨¢t_cwant(condition); ¨¢t_csleep,t_cwakeup ¤Ç»ÈÍѤ¹¤ë condition ¤ò³ÍÆÀ¡¿²òÊü¤¹¤ë ¨¢ ¨¢t_twakeup(thread_id); ¨¢¥¹¥ì¥Ã¥É£É£Ä¤Ç»ØÄꤷ¤¿¥¹¥ì¥Ã¥É¤ò¼Â¹Ô²Ä¾õÂ֤ˤ¹¤ë ¨¢ ¨¢t_notify(channel); ¨¢¥¹¥ì¥Ã¥ÉÍѤÎÈ󯱴ü¥¤¥Ù¥ó¥ÈÄÌÃÎ¥Á¥ã¥Í¥ë¤òÀ¸À®¤¹¤ë ¨¢ ¨¢t_ncancel(channel); ¨¢¥¹¥ì¥Ã¥ÉÍѤÎÈ󯱴ü¥¤¥Ù¥ó¥ÈÄÌÃÎ¥Á¥ã¥Í¥ë¤ò¾Ãµî¤¹¤ë ¨¢ ¨¢t_kill(thread_id,sig); ¨¢¥¹¥ì¥Ã¥É£É£Ä¤Ç»ØÄꤷ¤¿¥¹¥ì¥Ã¥É¤Ë¥·¥°¥Ê¥ë¤òÁ÷¿®¤¹¤ë ¨¢ ¨¢t_sendast(thread_id,lo_handler,func,¨¢¥¹¥ì¥Ã¥É¤ËÈ󯱴ü¥¤¥Ù¥ó¥È¤òÄÌÃΡʣÁ£Ó£Ô¤òÁ÷¿®¡Ë¤¹¤ë ¨¢ ¨¢ param,priority); ¨¢ ¨¢ ¨¢t_nhandler(lo_handler,func,param, ¨¢¥¹¥ì¥Ã¥ÉÍѤÎÈ󯱴ü¥¤¥Ù¥ó¥ÈÄÌÃÎ¥Á¥ã¥Í¥ë¤Î¥ï¡¼¥¯¥¨¥ê¥¢¤òÍѰդ¹¤ë¨¢ ¨¢ priority); ¨¢ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥

£¶¡¥£²¡¥£±¡¡¥¹¥ì¥Ã¥É¥â¥Ç¥ë

¡¡¥¹¥ì¥Ã¥É¤Ï¡¢¥×¥í¥»¥¹¤ÈÈæ³Ó¤¹¤ë¤È´ö¤Ä¤«¤ÎÅÀ¤Ç¤½¤Î¹Í¤¨Êý¤¬°Û¤Ê¤ê¤Þ¤¹¡£ ¡¡»÷¤Æ¤¤¤ëÅÀ¡§¥¹¥ì¥Ã¥É¤Ï£æ£ï£ò£ë¤Î¤è¤¦¤ËưŪ¤Ë¼Â¹Ô¤ò³«»Ï¤·£÷£á£é£ô¤Î¤è¤¦¤ËƱ´ü¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ¡¡¡¡¡§¥¹¥ì¥Ã¥É¤Ï»Ò¥×¥í¥»¥¹¤Î¤è¤¦¤Ë¡¢¥ª¡¼¥×¥ó¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò°ú·Ñ¤®¡¢½ªÎ»»þ¤Ë¥¨¥é¡¼ÈÖ¹æ¤òÊÖ¤·¤Þ¤¹¡£ ¡¡°Û¤Ê¤ëÅÀ¡¡¡§¥×¥í¥»¥¹¤È°ã¤Ã¤Æ¿Æ»Ò´Ø·¸¤¬¤Ê¤¯¡¢É¬¤º¤·¤â¥¹¥ì¥Ã¥ÉÀ¸À®»þ¤Ë¼Â¹Ô¤ò»Ï¤á¤Ê¤¯¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ ¡¡¡¡¡¡ ¡¡¡¡¡§¥¹¥ì¥Ã¥É¤Ï¡¢¥·¥¹¥Æ¥à³äÅö£É£Ä¤È¥«¥ì¥ó¥È¼Â¹Ô£É£Ä¤Î£²¤Ä¤Î¥¹¥ì¥Ã¥É£É£Ä¤ò»ý¤Á¤Þ¤¹¡£ ¡¡¡¡¡§¥¹¥ì¥Ã¥É¤Ï»Ò¥×¥í¥»¥¹¤È°ã¤Ã¤Æ¡¢ÀÅŪÀë¸À¤µ¤ì¤¿¥Ç¡¼¥¿¤È³°ÉôÀë¸À¤µ¤ì¤¿¥Ç¡¼¥¿¤ò¤¹¤Ù¤Æ¶¦Í­¤·¤Þ¤¹¡£ ¡¡¥×¥í¥»¥¹¤Ï¥ë¡¼¥È¥¹¥ì¥Ã¥É¤ò´Þ¤ß¤Þ¤¹¡£¤¹¤Ê¤ï¤Á¥×¥í¥»¥¹¤ò£±¤ÄÀ¸À®¤¹¤ë¤³¤È¤Ï¥ë¡¼¥È¥¹¥ì¥Ã¥É¤ò£±¤ÄºîÀ®¤¹¤ë»ö¤ÈƱ¤¸¤Ç¤¹¡£ ¡¡²¼¿Þ¤Ë¥×¥í¥»¥¹¤È¥¹¥ì¥Ã¥É¤Î´Ø·¸¤ò¼¨¤·¤Þ¤¹¡£Ãí°Õ¤·¤ÆÍߤ·¤¤¤Î¤Ï¡¢¥¹¥¿¥Ã¥¯¤Î¤¢¤Ä¤«¤¤¤Ç¡¢¥¹¥¿¥Ã¥¯¤Î´ÉÍý¤¬¥æ¡¼¥¶¤ËǤ¤µ¤ì¤Æ¤¤¤ëÅÀ¤Ç¤¹¡£¤³¤ÎÎã¤Ç¼¨¤µ¤ì¤Æ¤¤¤ë¥×¥í¥°¥é¥à¤Ï¡¢ÆâÉôưºî¤¬Íý²ò¤·°×¤¤¤è¤¦¤Ë¥·¥¹¥Æ¥à¥×¥ê¥ß¥Æ¥£¥Ö¤À¤±¤ÇºîÀ®¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢Ä̾ï¤Ï¤³¤Î¾å°ÌÁؤΥ¹¥ì¥Ã¥É¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ·¤Þ¤¹¡£ ¡¡£Ò£Ô£Õ¤Î¥¹¥ì¥Ã¥É¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ¹¤ë¤È¥¹¥¿¥Ã¥¯Îΰè¤Î³ÎÊÝÅù¤ÎÌÌÅݤ¯¤µ¤¤¥×¥í¥°¥é¥à¤ÏÉÔÍפˤʤꡢ¿§¡¹¤ÊƱ´üµ¡¹½¤â¤³¤Î¥ì¥Ù¥ë¤Ç¼Â¸½¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ¡¡¤Þ¤¿¥¹¥ì¥Ã¥É¤Î¼«Æ°ÊÑ¿ô°Ê³°¤Î¥×¥é¥¤¥Ù¡¼¥È¥Ç¡¼¥¿¤Î³äÅö¤Ï¡¢£Ã¥³¥ó¥Ñ¥¤¥é¤Î´ÉÍý¤ËǤ¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¤â¤·¤³¤Î´ÉÍý¤ò¥³¥ó¥Ñ¥¤¥é¤¬¥µ¥Ý¡¼¥È¤·¤Ê¤¤¾ì¹ç¡¢¼«Æ°ÊÑ¿ô°Ê³°¤Ï¤¹¤Ù¤Æ¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤Ç¥æ¡¼¥¶¤Î´ÉÍý¤Î¸µ¤Ç¥×¥í¥°¥é¥à¤¹¤ë»ö¤Ë¤Ê¤ê¤Þ¤¹¡£ ¥×¥í¥»¥¹¤È¥¹¥ì¥Ã¥É¤Î´Ø·¸ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤¨¡¨¡¨¨¨¡ ¨¢ ¡¡¡¡¡¡¥×¥í¥»¥¹´Ä¶­ ¨¢ ¨¢ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¢ ¨¢¥Ç¡¼¥¿ ¨¢¥Æ¥­¥¹¥È¡¦¥»¥°¥á¥ó¥È ¨¢¥×¥í¥»¥¹£É£Ä¡¢¥°¥ë¡¼¥×£É£Ä ¨¢ ¨¢¡¡¡¡¥»¥°¥á¥ó¥È¨¢ ¨¢¿Æ¥×¥í¥»¥¹£É£Ä¡¢ ¥ë¨¢ ¨¢ int array[2];¨¢ ¥ë¡¼¥È¥¹¥ì¥Ã¥É¡Ê½é´ü¥×¥í¥»¥¹¡Ë ¨¢¥×¥í¥»¥¹Í¥ÀèÅÙ ¡Ã¨¢ ¨¢ ¨¢¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤¨¢¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥¹¥¯¥ê¥×¥¿ ¥È¨¢ ¨¢ ¨¢¨¢main() { int id,status; ¨¢¨¢¥»¥°¥á¥ó¥È¥µ¥¤¥º¥ê¥ß¥Ã¥È ¥¹¨¢ ¨¢ ¨¢¨¢ id=t_create(child_thread,stack[SIZE-1],0)¨¢¨¢ ¥ì¨¢ ¨¢ ¨¢¨¢ root_thread(1); ¨¢¨¢ ¥Ã¨¢ ¨¢ ¨¢¨¢ status=t_wait(id); ¨¢¨¢ ¥É¨¢ ¨¢ ¨¢¨¢} ¨¢¨¢ ¶õ¨¢ ¨¢ ¨¢¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨©¨¢ ´Ö¨¢ ¨¢ ¨¢¨¢root_thread(arg) int arg;{ ¨¢¨¢ ¨¢ ¨¢ ¨¢¨¢ array[arg]*=array[arg]; ¨¢¨¢ ¨¢¥× ¨¢ ¨¢¨¢} ¨¢¨¢ ¨¢¥í ¨¢ ¨¢¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥¨¢ ¨¡¨©¥» ¨¢ »Ò¥¹¥ì¥Ã¥É ¨¢ ¨¢ ¨¢¥¹ ¨¢¨£¨¡¨¡¨¡¨¡¨¡¨¡¨«¨¤ ¨£¨«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢¶õ ¨¢¨¢stack[SIZE];¨¢¨¢ ¨¢¨¢¥¹¥ì¥Ã¥É¥×¥é¥¤¥Ù¡¼¥È´Ä¶­ ¨¢ »Ò¨¢´Ö ¨¢¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨«¨«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨«¨«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¥¹¨¢ ¨¢ ¨¢¨¢child_thread(arg) int arg;{ ¨¢¨¢ ¥·¥¹¥Æ¥à³äÅö¥¹¥ì¥Ã¥É£É£Ä ¥ì¨¢ ¨¢ ¨¢¨¢ arg = t_getdata(); ¨¢¨¢ ¥¹¥ì¥Ã¥É̾ ¥Ã¨¢ ¨¢ ¨¢¨¢ array[arg]++; ¨¢¨¢ ¥¨¥é¡¼ÈÖ¹æ ¥É¨¢ ¨¢ ¨¢¨¢ t_exit(arg); ¨¢¨¢ °ú¤­ÅϤ·¥Ç¡¼¥¿ÎÎ°è ¶õ¨¢ ¨¢ ¨¢¨¢} ¨¢¨¢ ¥¹¥ì¥Ã¥É¥¹¥¿¥Ã¥¯¥Ý¥¤¥ó¥¿ ´Ö¨¢ ¨¢ ¨¢¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¡¨¡¨ª¨¡ ¨¢ ¥æ¡¼¥¶¥×¥í¥»¥¹´ÉÍýÎÎ°è ¨¢ ¥·¥¹¥Æ¥à´ÉÍýÎÎ°è ¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨© ¨¢ ¥×¥í¥»¥¹¶õ´Ö ¨¢

£¶¡¥£³¡¡¥¹¥ì¥Ã¥É¤ÎÀ¸À®¡¢µ¯Æ°¡¢½ªÎ»

¡¡£Ò£Ô£Õ¡¢£Í£Á£Ã£È¤È¤â¤Ë¥¹¥ì¥Ã¥ÉÀ¸À®»þ¤ËÍ¿¤¨¤ë¤³¤È¤Î¤Ç¤­¤ë¥Ç¡¼¥¿¤Ï£³£²¥Ó¥Ã¥ÈÀ°¿ô¤Ç¤¹¤¬¡¢¥¹¥ì¥Ã¥É½ªÎ»»þ¤Î¥Ç¡¼¥¿¼õ¤±ÅϤ·¤Ë¤Ä¤¤¤Æ¤Ï°Û¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ ¡¡£Ò£Ô£Õ¤Ç¤Ï t_wait ¤Ç¡¢¥¹¥ì¥Ã¥É¤Î½ªÎ»¥¹¥Æ¡¼¥¿¥¹¤òÊÖ¤·¤Þ¤¹¤¬¡¢£Í£Á£Ã£È¤Î¾ì¹ç¤Ï¡¢cthread_join ¤ÇǤ°Õ¤ÎÃͤòÊÖ¤¹¤³¤È¤¬Íý²ò¤Ç¤­¤Þ¤¹¡£ ¡¡¤³¤ÎÅÀ¤ò½ü¤¤¤Æ¡¢¥¹¥ì¥Ã¥É¤ÎÀ¸À®¡¢µ¯Æ°¡¢½ªÎ»¤Ë»ÈÍѤµ¤ì¤ë¥é¥¤¥Ö¥é¥ê¤Ï¡¢£Ò£Ô£Õ¡¤£Í£Á£Ã£È¤È¤âƱ¤¸¤è¤¦¤Ê¤â¤Î¤Ç¤¹¡£¤³¤Î fork - wait ¥â¥Ç¥ë¤ÎÆÃÊ̤ʾì¹ç¡¢¤Ä¤Þ¤êÁê¼ê¤Î½ªÎ»¤òÂÔ¤¿¤Ê¤¤¾ì¹ç¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ë£Ò£Ô£Õ¡¢£Í£Á£Ã£È¤È¤â¥¹¥ì¥Ã¥ÉÀ¸À®»þ¤Ë»ØÄꤷ¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ £Ò£Ô£Õ £Í£Á£Ã£È ¨¢ ¨¢ Á°½èÍý ¨¢ ¨¢ #include #include ¨¢ ¨¢ void cthread_init(); ¨¢ ¨¢ ¡¡ À¸À® ¨¢ ¨¢ int mp_create(func,arg); cthread_t cthread_fork(func,arg); ¨¢ ¨¢ void (*func)(); any_t (*func)(); ¨¢ ¨¢ int arg; any_t arg; ¨¢ ¨¢ ½ªÎ» ¨¢ ¨¢ void mp_exit(exitcode); cthread_exit(result); ¨¢ ¨¢ int exitcode; any_t result; ¨¢ ¨¢ ½ªÎ»ÂÔ¤Á ¨¢ ¨¢ int t_wait(thread_id); any_t cthread_join(t); ¨¢ ¨¢ int thread_id; cthread_t t; ¨¢ ¨¢ ½ªÎ»¤òÂÔ¤¿¤Ê¤¤ ¨¢ ¨¢ int t_nowait(thread_id); void cthread_detach(t); ¨¢ ¨¢ int thread_id; cthread_t t; ¨¢ ¨¢ ¨¢ ¨¢ ¡Î¤¿¤À¤· any_t ¤ÏǤ°Õ¤Î·¿¤Ç¡¢ cthread_t ¤Ï£³£²¥Ó¥Ã¥È¥µ¥¤¥º¤Î¥¹¥ì¥Ã¥É£É£Ä¡Ï ¨¢ ¨¢ ¨¢ ¨¢ ¡¡ ¥¹¥ì¥Ã¥É¤Î½ªÎ»¤òÂԤľì¹ç ¨¢ ¨¢ ¨¢ ¨¢ id = mp_create(func,arg); id = cthread_fork(func,arg); ¨¢ ¨¢ | | ¨¢ ¨¢ status = t_wait(id); any_t = cthread_join(id); ¨¢ ¨¢ ¨¢ ¨¢ ¥¹¥ì¥Ã¥É¤Î½ªÎ»¤òÂÔ¤¿¤Ê¤¤¾ì¹ç ¨¢ ¨¢ ¨¢ ¨¢ t_nowait(mp_create(func,arg)); cthread_detach(cthread_fork(func,arg); ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡£Ò£Ô£Õ¤Î¾ì¹ç¡¢¥¢¥¤¥É¥ë¥¹¥ì¥Ã¥É¤òͽ¤áÀ¸À®¤·¤Æ¤ª¤­¸å¤«¤é¼ÂºÝ¤Î¥³¡¼¥É¤ò³äÅö¤Æ¼Â¹Ô¤¹¤ëÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤Ë¤ª¤¤¤Æ½ÐÍè¤ë¤À¤±¹â®¤Ë¥¹¥ì¥Ã¥É¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ç¤¹¡£ ¥¢¥¤¥É¥ë¥¹¥ì¥Ã¥É¤Î³äÅö ¼Â¥¹¥ì¥Ã¥É¤Î³äÅö¤Èµ¯Æ° mp_create(NULL,NULL); mp_call(func,arg); mp_calln(func,arg,n); ¥¹¥ì¥Ã¥ÉÀ¸À®µ¯Æ° ¥¹¥ì¥Ã¥É½ªÎ»ÂÔ¤Á ¡¡¥¹¥ì¥Ã¥ÉÀ¸À®¡¡¡¡¥¹¥ì¥Ã¥Éµ¯Æ° ¢­ ¡¡¡¡ ¡¡¡¡¢­ ¡¡¡¡¡¡¡¡¢­ ¡¡¢­ ¥ë¡¼¥È¥¹¥ì¥Ã¥É ¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¤ ¨£¨¡ ¨¡¨¤ ¨£¨¤ ¨£¨¡¨¡¨¡¨¡¨¡ ¨¢ 5250¦Ì ¨¢ ¨¢170¦Ì ¨¢ ¨¢5200¦Ì¨¢¨¢84¦Ì¨¢ £Ò£Ô£Õ ¨§¨¡¨¡¨¡¨¨¨¥ ¨£¨¡¨ª¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¥¨§¨¡¨¡¨ª¨¤ ¨¢3376¦Ì¨¢ ¨¢ ¨¢151¦Ì ¨¢ »Ò¥¹¥ì¥Ã¥É ¨¢ ¨¦¨¡¨¡¨¡¨¥ ¨¢ ¨¦¨¡¨¡¨¡¨¡ ¢¬¥¹¥ì¥Ã¥É½ªÎ» £·£°£°£°¥·¥ê¡¼¥º¡Ê£Í£Ã£¶£°£¸£°£´£°¡¡£²£µ£Í£È£ú¡Ë¤Î¥¹¥ì¥Ã¥É¤ÎÀ¸À®¡¢µ¯Æ°¡¢½ªÎ» ¡¡ÊÂÎó·×»»¥â¥Ç¥ë¤Ë¤ª¤¤¤Æ¤Ï¡¢¥¹¥ì¥Ã¥É¤ËÂФ¹¤ë½èÍý¤Î°ÍÍê¤ÈƱ´ü¤Ë¤«¤«¤ë¥³¥¹¥È¤ÎϤϡ¢¤½¤Î¤Þ¤Þ¥¹¥ì¥Ã¥É¤ÎγÅ٤ˤʤ뤿¤á¡¢¥¹¥ì¥Ã¥É¤òͽ¤áÀ¸À®¤·¤Æ¤ª¤­¸å¤«¤é¼ÂºÝ¤Î¥³¡¼¥É¤ò³äÅö¤Æ¼Â¹Ô¤¹¤ëÊýË¡¤¬Í­Íø¤Ç¤¹¡£ ¡¡¿Þ¤ÇÍý²ò¤Ç¤­¤ë¤è¤¦¤Ë¥¹¥ì¥Ã¥É¤Îµ¯Æ°¤Î¤ß¤Î¥³¥¹¥È¤Ï¡¢£±£µ£±¦ÌÉäǤ¢¤ê¡¢½ªÎ»ÂÔ¤Á¤Î¥³¥¹¥È¤Ï¡¢£±£·£°¦ÌÉäǤ¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢½èÍý¤ò£²¤Ä¤Ëʬ²ò¤¹¤ë¾ì¹ç¤Î¥³¥¹¥È¤Ï¡¢£³£²£±¦ÌÉ䫤«¤ë»ö¤Ë¤Ê¤ê¡¢ÊÂÎó½èÍý¤ò¹Ô¤¨¤ë¤Î¤ÏÌó£¶£µ£°¦ÌÉðʾå¤Î½èÍý¤Ë¤Ê¤ê¤Þ¤¹¡££Í£Ã£¶£¸£°£´£°¤Ç¤Î£Ã£Ð£É¤Ï¡¢£±¡¥£³¤Ç¤¹¤Î¤Ç¡¢¤³¤Î»þ´Ö¤Ë¹Ô¤¨¤ë½èÍý¤Ï¡¢Ìó£±£²£³£µ£°Ì¿Îá¤Ç¤¢¤ê¤³¤ì°Ê¾å¤Î½èÍý¤Ç¤¢¤ì¤ÐÊÂÎó¼Â¹Ô¤Î¸ú²Ì¤¬ÆÀ¤é¤ì¤Þ¤¹¡£ ¡¡°Ê²¼¤Î¥×¥í¥°¥é¥àÎã¤Ç¤Ï¡¢¥Ù¥¯¥È¥ëÎó¤ÎϤò¡¢£²¤Ä¤Î¥¹¥ì¥Ã¥É¤Ëʬ³ä¼Â¹Ô¤·¤Æ¤¤¤ë¤¢¤¤¤À¥ë¡¼¥È¥¹¥ì¥Ã¥É¤Ç¤Ï¡¢£²¤Ä¤Î¥Ù¥¯¥È¥ë¾è»»¤òÊÂÎó¤Ë¼Â¹Ô¤·¤Æ¤¤¤ë¤â¤Î¤Ç¤¹¡£ #include #define MAX 50 float sum1, sum2, dot; void vinit (), vsum1 (), vsum2 (), vdot (); main () { int t[2], ex, result; float vec1[MAX], vec2[MAX]; vinit (vec1, vec2); /* ÇÛÎó¤Î½é´ü²½ */ /* ¥¹¥ì¥Ã¥É¤òÀ¸À®¤·ÁíϤò·×»»¤¹¤ë¡£·ë²Ì¤Ï¥°¥í¡¼¥Ð¥ëÊÑ¿ô(sum1,sum2)¤Ë³ÊǼ¤µ¤ì¤ë */ if ((t[0] = mp_create (vsum1, vec1)) <= 0) perror("Couldn't create first thread"), exit(1); if ((t[1] = mp_create (vsum2, vec2)) <= 0) perror("Couldn't create second thread"), exit(2); /* ¥ë¡¼¥È¥¹¥ì¥Ã¥É¤Ï¡¢£²¤Ä¤Î¥Ù¥¯¥È¥ë¤Î¾è»»¤ò·×»»¤·¤¿¸å¡¢£²¤Ä¤Î»Ò¥¹¥ì¥Ã¥É¤Î ½ªÎ»¤òÂÔ¤Á¡¢·ë²Ì¤ò½ÐÎϤ¹¤ë */ vdot (vec1, vec2); ex = t_wait (t[1]); ex = t_wait (t[2]); printf ("sum1 = %f, sum2 = %f, dot = %f\n", sum1, sum2, dot); /* ¥ë¡¼¥È¥¹¥ì¥Ã¥É¾å¤Ç·ë²Ì¤Î³Îǧ¤ò¥·¡¼¥±¥ó¥·¥ã¥ë¤Ë¹Ô¤¤½ªÎ»¤¹¤ë */ vfy (&result, vec1, vec2); exit (result); } /* ¥Ù¥¯¥È¥ë¤ÎÁíϤòµá¤á¤ë´Ø¿ô¡¢·ë²Ì¤Ï³°ÉôÊÑ¿ô¤Ë³ÊǼ¤µ¤ì¤ë */ void vsum1 (v) float v[]; { int i; sum1 = 0; for (i = 0; i < MAX; i++) sum1 += v[i]; mp_exit (0); /* ¥¹¥ì¥Ã¥É¤Î½ªÎ»¥¹¥Æ¡¼¥¿¥¹¤Ç¥ë¡¼¥È¥¹¥ì¥Ã¥É¤Ë£°¤òÊÖ¤¹ */ } void vsum2 (v) float v[]; { int i; sum2 = 0; for (i = 0; i < MAX; i++) sum2 += v[i]; mp_exit (0); /* ¥¹¥ì¥Ã¥É¤Î½ªÎ»¥¹¥Æ¡¼¥¿¥¹¤Ç¥ë¡¼¥È¥¹¥ì¥Ã¥É¤Ë£°¤òÊÖ¤¹ */ } void vdot (v1, v2) /* £²¤Ä¤Î¥Ù¥¯¥È¥ë¤Î¾è»»¤òµá¤á¤ë´Ø¿ô */ float v1[], v2[]; { int i; dot = 0; for (i = 0; i < MAX; i++) dot += v1[i] * v2[i]; } void vinit (v1, v2) /* ¥Æ¥¹¥ÈÇÛÎó¤Î½é´ü²½ */ float v1[], v2[]; { int i; for (i = 0; i < MAX; i++) { v1[i] = i; v2[i] = -i; } } vfy (result, vec1, vec2) float vec1[], vec2[]; int *result; { int i; float locsum1 = 0, locsum2 = 0, locdot = 0; *result = 0; for (i = 0; i < MAX; i++) { locsum1 += vec1[i]; locsum2 += vec2[i]; locdot += vec1[i] * vec2[i]; } if (locsum1 != sum1) { printf ("sum 1 does not agree, local= %f thread= %f\n", locsum1, sum1); *result = 1; } if (locsum2 != sum2) { printf ("sum 2 does not agree, local= %f thread= %f\n", locsum2, sum2); *result = 1; } if (locdot != dot) { printf ("dots do not agree local= %f thread= %f\n", locdot, dot); *result = 1; } }

£¶¡¥£´¡¡¥¹¥ì¥Ã¥É¤ÎƱ´ü¤ÈÇÓ¾À©¸æ

¡¡¤³¤Î¾Ï¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¤Ç»ÈÍѤ¹¤ë»ö¤Î½ÐÍè¤ëƱ´ü¤ÈÇÓ¾À©¸æ¤Îµ¡¹½¤Ë¤Ä¤¤¤Æ²òÀ⤷¤Þ¤¹¡£ °ìÈÌŪ¤Ë¡¢¤É¤ÎÍͤʷ׻»µ¡¥·¥¹¥Æ¥à¤Ç¤¢¤Ã¤Æ¤â¡¢Æ±´üÌ¿Îá¤Ïɬ¤º¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢ÆÃ¤Ë¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¥·¥¹¥Æ¥à¤Ë¤ª¤¤¤ÆÆ±´üÌ¿Îá¤Ï¡¢¥·¥¹¥Æ¥à¤ÎÀ­Ç½¤òº¸±¦¤·¤Æ¤·¤Þ¤¦¤Û¤É½ÅÍפʤâ¤Î¤Ç¤¹¡£ ¡¡Ä̾盧¤Î¤è¤¦¤ÊƱ´üÌ¿Îá¤Ï¡¢Ã±°ì¤Î¥Ð¥¹¥µ¥¤¥¯¥ë¤Ë¤ª¤¤¤ÆÇÓ¾Ū¤Ë¥á¥â¥ê¤ÎÆÉ¤ß½ñ¤­¤ò¼Â¹Ô¤¹¤ë test-and-set¡Ê£Ô£Á£Ó¡Ë ¤« compare-and-swap¡Ê£Ã£Á£Ð¡ËÌ¿Îá¤Ç¼Â¸½¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¡ÊÎ㳰Ū¤Ë£Ò£³£°£°£°¥·¥ê¡¼¥º¤Ï»ý¤Ã¤Æ¤¤¤Þ¤»¤ó¡Ë ¡¡¤³¤ÎÌ¿Îá¤ò¼Â¹Ô¤·¤Æ¤¤¤ë´Ö¤Ï¡¢¥á¥â¥ê¥Ð¥¹¤Ï¥í¥Ã¥¯¤¬¤«¤±¤é¤ì¡¢Â¾¤Î¥Ð¥¹¥Þ¥¹¥¿¤Ï¥á¥â¥ê¥Ð¥¹¤ò»ÈÍѤǤ­¤Ê¤¤¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¤è¤¦¤Êµ¡¹½¤Ë¤è¤êƱ´üÌ¿Îá¤ÏÀµÅöÀ­¤òÊݾڤµ¤ì¤ëÌõ¤Ç¤¹¤¬¡¢¥ê¥¢¥ë¥¿¥¤¥à¥·¥¹¥Æ¥à¤ÎÍͤ˹⮤ËƱ´ü½èÍý¤ò¹Ô¤ï¤Í¤Ð¤Ê¤é¤Ê¤¤¾ì¹ç¡¢¤³¤ÎƱ´ü¤Ë¤«¤«¤ë»þ´Ö¤Ï½ÅÍפǤ¹¡£ ¡¡¤Ê¤¼¤Ê¤é¡¢ÉÑÈˤ˥Х¹¥í¥Ã¥¯¤¬µ¯¤³¤ë¤È¡¢¥·¥¹¥Æ¥à¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬µÞ·ã¤ËÄã²¼¤¹¤ë¤«¤é¤Ç¤¹¡£ ¤³¤ÎÌäÂê¤Ï¡¢¥á¥â¥ê´ÉÍý¤È¥­¥ã¥Ã¥·¥å¤Î¾Ï¤Ç½Ò¤Ù¤¿·ë²Ì¤È°ìÃפ·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥é¥¤¥È¥¹¥ë¡¼¥×¥í¥È¥³¥ë¤Ç¤Ï¡¢½ñ¤­¹þ¤ß¤ÎºÝ¤Ë¥­¥ã¥Ã¥·¥å¤È¥á¥â¥ê¤Ë½ñ¤­¹þ¤à¤¿¤á¡¢¥á¥â¥ê¥Ð¥¹¤ò¤â¥í¥Ã¥¯¤·¤Þ¤¹¤¬¡¢¥³¥Ô¡¼¥Ð¥Ã¥¯¥×¥í¥È¥³¥ë¤Ë¤ª¤¤¤Æ¤Ï¡¢Ê£¿ô¤Î£Ô£Á£ÓÌ¿Î᤬°Û¤Ê¤Ã¤¿¥á¥â¥ê¥¢¥É¥ì¥¹¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¸Â¤ê¡¢¥á¥â¥ê¥Ð¥¹¤ò¥í¥Ã¥¯¤¹¤ë»ö¤¬¤Ê¤¤¤¿¤á¡¢¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¤ä¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤Ë¤ª¤¤¤ÆºÇŬ¤Ç¤¢¤ë¤È¤¤¤¨¤Þ¤¹¡£

£¶¡¥£´¡¥£±¡¡ÇÓ¾À©¸æÊÑ¿ô¡Ê¥»¥Þ¥Õ¥©¡Ë¤Ë¤è¤ëƱ´ü

¡¡£Ò£Ô£Õ¤È£Í£Á£Ã£È¤Ë¤ª¤¤¤Æ¡¢¼ÂÁõ¤µ¤ì¤Æ¤¤¤ëÇÓ¾À©¸æµ¡¹½¤Ï¤¿¤¤¤Ø¤ó»÷¤Æ¤¤¤Þ¤¹¡£¤³¤ÎƱ´üÀ©¸æ¤Ï¡¢¤¢¤Þ¤ê¤Ë¤âͭ̾¤Ç¤¹¤Î¤ÇÀâÌÀ¤Ï¾Êά¤·¤Þ¤¹¤¬¡¢Ãí°Õ¤·¤ÆÃÖ¤¤¤ÆÍߤ·¤¤¤Î¤Ï¡¢»ÈÍÑË¡¤ò¸í¤ë¤È¥Ç¥Ã¥È¥í¥Ã¥¯¤Ë´Ù¤Ã¤Æ¤·¤Þ¤¦´í¸±¤¬¤¢¤ë¤³¤È¤Ç¤¹¡£°ìÅ٥ǥåȥí¥Ã¥¯¤Ë´Ù¤ë¤È¥·¥¹¥Æ¥à¤Ï»ß¤Þ¤Ã¤Æ¤·¤Þ¤¤¤Þ¤¹¡£ ¡¡¥Ç¥Ã¥É¥í¥Ã¥¯¤Î´í¸±¤Ï¡¢¥»¥Þ¥Õ¥©¤ò»ÈÍѤ·¤ÆºîÀ®¤·¤¿¥µ¥Ö¥ë¡¼¥Á¥ó¤ò¿½Å¥¹¥ì¥Ã¥É¤Ç»ÈÍѤ¹¤ë¾ì¹ç¤Ë¤âµ¯¤³¤ê¤Þ¤¹¡££Ò£Ô£Õ¤Ç¤Ï¡¢¤³¤Î¤è¤¦¤Ê´í¸±¤ò²óÈò¤¹¤ëÌÜŪ¤Ç¡¢ºÆµ¢Åª¤Ë¸Æ¤Ó½Ð¤»¤ëÇÓ¾À©¸æµ¡¹½¤â¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£¡ÊÆâÉôŪ¤Ë¥«¥¦¥ó¥¿¤ò¤â¤Ã¤Æ¤¤¤Þ¤¹¡Ë¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ £Ò£Ô£Õ £Í£Á£Ã£È ¨¢ ¨¢ ÇÓ¾À©¸æÊÑ¿ô¤Î³äÅö ¨¢ ¨¢ mplock mp_lock_alloc(); mutex_t mutex_alloc(); ¨¢ ¨¢ ÇÓ¾À©¸æÊÑ¿ô¤Î²òÊü ¨¢ ¨¢ void mp_lock_free(key); void mutex_free(key) ¨¢ ¨¢ ¥í¥Ã¥¯¤Ë¼ºÇÔ¤¹¤ë¤È¥¹¥ê¡¼¥×¤¹¤ë ¨¢ ¨¢ void mp_lock_set(key); void mutex_lock(key); ¨¢ ¨¢ ¥í¥Ã¥¯¤ò²ò½ü¤·¥¹¥ê¡¼¥×¤·¤Æ¤¤¤ë¥¹¥ì¥Ã¥É¤¬¤¢¤Ã¤¿¾ì¹ç£±¤Ä¤À¤±µ¯Æ°¤¹¤ë ¨¢ ¨¢ void mp_lock_clr1(key); void mutex_unlock(key); ¨¢ ¨¢ ¥í¥Ã¥¯¤ò²ò½ü¤·¥¹¥ê¡¼¥×¤·¤Æ¤¤¤ë¥¹¥ì¥Ã¥É¤ò¤¹¤Ù¤Æµ¯Æ°¤¹¤ë ¨¢ ¨¢ void mp_lock_clr(key); ¨¢ ¨¢ ¥í¥Ã¥¯¤Ë¼ºÇÔ¤·¤Æ¤â¥¹¥ê¡¼¥×¤»¤ºµ¢¤Ã¤Æ¤¯¤ë ¨¢ ¨¢ void mp_lock_try(key); void mutex_try_lock(key); ¨¢ ¨¢ ¥í¥Ã¥¯¤Ë¼ºÇÔ¤·¤¿¾ì¹ç¤Ç¤â¥¹¥ê¡¼¥×¤»¤º¥é¥¤¥Ö¥é¥ê¤ÎÃæ¤Ç¥Ó¥¸¡¼¥¦¥§¥¤¥È¤¹¤ë ¨¢ ¨¢ void mp_lock_spin(key); ¨¢ ¨¢ ÇÓ¾À©¸æÊÑ¿ô·¿ ¨¢ ¨¢ mplock key; mutex_t key; ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¥í¥Ã¥¯ ¡¡¡¡¡¡¡¡¥¢¥ó¥í¥Ã¥¯ ¡¡¢­ ¡¡ ¢­ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¤ ¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡ ¨¢ ¥é¥¤¥Ö¥é¥ê̾ ¨¢ ¸Æ½Ð»þ´Ö ¨¢ ¸ú²Ì»þ´Ö ¨¢ ¨¢¸Æ½Ð»þ´Ö¨¢ ¨¢¸Æ½Ð»þ´Ö¨¢ ¨§¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¡¨© ¨¦¨¡¨¡¨¡¨¡¨¥¨£¨¡¨¡¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨ª¨¤ ¨¢mp_lock_alloc ¨¢£±£¶£·£·¦Ì¨¢ £î£á¡¡ ¨¢ ¨¢ ¨¢ ¸ú²Ì»þ´Ö ¨¢ ¨¢mp_lock_free ¨¢ £´£¹¦Ì¨¢ £î£á¡¡ ¨¢ ¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨¢ ¨¦¨¡¨¡¨¡¨¡ ¨¢mp_lock_clr1 ¨¢ ¡¡£¹¦Ì¨¢ £î£á ¨¢ ¡¡¡¡ ¡¡¡¡¢¬¥¹¥ê¡¼¥×¾õÂÖ¡¡¼Â¹Ô²Ä¾õÂÖ ¼Â¹Ô¾õÂÖ ¨¢mp_lock_set ¨¢ £µ¦Ì¨¢ £±£µ£´¦Ì¨¢ ¡¡¡¡¥í¥Ã¥¯Í×µá ¡¡ ¨¢mp_lock_try ¨¢ £µ¦Ì¨¢ £±£µ¦Ì¨¢ ¨¢mp_lock_spn ¨¢ £´¦Ì¨¢ £±£µ¦Ì¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¢¥Õ¥¡¥¤¥ë¤ò¶¦Í­¤·¤ÆÇÓ¾Ū¤Ë¥¢¥¯¥»¥¹¤¹¤ëÎã¤Ç¤¹¡£ ÇÓ¾À©¸æµ¡¹½¤Ë¤Ï¡¢mp_lock¥Õ¥¡¥ß¥ê¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ #include #include mplock filelock; #define MAX 1000 int vec[MAX]; void vinit (), sum_file_entries (); FILE *fp; main () { int t1, t2, t3, ex1, ex2, ex3, result; /* Initialize test data and allocate a lock */ vinit (); filelock = mp_lock_alloc (); /* Open the file */ fp = fopen ("thrsnmtf.data", "r"); if (fp == NULL) exit (-1); /* Run function on 4 threads, including root */ t1 = mp_create (sum_file_entries, 0); t2 = mp_create (sum_file_entries, 0); t3 = mp_create (sum_file_entries, 0); sum_file_entries (); ex1 = t_wait (t1); ex2 = t_wait (t2); ex3 = t_wait (t3); /* Verify and clean up */ mp_lock_free (filelock); rewind (fp); /* So vfy() starts at the beginning of the file */ vfy (&result); exit (result); } tprivate int entries[MAX]; void sum_file_entries () { int i, sum, element, number, thread; /* Set the lock, then do one read before the loop */ mp_lock_set (filelock); fscanf (fp, "%d %d %d ", &thread, &element, &number); while (!feof (fp)) { /* While there's still data in the file */ for (i = 0; i < number; i++) fscanf (fp, "%d ", &entries[i]); /* Allow just one thread to enter, because the file should be read by one thread at a time */ mp_lock_clr1 (filelock); if ((element < 0) || (element >= MAX) || (number > MAX)) exit (2); /* File contains erroneous data */ /* The calculations: add the data in the line and store internally */ sum = 0; for (i = 0; i < number; i++) sum += entries[i]; vec[element] = sum; /* If another thread reaches the end of the file first, this last fscanf reads garbage. However, the effect is harmless because the loop does not repeat. */ mp_lock_set (filelock); fscanf (fp, "%d %d %d ", &thread, &element, &number); }

£¶¡¥£´¡¥£²¡¡¾ò·ïÊÑ¿ô¤Ë¤è¤ëƱ´ü

¡¡¾ò·ïÊÑ¿ô¤ò»È¤Ã¤¿¾ì¹ç¡¢ÇÓ¾À©¸æÊÑ¿ô¤ÈÁȹç¤ï¤»¤ë¤³¤È¤Ë¤è¤Ã¤Æ¥­¥å¡¼¥¤¥ó¥°¥â¥Ç¥ë¤òµ­½Ò¤Ç¤­¡¢¤è¤ê°ÂÁ´¤Ë¥×¥í¥°¥é¥à¤¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ ¡¡¡¡¡¡¡¡ £Ò£Ô£Õ £Í£Á£Ã£È ¨¢ ¨¢ ¾ò·ïÊÑ¿ô¤Î³äÅö ¨¢ ¨¢ mpcond mp_cond_alloc(); condition_t condition_alloc(); ¨¢ ¨¢ ¾ò·ïÊÑ¿ô¤Î²òÊü ¨¢ ¨¢ void mp_cond_free(condition); void condition_free(condition); ¨¢ ¨¢ ¤³¤ì¤ò¸Æ¤Ó¤À¤¹¤È key ¤ò¥¢¥ó¥í¥Ã¥¯¤· condition ¤Ç¥¹¥ì¥Ã¥É¤¬Ää»ß¾õÂÖ¤Ë¤Ê¤ë ¨¢ ¨¢ void mp_lock_wait(key,condition); void condition_wait(condition,key); ¨¢ ¨¢ condition ¤ÇÄä»ß¾õÂ֤ˤ¢¤ë¥¹¥ì¥Ã¥É¤ò£±¤Ä¤À¤±¼Â¹Ô²Äǽ¾õÂ֤ˤ¹¤ë ¨¢ ¨¢ void mp_signal(condition); void condition_signal(condition); ¨¢ ¨¢ condition ¤ÇÄä»ß¾õÂ֤ˤ¢¤ë¥¹¥ì¥Ã¥É¤òÁ´Éô¼Â¹Ô²Äǽ¾õÂ֤ˤ¹¤ë ¨¢ ¨¢ void mp_broadcast(condition); void condition_broadcast(condition); ¨¢ ¨¢ ¨¢ ¨¢ mplock key; mutex_t key; ¨¢ ¨¢ mpcond condition; condition_t condition; ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¤³¤ÎƱ´üµ¡¹½¤Ï¡¢»È¤¤Êý¤¬¾¯¤·Ê£»¨¤Ç¤¹¤¬²¼µ­¤Î¤è¤¦¤Ë¥¯¥ê¥Æ¥£¥«¥ë¥»¥¯¥·¥ç¥ó¤ÇÇÓ¾¾ðÊó¤òÀ©¸æ¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Þ¥ë¥Á¥¯¥é¥¤¥¢¥ó¥È¡Ý¥·¥ó¥°¥ë¥µ¡¼¥Ð¥â¥Ç¥ë¤òµ­½Ò¤·¤Æ¤¤¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢¥¯¥é¥¤¥¢¥ó¥ÈÉô ¨¢ ¨¢ ¨¢ ¨¢ ¡¡mp_lock_set(key); ¨¢ ¨¢ /* ¤³¤ÎÉôʬ¤Ï key ¤Ë¤è¤êÇÓ¾À©¸æ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¿¤á¤À¤ì¤âÆþ¤ì¤Ê¤¤ */ ¨¢ ¨¢ ¡¡mp_lock_wait(key,condition); ¨¢ ¨¢ /* ¤³¤ÎÉôʬ¤ò¼Â¹Ô¤¹¤ë¤È key ¤¬¥¢¥ó¥í¥Ã¥¯¤µ¤ì¤ë¤¿¤á¾¤Î¥¹¥ì¥Ã¥É¤¬ */ ¨¢ ¨¢ /* ¥¯¥ê¥Æ¥£¥«¥ë¥»¥¯¥·¥ç¥ó¤ËÆþ¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¤¬¡¢¼«¿È¤Ï condition */ ¨¢ ¨¢ /* Ää»ß¾õÂ֤ˤª¤«¤ì¤ë¤¿¤áÀè¤Ë¿Ê¤Þ¤ºÂ¾¤Î¥¹¥ì¥Ã¥É¤Î mp_signal ¤òÂÔ¤Ä */ ¨¢ ¨¢ ¡¡mp_lock_set(key); ¨¢ ¨¢ /* ¾¤Î¥¹¥ì¥Ã¥É¤Î mp_signal ¤Ë¤è¤Ã¤Æµ¯Æ°¸åľ¤Á¤Ë key ¤ò³ÎÊݤ· */ ¨¢ ¨¢ ¡¡¡¡/* ÇÓ¾À©¸æ¾ðÊó¤ò¥¢¥¯¥»¥¹¤¹¤ë */ ¨¢ ¨¢ ¡¡mp_lock_clr1(key); ¨¢ ¨¢ /* ÇÓ¾À©¸æÊÑ¿ô¤ò¥¢¥ó¥í¥Ã¥¯¤¹¤ë */ ¨¢ ¨¢ ¡¡mp_signal(condition); ¨¢ ¨¢ ¨¢ ¨¢¥µ¡¼¥ÐÉô ¨¢ ¨¢ ¨¢ ¨¢ mp_lock_set(key); ¨¢ ¨¢ /* ¤³¤ÎÉôʬ¤Ï key ¤Ë¤è¤êÇÓ¾À©¸æ¤Ë¤Ê¤Ã¤Æ¤¤¤ë */ ¨¢ ¨¢ mp_clr1(key); ¨¢ ¨¢ mp_signal(condition); ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¥¯¥é¥¤¥¢¥ó¥È set¢ªwait¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡set¢ªclear¨¡¨¡¨¡¨¡¨¡¨¡¨¡ ¢­ ¨¢ signal ¥¯¥é¥¤¥¢¥ó¥È set¢ªwait¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡set¢ª clear ¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡ ¢­ ¨¢ signal ¨¢ ¨¢ ¥¯¥é¥¤¥¢¥ó¥È set¢ªwait¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¡¨¡set¢ªclear¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡ ¢­ ¨¢ signal ¥µ¡¼¥Ð set¨¡¨¡¢ªclear ¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡ signal set mp_lock_set ¨¡¨¡¨¡¨¡¨¡¼Â¹Ô¾õÂÖ ¢ª¡¡¥¯¥ê¥Æ¥£¥«¥ë¥»¥¯¥·¥ç¥ó wait mp_lock_wait ¨¡¨¡¨¡¨¡¨¡Ää»ß¾õÂÖ clear mp_lock_clr1 ¨¢ signal mp_signal ¨¡¨¥ ¾¤Î¥¹¥ì¥Ã¥É¤ò¥¢¥¯¥Æ¥£¥Ö¤Ë¤¹¤ë #include #include #include #define SERVER_THREAD 3 /* Number of threads for servers (enqueuing) */ #define CLIENT_THREAD 2 /* Number of threads for clients (dequeuing) */ #define INTERVAL 1 /* For test, seconds between signals */ #define TIMES 5 /* For test, number of signals to send */ #define TRUE 1 /* Used in while constructs to loop forever */ #define HIGH_PRIME 1074889 /* Seed for random-number generation */ #define QUEUE_DATA_SPACE 4096 /* Arbitrary size (in elements) for queue */ #define TEST_SIGNAL SIGINT /* Signal that triggers the servers */ /* Arbitrary limit to number of items queued simultaneously */ #define QUEUE_POINTER_SPACE (SERVER_THREAD+1) /* The queue itself, and pointers */ float queue_data[QUEUE_DATA_SPACE]; /* Pointers to per-item information about queue */ struct queue_info { int queue_base; /* First element of this queued item */ int num_elem; /* Number of elements to be dequeued */ } queue_pointers[QUEUE_POINTER_SPACE]; /* The indexes are counters so that up-to-date values are available */ mpcounter bottom_queue_index, /* Where each server adds data */ bottom_pointers_index, /* Where each server adds pointer */ top_pointers_index, /* Where each client removes pointer */ queued_items; /* How many items are currently on queue */ /* Locks for atomic access to the _index pointers that control arrays and a global lock for the queue itself */ mplock server_lock, /* Bottom_queue_index and bottom_pointers_index */ client_lock, /* Top_pointers_index */ queue_lock; /* Queued_items */ /* Conditions to signal between server and client that the queue is available */ mpcond server_done, /* Clients wait, servers signal */ client_done; /* Servers wait, clients signal */ main () { int i, ret; void server_scheduler (), client (), init_rand (), test_servers (); sigset (TEST_SIGNAL, SIG_IGN); bottom_queue_index = mp_counter_alloc (); bottom_pointers_index = mp_counter_alloc (); top_pointers_index = mp_counter_alloc (); queued_items = mp_counter_alloc (); server_lock = mp_lock_alloc (); client_lock = mp_lock_alloc (); queue_lock = mp_lock_alloc (); client_done = mp_cond_alloc (); server_done = mp_cond_alloc (); /* Create an arbitrary number of threads for server and client functions */ for (i = 0; i < SERVER_THREAD; i++) ret = mp_create (init_rand, HIGH_PRIME); for (i = 0; i < CLIENT_THREAD; i++) ret = mp_create (client, 0); while (mp_counter_fetch (mp_idle_count) < SERVER_THREAD) ; /* This thread handles the signals */ sigset (TEST_SIGNAL, server_scheduler); /* This function could automate testing by delivering signals, but the program hangs because the client and server threads never exit. An extra level of synchronization would be required to ensure that all clients and servers finished their work before exiting or being killed. */ /* ret = mp_create(test_servers, t_gettid() ); */ while (TRUE) ; } /* Signal handler */ /* This is a crude scheduler, starting up server functions to add data to the queue in response to interrupts from the user's terminal. The scheduling algorithm simply starts as many servers as there are idle threads, on the assumption that every resource is thus being used to the fullest. */ void server_scheduler (sig) int sig; { int current_idle, ret; void fill_buffer (), server (); /* Signal disabled until this handler can finish its work */ sigset (sig, SIG_IGN); if (sig != TEST_SIGNAL) fprintf (stderr, "Unrecognized signal received: %d\n", sig); else { /* Make sure at least one idle thread is available, then run the server function on all available threads */ while (!(current_idle = mp_counter_fetch (mp_idle_count))) ; ret = mp_calln (server, 0, current_idle); } sigset (sig, server_scheduler); } /* Server -- enqueues items */ /* This sample server simply adds an arbitrary number of floating-point numbers, randomly-generated, to the queue space. In a real application, the corresponding function would retrieve data from some external source. No two servers can run simultaneously, because while one is waiting, its data or pointer space might be overrun by other servers. However, all parts of the function can run in parallel with a client, except those locked by the queue_lock. */ void server () { int local_queue_index, local_pointers_index, ret; /* Arbitrary number of elements per item */ int num_elements = mp_tid * 10; /* Lock the queue so that other servers cannot update it (clients can still run). Get current value of pointer to bottom of queue's data space, and update it for a wrap-arround queue. */ mp_lock_set (server_lock); /* Retrieve index for this thread's use, and update index for subsequent threads' use */ local_queue_index = mp_counter_fetch (bottom_queue_index); ret = mp_counter_init (bottom_queue_index, (local_queue_index + num_elements) % QUEUE_DATA_SPACE); /* Get a spot on the bottom of the queue_info structure to put information needed by a client to dequeue data: the starting point within the queue's data space and the number of floating-point items to dequeue. Update pointer to bottom, taking into consideration that the pointers themselves form a wraparound queue. */ local_pointers_index = mp_counter_fetch (bottom_pointers_index); ret = mp_counter_init (bottom_pointers_index, (local_pointers_index + 1) % QUEUE_POINTER_SPACE); /* Prevent the overwriting of other data on the queue, by checking the queue counter to see whether the queue is full. In theory, results of the program could be corrupted because a server overwrites unread space in the queue_data array; the program does not check for overruns, but assumes that the array is sufficiently large for whatever data is waiting to be dequeued. */ mp_lock_set (queue_lock); /* If the queue is full, wait on client_done for a client. Otherwise, just proceed. Clear the lock in any case. */ if (mp_counter_fetch (queued_items) >= QUEUE_POINTER_SPACE) mp_lock_wait (queue_lock, client_done); mp_lock_clr (queue_lock); /* Put information needed by a client in the queue_info structure */ queue_pointers[local_pointers_index].queue_base = local_queue_index; queue_pointers[local_pointers_index].num_elem = num_elements; /* Place items on the queue. For this example, num_elements causes an arbitrary number of floating-point values to be placed on the queue, while the values themselves are simply generated at random. If the pointer reaches the top of the queue, it wraps around to the bottom. */ while (num_elements--) { queue_data[local_queue_index] = rand (); if (++local_queue_index >= QUEUE_DATA_SPACE) local_queue_index = 0; } /* Increment counter to reflect a new element on the queue */ mp_lock_set (queue_lock); if ((ret = mp_counter_incr (queued_items)) > QUEUE_POINTER_SPACE) fprintf (stderr, "Server %d: queue pointers overflowed\n", mp_tid); mp_lock_clr (queue_lock); /* Clear lock so other servers can enqueue data, and wake up one waiting client thread, if any are waiting for data */ mp_lock_clr (server_lock); mp_signal (server_done); /* Thread goes idle at the end of this function. The same server function can be run on this thread later */ } /* Client -- dequeues and processes items */ /* This client loops endlessly, removing data when it exits and otherwise waiting for a server to signal that new data has arrived. No two clients can run simultaneously, because while one is waiting, others could wrap around and conflict with its data or pointer space. However, all parts of the function can run in parallel with a server, except those locked by the queue_lock. */ void client () { int local_queue_index, local_pointers_index, num_elements, ret; void process_item (); while (TRUE) { /* Lock the queue so that other clients cannot update it (servers can still run). Get current value of pointer to top of queue_info array, and update pointer, taking into consideration that the pointers themselves form a wraparound queue. */ mp_lock_set (client_lock); /* Retrieve index for this thread's use, and update index for subsequent threads' use */ local_pointers_index = mp_counter_fetch (top_pointers_index); ret = mp_counter_init (top_pointers_index, (local_pointers_index + 1) % QUEUE_POINTER_SPACE); /* To avoid reading from the queue before the servers have had a chance to enqueue data, check the queue counter to see whether the queue is empty. */ mp_lock_set (queue_lock); /* If the queue is empty, wait on server_done for a server. Otherwise, just proceed. Clear the lock in any case. */ if (mp_counter_fetch (queued_items) <= 0) mp_lock_wait (queue_lock, server_done); mp_lock_clr (queue_lock); /* Retrieve information from queue_info structure */ local_queue_index = queue_pointers[local_pointers_index].queue_base; num_elements = queue_pointers[local_pointers_index].num_elem; /* Remove and process items on the queue. For this example, process_item simply prints out the value retrieved. In a real application, it would probably read data into a local array, in preparation for further processing after the locks are released. */ while (num_elements--) { process_item (queue_data[local_queue_index]); if (++local_queue_index >= QUEUE_DATA_SPACE) local_queue_index = 0; } /* Decrement counter because an element has been removed from the queue */ mp_lock_set (queue_lock); if ((ret = mp_counter_decr (queued_items)) < 0) fprintf (stderr, "Client %d: queue pointers underflowed\n", mp_tid); mp_lock_clr (queue_lock); /* Clear lock so other clients can read data, and wake up one waiting server thread, if any are waiting for data */ mp_lock_clr (client_lock); mp_signal (client_done); } } /* Runs as first function on each thread, so that the thread can later generate random numbers */ void init_rand (seed) int seed; { srand (seed); } void process_item (dequ) float dequ; { printf ("Dequeued item is %f\n", dequ); } /* Sends TIMES signals to calling thread at INTERVAL seconds. */ void test_servers (thread_id) int thread_id; { int times = TIMES; while (times--) { t_kill (thread_id, TEST_SIGNAL); sleep (INTERVAL); } mp_exit (0); }

£¶¡¥£µ¡¡¤½¤Î¾¤ÎƱ´ü¼êÃÊ

¡¡£Í£Á£Ã£È¤Ë¼ÂÁõ¤µ¤ì¤Æ¤¤¤ëƱ´ü¥×¥ê¥ß¥Æ¥£¥Ö¤Ï°Ê¾å¤Î£²¼ïÎà¤Ç¤¹¤¬¡¢£Ò£Ô£Õ¤Ç¤Ï¤½¤Î¾¤ÎƱ´ü¥â¥Ç¥ë¤ò¥×¥í¥°¥é¥à¤·¤ä¤¹¤¤¤è¤¦¤Ë¡¢ÂåɽŪ¤Ê¥â¥Ç¥ë¤Ë¹ç¤ï¤»¤ÆÆ±´ü¥×¥ê¥ß¥Æ¥£¥Ö¤òÍѰդ·¤Æ¤¤¤Þ¤¹¡£

£¶¡¥£µ¡¥£±¡¡·×¿ô·¿ÇÓ¾À©¸æÊÑ¿ô¡Ê¥«¥¦¥ó¥¿¥»¥Þ¥Õ¥©¡Ë

¡¡¤³¤ì¤Ï¡¢£Ï£Ó¤Î¶µ²Ê½ñ¤Çɬ¤º¼è¤ê¾å¤²¤é¤ì¤ë¤â¤Î¤Ç¡¢ÇÓ¾À©¸æÊÑ¿ô¤ò»È¤¨¤Ð¼Â¸½¤Ç¤­¤ë¤â¤Î¤Ç¤¹¤¬¡¢Ãí°Õ¿¼¤¯¥×¥í¥°¥é¥à¤·¤Ê¤¤¤È¥Ç¥Ã¥É¥í¥Ã¥¯¤Î´í¸±¤¬¤¢¤ê¤Þ¤¹¡£¤½¤³¤Ç¡¢¿®ÍêÀ­¤ò¾å¤²¤ë¤¿¤á¤Ë£Ò£Ô£Õ¤Ç¤Ï¡¢¥×¥ê¥ß¥Æ¥£¥Ö¤È¤·¤ÆÍѰդ·¤Þ¤·¤¿¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ mpcounter mp_counter_alloc(); ưŪ¤Ë¥«¥¦¥ó¥¿¥»¥Þ¥Õ¥©¤ò³ä¤êÅö¤Æ£°¤Ë½é´ü²½¤¹¤ë¡£ ¨¢ ¨¢ void mp_counter_free(counter) ¥«¥¦¥ó¥¿¥»¥Þ¥Õ¥©¤ò¥á¥â¥ê¤Ë²òÊü¤¹¤ë¡£ ¨¢ ¨¢ int mp_counter_init(counter,value); ¥«¥¦¥ó¥¿¥»¥Þ¥Õ¥©¤ò value ¤Ë½é´ü²½¤¹¤ë¡£ ¨¢ ¨¢ int mp_counter_incr(counter); ¥«¥¦¥ó¥¿¥»¥Þ¥Õ¥©¤ò¥¤¥ó¥¯¥ê¥á¥ó¥È¤¹¤ë¡£ ¨¢ ¨¢ int mp_counter_decr(counter); ¥«¥¦¥ó¥¿¥»¥Þ¥Õ¥©¤ò¥Ç¥¯¥ê¥á¥ó¥È¤¹¤ë¡£ ¨¢ ¨¢ int mp_counter_fetch(counter); ¥«¥¦¥ó¥¿¥»¥Þ¥Õ¥©¤ÎÃͤòÆÉ¤ß½Ð¤¹ ¨¢ ¨¢ mpcounter counter; ¨¢ ¨¢ int value; ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¡¡¤³¤Î¥«¥¦¥ó¥¿¥»¥Þ¥Õ¥©¤ò»ÈÍѤ¹¤ë¤È¡¢¥À¥Ö¥ë¥Ð¥Ã¥Õ¥¡¥ê¥ó¥°¤ä¥Ð¥ê¥¢Æ±´ü¤Î¤è¤¦¤Ê¥â¥Ç¥ë¤òµ­½Ò¤Ç¤­¤Þ¤¹¡£ ¥Ð¥ê¥¢Æ±´ü¥â¥Ç¥ë¤Ï¡¢²¼¿Þ¤Î¤è¤¦¤ËºÇ¤âñ½ã¤Ê¥¹¥ì¥Ã¥É¤ÎƱ´ü¥â¥Ç¥ë¤Ç¤¹¡£ (1) a = sin(x); ¡ý (2) b = cos(y) ¨¢ (3) c = tan(x+y); ¡¡¡¡¡¡(1)¡¡¡¡¡¡(2) (3) (4) X = (a+b)*c ¨¢ (5) Y = (a-b)/c ¡ý¥Ð¥ê¥¢ ¨¢ (4) (5) ¨¢ ¡ý¥Ð¥ê¥¢ ¡¡ ¾å¿Þ¤Î¥Ç¡¼¥¿¥Õ¥í¡¼¥°¥é¥Õ¤«¤é¤âÍý²ò¤Ç¤­¤ë¤è¤¦¤Ë¥Ç¡¼¥¿»²¾È´Ø·¸¤è¤ê¡Î(1)(2)(3)¡Ï¤ÏÊÂÎó¤Ë ¼Â¹Ô¤Ç¤­¤Þ¤¹¤¬¡Î(4)(5)¡Ï¤Ï¡Î(1)(2)(3)¡Ï¤¬½ªÎ»¤·¤¿¸å¤Ç¤Ê¤¤¤È¼Â¹Ô¤Ç¤­¤Þ¤»¤ó¡£ ¡¡¤³¤Î¤è¤¦¤Ê¡¢¤È¤­¤Ë¥Ð¥ê¥¢Æ±´ü¤ò»ÈÍѤ¹¤ì¤Ð´Êñ¤ËƱ´ü¤ò¤È¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

£¶¡¥£µ¡¥£²¡¡ÇÓ¾½ñ¹þ¤ß¿½ÅÆÉ¤ß¤À¤·

¤³¤ì¤âÈó¾ï¤Ëͭ̾¤Ê¥×¥í¥°¥é¥ß¥ó¥°¥â¥Ç¥ë¤Ç¡¢ÆÃ¤Ë¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¹¹¿·¤Ê¤É¤Ë¤è¤¯»È¤ï¤ì¤Þ¤¹¡£ ¤³¤Î¥â¥Ç¥ë¤Ç¤Ï¡¢½ñ¤­¹þ¤ß¤Ï¾ï¤ËÇÓ¾À©¸æ¤µ¤ì¤Þ¤¹¤¬¡¢ÆÉ¤ß¤À¤·¤ÏÊÂÎó¡Ê¤¢¤ë¤¤¤Ïʹԡˤ˹Ԥï¤ì¤Þ¤¹¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¨¢ mprwlock mp_rwlock_alloc(); ÇÓ¾½ñ¤­¹þ¤ß¿½ÅÆÉ¤ß¤À¤··¿¤Î¥»¥Þ¥Õ¥©ÊÑ¿ô¤ò³ä¤êÅö¤Æ¤ë ¨¢ ¨¢ void mp_rwlock_free(key); ÇÓ¾½ñ¤­¹þ¤ß¿½ÅÆÉ¤ß¤À¤··¿¤Î¥»¥Þ¥Õ¥©ÊÑ¿ô¤ò²òÊü¤¹¤ë ¨¢ ¨¢ void mp_read_set(key); ÆÉ¤ß½Ð¤·¸¢¤òÆÀ¤ë¡£½ñ¤­½Ð¤·¥¹¥ì¥Ã¥É¤¬¤¤¤ë¾ì¹çÉõº¿¤µ¤ì¤ë¨¢ ¨¢ int mp_read_try(key); mp_read_set ¤ÈƱÍͤÀ¤¬³ÍÆÀ¤Ë¼ºÇÔ¤·¤Æ¤âÉõº¿¤µ¤ì¤Ê¤¤ ¨¢ ¨¢ void mp_read_clr(key); ÆÉ¤ß½Ð¤·¸¢¤òÊü´þ¤¹¤ë¡£¤³¤ÎÁàºî¤Ë¤è¤ê½ñ¤­½Ð¤·¥¹¥ì¥Ã¥É¤Î¨¢ ¨¢ Éõº¿¤¬²ò½ü¤µ¤ì¤ë ¨¢ ¨¢ void mp_read_conv(key); ¤³¤ÎÁàºî¤Ë¤è¤ê¸½ºß»ý¤Ã¤Æ¤¤¤ëÆÉ¤ß½Ð¤·¸¢¤ò½ñ¤­¹þ¤ß¸¢¤Ë ¨¢ ¨¢ Êѹ¹¤¹¤ë¡£¤â¤·ÆÉ¤ß¤À¤·¥¹¥ì¥Ã¥É¤¬Â¸ºß¤¹¤ì¤ÐÉõº¿¤µ¤ì¤ë¡£¨¢ ¨¢ void mp_write_set(key); ½ñ¤­¹þ¤ß¸¢¤òÆÀ¤ë¡£¤â¤·ÆÉ¤ß¤À¤·¤È½ñ¤­½Ð¤·¥¹¥ì¥Ã¥É¤¬¤¤¤ë¨¢ ¨¢ ¾ì¹ç¤Ë¤ÏÉõº¿¤µ¤ì¤ë¡£ ¨¢ ¨¢ int mp_write_try(key); mp_write_set ¤ÈƱÍͤÀ¤¬³ÍÆÀ¤Ë¼ºÇÔ¤·¤¿¾ì¹ç¤Ç¤âÉõº¿¤µ¤ì ¨¢ ¨¢ void mp_write_clr(key); ½ñ¤­½Ð¤·¸¢¤òÊü´þ¤¹¤ë¡£¤³¤ÎÁàºî¤Ë¤è¤êÆÉ¤ß¹þ¤ß¥¹¥ì¥Ã¥É¤Î¨¢ ¨¢ Éõº¿¤¬²ò½ü¤µ¤ì¤ë ¨¢ ¨¢ void mp_write_conv(key); ¤³¤ÎÁàºî¤Ë¤è¤ê¸½ºß¤â¤Ã¤Æ¤¤¤ë½ñ¤­¹þ¤ß¸¢¤òÆÉ¤ß¤À¤·¸¢¤Ë ¨¢ ¨¢ Êѹ¹¤¹¤ë¡£¤â¤·½ñ¤­½Ð¤·¤òÂԤäƤ¤¤ë¥¹¥ì¥Ã¥É¤¬Â¸ºß¤¹¤ë ¨¢ ¨¢ ¾ì¹ç¤ÏÉõº¿¤µ¤ì¤ë ¨¢ ¨¢ mprwlock key; ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥

¡ø£·¡¡¸À¸ì´Ö¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹

¡¡£Ã¤È£Æ£Ï£Ò£Ô£Ò£Á£Î¤Î¸À¸ì´Ö¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Î¾ÜºÙ¤Ï¡¢FORTRAN Language and Environment Manual ¤Î Chapter 11 Using FORTRAN with C ¤Ëµ­½Ò¤¬¤¢¤ê¤Þ¤¹¡£ £æ£·£·¤Ç»ÈÍѤǤ­¤ë¥×¥í¥»¥¹À©¸æ´Ø¿ô¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£ ABORT ¥·¥°¥Ê¥ë SIGIOT("abort")¤ò¸Æ¤Ó½Ð¤·¤¿¥×¥í¥»¥¹¤ËÁ÷¿®¤¹¤ë¡£ ALARM »ØÄꤵ¤ì¤¿´Ö³Ö¤Î¸å¤Ë SIGALARM ¥·¥°¥Ê¥ë¤òÁ÷¿®¤¹¤ë¤è¤¦¤Ë¥¢¥é¡¼¥à¥¯¥í¥Ã¥¯¤ò¥»¥Ã¥È¤¹ ¤ë¡£ FORK ¸½¥×¥í¥»¥¹¤ò¥³¥Ô¡¼¤·¤Æ¿·¤·¤¤¥×¥í¥»¥¹¤òºîÀ®¤¹¤ë¡£ KILL ¥·¥°¥Ê¥ë¤ò¥×¥í¥»¥¹¤ËÁ÷¿®¤¹¤ë¡£ PLOCKIN ²¾ÁÛ¶õ´ÖÃæ¤Î¥á¥â¥ê¥»¥°¥á¥ó¥È¤ò¼çµ­²±¤Ë¥í¥Ã¥¯¤¹¤ë¡£ PUNLOCK ¥á¥â¥ê¥»¥°¥á¥ó¥È¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë¡£ SIGNAL KILL ¤ÇÁ÷¿®¤µ¤ì¤ë¥·¥°¥Ê¥ë¤Î½èÍý¤òÄêµÁ¤¹¤ë¡£ SLEEP ¥×¥í¥»¥¹¤Î¼Â¹Ô¤òÃæÃǤ¹¤ë¡£ WAIT »Ò¥×¥í¥»¥¹¤Î½ªÎ»¤òÂԤġ£ ¤³¤ì°Ê³°¤Î¥·¥¹¥Æ¥àÀ©¸æ¥µ¥Ö¥ë¡¼¥Á¥ó¤Ï¡¢¥æ¡¼¥¶¤¬£æ£·£·¤Ç¸Æ¤Ó½Ð¤»¤ë£Ã¤Î´Ø¿ô¤ò¼«ºî¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢°Ê²¼¤Î¼ê½ç¤Ç´Êñ¤ËºîÀ®¤¹¤ë»ö¤¬½ÐÍè¤Þ¤¹¡£ £±¡ËÊÑ¿ô̾ ¡¡£æ£·£·¤«¤é¸«¤ë£Ã¤ÎÊÑ¿ô¤ÏºÇ¸å¤Ë¥¢¥ó¥À¡¼¥¹¥³¥¢"_"¤òÉÕ¤±¤ë FORTRAN val C val_ £²¡Ë¥µ¥Ö¥ë¡¼¥Á¥ó¸Æ¤Ó¤À¤· ¡¡£æ£·£·¤«¤é£Ã¤Ø¤Î¸Æ¤Ó¤À¤·¤Ï¡¢ ̾Á°¸Æ¤Ó¤À¤·¡Êcall by name¡Ë¤Ç¤¢¤ë¡£ FORTRAN integer*4 val1,val2,val3 call c_function(val1,val2,val3) C void c_function_(val1,val2,val3) int *val1,*val2,*val3;{}; £³¡ËÊÑ¿ô¤ÎÂбþ FORTRAN C BYTE or LOGICAL char, unsigned char INTEGER*2 or LOGICAL*2 short int , unsigned short int INTEGER*4 or LOGICAL*4 long int , unsigned long int REAL*4 float REAL*8 double COMPLEX*8 struct {float r,i} COMPLEX*16 struct {double r,i}; ʸ»ú int *p COMMON /xyz/ struct xyz_ £Æ£Ï£Ò£Ô£Ò£Á£Î¡Ý£Ã¡Ý£Æ£Ï£Ò£Ô£Ò£Á£Î¤Î¸À¸ì´Ö¥ê¥ó¥¯¤ò¹Ô¤¦¥×¥í¥°¥é¥àÎã ¥³¥ó¥Ñ¥¤¥ëÊýË¡ % f77 -ashard_ -o main main.f subc.c subf.f #################################################### c FORTRAN main program common /shared/ rdata rdata = 10.0 iflg = 0 call subc( iflg ) call subc( iflg ) call subc( iflg ) end ##################################################### #include subc_( iflg ) int *iflg ; { extern struct{ float rdata ; } shared_; (*iflg )++ ; shared_.rdata *= 2.0 ; printf( "subc %d %f \n", *iflg, shared_.rdata ) ; subf_( iflg ) ; } ########################################################### c FORTRAN sub program subroutine subf( iflg ) common /shared/ rdata iflg = iflg + 1 rdata = rdata * 2.0 print *,"subf ", iflg, rdata end

¡ø£¸¡¡ÎãÂê ¨¢

¡¡¤³¤Î¾Ï¤Ç¤Ï¡¢¤¤¤í¤¤¤í¤ÊÌäÂê¤òÊ£¿ô¤Î¥×¥í¥°¥é¥àÊýË¡¤Ç·ÇºÜ¤·¤Þ¤¹¡£

£¸¡¥£±¡¡°ìÄê»þ´Ö£×£Á£É£Ô

¶¦Í­¥á¥â¥ê¤Ë£²¤Ä¤ÎÊÑ¿ô¥«¥¦¥ó¥È¤ª¤è¤Ó¥Õ¥é¥°¤òÀßÄꤹ¤ë¡£ £±É䴤Ȥ˥«¥¦¥ó¥È¤Ë£±¤ò²Ã¤¨¡¢¥«¥¦¥ó¥È¡ä¡á£±£°¤Ç¥Õ¥é¥°¤Ë£±¤òÂåÆþ¤·¤Æ½ªÎ»¤¹¤ë¥×¥í¥»¥¹£Â¤È¡¢ ¥«¥¦¥ó¥È¤Ë£±¤¬²Ã¤ï¤ë¤´¤È¤Ë¤½¤ÎÃͤòɽ¼¨¤·¥Õ¥é¥°¡á¡á£±¤Ç½ªÎ»¤¹¤ë¥×¥í¥»¥¹£Á¤ò ºîÀ®¤¹¤ë¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¥×¥í¥»¥¹£Á ¨¢ write write write ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¢­ ¢­ ¢¬ ¢¬ ¢¬ ¥«¥¦¥ó¥È¢«£° µ¯Æ° countup countup countup ¥Õ¥é¥°¡¡¢«£° ¢­ ¢¬ ¢¬ ¢¬ ¨£¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¤ ¥×¥í¥»¥¹£Â ¨¢¢«£±É⪨¢¢«£±É⪨¢¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¢¢«£±É⪨¢ ¨¦¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¥ ¼Â¹Ô¸¢¤òÊü´þ¤·¤Æ¥×¥í¥»¥¹£Á¤Ë¤æ¤º¤ë¡¡¡¡¡¡¡¡¡¡¥«¥¦¥ó¥È¡æ£±£°¤Ç ¡¡¥Õ¥é¥°¢«£±¤·¤Æ½ªÎ» ¡¡¡¡¥×¥í¥»¥¹£Á¤Ï¡¢¾ï¤Ë¥«¥¦¥ó¥È¤È¥Õ¥é¥°¤ò´Æ»ë Í¥Àè½ç°Ì¡¡£Â¡ä£Á ¹â¡¡Äã ¡ã¡ã¡¡ÊýË¡£±¡¡¡ä¡ä ¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¢£Õ£Î£É£Ø¸ß´¹¤Î¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î¤ß¤Çµ­½Ò¤·¤Þ¤¹¡£ ½¾¤Ã¤Æ¡¢¶¦Í­¥á¥â¥ê¤Ï SVR4 Âбþ¤Î¥·¥§¥¢¡¼¥É¥á¥â¥ê¤ò»ÈÍѤ·¤Æµ­½Ò¤·¡¢¸ÇÄêÍ¥ÀèÅ٥ץ饤¥ª¥ê¥Æ¥£¤Ë¤Ï¡¢£î£é£ã£å¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£ ¡¡¤Þ¤¿¤³¤ÎÎã¤Ç¤Î¶¦Í­¥á¥â¥ê¤Ï¡¢¥¹¥¿¥Æ¥£¥Ã¥¯¤ËÀë¸À¤·¤¿Îΰè¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ #include #include #include #include #include #include #include /* protections on ipc stuff */ #define RUSER 0400 #define WUSER 0200 struct { unsigned int loopflag, counter; } shared_memory ; process_B(upcount) unsigned int upcount; { nice(-20); /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ do { sleep(1); (shared_memory.counter)++; } while ( shared_memory.counter < upcount ); shared_memory.loopflag = 1; } main() { int pid,count; int shmid; char *shmat(); int i,status; char *shmaddr; if((shmid = shmget(IPC_PRIVATE,sizeof(shared_memory),RUSER | WUSER )) < 0 ) { perror("shmmget error"); exit(1); } if ((shmaddr = shmat(shmid,&shared_memory,SHM_RND)) == (char *) -1 ){ perror("shmat error"); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); exit(1); } shared_memory.loopflag = 0; shared_memory.counter = count = 0; nice(-19); /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (plock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } if((pid = fork())==NULL) { process_B(10); exit(1); } else { do { if ( shared_memory.counter != count ) { count = shared_memory.counter; printf(" update counter %d\n",shared_memory.counter); } } while ((shared_memory.loopflag)==0); while ( pid==wait(&status)); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); fflush(stdout); } } ¡ã¡ã¡¡ÊýË¡£²¡¡¡ä¡ä ¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¢SVR4 Âбþ¤Î¥·¥§¥¢¡¼¥É¥á¥â¥ê¤ò»ÈÍѤ·¡¢£Ò£Ô£Õ¤Î¥ê¥¢¥ë¥¿¥¤¥à¡¦¥¹¥±¥¸¥å¥ê¥ó¥°¡¢¥á¥â¥ê¥í¥Ã¥¯¡¢astpauseÅù¤ò»ÈÍѤ·¤¿ÊýË¡¤Çµ­½Ò¤·¤Þ¤¹¡£ ¡¡¤Þ¤¿¤³¤ÎÎã¤Ç¤Î¶¦Í­¥á¥â¥ê¤Ï¡¢¥Ç¡¼¥¿¥»¥°¥á¥ó¥È¤ò¿­Ä¥¤µ¤»¤Æ¥À¥¤¥Ê¥ß¥Ã¥¯¤Ë³ä¤êÉÕ¤±¤Æ¤¤¤Þ¤¹¡£ #include #include #include #include #include #include #include #include #include #include #include #include #define RT_CPU_MASK 4 #define roundup(x) (((int)(x) + NBPG -1)& ~(NBPG-1)) #define MAP_SIZE 1*NBPG /* protections on ipc stuff */ #define RUSER 0400 #define WUSER 0200 struct shared_memory { unsigned int loopflag, counter; }; struct shared_memory *shmaddr = NULL; process_B(upcount) unsigned int upcount; { int policy, prio; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI; /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } do { astpause(-1,1000);/*¡¡£±£°£°£°¥ß¥êÉá¢Í¥ÀèÅÙ¤òÊѲ½¤µ¤»¤º¤ËÂԤġ¡*/ (shmaddr->counter)++; } while ( shmaddr->counter < upcount ); shmaddr->loopflag = 1; } main() { int policy, prio,pid,count; int shmid; char *shmat(); int i,status; unsigned char *sbrk(); shmaddr = (struct shared_memory*)sbrk(0); shmaddr = (struct shared_memory*)roundup(shmaddr); status = brk(shmaddr + MAP_SIZE); if(status<0){ perror(stderr,"Memory Alocation"); exit(1); } if((shmid = shmget(IPC_PRIVATE,sizeof(struct shared_memory),RUSER | WUSER )) < 0 ) { perror("shmmget error"); exit(1); } if (shmat(shmid,shmaddr,SHM_RND) == (char *) -1 ){ perror("shmat error"); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); exit(1); } shmaddr->loopflag = 0; shmaddr->counter = count = 0; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI-1; /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } #ifdef SLAVE if (mpadvise(MPA_RT_SET, RT_CPU_MASK) < 0) {/* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ perror("mpadvise reserving processor"); exit (1); } if (mpadvise(MPA_60HZ_OFF, RT_CPU_MASK) < 0) {/* unix ¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ perror("mpadvise turning off time-sharing interrupts"); exit (3); } if (mpadvise(MPA_TBINV_OFF, RT_CPU_MASK) < 0) { perror ("MPA_TBINV_OFF"); exit (7); } #endif #ifdef LOCK if (rtplock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } #endif if((pid = fork())==NULL) { process_B(10); } else { do { if ( shmaddr->counter != count ) { count = shmaddr->counter; printf(" update counter %d\n",shmaddr->counter); } } while ((shmaddr->loopflag)==0); while ( pid==wait(&status)); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); fflush(stdout); } } ¡ã¡ã¡¡ÊýË¡£³¡¡¡ä¡ä ¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¢RTU ¤Ë¤ª¤±¤ë¥ê¥¶¡¼¥Ö¥É¥á¥â¥ê¤ò»ÈÍѤ·¤¿ÊýË¡¤Çµ­½Ò¤·¤Þ¤¹¡£ #include #include #include #include #include #include #include #include #include #include #include #include #define RT_CPU_MASK 4 #define roundup(x) (((int)(x) + NBPG -1)& ~(NBPG-1)) #define MAP_SIZE 1*NBPG struct shared_memory { unsigned int loopflag, counter; }; struct shared_memory *shmaddr = NULL; process_B(upcount) unsigned int upcount; { int policy, prio; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI; /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } do { astpause(-1,1000); (shmaddr->counter)++; } while ( shmaddr->counter < upcount ); shmaddr->loopflag = 1; } main() { int policy, prio,pid,count; int memfd; int status; unsigned char *sbrk(); shmaddr = (struct shared_memory*)sbrk(0); shmaddr = (struct shared_memory*)roundup(shmaddr); status = brk(shmaddr + MAP_SIZE); if(status<0){ perror(stderr,"Memory Alocation"); exit(1); } if ((memfd=open("/dev/resmem",O_RDWR))==-1) { perror("reserved memory open failed"); exit(1); } status=mmap(shmaddr, MAP_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, memfd, 0); if (status < 0 ) { perror("mmap"); exit(2); } shmaddr->loopflag = 0; shmaddr->counter = count = 0; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI-1; /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } #ifdef SLAVE if (mpadvise(MPA_RT_SET, RT_CPU_MASK) < 0) {/* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ perror("mpadvise reserving processor"); exit (1); } if (mpadvise(MPA_60HZ_OFF, RT_CPU_MASK) < 0) {/* unix ¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ perror("mpadvise turning off time-sharing interrupts"); exit (3); } if (mpadvise(MPA_TBINV_OFF, RT_CPU_MASK) < 0) { perror ("MPA_TBINV_OFF"); exit (7); } #endif #ifdef LOCK if (rtplock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } #endif if((pid = fork())==NULL) { process_B(10); } else { do { if ( shmaddr->counter != count ) { count = shmaddr->counter; printf(" update counter %d\n",shmaddr->counter); } } while ((shmaddr->loopflag)==0); while ( pid==wait(&status)); fflush(stdout); } } ¡ã¡ã¡¡ÊýË¡£´¡¡¡ä¡ä ¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¢¥¹¥ì¥Ã¥É¤ò»ÈÍѤ·¡¢¥ê¥¢¥ë¥¿¥¤¥à¥¹¥ì¡¼¥Ö¤ò»ÈÍѤ·¤¿ÊýË¡¤Çµ­½Ò¤·¤Þ¤¹¡£ ¥¹¥ì¥Ã¥É¤Ï¡¢Æ±°ì¥×¥í¥»¥Ã¥µ¤Ë³ä¤êÉÕ¤±¤Æ¤¤¤Þ¤¹¡£ #include #include #include #include #include #include #include #include #include #include #define RT_CPU_MASK 4 unsigned int loopflag = 0, count = 0,counter = 0; process_B(upcount) unsigned int upcount; { int policy, prio; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI; /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } do { astpause(-1,1000); counter++; } while ( counter < upcount ); loopflag = 1; t_exit(0); } main() { int policy, prio,tid; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI-1; /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } #ifdef SLAVE if (mpadvise(MPA_RT_SET, RT_CPU_MASK) < 0) {/* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ perror("mpadvise reserving processor"); exit (1); } if (mpadvise(MPA_60HZ_OFF, RT_CPU_MASK) < 0) {/* unix ¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ perror("mpadvise turning off time-sharing interrupts"); exit (3); } if (mpadvise(MPA_TBINV_OFF, RT_CPU_MASK) < 0) { perror ("MPA_TBINV_OFF"); exit (7); } #endif #ifdef LOCK if (rtplock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } #endif tid = mp_create(process_B,10); do { if ( counter != count ) { count = counter; printf(" update counter %d\n",counter); } } while (loopflag==0); t_wait(tid); fflush(stdout); }

£¸¡¥£²¡¡¼þ´ü¥¿¥¤¥Þ³ä¹þ¤ß¡Ê¥¯¥í¥Ã¥¯£Á£Ó£Ô¡Ëµ¯Æ°

¡¡¶¦Í­¥á¥â¥ê¤ËÊÑ¿ô¥«¥¦¥ó¥È¤ª¤è¤Ó¥Õ¥é¥°¤òÀßÄꤹ¤ë¡£ £±¥ß¥êÉÃËè¤Ëµ¯Æ°¤µ¤ì¥«¥¦¥ó¥È¤Ë£±¤ò²Ã¤¨¡¢¥«¥¦¥ó¥È¡ä¡á£±£°£°£°£°¤Ç¥Õ¥é¥°¤Ë£±¤òÂåÆþ¤·¤Æ½ªÎ»¤¹¤ë¥×¥í¥»¥¹£Â¤È¥«¥¦¥ó¥È¤¬£±£°£°£°¤Ç½ªÎ»¤¹¤ë¥×¥í¥»¥¹£Á¤òºîÀ®¤¹¤ë¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¥×¥í¥»¥¹£Á ¨¢ ¥«¥¦¥ó¥È¤¬£±£°£°£°¤Ç³ä¤êÀڤ줿¤é write ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¢­ ¢­ ¢¬ ¢¬ ¢¬ ¥«¥¦¥ó¥È¢«£° µ¯Æ° countup countup countup ¥Õ¥é¥°¡¡¢«£° ¢­ ¢¬ ¢¬ ¢¬ ¨£¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¤ ¥×¥í¥»¥¹£Â ¨¢ ¨¢suspend ¨¢ ¨¢suspend ¨¢¢«1ms ¢ª¨¢ ¨¦¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¥ ¢¬¡¡¡¡¡¡¢«1ms¢ª ¡¡¡¡¢¬¡¡¡¡¡¡¡¡¢«1ms ¢ª¡¡¡¡¢¬ ¡¡¡¡¥¯¥í¥Ã¥¯³ä¹þ¤ß ¼Â¹Ô¸¢¤òÊü´þ¤·¤Æ¥×¥í¥»¥¹£Á¤Ë¤æ¤º¤ë¡¡¡¡¡¡¡¡¥«¥¦¥ó¥È¡æ£±£°£°£°£°¤Ç ¥Õ¥é¥°¢«£±¤·¤Æ½ªÎ» ¡¡¡¡¥×¥í¥»¥¹£Á¤Ï¡¢¾ï¤Ë¥«¥¦¥ó¥È¤È¥Õ¥é¥°¤ò´Æ»ë Í¥Àè½ç°Ì¡¡£Â¡ä£Á ¹â¡¡Äã ¡ã¡ã¡¡ÊýË¡£±¡¡¡ä¡ä ¡¡¥¹¥ì¥Ã¥É¤ò£²¤ÄÀ¸À®¤·¡¢¥¯¥í¥Ã¥¯£Á£Ó£Ô¤ò»ÈÍѤ¹¤ë¡£ ¡¡¤³¤ÎÎã¤Ç¤Ï»ÈÍѤ·¤Æ¤¤¤Ê¤¤¤¬¡¢£²¤Ä¤Î¥¹¥ì¥Ã¥É¤òÊÌ¤Î¥×¥í¥»¥Ã¥µ¤Ë³ä¤êÉÕ¤±¤é¤ì¤ë #include #include #include #include #include #include #include #include #include #include #define RT_CPU_MASK 4 int cpu_no = 2; unsigned int loopflag = 0, count = 0,counter = 0; #define CLK_TICK 1000 /* ¥Þ¥¤¥Ê¡¼¥µ¥¤¥¯¥ë¤Ï1KHz */ #define CLK_HZ 1000 /* 1ms¤ÇÄê¼þ´ü³ä¤ê¹þ¤ß */ #define CLK_PRI 100 /* AST ¥×¥é¥¤¥ª¥ê¥Æ¥£ */ #define GIGA (1000*1000*1000) #define NANO_CYCLE (GIGA/CLK_HZ) /* ¥°¥í¡¼¥Ð¥ëÊÑ¿ô */ struct clkspec_t interv = {0, NANO_CYCLE, 0, 0}; int ast_id; function1(); (*cyclic[1])() = { function1 }; extern _asthandler(); /* £±¥ß¥êÉ䴤Ȥˤ³¤Î¥¹¥ì¥Ã¥É¤¬¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤Çµ¯Æ°¤µ¤ì¤ë*/ function1(overrun) { counter ++; if ((counter%10000)==0) { loopflag = 1; } } process_B(upcount) unsigned int upcount; { int policy, prio; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI; /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } if ( (ast_id = clkast(_asthandler, cyclic[0], CLK_PRI, &interv, cpu_no))== -1) { perror("Failed to start clock"); exit(1); } do{ /* ¤³¤³¤Ç ±Êµ×¤Ë¥ë¡¼¥×¤·¤Æ³ä¤ê¹þ¤ß¤òÂÔ¤Ä */ if ( astpause(0,2000) < 0 ){ perror("ast pause");exit(1); } } while(loopflag==0); t_exit(0); } main() { int policy, prio,tid; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI-1; /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } if (mpadvise(MPA_RT_SET, RT_CPU_MASK) < 0) {/* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ perror("mpadvise reserving processor"); exit (1); } if (mpadvise(MPA_60HZ_OFF, RT_CPU_MASK) < 0) {/* unix ¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ perror("mpadvise turning off time-sharing interrupts"); exit (3); } /* Äê¼þ´ü³ä¤ê¹þ¤ß¤Î¼þÇÈ¿ô¤ò¥»¥Ã¥È¤¹¤ë */ if ((mpadvise(MPA_CLK_SET,RT_CPU_MASK, CLK_TICK)) < 0) { perror("mpadvise setting clock interrupt"); exit (2); } if (rtplock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } tid = mp_create(process_B,10000); do { if ( (counter%1000)==0 ){ printf("counter %d\n",counter); } } while (loopflag==0); t_wait(tid); fflush(stdout); } ¡ã¡ã¡¡ÊýË¡£²¡¡¡ä¡ä ¡¡¥¹¥ì¥Ã¥É¤ò»ÈÍѤ»¤º¡¢¥×¥í¥»¥¹¤È³ä¹þ¤ß´Ø¿ô¤Î¤ß¤Çµ­½Ò¤¹¤ë¡£ ¡¡¤³¤ÎÎã¤Ç¤Ï¡¢£Æ£á£ó£ô¥¯¥í¥Ã¥¯£Á£Ó£Ô¤ò»ÈÍѤ·¤Æ¤¤¤ë¡£ ¡¡³ä¹þ¤ß´Ø¿ô¤Ï¡¢³ä¤ê¹þ¤Þ¤ì¤¿´Ø¿ô¤è¤ê¤âÍ¥ÀèÅÙ¤¬¹â¤¤¡£ #include #include #include #include #include #define CLK_TICK 1000 /* ¥Þ¥¤¥Ê¡¼¥µ¥¤¥¯¥ë¤Ï1KHz */ #define CLK_HZ 1000 /* 1000 Hz(1ms)¤ÇÄê¼þ´ü³ä¤ê¹þ¤ß */ #define CLK_PRI 100 /* AST ¥×¥é¥¤¥ª¥ê¥Æ¥£ */ #define GIGA (1000*1000*1000) #define NANO_CYCLE (GIGA/CLK_HZ) #define RT_CPU_MASK 0x4 /* ¥°¥í¡¼¥Ð¥ëÊÑ¿ô */ struct clkspec_t interv = {0, NANO_CYCLE, 0, 0}; int ast_id; function1(); (*cyclic[1])() = { function1}; extern _fasthandler(); int policy = SCHED_FIFO; /* ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ï£Æ£É£Æ£Ï¤Ç¤ª¤³¤Ê¤¦ */ int prio = MAX_RT_PRI; /* ¥×¥é¥¤¥ª¥ê¥Æ¥£¤ÏºÇÂç¥×¥é¥¤¥ª¥ê¥Æ¥£ */ int loopflag = 0; /* ¤³¤ÎÃͤò1¤Ë¤¹¤ë¤È¥×¥í¥»¥¹¤¬½ªÎ»¤¹¤ë */ int counter = 0; /* £±¥ß¥êÉ䴤Ȥˤ³¤Î¥¹¥ì¥Ã¥É¤¬µ¯Æ°¤µ¤ì¤ë*/ function1(overrun) { counter ++; if ((counter%10000)==0) { loopflag = 1; } } main() { /* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë */ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } /* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ if (rtplock(PROCLOCK) < 0) { perror("process lock"); exit(2); } /* ¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ if (mpadvise(MPA_RT_SET, RT_CPU_MASK) < 0) { perror("mpadvise reserving processor"); exit (1); } /* Äê¼þ´ü³ä¤ê¹þ¤ß¤Î¼þÇÈ¿ô¤ò¥»¥Ã¥È¤¹¤ë */ if ((mpadvise(MPA_CLK_SET,RT_CPU_MASK, CLK_TICK)) < 0) { perror("mpadvise setting clock interrupt"); exit (2); } /* unix ¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ if (mpadvise(MPA_60HZ_OFF, RT_CPU_MASK) < 0) { perror("mpadvise turning off time-sharing interrupts"); exit (3); } /* farst ast ¥Ï¥ó¥É¥é¤Ècyclic ´Ø¿ô¤òÅÐÏ¿¤·³ä¤ê¹þ¤ß¤ÇÄê¼þ´üµ¯Æ°¤¬¤«¤«¤ë¤è¤¦¤Ë¤¹¤ë */ if ( (ast_id = fclkast(_fasthandler, cyclic[0], CLK_PRI, &interv, 2,0))== -1) { perror("Failed to start clock"); exit(1); } do{ /* ¤³¤³¤Ç¥ë¡¼¥×¤·¤Æ³ä¤ê¹þ¤ß¤òÂÔ¤Ä */ if ( (counter%1000)==0 ){ printf("counter %d\n",counter); } } while(loopflag==0); }

£¸¡¥£³¡¡£Æ£Ï£Ò£Ô£Ò£Á£Î¤È£Ã¤Î´Ö¤Î¶¦Í­¥á¥â¥ê

¡¡£¸¡¥£±¤ÈƱ°ì»ÅÍͤǡ¢¥×¥í¥»¥¹£Á¤Ï£Æ£Ï£Ò£Ô£Ò£Á£Î¤Ç¡¢¥×¥í¥»¥¹£Â¤Ï¡¢£Ã¤ÇºîÀ®¤¹¤ë¡£ °Ê²¼¤Î¥×¥í¥°¥é¥à¤ò ex3.f.f ex3.c.c ¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¡¡-a ¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¡¢¸À¸ì´Ö¤Ç¶¦Í­¥á¥â¥ê¤ò¼Â¸½¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢£æ£·£·¤Îcommonʸ¤ÇÀë¸À¤µ¤ì¤¿Îΰè¤ò£Ã¸À¸ì¤Ç¥·¥§¥¢¡¼¥É¥á¥â¥ê¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»ÈÍѤ·¶¦Í­¥á¥â¥ê¤Ë¤·¤Æ¤¤¤ë¤Î¤¬¥Ý¥¤¥ó¥È¤Ç¤¹¡£ % f77 -o ex3 ex3f.f ex3c.c -ashared_data_ c*********************** c* fortran main ex3f.f * c*********************** c integer*4 loopflag,counter common /shared_memory/ loopflag,counter integer*4 pid,fork,wait,status,upcount,shmid,shmaddr c upcount = 10 call map_memory(shmid,shmaddr) loopflag = 0 counter = 0 count = 0 call realtime() pid = fork() if (pid.eq.0) then call process_b(upcount) call exit() else do while (loopflag.eq.0) if (counter.ne.count) then count = counter print *,"update counter",counter end if end do status = wait(status) call unmap_memory(shmid,shmaddr) end if end *********************** * subroutine C ex3c.c * *********************** #include #include #include #include #include #include #include #include #include #include #include #include #define RT_CPU_MASK 4 #define roundup(x) (((int)(x) + NBPG -1)& ~(NBPG-1)) #define MAP_SIZE 1*NBPG /* protections on ipc stuff */ #define RUSER 0400 #define WUSER 0200 extern struct { unsigned int loopflag, counter; } shared_memory_; process_b_(upcount) int *upcount; { int policy, prio; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI; /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } do { astpause(-1,1000); (shared_memory_.counter)++; } while ( shared_memory_.counter < *upcount ); shared_memory_.loopflag = 1; } map_memory_(shmid,shmaddr) int *shmid; char **shmaddr; { char *shmat(); if((*shmid = shmget(IPC_PRIVATE,sizeof(shared_memory_), RUSER | WUSER )) < 0 ) { perror("shmmget error"); exit(1); } if ((*shmaddr = shmat(*shmid,&shared_memory_,SHM_RND)) == (char *) -1 ){ perror("shmat error"); shmdt(*shmaddr); shmctl (*shmid, IPC_RMID, 0); exit(1); } } realtime_(){ int i,status; int policy, prio,pid; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI-1; /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } #ifdef SLAVE if (mpadvise(MPA_RT_SET, RT_CPU_MASK) < 0) {/* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ perror("mpadvise reserving processor"); exit (1); } if (mpadvise(MPA_60HZ_OFF, RT_CPU_MASK) < 0) {/* unix ¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ perror("mpadvise turning off time-sharing interrupts"); exit (3); } #endif #ifdef LOCK if (rtplock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } #endif } unmap_memory_(shmid,shmaddr) int *shmid; int **shmaddr; { char *shmat(); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); fflush(stdout); }

£¸¡¥£´¡¡¥×¥í¥»¥¹¤ÎÄä»ß¤ÈºÆ³«

¡¡°Ê²¼¤Î£²¤Ä¤Î¥×¥í¥»¥¹¤òºîÀ®¤¹¤ë¡£¤¿¤À¤·Í¥ÀèÅ٤ϡÊÄã¡Ë£Á¡ã£Â¡Ê¹â¡Ë¤È¤¹¤ë¡£ ¥×¥í¥»¥¹£Á ¡¡¶¦Í­¥á¥â¥ê¤Î¥«¥¦¥ó¥È¤ª¤è¤Ó¥Õ¥é¥°¤ò£°¤Ë½é´ü²½¸å¡¢¥×¥í¥»¥¹£Â¤òµ¯Æ°¤·¡¢¥Õ¥é¥°¡á£±¤ò³Îǧ¤·£±Éøå¤Ë¥×¥í¥»¥¹£Â¤òºÆ³«¤¹¤ë¡£ ¡¡¤½¤Î¸å¡¢¥«¥¦¥ó¥ÈÃͤòɽ¼¨¡¢£±Éøå¥×¥í¥»¥¹£Â¤òºÆ³«¤¹¤ë¡£½èÍý¤ò¥Õ¥é¥°¡á£²¤Þ¤Ç·«¤êÊÖ¤¹¡£ ¥×¥í¥»¥¹£Â ¡¡¥×¥í¥»¥¹£Á¤è¤êµ¯Æ°¡¢¥Õ¥é¥°¤Ë£±¤òÂåÆþ¤·¤ÆÄä»ß¡¢¤½¤Î¸å¥¿¥¹¥¯£Á¤«¤éºÆ³«¤µ¤ì¤ëËè¤Ë¥«¥¦¥ó¥È¤Ë£±¤ò²Ã¤¨Ää»ß¤¹¤ë½èÍý¤ò¥«¥¦¥ó¥È¡æ£±£°¤Ë¤Ê¤ë¤Þ¤Ç·«¤êÊÖ¤·¡¢¥Õ¥é¥°¤Ë£²¤òÂåÆþ¤·¤Æ½ªÎ»¤¹¤ë¡£ £±Éà £±Éà £±Éà £±Éà ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¥×¥í¥»¥¹£Á¡¡¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢ ¨¢¥Õ¥é¥°¡á£²¤Ç½ªÎ» ¨¦¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¢­¨¡¨¡¨¡¨¡¨¥ ¨¦¢­¨¡¨¡¨¡¨¡¨¥ ¨¦¢­¨¡¨¡¨¡¨¡¨¥ ¥«¥¦¥ó¥È¢«£° ¢­ ¥Õ¥é¥°¡á£± ¢­ write ¢­ write ¡¡¥Õ¥é¥°¡¡¢«£° ¢­ ³Îǧ ¢­ resume ¢­ resume ¨£¨¡¨¤ ¨£¨¡¨¤ ¨£¨¡¨¤ ¨¢ ¨¢suspend ¨¢ ¨¢suspend ¨¢ ¨¢suspend ¥«¥¦¥ó¥È¡æ£±£°¤Ç ¨¦¨¡¨¥ ¨¦¨¡¨¥ ¨¦¨¡¨¥ ¥Õ¥é¥°¢«£²¤·¤Æ½ªÎ» ¥Õ¥é¥°¢«£± ¥«¥¦¥ó¥È¥¢¥Ã¥× ¡ã¡ã¡¡ÊýË¡£±¡¡¡ä¡ä ¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¢SVR4 Âбþ¤Î¥·¥§¥¢¡¼¥É¥á¥â¥ê¤È¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»ÈÍѤ·¤¿ÊýË¡¤Çµ­½Ò¤·¤Þ¤¹¡£ #include #include #include #include #include #include #include /* protections on ipc stuff */ #define RUSER 0400 #define WUSER 0200 struct { unsigned int loopflag, counter; } shared_memory ; int (*syshandler)(); /* Pointer to old handler. */ function(sig) int sig;{} process_B(upcount) unsigned int upcount; { nice(-20); /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ shared_memory.loopflag = 1; do { pause(); signal(SIGUSR1,function); (shared_memory.counter)++; } while ( shared_memory.counter < upcount ); shared_memory.loopflag = 2; } main() { int pid,count; int shmid; char *shmat(); int i,status; char *shmaddr; if((shmid = shmget(IPC_PRIVATE,sizeof(shared_memory),RUSER | WUSER )) < 0 ) { perror("shmmget error"); exit(1); } if ((shmaddr = shmat(shmid,&shared_memory,SHM_RND)) == (char *) -1 ){ perror("shmat error"); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); exit(1); } shared_memory.loopflag = 0; shared_memory.counter = count = 0; nice(-19); /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ #ifdef LOCK if (plock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } #endif if((pid = fork())==NULL) { syshandler = signal(SIGUSR1,function); process_B(10); signal(SIGUSR1,syshandler); exit(1); } else { do { } while ((shared_memory.loopflag)==0); do { sleep(1); kill(pid,SIGUSR1); if ( shared_memory.counter != count ) { count = shared_memory.counter; printf(" update counter %d\n",shared_memory.counter); } } while ((shared_memory.loopflag)==1); while ( pid==wait(&status)); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); fflush(stdout); } } ¡ã¡ã¡¡ÊýË¡£²¡¡¡ä¡ä ¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¢SVR4 Âбþ¤Î¥·¥§¥¢¡¼¥É¥á¥â¥ê¤È£Ò£Ô£Õ¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥í¥»¥¹¡¦¥¹¥±¥¸¥å¡¼¥ë¡¦¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»ÈÍѤ·¤¿ÊýË¡¤Çµ­½Ò¤·¤Þ¤¹¡£ #include #include #include #include #include #include #include #include #include #include #include /* protections on ipc stuff */ #define RUSER 0400 #define WUSER 0200 struct { unsigned int loopflag, counter; } shared_memory ; process_B(upcount) unsigned int upcount; { int policy, prio; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI; /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } shared_memory.loopflag = 1; do { hold();/* ¥×¥í¥»¥¹¤ò¥ê¥¢¥ë¥¿¥¤¥à¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤«¤é³°¤¹ */ (shared_memory.counter)++; } while ( shared_memory.counter < upcount ); shared_memory.loopflag = 2; } main() { int pid,count; int shmid; char *shmat(); int i,status; char *shmaddr; int policy, prio; if((shmid = shmget(IPC_PRIVATE,sizeof(shared_memory),RUSER | WUSER )) < 0 ) { perror("shmmget error"); exit(1); } if ((shmaddr = shmat(shmid,&shared_memory,SHM_RND)) == (char *) -1 ){ perror("shmat error"); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); exit(1); } shared_memory.loopflag = 0; shared_memory.counter = count = 0; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI-1; /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } #ifdef SLAVE if (mpadvise(MPA_RT_SET, RT_CPU_MASK) < 0) {/* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ perror("mpadvise reserving processor"); exit (1); } if (mpadvise(MPA_60HZ_OFF, RT_CPU_MASK) < 0) {/* unix ¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ perror("mpadvise turning off time-sharing interrupts"); exit (3); } if (mpadvise(MPA_TBINV_OFF, RT_CPU_MASK) < 0) { perror ("MPA_TBINV_OFF"); exit (7); } #endif #ifdef LOCK if (rtplock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } #endif if((pid = fork())==NULL) { process_B(10); exit(1); } else { while ((shared_memory.loopflag)==0); do { astpause(-1,1000); release(pid);/* hold ¤·¤Æ¤¤¤ë¥×¥í¥»¥¹¤ò¥ê¥¢¥ë¥¿¥¤¥à¥¹¥±¥¸¥å¡¼¥ë¥­¥å¡¼¤ËÌ᤹ */ if ( shared_memory.counter != count ) { count = shared_memory.counter; printf(" update counter %d\n",shared_memory.counter); } } while ((shared_memory.loopflag)==1); while ( pid==wait(&status)); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); fflush(stdout); } } ¡ã¡ã¡¡ÊýË¡£³¡¡¡ä¡ä ¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¢¥¹¥ì¥Ã¥É¤ò»ÈÍѤ·¤¿ÊýË¡¤Çµ­½Ò¤·¤Þ¤¹¡£ #include #include #include #include #include #include #include #include #include #include #include #include struct { unsigned int loopflag, counter; } shared_memory ; unsigned int condition = 0; process_B(upcount) unsigned int upcount; { int policy, prio; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI; /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } shared_memory.loopflag = 1; do { t_cwant(&condition); t_csleep(&condition); (shared_memory.counter)++; } while ( shared_memory.counter < upcount ); shared_memory.loopflag = 2; t_exit(); } main() { int tid,count; int i,status; int policy, prio; shared_memory.loopflag = 0; shared_memory.counter = count = 0; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI-1; /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } #ifdef SLAVE if (mpadvise(MPA_RT_SET, RT_CPU_MASK) < 0) {/* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ perror("mpadvise reserving processor"); exit (1); } if (mpadvise(MPA_60HZ_OFF, RT_CPU_MASK) < 0) {/* unix ¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ perror("mpadvise turning off time-sharing interrupts"); exit (3); } if (mpadvise(MPA_TBINV_OFF, RT_CPU_MASK) < 0) { perror ("MPA_TBINV_OFF"); exit (7); } #endif #ifdef LOCK if (rtplock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } #endif tid = mp_create(process_B,10); while ((shared_memory.loopflag)==0); do { astpause(-1,1000); t_twakeup(tid); if ( shared_memory.counter != count ) { count = shared_memory.counter; printf(" update counter %d\n",shared_memory.counter); } } while ((shared_memory.loopflag)==1); t_wait(tid); }

£¸¡¥£µ¡¡¥¿¥¤¥ÞÃͼèÆÀ¤Èµ¯Æ°¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É

¡¡£¸¡¥£´¡¡¤Î»ÅÍÍ¤Î¥×¥í¥»¥¹£Á¤Ç¡¢resume ľÁ°¤Î»þ¹ï t1 ¤òÆÉ¤à¡¢Æ±ÍÍ¤Ë¥×¥í¥»¥¹£Â¤Ç suspend ľ¸å¤Î»þ¹ï t2¡¡¤òÆÉ¤ß¡¢ t2-t1 ¤ÎÃͤòɽ¼¨¤¹¤ë¡£¡Êt2-t1 ¤¬ resume ¤Î¥ª¡¼¥Ð¥Ø¥Ã¥É¡Ë ¥³¥ó¥Ñ¥¤¥ë¤È¼Â¹Ô·ë²Ì % cc -O3 -o ex5.0 ex5.0.c % cc -O3 -o ex5.1 ex5.1.c % cc -O3 -o ex5.2 ex5.2.c % ex5.0 update counter 1 update counter 2 update counter 3 update counter 4 update counter 5 update counter 6 update counter 7 update counter 8 update counter 9 prosess switch time 622.272 micro sec % ex5.1 update counter 1 update counter 2 update counter 3 update counter 4 update counter 5 update counter 6 update counter 7 update counter 8 update counter 9 prosess switch time 194.56 micro sec % ex5.2 update counter 1 update counter 2 update counter 3 update counter 4 update counter 5 update counter 6 update counter 7 update counter 8 update counter 9 prosess switch time 191.936 micro sec ¡ã¡ã¡¡ÊýË¡£±¡¡¡ä¡ä /* ex5.0.c */ #include #include #include #include #include #include #include /* protections on ipc stuff */ #define RUSER 0400 #define WUSER 0200 #define LOOPNO 10 struct { unsigned int loopflag, counter; unsigned long int t1[LOOPNO],t2[LOOPNO]; } shared_memory ; adjust(start,finish,realtime) unsigned long *start,*finish; float *realtime; { #ifdef mc7000 *realtime = (float)( *finish - *start ) * 640.0 / 1000.0; #endif } readtime(nowtime) unsigned long *nowtime; { #ifdef mc7000 #define HIGH_TIME_ADDRESS 0xfe001000 /* 48 bit realtime counter high byte */ #define LOW_TIME_ADDRESS 0xfe001004 /* 48 bit realtime counter low word */ *nowtime = *(unsigned long *)LOW_TIME_ADDRESS; #endif } int (*syshandler)(); /* Pointer to old handler. */ function(sig) int sig; {} process_B(upcount) unsigned int upcount; { int policy, prio; nice(-20); /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ shared_memory.loopflag = 1; do { pause(); readtime(&(shared_memory.t2[shared_memory.counter])); signal(SIGUSR1,function); (shared_memory.counter)++; } while ( shared_memory.counter < upcount ); shared_memory.loopflag = 2; } main() { int pid,count; int shmid; char *shmat(); int i,status; char *shmaddr; int policy, prio; float realtime=0.0,total = 0.0; if((shmid = shmget(IPC_PRIVATE,sizeof(shared_memory),RUSER | WUSER )) < 0 ) { perror("shmmget error"); exit(1); } if ((shmaddr = shmat(shmid,&shared_memory,SHM_RND)) == (char *) -1 ){ perror("shmat error"); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); exit(1); } shared_memory.loopflag = 0; shared_memory.counter = count = 0; nice(-19); /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ #ifdef LOCK if (plock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } #endif if((pid = fork())==NULL) { syshandler = signal(SIGUSR1,function); process_B(LOOPNO); signal(SIGUSR1,syshandler); exit(1); } else { do { } while ((shared_memory.loopflag)==0); do { sleep(1); readtime(&(shared_memory.t1[shared_memory.counter])); kill(pid,SIGUSR1); if ( shared_memory.counter != count ) { count = shared_memory.counter; printf(" update counter %d\n",shared_memory.counter); } } while ((shared_memory.loopflag)==1); while ( pid==wait(&status)); for (i=0;i #include #include #include #include #include #include #include #include #include #include /* protections on ipc stuff */ #define RUSER 0400 #define WUSER 0200 #define RT_CPU_MASK 0x04 #define LOOPNO 10 struct { unsigned int loopflag, counter; unsigned long int t1[LOOPNO],t2[LOOPNO]; } shared_memory ; adjust(start,finish,realtime) unsigned long *start,*finish; float *realtime; { #ifdef mc7000 *realtime = (float)( *finish - *start ) * 640.0 / 1000.0; #endif #ifdef mc8000 *realtime = (float)( *finish - *start ) * 62.50 / 1000.0; #endif } readtime(nowtime) unsigned long *nowtime; { #ifdef mc7000 #define HIGH_TIME_ADDRESS 0xfe001000 /* 48 bit realtime counter high byte */ #define LOW_TIME_ADDRESS 0xfe001004 /* 48 bit realtime counter low word */ *nowtime = *(unsigned long *)LOW_TIME_ADDRESS; #endif #ifdef mc8000 unsigned long int *clk_ptr = (unsigned long int *)0x7FFFA000; *nowtime = *((unsigned long int *)0x7FFFA000); #endif } process_B(upcount) unsigned int upcount; { int policy, prio; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI; /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } shared_memory.loopflag = 1; do { hold(); readtime(&(shared_memory.t2[shared_memory.counter])); (shared_memory.counter)++; } while ( shared_memory.counter < upcount ); shared_memory.loopflag = 2; } main() { int pid,count; int shmid; char *shmat(); int i,status; char *shmaddr; int policy, prio; float realtime=0.0,total = 0.0; if((shmid = shmget(IPC_PRIVATE,sizeof(shared_memory),RUSER | WUSER )) < 0 ) { perror("shmmget error"); exit(1); } if ((shmaddr = shmat(shmid,&shared_memory,SHM_RND)) == (char *) -1 ){ perror("shmat error"); shmdt(shmaddr); shmctl (shmid, IPC_RMID, 0); exit(1); } shared_memory.loopflag = 0; shared_memory.counter = count = 0; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI-1; /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } #ifdef SLAVE if (mpadvise(MPA_RT_SET, RT_CPU_MASK) < 0) {/* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ perror("mpadvise reserving processor"); exit (1); } if (mpadvise(MPA_60HZ_OFF,RT_CPU_MASK)<0){/*unix¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë*/ perror("mpadvise turning off time-sharing interrupts"); exit (3); } #endif #ifdef LOCK if (rtplock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } #endif if((pid = fork())==NULL) { process_B(LOOPNO); exit(1); } else { do { } while ((shared_memory.loopflag)==0); do { astpause(-1,1000); readtime(&(shared_memory.t1[shared_memory.counter])); release(pid); if ( shared_memory.counter != count ) { count = shared_memory.counter; printf(" update counter %d\n",shared_memory.counter); } } while ((shared_memory.loopflag)==1); while ( pid==wait(&status)); for (i=0;i #include #include #include #include #include #include #include #include #include #include #include #define LOOPNO 10 struct { unsigned int loopflag, counter; unsigned long int t1[LOOPNO],t2[LOOPNO]; } shared_memory ; unsigned int condition = 0; adjust(start,finish,realtime) unsigned long *start,*finish; float *realtime; { #ifdef mc7000 *realtime = (float)( *finish - *start ) * 640.0 / 1000.0; #endif #ifdef mc8000 *realtime = (float)( *finish - *start ) * 62.50 / 1000.0; #endif } readtime(nowtime) unsigned long *nowtime; { #ifdef mc7000 #define HIGH_TIME_ADDRESS 0xfe001000 /* 48 bit realtime counter high word */ #define LOW_TIME_ADDRESS 0xfe001004 /* 48 bit realtime counter low word */ *nowtime = *(unsigned long *)LOW_TIME_ADDRESS; #endif #ifdef mc8000 unsigned long int *clk_ptr = (unsigned long int *)0x7FFFA000; *nowtime = *((unsigned long int *)0x7FFFA000); #endif } process_B(upcount) unsigned int upcount; { int policy, prio; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI; /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } shared_memory.loopflag = 1; do { t_cwant(&condition); t_csleep(&condition); readtime(&(shared_memory.t2[shared_memory.counter])); (shared_memory.counter)++; } while ( shared_memory.counter < upcount ); shared_memory.loopflag = 2; t_exit(); } main() { int tid,count; int i,status; int policy, prio; float realtime=0.0,total = 0.0; shared_memory.loopflag = 0; shared_memory.counter = count = 0; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MAX_RT_PRI-1; /* ºÇÂçÍ¥ÀèÅÙ-1¤Î¥ê¥¢¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } #ifdef SLAVE if (mpadvise(MPA_RT_SET, RT_CPU_MASK) < 0) {/* ¥»¥«¥ó¥É¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ perror("mpadvise reserving processor"); exit (1); } if (mpadvise(MPA_60HZ_OFF, RT_CPU_MASK) < 0) {/* unix ¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ perror("mpadvise turning off time-sharing interrupts"); exit (3); } if (mpadvise(MPA_TBINV_OFF, RT_CPU_MASK) < 0) { perror ("MPA_TBINV_OFF"); exit (7); } #endif #ifdef LOCK if (rtplock(PROCLOCK) < 0) {/* ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤ò¥í¥Ã¥¯¤¹¤ë */ perror("process lock"); exit(2); } #endif tid = mp_create(process_B,10); while ((shared_memory.loopflag)==0); do { astpause(-1,1000); readtime(&(shared_memory.t1[shared_memory.counter])); t_twakeup(tid); if ( shared_memory.counter != count ) { count = shared_memory.counter; printf(" update counter %d\n",shared_memory.counter); } } while ((shared_memory.loopflag)==1); t_wait(tid); for (i=0;i

£¸¡¥£¶¡¡¥×¥í¥»¥¹¤Î¥×¥í¥»¥Ã¥µ¤Ø¤Î³äÉÕ

¡¡¶¦Í­¥á¥â¥ê¤Ë¡¡flag1,falg2 ¤òÀßÄê¡¢°Ê²¼¤Ë¤Ë¼¨¤¹¥×¥í¥»¥¹£Á¡¢£Â¡¢£Ã¤ò¤½¤ì¤¾¤ìÊÌ¥×¥í¥»¥Ã¥µ¤Ç¼Â¹Ô¤¹¤ë¡£ ¨£¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¤ ¥×¥í¥»¥¹£Á ¨¢flag1¢«0 ¨¢flag1 == 1 ¤«¤Ä flag2 == 1 ¤Ê¤é ¨¢flag1==3 ¤«¤Äflag2==3 ¤Ê¤é¨¢ ¨¢flag2¢«0¨¢B¤ÈC¤òµ¯Æ° ¨¢»þ¹ït1¼èÆÀ flag1 ¢« 2 flag ¢« 2 ¨¢»þ¹ït2¼èÆÀ t2-t1ɽ¼¨¡¢½ªÎ»¨¢ ¨¦¨¡¨¡¨¡¨¡¨«¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¥ ¨§¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¤ ¥×¥í¥»¥¹£Â ¨¢flag1¢«1¨¢ ¨¢flag1=2¤Ê¤é ¨¢flag1¢«3¨¢ ¨§¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¥ ¨¢ data(i)=2.0*i ½ªÎ» ¨¢ i=1,10000000 ¨§¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¨¨¡¨¡¨¡¨¡¨¤ ¥×¥í¥»¥¹£Ã ¨¢flag2¢«1¨¢ ¨¢flag2=2¤Ê¤é ¨¢flag2¢«3¨¢ ¨¦¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¡¨¡¨¡¨ª¨¡¨¡¨¡¨¡¨¥ data(i)=2.0*i ½ªÎ» i=10000001,2000000 ¡¡¤³¤³¤Ç¤Ï¡¢Æ±´üÊÑ¿ô¤Ë·×¿ô·¿ÇÓ¾À©¸æÊÑ¿ô¡Ê¥«¥¦¥ó¥¿¥»¥Þ¥Õ¥©¡Ë¤ò»ÈÍѤ·¤Þ¤¹¡£ ¥³¥ó¥Ñ¥¤¥ë¤È¼Â¹Ô·ë²Ì % cc -O3 ex7.c prosess execution time 1.7994e+06 micro sec /* ex7.c */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define DATA_SIZE 2000000 struct { mpcounter flag1,flag2; float data[DATA_SIZE]; } shared_memory ; unsigned long int t1,t2; unsigned int condition = 0; adjust(start,finish,realtime) unsigned long *start,*finish; float *realtime; { #ifdef mc7000 *realtime = (float)( *finish - *start ) * 640.0 / 1000.0; #endif #ifdef mc8000 *realtime = (float)( *finish - *start ) * 62.50 / 1000.0; #endif } readtime(nowtime) unsigned long *nowtime; { #ifdef mc7000 #define HIGH_TIME_ADDRESS 0xfe001000 /* 48 bit realtime counter high word */ #define LOW_TIME_ADDRESS 0xfe001004 /* 48 bit realtime counter low word */ *nowtime = *(unsigned long *)LOW_TIME_ADDRESS; #endif #ifdef mc8000 unsigned long int *clk_ptr = (unsigned long int *)0x7FFFA000; *nowtime = *((unsigned long int *)0x7FFFA000); #endif } process_B(mask) unsigned int mask; { int policy, prio,i; policy = SCHED_FIFO;/* FIFO ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Ë¤¹¤ë */ prio = MIN_RT_PRI; /* ºÇÂçÍ¥ÀèÅ٤Υꥢ¥ë¥¿¥¤¥à¥×¥é¥¤¥ª¥ê¥Æ¥ê¥£¤Ë¤¹¤ë*/ if (schedset(NULL, &policy, &prio, NULL) < 0) { perror("schedset"); exit(2); } if (mpadvise(MPA_RT_SET,mask) < 0) {/* ¥×¥í¥»¥Ã¥µ¤ÎÀêÍ­¤ò¥»¥Ã¥È¤¹¤ë */ perror("mpadvise reserving processor"); exit (1); } if (mpadvise(MPA_60HZ_OFF,mask) < 0) { /* unix ¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°³ä¤ê¹þ¤ß¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë */ perror("mpadvise turning off time-sharing interrupts"); exit (3); } mp_counter_incr(shared_memory.flag1); do { astpause(-1,10);} while ( (mp_counter_fetch(shared_memory.flag1)!=2) || (mp_counter_fetch(shared_memory.flag2)!=2)); for ( i=0;i

£¸¡¥£·¡¡¥¹¥ì¥Ã¥É¤Ë¤è¤ë¥À¥Ö¥ë¥Ð¥Ã¥Õ¥¡Ë¡¤Î¼Â¸½

¡¡¤³¤Î¥×¥í¥°¥é¥àÎã¤Ï¡¢¥¹¥ì¥Ã¥É¤Ë¤è¤ë¥À¥Ö¥ë¥Ð¥Ã¥Õ¥¡Ë¡¤ò»ÈÍѤ·¡¢È󯱴üÆþ½ÐÎϤòµ­½Ò¤·¤Æ¤¤¤Þ¤¹¡£ ·«ÊÖ¤·¥ë¡¼¥×¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·«ÊÖ¤·¥ë¡¼¥× ¨£¨¡¨¡¨¡¨¤¨£¨¡¨¡¨¡¨¤¨£¨¡¨¡¨¡¨¤¨£¨¡¨¡¨¡¨¤¨£¨¡¨¡¨¡¨¤¨£¨¡¨¡¨¡¨¤¨£¨¡¨¡¨¡¨¤¨£¨¡¨¡¨¡¨¤¨£¨¡¨¡¨¡¨¤ Æþ½ÐÎÏ¥¹¥ì¥Ã¥É¨¢read1 ¨¢¨¢read2 ¨¢¨¢write1¨¢¨¢read1 ¨¢¨¢write2¨¢¨¢read2 ¨¢¨¢write1¨¢¨¢read1 ¨¢¨¢write2¨¢ ¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥¨¦¨¡¨¡¨¡¨¥ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡¨¤ ¨£¨¡¨¡¨¡¨¡¨¡ ·×»»¥¹¥ì¥Ã¥É ¨¢ calc1 ¨¢ ¨¢ calc2 ¨¢ ¨¢ calc1 ¨¢ ¨¢ calc2 ¨¢ ¨¢ ¨¦¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡¨¥ ¨¦¨¡¨¡¨¡¨¡¨¡ ·«ÊÖ¤·¥ë¡¼¥× ·«ÊÖ¤·¥ë¡¼¥× #include #include #define VECNUM 9 #define BIG_VECTOR 10 #define INPUT_FILENAME "thrdbf.input" mpcounter c1, c2; float buffer1[BIG_VECTOR], buffer2[BIG_VECTOR]; FILE *finp; main () { void vinit (), parallel_func (); /* read_buf() and write_buf() handle I/O to and from a specified buffer */ int i, ret, read_buf (), write_buf (); int end_reached = 0; c1 = mp_counter_alloc (); c2 = mp_counter_alloc (); /* Create initial data */ vinit (); finp = fopen (INPUT_FILENAME, "r"); /* Initializing the counters is a useful precaution that is not really needed in this example, because when the counters are allocated they have the value 0. But if the entire loop were to be repeated, re-initializing the counters here would be critical. */ ret = mp_counter_init (c1, 0); ret = mp_counter_init (c2, 0); /* Start other thread to perform calculations, and begin main loop in root thread */ ret = mp_create (parallel_func, 0); /* Double-buffering algorithm requires one buffer to be read once before the main loop */ if (read_buf (buffer1)) exit (-2); /* Let calculating thread start on buffer 1 */ ret = mp_counter_incr (c1); while (!end_reached) /* *** Start of main loop *** */ { /* Read data into second buffer, ending loop if EOF or an error occurs. Increment counter to let calculating thread start on buffer. */ if (!(ret = read_buf (buffer2))) ret = mp_counter_incr (c2); else { end_reached = 2; break; } /* Odd counter means the calculating thread is still handling the buffer */ while (mp_counter_fetch (c1) & 1) ; /* When the calculating thread finishes the first buffer, write it and read new data into it, ending loop if end-of-file reached. Increment counter to let calculating thread start on buffer. */ write_buf (buffer1); if (!(ret = read_buf (buffer1))) ret = mp_counter_incr (c1); else { end_reached = 1; break; } /* Write second buffer when calculating thread is finished with it */ while (mp_counter_fetch (c2) & 1) ; write_buf (buffer2); } /* *** End of Main loop *** */ /* Double-buffering algorithm requires a buffer to be written once after the main loop. Wait on counter so that last calculation can finish before the write. */ ret = 0; switch (end_reached) { case 1: while (mp_counter_fetch (c2) & 1) ; write_buf (buffer2); break; case 2: while (mp_counter_fetch (c1) & 1) ; write_buf (buffer1); break; default: fprintf (stderr, "Incorrect return value %d from W/R function\n", end_reached); ret++; break; } /* Clean up */ mp_counter_free (c1); mp_counter_free (c2); fclose (finp); exit (ret); } void parallel_func () { void calculate (); int ret; while (1) { /* Even counter means the I/O thread is still handling the buffer */ while (!(mp_counter_fetch (c1) & 1)) ; calculate (buffer1); ret = mp_counter_incr (c1); while (!(mp_counter_fetch (c2) & 1)) ; calculate (buffer2); ret = mp_counter_incr (c2); } } int write_buf (buf) float buf[]; { int i; for (i = 0; i < BIG_VECTOR; i++) if (fprintf (stdout, "%f ", buf[i]) <= 0) { fprintf (stderr, "Error writing to file\n"); exit (-3); } fprintf (stdout, "\n"); } int read_buf (buf) float buf[]; { int i; for (i = 0; i < BIG_VECTOR; i++) if (fscanf (finp, "%f", &buf[i]) <= 0) return (1); return (0); } /* For this example, a trivial calculation is used: replacing each element n with the sum of itself and the element at BIG_VECTOR-n. If BIG_VECTOR is odd, the middle element is untouched. */ void calculate (buf) float buf[]; { float tmp; int i; for (i = 0; i < BIG_VECTOR / 2; i++) { tmp = buf[i] + buf[BIG_VECTOR - i - 1]; buf[i] = tmp; buf[BIG_VECTOR - i - 1] = tmp; } } void vinit () { int i, j; finp = fopen (INPUT_FILENAME, "w"); for (i = 0; i < VECNUM; i++) { for (j = 0; j < BIG_VECTOR; j++) { float tmp; tmp = ((j + 1.0) * (BIG_VECTOR - j) - 1.0) / (VECNUM - VECNUM % (i + 1)) + 1.0; if (fprintf (finp, "%f ", tmp) <= 0) { fprintf (stderr, "Error creating input file\n"); exit (-1); } } fprintf (finp, "\n"); } fclose (finp); }

¡ø£¹¡¡¤ª¤ï¤ê¤Ë ¨¢

¡¡¸½ºß¡¢£Ð£Ï£Ó£É£Ø £Ð£±£°£°£³¡¥£´¤ä£Ò£å£á£ì£ô£é£í£å£Í£Á£Ã£È¡¢£Ì£ù£î£ø£Ï£Ó¡¢£Ö£ø£×£ï£ò£ë£ó¤Ê¤É¡¢¥ê¥¢¥ë¥¿¥¤¥à£Ï£Ó¤â¤º¤¤¤Ö¤ó¥á¥¸¥ã¡¼¤ÊÏÃÂê¤È¤·¤ÆÅÁ¤¨¤é¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£¤³¤ì¤Ï¡¢¥³¥ó¥«¥ì¥ó¥È¼Ò¤¬£Ò£Ô£Õ¤òÀ¤³¦¤ÇºÇ½é¤Ë£Õ£Î£É£Ø¤ò¥ê¥¢¥ë¥¿¥¤¥à²½¤·¤¿¡ÊÅö»þ¤Ï¥Þ¥¹¥³¥ó¥×¼Ò¤Ç¤·¤¿¡ËÅö»þ¤«¤é¤Ï¹Í¤¨¤é¤ì¤Ê¤¤¤³¤È¤Ç¤¹¡£ ¡¡¤±¤ì¤É¤â¡¢¤¤¤Á¤Ð¤ó½ÅÍפʤ³¤È¤Ï¡¢¿®ÍêÀ­¤Î¤¢¤ë¥ê¥¢¥ë¥¿¥¤¥à¥·¥¹¥Æ¥à¤ò¹½ÃÛ¤¹¤ë¤¿¤á¤Ë¤Ï¡¢½½Ê¬¤Ê·Ð¸³¤òÀѤޤͤФʤê¤Þ¤»¤ó¡£ ¡¡¤¿¤È¤¨¤Ð¡¢¥³¥ó¥«¥ì¥ó¥È£·£°£°£°¥·¥ê¡¼¥º¤Ï¡¢£Ò£Ô£Õ¤òºÇ¤â¸úΨ¤è¤¯¼Â¹Ô¤¹¤ë¤¿¤á¤Ë£Ò£Ô£ÕÍѤËÀ߷פ·¤¿½é¤á¤Æ¤Î¥·¥ê¡¼¥º¤Ç¤¹¤¬¡¢¤³¤³¤Þ¤Ç¤¯¤ë¤Î¤Ë£±£°Ç¯´Ö¤ËÅϤäƼºݤΥե£¡¼¥ë¥É¤Ç·Ð¸³¤òÀѤޤʤ¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£ ÆÃ¤ËÊÂÎó½èÍý¤Îµ»½Ñ¤Ï¤½¤Îµæ¶Ë¤Ë¤¢¤ë¤â¤Î¤Ç¤½¤Î¥Î¥¦¥Ï¥¦¤Ï¡¢°ìÄ«°ìͼ¤ËÆÀÆñ¤¤¤â¤Î¤Ç¤¹¡£ ¡¡¤½¤Î·Ð¸³¤ò¤â¤È¤Ë¡¢º£¸å½ÅÍפˤʤë¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤È¿½Å¥¹¥ì¥Ã¥É¤Ë¤Ä¤¤¤Æ¡¢É¸½à£Õ£Î£É£Ø¤È¤Î°ã¤¤¤òÀâÌÀ¤·¤Æ¤­¤Þ¤·¤¿¡£ ¡¡¤ª¤½¤é¤¯¡¢º£¸å¥ê¥¢¥ë¥¿¥¤¥à¤ÈÊÂÎó½èÍý¤Îµ»½Ñ¤Ï¡¢¥Í¥Ã¥È¥ï¡¼¥¯µ»½Ñ¤Ë¤Ä¤¤¤Ç£Õ£Î£É£Ø¥¨¥ó¥¸¥Ë¥¢¤Ë¤È¤Ã¤ÆÉ¬¿Ü¤Îµ»½Ñ¤È¤Ê¤ë¤È»×¤ï¤ì¤Þ¤¹¡£¤½¤Î¤è¤¦¤Ê°ÕÌ£¤Ç¡¢¤³¤ì¤¬¾¯¤·¤Ç¤âÌò¤Ë¤¿¤Æ¤Ð¹¬¤¤¤Ç¤¹¡£ £±£¹£¹£²Ç¯£¸·î¡¡¥³¥ó¥«¥ì¥ó¥ÈÆüËܳô¼°²ñ¼Ò µ»½ÑÉô

¡ø£±£°¡¡»²¹Íʸ¸¥ ¨¢

"Real-Time and Multipocessing Manual" "Realtime Programming Manual" "Writing a UNIX Device Driver" °Ê¾å¡¡Concurrent Computer Corporation. "£Õ£Î£É£Ø¥Ç¥Ð¥¤¥¹¥É¥é¥¤¥Ð"¡¡ÌîÃæ¹À°ì¡¡ÂçÀ¾¾ÈÂ嶦Ìõ¡¡¥¢¥¹¥­¡¼½ÐÈǶɡʤ³¤ÎËÜ¤Ï 3) ¤Î¾¶Ìõ¤Ç¤¢¤ë¡Ë "£²Ëç¤Î£Ö£Í£Å£¶£Õ¥Ü¡¼¥É¤Ç¥á¥â¥ê¶¦Í­·¿£³¥×¥í¥»¥Ã¥µ¥·¥¹¥Æ¥à¤ò¼Â¸½¤·¤¿¥ê¥¢¥ë¥¿¥¤¥à¥³¥ó¥Ô¥å¡¼¥¿£·£°£°£°¥·¥ê¡¼¥º" ¡¡ÂçÅçζÇî¡¿ÅÄÃæÄ¾¼ù £±£¹£¹£²Ç¯ÅŻҾðÊóÄÌ¿®³Ø²ñ½Õ´üÂç²ñ£Ä¡Ý£±£³£¹ "¥ê¥¢¥ë¥¿¥¤¥à¥·¥¹¥Æ¥à¤Ë¤ª¤±¤ë£Õ£Î£É£Ø¤ÈÊÂÎó½èÍý"¡¡ÂçÅçζÇî¡¿ËÙ¸ý´´Í§¡¡£ê£õ£óÀßΩ£±£°¼þǯµ­Ç°£Õ£Î£É£Ø¹ñºÝ¥·¥ó¥Ý¥¸¥¦¥àÏÀʸ½¸¡¡£ê£á£ð£á£î¡¡£Õ£Î£É£Ø¡¡£Ó£ï£ã£é£å£ô£ù "£³¸Ä¤Î£¶£¸£°£´£°¤òÅëºÜ¤·¤¿£Ö£Í£Å£â£õ£ó¥Ü¡¼¥É¤Ê¤É" Æü·Ð¥¨¥ì¥¯¥È¥í¥Ë¥¯¥¹¡¡ £±£¹£¹£²Ç¯£³·î£²Æü¹æ¡¡No548 pp 231 "C Threads" Eric C.Cooper Richard P.Draves Department of Computer Sciencd Carnegie Mellon University Draft of 20 July 1987 "¥ê¥¢¥ë¥¿¥¤¥à£Õ£Î£É£Ø¥·¥¹¥Æ¥à"¡¡À®Åĸ÷¾´Ìõ Æü·Ð£Â£Ð¼Ò ¥ê¥¢¥ë¥¿¥¤¥à¤È£Õ£Î£É£ØÆÃ½¸¡¡£Õ£Î£É£Ø¥Þ¥¬¥¸¥ó¡¡ £±£¹£¹£±Ç¯£¹·î¹æ pp68-87 "¥ê¥¢¥ë¥¿¥¤¥à£Õ£î£é£ø£Æ£Á»Ô¾ì¤ØÈ¯¿Ê"¡¡Æü·Ð¥¨¥ì¥¯¥È¥í¥Ë¥¯¥¹¡¡£±£¹£¸£²Ç¯£±£²·î£²£¶Æü¹æ¡¡No.463 pp117-124 "¥ê¥¢¥ë¥¿¥¤¥à£Ï£Ó¤Î´ðËܵ»½Ñ¤ò¸«ÅϤ¹"¡¡Æü·Ð¥¨¥ì¥¯¥È¥í¥Ë¥¯¥¹¡¡£±£¹£¸£¸Ç¯£´·î£´Æü¹æ¡¡No.444 pp161-177 "£Õ£Î£É£Ø¡¡£´¡¥£³£Â£Ó£Ä¤ÎÀ߷פȼÂÁõ"¡¡ÃæÀ¾ÌÀ¡¿ÁêÅĿΡ¿¾®ÃÓÈÆÊ¿¶¦Ìõ¡¡´ÝÁ±³ô¼°²ñ¼Ò "£Õ£Î£É£Ø¥·¥¹¥Æ¥à¥Á¥å¡¼¥Ë¥ó¥°"¡¡Mike Loukides Ãø¡¿º½¸¶½¨¼ù´ÆÌõ¡¡¥¢¥¹¥­¡¼½ÐÈÇ¶É POSIX P1003.4/D12 February 1992 IEEE STD Dept. "£Õ£Î£É£Ø¸¶Åµ" ÀÐÅÄÀ²µ×´Æ½¤ ¥Ñ¡¼¥½¥Ê¥ë¥á¥Ç¥£¥¢ "The Interaction of Architecture and Operating System Design" Thomas E.Anderson,Henry M.Levy,Brian N.Bershad and Edward D.Lazowska [ASPLOS-IV Proceeding pp.108-120(Apr.1991)] "¥ê¥¢¥ë¥¿¥¤¥à½èÍý¤Î£Ð£Ï£Ó£É£ØÉ¸½à¤¬Äê¤Þ¤ë¡¢Â¿¤¯¤Î¥Ù¥ó¥À¤¬½àµò¤òɽÌÀ"¡¡Æü·Ð¥¨¥ì¥¯¥È¥í¥Ë¥¯¥¹¡¡£±£¹£¹£±Ç¯£¹·î£³£°Æü¹æ¡¡No.537 pp127-133 "ÊÆ¥µ¥ó¤Î£Ó£ï£ì£á£ò£é£ó¡¢¥Ñ¥½¥³¥ó¤È£×£Ó¤Î¶¦Ạ̈ϣӤòÌܻؤ¹"¡¡Æü·Ð¥¨¥ì¥¯¥È¥í¥Ë¥¯¥¹¡¡£±£¹£¹£²Ç¯£²·î£³Æü¹æ No.546 pp157-164 "ÊÂ¹Ô¥×¥í¥°¥é¥ß¥ó¥°¤Î¸¶Íý"¡¡¥ê¥Á¥ã¡¼¥É¡¥£Ã¡¥¥Û¥ë¥ÈÃø¡¿ÂçÌîË­´ÆÌõ¡¡·¼³Ø½ÐÈÇ "ʹԽèÍý¤È£Õ£Î£É£Ø"¡¡£Í¡¥¥Ù¥ó¡Ý¥¢¥êÃø¡¿ÅÏÊձɰìÌõ¡¡·¼³Ø½ÐÈÇ "ÊÂÎó½èÍý¥Þ¥·¥ó"¡¡ÉÙÅÄ¿¿¼£¡¿ËöµÈÉÒ§¶¦Ãø¡¡¥ª¡¼¥à¼Ò "ÊÂÎó½èÍýµ»½Ñ"¡¡³Þ¸¶ÇîÆÁÃø¡¡¥³¥í¥Ê¼Ò "¿·¤·¤¤£Ï£Ó"¡¡ÀÐÅÄÀ²µ×¡¿ÅÚµïÈϵ׶¦Æ±ÊÔ½¸¡¡¶¦Î©½ÐÈdzô¼°²ñ¼Ò
[back] Back