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