|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Docbook ¿ø¹®
Kernel 2.6¿¡¼ stat Á¤º¸°¡ ¹Ù²ñ
cpu 160973516 140668 193307293 2350842518 97711250 250076 1915952 0
cpu0 76866807 59063 92916755 1182630432 49046887 114166 936567 0
cpu1 84106709 81605 100390538 1168212086 48664363 135910 979385 0
Kernel 2.4¿¡¼¿Í´Â ´Þ¸®, 4°³ÀÇ Çʵ尡 ´õ Ãß°¡µÇ¾ú´Ù. °¢°¢ÀÇ Çʵ尡 ÀǹÌÇÏ´Â ¹Ù´Â ´ÙÀ½°ú °°´Ù.
- user : user ¸ðµå¿¡¼ÀÇ ÇÁ·Î¼¼½º ½ÇÇà½Ã°£
- nice : user ¸ðµå¿¡¼ÀÇ niced ÇÁ·Î¼¼½º ½ÇÇà½Ã°£
- system : Ä¿³Î ¸ðµå¿¡¼ÀÇ ÇÁ·Î¼¼½º ½ÇÇà½Ã°£
- idle : ³í½Ã°£
- iowait : I/O°¡ ¿Ï·áµÇ±â¸¦ ±â´Ù¸° ½Ã°£
- irq : servicing interrupts
- softirq : servicing softirqs
ÀÌ ³»¿ëÀ» docbook¿¡ Ãß°¡Çϵµ·Ï ÇÑ´Ù.
sms Á¦ÀÛ±â| 교정 과정 |
|---|
| 교정 0.8 | 2003³â 6¿ù 13ÀÏ 19½Ã | | | ÃÖÃÊ ¹®¼ÀÛ¼º |
±×µ¿¾È ¸î ¹ø¿¡ °ÉÃļ /procÆÄÀϽýºÅÛ¿¡ °üÇÑ ¿¬Àçµµ Çß¾ú°í
°ü·ÃµÇ¾î¼ smsÁ¤º¸¸¦ °¡Á®¿À´Â °Áµµ ¸¶·ÃÇß¾ú´Ù. À̹ø¿¡´Â Á»´õ
Æø³ÐÀº ½Ã½ºÅÛÁ¤º¸¸¦ °¡Á®¿À´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¸±â·Î Çß´Ù.
ÀÌ ÇÁ·Î±×·¥Àº ¸®´ª½º kernel-2.4.x¿¡¼ ÄÚµù/Å×½ºÆ® µÇ¾úÀ¸¸ç,
´Ù¸¥ À¯´Ð½ºµé¿¡¼´Â ÀÛµ¿ÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù.
¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥ÀÇ À̸§Àº jsmsÀ¸·Î Á¤Çß´Ù. joinc+sms(-.-;)ÀÇ
ÁÙÀÓ¸»ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ½Ã½ºÅÛ°ü¸®¸¦ ¸ñÀûÀ¸·Î »ç¿ëÇÏ´Â df, freeµî°ú À¯»çÇÑ
Á¤º¸¸¦ ¾ò¾î¿Ã °ÍÀÌ´Ù.
Áï µð½ºÅ©Á¤º¸, ¸Þ¸ð¸®Á¤º¸, CPU»ç¿ëÀ² µîÀÇ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.
°¢°¢ÀÇ ½Ã½ºÅÛ Á¤º¸µéÀº ´ëºÎºÐ /procÆÄÀϽýºÅÛ¿¡ ÀÖ´Â ÆÄÀϵéÀ»
ºÐ¼®ÇÔÀ¸·Î½á ¾ò¾î¿À°Ô µÈ´Ù. À̹ø Àå¿¡¼´Â °¢°¢ÀÇ Á¤º¸º°·Î
¾î¶²½ÄÀ¸·Î µ¥ÀÌŸ¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´ÂÁö¸¦ ¼³¸íÇϵµ·Ï ÇÒ°ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¼³¸íÀº ½ÇÁ¦ ÀÛµ¿µÇ´Â Äڵ带 ¿¹Á¦·Î ¸¸µé¾î°¡¸é¼ ÀÌ·ç¾îÁö°Ô
µÉ°ÍÀÌ´Ù.
ÀÌ·¯ÇÑ °¢°¢ÀÇ ¿¹Á¦ÄÚµåµéÀº ³ªÁß¿¡ jsms¿¡ ÅëÇÕµÇ°Ô µÉ°ÍÀÌ´Ù.
¸Þ¸ð¸®´Â Å©°Ô ¹°¸®Àû¸Þ¸ð¸®¿Í Swap¸Þ¸ð¸®·Î ±¸¼ºµÇ¸ç, ¿ì¸®´Â
ÀÌµé ¸ðµÎ¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Á®¿Ã ¼ö ÀÖ¾î¾ß ÇÑ´Ù. °¡Á®¿Ã µ¥ÀÌŸ´Â
ÇÒ´çµÈ Àüü ºí·°Å©±â, »ç¿ëµÇ´Â ºí·°Å©±â,
»ç¿ëÇÒ¼ö ÀÖ´Â ºí·°Å©±â,
shared, buffers, cachedµÈ ºí·° Å©±âÀÌ´Ù.
ÀÌ·¯ÇÑ ¸Þ¸ð¸® Á¤º¸´Â /procÆÄÀϽýºÅÛ¿¡ ÀÇÇØ¼ ÆÄÀÏ·Î
Á¦°øµÇ¾îÁø´Ù. ¸Þ¸ð¸® Á¤º¸¸¦ °¡Áö´Â ÆÄÀÏÀº
/proc/meminfoÀÌ´Ù.
ÀÌ ÆÄÀÏÀº ´ÙÀ½°ú °°Àº ¸Þ¸ð¸®ÀÇ »ó¼¼ÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù.
[root@localhost proc]# cat meminfo
total: used: free: shared: buffers: cached:
Mem: 260984832 257720320 3264512 4489216 48381952 8617984
Swap: 542826496 0 542826496
MemTotal: 254868 kB
MemFree: 3188 kB
...
|
µ¥ÀÌÅÍ´Â scanf¸¦ ÀÌ¿ëÇÏ´Â Á¤µµ·Î ¾î·ÆÁö ¾Ê°Ô °¡Á®¿Ã ¼ö ÀÖ´Ù.
°¡Á®¿Ã µ¥ÀÌŸ¸¦ Á¤¸®ÇÒ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ ¸¸µé±â·Î Çß´Ù.
typedef struct _df
{
// ¹°¸®Àû ¸Þ¸ð¸® Å©±â ÀúÀå¿ë
ulong real_total;
ulong real_used;
ulong real_buffers;
ulong real_cached;
// ½º¿Ò ¸Þ¸ð¸® Å©±â ÀúÀå¿ë
ulong swap_total;
ulong swap_used;
} df;
|
CPU»ç¿ë·üÀº /proc/stat¸¦ Âü°íÇÏ¸é µÈ´Ù.
[root@coco /root]# cat /proc/stat
cpu 94964 233 9932 1662334
cpu0 94964 233 9932 1662334
page 467656 48623
swap 4365 11418
...
|
CPU»ç¿ë·ü·Î½á ºÎÆÃÈÄ Áö±Ý±îÁö ¼Ò¸ðµÈ jiffiesÀÇ Å©±â¸¦ ³ªÅ¸³½´Ù.
5°³ÀÇ Çʵå·Î ±¸¼ºµÇ¾î ÀÖÀ¸¸ç, ù¹øÂ° Çʵå´Â CPU¹øÈ£, µÎ¹øÂ° Çʵå´Â
user ¸ðµå, ¼¼¹øÂ° Çʵå´Â low priority(nice»óÅÂ)ÀÇ user¸ðµå¸¦ ³ªÅ¸³½´Ù.
³×¹øÂ° Çʵå´Â system ¸ðµå ¸¶Áö¸·Àº idle Å×½ºÅ©ÀÇ jiffies
¼Ò¸ð °ªÀ» ³ªÅ¸³½´Ù. ¿ì¸®°¡ ÇÊ¿ä·Î ÇÏ´Â °ªÀº µÎ¹øÂ°, ³×¹øÂ°, ´Ù¼¸¹øÂ° ÇʵåÀÇ
°ªÀ¸·Î ÀÌµé °ªÀ» ÀÌ¿ëÇØ¼ CPUÀÇ »ç¿ëÀ²À» ¾ò¾î¿Ã ¼ö ÀÖ´Ù.
/proc/statÀÇ Ãâ·Â³»¿ëÀ» º¸¸é cpu¿Í cpu0°ú °°ÀÌ µÚ¿¡ ¼ýÀÚ°¡ ºÙÀº °Í°ú ±×·¸Áö
¾ÊÀº °ÍÀÌ Àִµ¥, ¼ýÀÚ°¡ ºÙÁö ¾ÊÀº °ÍÀº (cpu°¡ ¿©·¯ °³ ÀÖÀ» ¶§)Àüü cpu¿¡
´ëÇÑ jiffiesÃÑÇÕÀÇ °è»êÀ» º¸¿©ÁØ´Ù. ¼ýÀÚ°¡ ºÙÀº°ÍµéÀº °³º° cpu¿¡ ´ëÇÑ
jiffies°ªÀ» º¸¿©ÁØ´Ù. À§ÀÇ ¸®´ª½º½Ã½ºÅÛÀÇ °æ¿ì ´ÜÁö ÇϳªÀÇ cpu·Î
ÀÌ·ç¾îÁ® ÀÖÀ½À» ÁüÀÛÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¸¸¾à CPUÀÇ IDLE»óŸ¸À» ¾Ë°í ½Í´Ù¸é ´Ù¼¸¹øÂ° Çʵ尪¸¸À» Á¶»çÇÏ¸é µÉ°ÍÀÌ´Ù.
ÀÌ·¸°Ô ÇØ¼ CPUÀÇ jiffies¸¦ °¡Áö°í ¿À±ä ÇßÁö¸¸ À̰͸¸À¸·Î´Â ¿ì¸®°¡ ¿øÇÏ´Â
Á¤º¸¸¦ ¾ò¾î¿Ã¼ø ¾ø´Ù. ½ÇÁ¦ ¿ì¸®°¡ ¿øÇÏ´Â Á¤º¸´Â Àüü CPU»ç¿ë jiffiesÁß
idle jiffies¸¦ ¾ò¾î¿Í¾ß Çϰí À̰ÍÀ» ´Ù½Ã ¹éºÐÀ²·Î Ç¥½ÃÇØ¾ß ÇϹǷΠ¾à°£ÀÇ °¡°øÀ»
ÇØÁÖ¾î¾ß ÇÑ´Ù.
¹æ¹ýÀº °£´ÜÇÏ´Ù. ÀÏÁ¤½Ã°£ ¼ÒºñµÈ idel jiffies¸¦ ÃÑ ¼ÒºñµÈ jiffies·Î ³ª´² ÁÖ¸é
µÈ´Ù.
(idle jiffies)*100 / (idle jiffies + use jiffies + system jiffies + low prio jiffies)
|
À§ÀÇ ¹æ¹ýÀ» ÅëÇϸé cpuÀÇ idleÀÇ ¹éºÐÀ² °ªÀ» ¾ò¾î¿Ã ¼ö ÀÖ´Ù.
ÀÏÁ¤ ½Ã°£Àº ÃÊ´ÜÀ§·Î ÇÏ¸é µÇ°í, ¼ÒºñµÈ jiffies¸¦ ±¸ÇØ¾ß ÇÔÀ¸·Î
ÀÌÀüÀÇ jiffies°ªÀ» °¡Áö°í ÀÖ¾î¾ß µÈ´Ù.
º¸Åë µð½ºÅ© »ç¿ëÀ²À» È®ÀÎÇϱâ À§Çؼ ¿©·¯ºÐÀº df½Ã½ºÅÛ ¸í·É¾î¸¦
»ç¿ëÇÒ °ÍÀÌ´Ù. ´ÙÀ½Àº df·Î È®ÀÎÇØº» ÇÊÀÚÀÇ ½Ã½ºÅÛÀÇ µð½ºÅ© »ç¿ëÀ²ÀÌ´Ù.
µð½ºÅ©ÀÇ »ç¿ëÀ²À» °Ë»çÇϱâ À§Çؼ´Â /etc/mtab°ú /proc/mounts,
/proc/partitionÀÇ Á¤º¸¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù.
/proc/mounts´Â ÇöÀç ¸¶¿îÆ®µÈ ÀåÄ¡¿Í ¸¶¿îÆÃ°æ·Î ÆÄÀϽýºÅÛ Á¾·ù Á¤º¸¸¦ ´ã°í ÀÖ´Ù.
[root@localhost proc]# mounts
/dev/root / ext2 rw 0 0
/proc /proc proc rw 0 0
usbdevfs /proc/bus/usb usbdevfs rw 0 0
/dev/hda1 /boot ext2 rw 0 0
/dev/hda6 /home ext2 rw 0 0
/dev/hda5 /usr ext2 rw 0 0
/dev/hda8 /var ext2 rw 0 0
none /dev/pts devpts rw 0 0
automount(pid556) /misc autofs rw 0 0
|
À§ÀÇ ³»¿ëÀº /proc/mountsÀÇ ³»¿ëÀÌ´Ù. ¿ì¸®´Â ½ÇÁ¦ ÀåÄ¡¿¡ ¸¶¿îÆ®µÈ ÆÄÀϽýºÅÛ¿¡
´ëÇÑ Á¤º¸¸¸À» ÇÊ¿ä·Î ÇϹǷΠ/dev·Î ½ÃÀ۵Ǵ °Íµé¿¡ ´ëÇÑ Á¤º¸¸¸ ÀÐ¾î ¿À¸é µÈ´Ù.
±×·±µ¥ À§ÀÇ Á¤º¸¸¦ º¸¸é ÀåÄ¡°¡ Á» ÀÌ»óÇÏ°Ô Ç¥½ÃµÇ´Â°Ô ÀÖÀ» °ÍÀÌ´Ù. /dev/root°¡
±×°ÍÀε¥, ±âº»ÀûÀ¸·Î /dev/root´Â Á¸ÀçÇÏÁö ¾Ê´Â ÀåÄ¡ÀÌ´Ù. ±×·³À¸·Î ¿Ã¹Ù¸¥ ÀåÄ¡¸íÀ»
Àоî¿Í¾ß¸¸ Çϴµ¥ ±×·¯±â À§Çؼ /etc/mtabÆÄÀϰú ºñ±³Çؼ °°ÀÌ »ç¿ëÇÏ°Ô µÈ´Ù.
[root@localhost proc]# cat /etc/mtab
/dev/hda7 / ext2 rw 0 0
none /proc proc rw 0 0
usbdevfs /proc/bus/usb usbdevfs rw 0 0
/dev/hda1 /boot ext2 rw 0 0
/dev/hda6 /home ext2 rw 0 0
/dev/hda5 /usr ext2 rw 0 0
/dev/hda8 /var ext2 rw 0 0
none /dev/pts devpts rw,gid=5,mode=620 0 0
automount(pid556) /misc autofs rw,fd=5,pgrp=556,minproto=2,maxproto=3 0 0
|
À§ÀÇ Á¤º¸¸¦ º¸¸é ·çÆ® ÆÄÀÏ ½Ã½ºÅÛÀÌ ¿¬°áµÈ ÀåÄ¡°¡ Á¦´ë·Î Ç¥½ÃµÇ°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.
ÀÌÂë ÇØ¼ ÇÑ °¡Áö Àǹ®Á¡ÀÌ »ý±æ °ÍÀÌ´Ù. ±×·¸´Ù¸é ±×³É óÀ½ºÎÅÍ /etc/mtab¸¦ ÀÌ¿ëÇØ¼
¸¶¿îÆ®µÈ ÆÄÀϽýºÅÛÀÇ Á¤º¸¸¦ °¡Á®¿Ã ¼ö ÀÖÁö ¾ÊÀº°¡ ÇÏ´Â Á¡ÀÌ´Ù.
ºÐ¸íÈ÷ /etc/mtab¸¸À» ÀÌ¿ëÇØµµ ¸¶¿îÆ®µÈ ÆÄÀϽýºÅÛ¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò¾î ¿Ã ¼ö ÀÖ±â´Â ÇÏ´Ù.
±×·±µ¥ ÇѰ¡Áö ¹®Á¦Á¡ÀÌ Àִµ¥, ±×°Ç mtabÆÄÀÏÀ» °ü¸®ÇÏ´Â ÁÖü°¡ Ä¿³ÎÀÌ ¾Æ´Ï¶ó´Â Á¡ÀÌ´Ù.
mount½Ã½ºÅÛ ÇÁ·Î±×·¥ÀÌ /etc/mtabÀÇ Á¤º¸¸¦ °»½ÅÇÏ°í »ç¿ëÇϴµ¥, ÀÌ´Â mount¹öÁ¯ ȤÀº
¹ö±×µî¿¡ ÀÇÇØ¼ mtab³»¿ëÀÌ Á¦´ë·Î ¹Ý¿µµÇÁö ¾ÊÀ» ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù. ½ÇÁ¦ °¡²û ÀÌ·¯ÇÑ
»óȲÀÌ ¹ß»ýÇϱ⵵ ÇÑ´Ù. ¹Ý¸é /proc/mounts´Â Ä¿³Î¿¡¼ Á÷Á¢ °ü¸®ÇÏ°Ô µÊÀ¸·Î À§ÀÇ ¹®Á¦µéÀ»
ÇÇÇÒ ¼ö ÀÖ´Ù. ±×·¡¼ ±»ÀÌ /etc/mtab¸¸ »ç¿ëÇÏÁö ¾Ê°í /proc/mounts¿Í ÇÔ²² »ç¿ëÇÏ°Ô µÈ´Ù.
½ÇÁ¦ dfÀÇ ½î¾²Äڵ带 º¸¸é mtab¿Í /proc/mounts¸¦ °°ÀÌ ÀÌ¿ëÇØ¼ ÆÄÀϽýºÅÛ Á¤º¸¸¦ ¾ò¾î ¿À´Â
°É È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.
ÀÌ·¸°Ô /proc/mounts¿Í mtabÀ» ÀÌ¿ëÇØ¼ Á¤È®ÇÑ ¸¶¿îÆ®µÈ ÀåÄ¡ Á¤º¸¸¦ ¾ò¾î¿Ô´Ù¸é °¢ ÀåÄ¡ÀÇ
Å©±â¿Í »ç¿ë·®µîÀ» °Ë»çÇØ¾ß ÇÒ °ÍÀÌ´Ù.
ÀÌ Á¤º¸´Â statfs(2)½Ã½ºÅÛ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. »ç¿ë¹æ¹ýÀº ¿¹Á¦¸¦ ÅëÇØ¼
¾Ë¾Æ º¼ °ÍÀÌ´Ù.
ÇÁ·Î¼¼½º Á¤º¸´Â À̹Ì
ÇÁ·Î¼¼½º Á¤º¸ ¾ò¾î¿À±â¿¡¼ ´Ù·é ¹Ù ÀÖÀ½À¸·Î Áߺ¹À» ÇÇÇÏ´Â Â÷¿ø¿¡¼ ´Ù·çÁö´Â ¾ÊÀ» °ÍÀÌ´Ù.
À̰ÍÀº °¢ÀÚ Å×½ºÆ®Çغ¸±â ¹Ù¶õ´Ù.
¿ì¸®°¡ ¸¸µé ÇÁ·Î±×·¥Àº ±â´ÉÀÇ ±¸Çö¿¡¸¸ ½Å°æÀ» ¾µ °ÍÀÌ´Ù. ±ò²û, È¿À², °¡µ¶¼º ÀÌ·±°Ç °¢ÀÚ
ÀÇ ¸òÀ¸·Î ³²°Ü ³õµµ·Ï ÇϰڴÙ.
¿øÇÒÇÑ ÇÁ·ÎÁ§Æ®ÀÇ ÁøÇàÀ» À§Çؼ mainÇÔ¼ö¿Í ÇÔ¼ö ±¸ÇöºÎºÐÀ» ºÐ¸®½Ã۵µ·Ï ÇÒ °ÍÀÌ´Ù.
mainÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â ½î¾²ÆÄÀÏÀº ÃÖ¼ÒÇÑÀÇ ±â´É¸¸À» ÇÏ¸é¼ ´ÜÁö ÇÊ¿ä·Î ÇÏ´Â ÇÔ¼ö¸¦ È£Ãâ
ÇØ¼ ȸ鿡 Ãâ·ÂÇÏ´Â Àϸ¸À» Çϵµ·Ï ÇÒ°ÍÀÌ´Ù.
./--+-- Makefile
|
+-- jsms.cc
|
+-- main.cc
|
+-- include/ ------ jsms.h
|
À̰ÍÀº make·êÀ» ´ã°í ÀÖ´Â ÆÄÀÏ·Î ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÈ´Ù.
°£´ÜÇÏ°Ô ÀÌÇØ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
Makefile°ü·Ã ³»¿ëÀº make¸¦ ÀÌ¿ëÇÑ ÇÁ·ÎÁ§Æ® °ü¸®¸¦ Âü°íÇϱ⠹ٶõ´Ù.
¿¹Á¦ : Makefile
#############################################################################
# Makefile for building jsms
# Generated by tmake at 15:32, 2003/06/13
# Project: jsms
# Template: app
#############################################################################
####### Compiler, tools and options
CC = gcc
CXX = g++
CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG
CXXFLAGS= -pipe -Wall -W -O2 -DNO_DEBUG
# ./includeÀÇ Çì´õÆÄÀÏÀ» ÂüÁ¶Çϵµ·Ï Çϱâ À§Çؼ
INCPATH = -I./include
LINK = g++
LFLAGS =
TAR = tar -cf
GZIP = gzip -9f
####### Files
HEADERS = include/jsms.h
SOURCES = jsms.cc \
main.cc
OBJECTS = jsms.o \
main.o
INTERFACES =
UICDECLS =
UICIMPLS =
SRCMOC =
OBJMOC =
DIST =
TARGET = jsms
INTERFACE_DECL_PATH = .
####### Implicit rules
.SUFFIXES: .cpp .cxx .cc .C .c
.cpp.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.cxx.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.cc.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.C.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.c.o:
$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
####### Build rules
all: $(TARGET)
$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC)
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
dist:
$(TAR) jsms.tar jsms.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST)
$(GZIP) jsms.tar
clean:
-rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET)
-rm -f *~ core
####### Sub-libraries
###### Combined headers
####### Compile
jsms.o: jsms.cc
main.o: main.cc
|
¿ª½Ã ÁÖ¼®À¸·Î ¸ðµç ¼³¸íÀ» ´ë½ÅÇϵµ·Ï ÇϰڴÙ.
¿¹Á¦ : jsms.h
#ifndef _JSMS_H_
#define _JSMS_H_
#include <vector>
#include <algorithm>
#include <unistd.h>
#include <stdio.h>
#include <set>
#include <iostream>
#include <sys/vfs.h>
#define MOUNT_STR_LEN 255
#define DEVICE_STR_LEN 80
#define MAX_CPU_NUM 32
#define DF_LINE_LEN MOUNT_STR_LEN + DEVICE_STR_LEN
using namespace std;
// µð½ºÅ© Á¤º¸¸¦ ÀúÀåÇϱâ À§ÇÑ ±¸Á¶Ã¼
typedef struct _df
{
int blocks; // ÇÒ´çµÈ ºí·°
int used; // »ç¿ëÇϰí ÀÖ´Â ºí·°
int avail; // »ç¿ëÇÒ ¼ö ÀÖ´Â ºí·°
char mount[MOUNT_STR_LEN]; // ¸¶¿îÆ® µð·ºÅ丮
char device[DEVICE_STR_LEN]; // ÀåÄ¡¸í
} df;
// cpu »ç¿ëÀ²
// ¿©·¯°³ÀÇ CPU¸¦ »ç¿ëÇÒ ¼öµµ ÀÖÀ½À¸·Î
// CPUÀÇ °¹¼ö¸¦ ÀúÀåÇϸç,
// CPUÀÇ »ç¿ëÀ²Àº (CPU°¹¼ö ¸¸Å)¹è¿¿¡ ÀúÀåµÈ´Ù.
typedef struct _cpu_usage
{
int cpuid; // Ưº°È÷ »ç¿ëµÇÁö ¾Ê´Â´Ù.
int countcpu; // µî·ÏµÈ CPUÀÇ ¼ö
int cpuusage[MAX_CPU_NUM]; // °¢ CPUÀÇ »ç¿ëÀ²
} cpu_usage;
// ¸Þ¸ð¸® Á¤º¸
// ¹°¸®Àû ¸Þ¸ð¸®¿Í ½º¿Ò ¸Þ¸ð¸® ÀúÀå¿ë
typedef struct _mem_data
{
ulong real; // ¹°¸®Àû ¸Þ¸ð¸® Å©±â
ulong free; // ¹°¸®Àû ¸Þ¸ð¸® ³²Àº Å©±â
ulong swap_use; // ½º¿Ò »ç¿ë·®
ulong swap_free; // ½º¿Ò ³²Àº·®
} mem_data;
// ³ªÁß¿¡ /etc/mtab°ú /proc/mountsÀÇ Á¤º¸¸¦
// ºñ±³Çϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÑ´Ù.
// »ç¿ë¹ýÀº jsms.cc¸¦ Âü°í
struct ltstr
{
bool operator()(const df m1, const df m2) const
{
return strcmp(m1.mount, m2.mount) < 0;
}
};
class JSms
{
private:
// ÇöÀç CPU»ç¿ëÀ² (jiffly °¹¼ö)
int mcurrent_usage[MAX_CPU_NUM][3];
// ¹Ù·ÎÀüÀÇ CPU»ç¿ëÀ²
int mold_usage[MAX_CPU_NUM][3];
public :
// µð½ºÅ© Á¤º¸¸¦ ¾ò±â À§ÇÑ ¸Þ¼µå
vector<df> GetDf();
// CPU»ç¿ëÀ²À» ¾ò±â À§ÇÑ ¸Þ¼µå
cpu_usage GetCpuIdle();
// ¸Þ¸ð¸® Á¤º¸¸¦ ¾ò±â À§ÇÑ ¸Þ¼µå
mem_data GetMem();
};
#endif
|
JSmsÀÇ Å¬·¡½ºÀÇ Á¤ÀǸ¦ ´ã°í ÀÖ´Ù. ÄÚµåµå¿Í ÇÔ²² /procÀÇ °¢ ÆÄÀÏÀ» ÇÔ²²
Âü°íÇϸé Á»´õ ÀÌÇØÇϱ⠽¬¿ï °ÍÀÌ´Ù. /procÀÇ °¢ ÆÄÀÏ·Î ºÎÅÍ Á¤º¸¸¦ ¾ò¾î¿À´Â °ÍÀº
scanf°è¿ ÇÔ¼ö¸¦ »ç¿ëÇß´Ù.
¿¹Á¦ : jsms.cc
#include <jsms.h>
#include <vector>
#include <algorithm>
#include <unistd.h>
#include <stdio.h>
#include <set>
#include <iostream>
#include <sys/vfs.h>
// /etc/mtab¿Í /proc/mountsÀÇ ÆÄÀϳ»¿ëÀ» ÀÌ¿ëÇØ¼
// ¸¶¿îÆ®µÈ µð½ºÅ©ÀÇ Á¤º¸¸¦ ¾ò¾î¿Â´Ù.
vector<df> JSms::GetDf()
{
FILE *fp = NULL;
struct statfs lstatfs;
unsigned int i = 0;
set<df, ltstr> smtab, smount;
vector<df> vmtab;
char line[DF_LINE_LEN];
df ldf_data;
// ¸ÕÀú /etc/mtabÀ» ¿¾î¼ °¢ ÀåÄ¡¿Í
// ÀåÄ¡¿¡ ¸¶¿îÆ®µÈ ÆÄÀÏÀÇ À̸§À» ¾ò¾î¿Â´Ù.
// ¾ò¾î¿Â µ¥ÀÌÅÍ´Â smtab setÄÁÅ×À̳ʿ¡ ÀúÀåÇÑ´Ù.
// smtab¿¡ ÀúÀåµÈ µ¥ÀÌÅÍ´Â ³ªÁß¿¡ /proc/mounts µ¥ÀÌÅÍ¿Í
// ºñ±³ÇÏ°Ô µÈ´Ù.
// ¿Ö³ÄÇÏ¸é ¸¶¿îÆ® ÆÄÀÏ¿¡ ´ëÇÑ µð¹ÙÀ̽º À̸§ÀÌ À߸ø ÁöÁ¤µÇ¾î
// ÀÖÀ» ¼ö ÀÖÀ½À¸·Î À̰æ¿ì /proc/mountsÀÇ ³»¿ëÀ» ÂüÁ¶ÇØ¾ß Çϱâ
// ¶§¹®ÀÌ´Ù.
fp = fopen("/etc/mtab", "r");
if (fp == NULL)
{
cout << "Open Error mtab" << endl;
exit(0);
}
while(fgets(line, DF_LINE_LEN, fp) != NULL)
{
if ((strstr(line, "/dev/") - line) == 0)
{
sscanf(line, "%s %s", ldf_data.device, ldf_data.mount);
smtab.insert(ldf_data);
}
}
fclose(fp);
fp = NULL;
// /proc/mounts·Î ºÎÅÍ µð¹ÙÀ̽º¿Í ¸¶¿îÆ®ÆÄÀÏ Á¤º¸¸¦
// ¾ò¾î¿Â´Ù.
fp = fopen("/proc/mounts", "r");
if (fp == NULL)
{
cout << "Open Error mounts" << endl;
exit(0);
}
while(fgets(line, DF_LINE_LEN, fp) != NULL)
{
if ((strstr(line, "/dev/") - line) == 0)
{
sscanf(line, "%s %s", ldf_data.device, ldf_data.mount);
smount.insert(ldf_data);
}
}
fclose(fp);
fp = NULL;
// /proc/mount¿Í /etc/mtabÀÇ ³»¿ëÀ» intersection(±³ÁýÇÕ)¿¬»êÀ» ½ÃŲ´Ù.
// ¿¬»ê¿¡ »ç¿ëÇÒ ºñ±³ÇÔ¼ö´Â jsms.h¿¡ Á¤ÀÇ µÇ¾îÀÖ´Â ltstrÀÌ´Ù.
// ±³ÁýÇÕ¿¡ »ç¿ëµÉ ºñ±³ µ¥ÀÌÅÍ´Â ¸¶¿îÆ® µð·ºÅ丮 À̸§ÀÌ´Ù.
// ÀÌ·¸°Ô ÇÒ°æ¿ì ºñ·Ï /etc/mtab¿¡ ÀÖ´Â ÀåÄ¡À̸§ÀÌ À߸øµÇ¾ú´Ù°í ÇÏ´õ¶óµµ
// /proc/mountÀÇ Á¦´ë·ÎµÈ ÀåÄ¡À̸§À¸·Î µ¤¾î ¾µ ¼ö ÀÖ´Ù.
// ÀÌ µ¥ÀÌÅÍ´Â vmtab¿¡ ÀúÀåµÈ´Ù.
set_intersection( smtab.begin(), smtab.end(),
smount.begin(), smount.end(),
back_inserter(vmtab), ltstr());
// ¸¶¿îÆ®µÈ ÆÄÀϽýºÅÛ¿¡ ´ëÇÑ µð½ºÅ© »ç¿ëÀ²À» ±¸ÇÑ´Ù.
{
for (i = 0; i < vmtab.size(); i++)
{
statfs(vmtab[i].mount, &lstatfs);
vmtab[i].blocks = lstatfs.f_blocks*(lstatfs.f_bsize/1024);
vmtab[i].avail = lstatfs.f_bavail*(lstatfs.f_bsize/1024);
vmtab[i].used = vmtab[i].blocks - vmtab[i].avail;
}
}
return vmtab;
}
// CPU»ç¿ëÀ²À» üũÇÑ´Ù.
// CPU»ç¿ëÀ²À» À§Çؼ´Â ÇöÀçÀÇ jiffies°ªÀ» ±¸Çϰí
// °ú°ÅÀÇ jiffiesÀÇ °ª°ú ºñ±³Çؼ ¾ó¸¶¸¸Å Áõ°¡ Çß´ÂÁö¸¦
// ÆÇ´ÜÇØ¼ ¹éºÐÀ²·Î ³ªÅ¸³»°Ô µÈ´Ù.
// ±×·¯¹Ç·Î ÀÌ ¸Þ¼µå´Â µÎ¹ø È£ÃâÇØ¾ß ÇÑ´Ù.
// óÀ½ È£Ãâ·Î ¾Ë¾Æ³½ jiffies°ªÀº º°µµÀÇ º¯¼ö¿¡ ÀúÀåµÇ°í
// sleep¸¦ È£ÃâÇÑ ÈÄ Àá½ÃÈÄ ´Ù½Ã ÀÌ ¸Þ¼µå¸¦ È£ÃâÇØ¾ß ÇöÀçÀÇ
// jiffies°ª°ú °ú°ÅÀÇ jiffies¸¦ ÀÌ¿ëÇÑ °è»êÀÌ °¡´ÉÇØ Áø´Ù.
cpu_usage JSms::GetCpuIdle()
{
FILE *fp = NULL;
char line[80];
cpu_usage lcpu_usage;
char cpuid[32];
int nulldata;
int totaldiff;
int diff[3];
int cpu_num = 0;
memset((void *)&lcpu_usage, 0x00, sizeof(cpu_usage));
// /proc/statÆÄÀÏÀ» ÀÐ¾î¼ jiffies°ªÀ» °è»êÇÑ´Ù.
fp = fopen("/proc/stat", "r");
if(fp == NULL)
{
cout << "Cannot open stat" << endl;
return lcpu_usage;
}
while(1)
{
fgets(line,80, fp);
if (strstr(line, "cpu") == NULL)
{
fclose(fp);
// cpu °¹¼ö¸¦ ¼¼ÆÃÇÏ°í ¸®ÅÏÇÑ´Ù.
lcpu_usage.countcpu = cpu_num -1;
return lcpu_usage;
}
else
{
// /proc/stat¿¡¼ ÃÖÃÊ¿¡ ÀÐ¾î µéÀÌ´Â µ¥ÀÌÅÍ´Â
// Àüü CPU¿¡ ´ëÇÑ Åë°è µ¥ÀÌÅÍ´Ù.
// ±×·¯¹Ç·Î °³º° CPU¿¡ ´ëÇÑ µ¥ÀÌÅ͸¦ ¾ò±â À§Çؼ´Â óÀ½ ¶óÀÎÀº
// ¹«½ÃÇÏ°í ³Ñ¾î°¡¾ß ÇÑ´Ù.
if (cpu_num > 0)
{
// sscanf¸¦ ÀÌ¿ëÇØ¼ jiffies°ªÀ» ¾ò¾î¿Â´Ù.
// ±×¸®°í °ú°ÅÀÇ jiffies°ª°úÀÇ ¿¬»êÀ» ÅëÇØ¼
// °¢°¢ÀÇ jiffies°¡ ¾ó¸¶¸¸Å º¯Çß´ÂÁö¸¦ È®ÀÎÇϰí
// ÀÌ °ªÀ» ¹éºÐÀ²·Î ³ªÅ¸³½´Ù.
sscanf(line, "%s %d %d %d %d",
cpuid,
&mcurrent_usage[cpu_num-1][0],
&nulldata,
&mcurrent_usage[cpu_num-1][1],
&mcurrent_usage[cpu_num-1][2]);
diff[0] = mcurrent_usage[cpu_num-1][0] - mold_usage[cpu_num-1][0];
diff[1] = mcurrent_usage[cpu_num-1][1] - mold_usage[cpu_num-1][1];
diff[2] = mcurrent_usage[cpu_num-1][2] - mold_usage[cpu_num-1][2];
totaldiff = diff[0] + diff[1] + diff[2];
lcpu_usage.cpuusage[cpu_num-1] = (diff[2]*100)/totaldiff;
memcpy((void *)&mold_usage,
(void *)&mcurrent_usage,
sizeof(mcurrent_usage));
}
cpu_num ++;
}
}
if(fp != NULL)
fclose(fp);
}
// ¸Þ¸ð¸® Á¤º¸¸¦ ¾ò¾î¿Â´Ù.
mem_data JSms::GetMem()
{
FILE *fp = NULL;
int index = 0;
char line[128];
mem_data lmem_data;
int nulldata;
char null[12];
fp = fopen("/proc/meminfo", "r");
if (fp == NULL)
{
cout << "Meminfo open error" << endl;
exit(0);
}
while(1)
{
fgets(line, 128, fp);
if(index == 0)
{
index ++;
continue;
}
else if(index == 1)
{
sscanf(line, "%s %lu %d %lu", null, &lmem_data.real, &nulldata, &lmem_data.free
);
}
else if(index == 2)
{
sscanf(line, "%s %lu %lu %lu", null, &nulldata, &lmem_data.swap_use,
&lmem_data.swap_free);
}
else
{
fclose(fp);
return lmem_data;
}
index ++;
}
}
|
mainÇÔ¼ö´Â ´ÜÁö JSmsŬ·¡½º¸¦ ÀÌ¿ëÇÏ´Â °Í ¸»°í´Â ÇÏ´Â ÀÏÀÌ ¾ø´Ù.
ÇÁ·Î±×·¥ ½ÇÇàÀÎÀÚ¸¦ ó¸®Çϱâ À§Çؼ getopt()¸¦ »ç¿ëÇß´Ù.
¿¹Á¦ : main.cc
#include <jsms.h>
#include <unistd.h>
void help()
{
printf("Usage : jsms -[mcf] \n"
"-m : mem info\n"
"-c : cpu usage\n"
"-h : help message\n"
"-f : disk info\n");
exit(0);
}
int main(int argc, char **argv )
{
class JSms lSms;
vector<df> ldf;
mem_data lmem_data;
int opt;
while((opt = getopt(argc, argv, "mcfh")) != -1)
{
// ¸Þ¸ð¸® Á¤º¸¸¦ ¿äûÇßÀ»¶§
switch (opt)
{
case 'm':
{
ulong swap_real;
lmem_data = lSms.GetMem();
printf("REAL : %15lu %15lu %lu\n", lmem_data.real,
lmem_data.free,
((lmem_data.real - lmem_data.free)*100)/lmem_data.real);
swap_real = lmem_data.swap_use + lmem_data.swap_free;
printf("Swap : %15lu %15lu %lu\n", swap_real,lmem_data.swap_free,
(swap_real - lmem_data.swap_free)*100/swap_real);
break;
}
// CPU»ç¿ëÀ²À» ¿äûÇßÀ»¶§
// sleep()À» ÀÌ¿ëÇØ¼ ½Ã°£Â÷¸¦ µÎ°í GetCpuIdle¸¦ µÎ¹ø È£ÃâÇßÀ½¿¡
// À¯ÀÇ ÇÑ´Ù.
case 'c':
{
cpu_usage lcpu_usage;
lcpu_usage = lSms.GetCpuIdle();
sleep(1);
lcpu_usage = lSms.GetCpuIdle();
for (int i = 0; i < lcpu_usage.countcpu; i++)
{
printf("[%d] : %d\n", i+1, lcpu_usage.cpuusage[i]);
}
break;
}
// µð½ºÅ© »ç¿ë·® üũ
case 'f':
{
ldf = lSms.GetDf();
for (int i = 0; i < ldf.size(); i++)
{
printf("%10s %-15s %12d %12d\n", ldf[i].device,
ldf[i].mount,
ldf[i].blocks,
ldf[i].used);
}
break;
}
// µµ¿ò¸»
case 'h':
{
help();
break;
}
default :
{
help();
break;
}
}
}
}
|
|
|