¿ù°£ Àα⠰Խù°

°Ô½Ã¹° 9°Ç
   
³ª¸¸ÀÇ ps¸¦ ¸¸µé¾îº¸ÀÚ
±Û¾´ÀÌ : ÃÖ°í°ü¸®ÀÚ ³¯Â¥ : 2009-12-01 (È­) 10:42 Á¶È¸ : 241724
±ÛÁÖ¼Ò :
                          

³ª¸¸ÀÇ ps¸¦ ¸¸µé¾îº¸ÀÚ

À± »ó¹è

yundream@joinc.co.kr

±³Á¤ °úÁ¤
±³Á¤ 0.8 2003³â 4¿ù 7ÀÏ 23½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º


1Àý. ¼Ò°³

´ëºÎºÐÀÇ Unix¿î¿µÃ¼Á¦´Â procÆÄÀϽÃÅÛÀ» Á¦°øÇÑ´Ù. proc´Â process infomation pseudoÀÇ ÁÙÀÓ¸»ÀÌ´Ù. Áï procÆÄÀϽýºÅÛÀº Ä¿³Î¿¡¼­Á¦°øÇÏ´Â ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ÀúÀåÇÏ°í ÀÖ´Â ÆÄÀϽýºÅÛÀ̶ó°í Á¤¸®ÇÒ¼ö ÀÖ´Ù.
ÀÌ ¹®¼­´Â procÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇؼ­ ½ÇÁ¦ ÇÁ·Î¼¼½º¸ñ·ÏÀ» Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥Á¦ÀÛ°ú °ü·ÃµÈ ³»¿ëÀ» ´ã°í ÀÖ´Ù. ¹®¼­´Â ¸®´ª½º¿î¿µÃ¼Á¦(kernel 2.4.x)¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾ú´Ù.

2Àý. proc ÆÄÀϽýºÅÛ

2.1Àý. proc ÆÄÀϽýºÅÛ¿¡ ´ëÇÏ¿©

¸®´ª½º Ä¿³ÎÀÇ ÁÖµÈÀÓ¹«Áß Çϳª´Â ÇÁ·Î¼¼½º¸¦ ½ÇÇà½ÃÅ°°í À̵éÀ» À¯ÁöÇÏ´Â ÀÏÀ̸ç, À̸¦ À§Çؼ­ Ä¿³Îµ¥ÀÌŸ±¸Á¶Ã¼¸¦ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ°Ô µÈ´Ù. ±×·±µ¥ ÀÌ·± ÇÁ·Î¼¼½ºÁ¤º¸´Â Ä¿³Î¿¡°Ô¸¸ ÇÊ¿äÇÑ°Ô ¾Æ´Ï°í ½Ã½ºÅÛ °ü¸®ÀÚȤÀº ÇÁ·Î±×·¡¸Óµé¿¡°Ôµµ Àý´ëÀûÀ¸·Î ÇÊ¿äÇÑ Á¤º¸ÀÌ´Ù.
±×·¸´Ù¸é ÇÊ¿äÇÑ Á¤º¸¸¦ ¾ò¾î³»±â À§Çؼ­ ¾î¶»°Ô ÇؾßÇÒ±î? Á÷Á¢ Ä¿³Î¿¡°Ô Ä¿³Îµ¥ÀÌŸ±¸Á¶Ã¼¸¦ ¿äûÇؼ­ ±×°É ÀÏÀÏÀÌ ºÐ¼®ÇØ¾ß ÇÒ±î ? ¹°·Ð ±×·¸°Ôµµ ÇÒ¼ö ÀÖ°ÚÁö¸¸, ÀÌ°ÍÀº ¸Å¿ì º¹ÀâÇÑ ÀÛ¾÷À̸ç, ¶ÇÇÑ (Ä¿³Î¸ðµå¿¡¼­ Á÷Á¢ÀÌ·ç¾îÁö´Â ÀÛ¾÷ÀÓÀ¸·Î)À§ÇèÇÑÀÛ¾÷À̱⵵ ÇÏ´Ù. ±×·¡¼­ ¸®´ª½º½Ã½ºÅÛÀº »ç¿ëÀÚ·¹º§¿¡¼­ ÇÁ·Î¼¼½ºÀÇ »óŸ¦ °£´ÜÇÏ°Ô È®Àΰ¡´ÉÇϵµ·Ï ÇϱâÀ§Çؼ­ procÆÄÀϽýºÅÛÀ» Á¦°øÇÑ´Ù.
¿ì¸®´Â º¹ÀâÇÏ°Ô Ä¿³Î·ÎºÎÅÍ ¿©·¯°¡Áö Ä¿³Îµ¥ÀÌŸ±¸Á¶Ã¼¸¦ ¿äûÇÒÇÊ¿ä ¾øÀÌ procÆÄÀϽýºÅÛ¿¡¼­ Á¦°øÇÏ´Â Á¤º¸µéÀ» ÀоîµéÀÌ´Â Á¤µµ·Î °£´ÜÇÏ°Ô ÇÁ·Î¼¼½º »óŸ¦ ¾ò¾î¿Ã¼ö ÀÖ´Ù.
ÀÛÀº Á¤º¸: procÆÄÀϽýºÅÛÀº ´ëºÎºÐÀÇ À¯´Ð½º¿î¿µÃ¼Á¦¿¡¼­ äÅõǾîÁö°í ÀÖÁö¸¸, µ¥ÀÌŸ¸¦ ÀúÀåÇÏ´Â ¹üÀ§¿Í Æ÷¸Ë¿¡ À־ ¿î¿µÃ¼Á¦°£ Â÷ÀÌÁ¡À» º¸ÀδÙ. ÀúÀåÇÏ´Â ¹üÀ§ÀÇ °æ¿ì ´ëºÎºÐÀÇ À¯´Ð½º¿î¿µÃ¼Á¦´Â ´ÜÁö ÇÁ·Î¼¼½º Á¤º¸¸¸À» Á¦°øÇÏ´Â ¹Ý¸é, ¸®´ª½º´Â ÇÁ·Î¼¼½º Á¤º¸»Ó¸¸ ¾Æ´Ï¶ó ³×Æ®¿÷Á¤º¸, ÆÄÀϽýºÅÛ, µð¹ÙÀ̽º Á¤º¸, ¸Þ¸ð¸®Á¤º¸, CPUÁ¤º¸µî ´Ù¾çÇÑ Á¤º¸µéÀ» Á¦°øÇÑ´Ù.
ƯÈ÷ ¸®´ª½ºÀÇ °æ¿ì ¸î¸îÁ¤º¸µé¿¡ ´ëÇؼ­´Â ´ÜÁö ¿­¶÷¸¸ °¡´ÉÇÑ ¼öÁØÀÌ ¾Æ´Ñ Á÷Á¢¼öÁ¤À» ÅëÇؼ­ Ä¿³ÎÀÇ ÇൿÀ» º¯°æ½ÃÄÑÁÙ¼öµµ ÀÖ´Ù. ÀÌ°ÍÀº ´Ù¸¥ À¯´Ð½º¿¡ ºñÇؼ­ ¸Å¿ì È®ÀåµÈ ºÎºÐÀ̶ó°í ÇÒ¼ö ÀÖ´Ù.
¿¹¸¦ µé¾î ICMP¿äû¿¡ ´ëÇÑ ÀÀ´äÀ» ¸·°í ½Í´Ù¸é "echo 0 /proc/sys/net/ipv4/icmp_echo_ignore_all"ÇÏ´Â Á¤µµ·Î °£´ÜÇÏ°Ô Ä¿³ÎÀÇ ÇൿÀ» º¯°æ½ÃÄÑÁÙ¼ö ÀÖ´Ù. ´Ù¸¥¿î¿µÃ¼Á¦¿¡¼­ÀÇ ÀÌ·¯ÇÑ ÀÛ¾÷Àº Àü¿ë°ü¸®µµ±¸¸¦ »ç¿ëÇϵçÁö ¸®º×ÆÃÀ» ½ÃÅ°µçÁö ÇؾßÇÑ´Ù.
ÀúÀåµÇ´Â Æ÷¸ËÀ» º¸ÀÚ¸é ¸®´ª½º´Â ÀÏ¹Ý ASCII¹®ÀÚ·Î ÀÌ·ç¾îÁø ¹Ý¸é ´Ù¸¥ À¯´Ð½ºµéÀº ±¸Á¶Ã¼·Î Á¤º¸°¡ ÀÌ·ç¾îÁ® ÀÖ´Ù. ¸®´ª½ºÀÇ °æ¿ì ÇÁ·Î¼¼½º Á¤º¸°¡ ÀϹݹ®ÀÚ·Î ÀÌ·ç¾îÁ® À־ Á÷°üÀûÀ¸·Î È®ÀÎÇϱ⿡ ÁÁ±â´Â ÇÏÁö¸¸ ÇÁ·Î±×·¡¹ÖÀ» ÇÒ°æ¿ì À̸¦ ÆĽÌÇؾߵDZ⠶§¹®¿¡ ´Ù¸¥ À¯´Ð½ºµé¿¡ ºñÇؼ­ Á» ºÒÆíÇÑÁ¡ÀÌ µÇ±âµµ ÇÑ´Ù.

2.2Àý. ÇÁ·Î¼¼½º Á¤º¸°¡Á®¿À±â

¸®´ª½ºÀÇ °æ¿ì ±â´ÉÀÌ È®ÀåµÇ±ä ÇßÁö¸¸ procÆÄÀϽýºÅÛÀÇ °¡ÀåÅ« »ç¿ë¸ñÀûÀº ¹¹´Ï¹¹´Ï Çصµ ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ¾ò¾î¿À´Â ÀÏÀÌ´Ù.
±âº»ÀûÀ¸·Î procÆÄÀϽýºÅÛÀº /procµð·ºÅ丮¾È¿¡¼­ ÀÌ·ç¾îÁö¸ç, ÇÁ·Î¼¼½ºÁ¤º¸´Â /procµð·ºÅ丮¹Ø¿¡ °¢ ÇÁ·Î¼¼½ºÀÇ PID¸¦ À̸§À¸·ÎÇÏ´Â ¼­ºêµð·ºÅ丮 ¹Ø¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. ¿¹¸¦µé¾î PID°¡ 912ÀÎ ÇÁ·Î¼¼½º¶ó¸é, 912 ÇÁ·Î¼¼½ºÀÇ Á¤º¸´Â /proc/912(ÀÌÇÏ /proc/[PID])¹Ø¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù.
/proc/[PID] µð·ºÅ丮¹Ø¿¡´Â ´Ù½Ã ¸î°³ÀÇ µð·ºÅ丮¿Í ¸î°³ÀÇ ÆÄÀϵé·Î ÀÌ·ç¾îÁ® ÀÖ´Ù.
 /proc/[PID]/ -+-- cmdline
               |
               +-- cwd
               |
               +-- environ
               |
               +-- exe 
               |
               +-- fd -------+-- 0
               |             |
               +-- maps      +-- 1
               |
               +-- root 
               |
               +-- stat 
               |
               +-- statm 
               |
               +-- status
			
¸®´ª½ºÀÇ °æ¿ì À§¿Í °°Àº ÆÄÀϵé·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. °¢ ÆÄÀÏÀÌ °¡Áö°í ÀÖ´Â ÀÚ¼¼ÇÑ Á¤º¸µé¿¡ ´ëÇؼ­´Â procÀÇ manÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.
¸®´ª½ºÀÇ °æ¿ì °¢°¢ÀÇ Á¤º¸µéÀº ÀÏ¹Ý ASCIIÅؽºÆ®¹®ÀÚ·Î ÀÌ·ç¾îÁ®ÀÖ°í, ´ëºÎºÐÀÇ °æ¿ì °ø¹é¹®ÀÚ(' ')·Î ÇʵåÀÇ ±¸ºÐÀÌ µÇ¾îÀÖÀ½À¸·Î, ½±°Ô ¿øÇÏ´Â Á¤º¸µéÀ» ¾ò¾î¿Ã¼ö ÀÖ´Ù.

3Àý. ³ª¸¸ÀÇ psÁ¦ÀÛ

ÇÁ·Î¼¼½ºÁ¤º¸¸¦ È®ÀÎÇϱâ À§Çؼ­ ¸®´ª½º´Â ps¶ó´Â µµ±¸¸¦ Á¦°øÇÑ´Ù. ps¸¦ »ç¿ëÇÔÀ¸·Î½á, ¿ì¸®´Â ÇÁ·Î¼¼½ºÀÇ °¢Á¾Áß¿äÇÑ Á¤º¸µéÀ» ¾ò¾î¿À°í, ¾ò¾î¿Â Á¤º¸´Â ½Ã½ºÅÛ°ü¸®¿Í ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ Áß¿äÇÑ µ¥ÀÌŸ·Î »ç¿ëÇÑ´Ù.
±×¸² 1. ps¸¦ ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º»óÅ ȮÀÎ
¿ì¸®°¡ ¾ò°íÀÚÇÏ´Â ÇÁ·Î¼¼½ºµ¥ÀÌŸ´Â ´ÙÀ½°ú °°´Ù.
  • ÇÁ·Î¼¼½ºÀÇ ½ÇÇàÀ¯Àú
  • ÇÁ·Î¼¼½º ¾ÆÀ̵ð(PID)
  • ºÎ¸ðÇÁ·Î¼¼½º ¾ÆÀ̵ð(PPID)
  • ºÎ¸ðÇÁ·Î¼¼½º »óÅÂ(Zombie, Run, Sleep µî)
  • ÇÁ·Î¼¼½º À̸§
  • CPU »ç¿ëÀ²(%)
  • VMEM(°¡»ó¸Þ¸ð¸®) »ç¿ëÀ²
ps¿¡ ºñÇؼ­ ¸î°¡Áö ºüÁø°ÍµéÀÌ ÀÖ±äÇÏÁö¸¸ ÇÁ·Î¼¼½º¸¦ °ü¸®Çϴµ¥ ÇÊ¿äÇÑ ÃÖ¼ÒÇÑÀÇ Á¤º¸´Â °¡Á®¿Â´Ù.
ÀÌ psµµ ±âº»ÀûÀ¸·Î procÆÄÀϽýºÅÛ¿¡ÀÖ´Â ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ÀÌ¿ëÇؼ­ °¡Á®¿Â´Ù. ´õ Á¤È®È÷ ¸»ÇÏÀÚ¸é stats¿¡¼­ ÇÊ¿äÇÑ Á¤º¸¸¦ °¡Á®¿Â´Ù. ´ÙÀ½Àº ½ÇÁ¦ statsÀÇ ÆÄÀϳ»¿ëÀÌ´Ù. ¿ø·¡´Â ÇϳªÀÇ ÇàÀ¸·Î µÇ¾îÀÖÀ¸³ª Ãâ·ÂÇϱ⠽±°Ô ¿©·¯°³ÀÇ ÇàÀ¸·Î ºÐ¸®Çß´Ù.
[root@localhost 2489]# cat stat
2489 (vi) T 2251 2489 2251 772 2581 0 187 0 455 0 12 4 0 0 9 0 0 0 181334 
6950912 0 4294967295 134512640 136413760 3221223720 3221222316 
1074893473 0 0 12288 1333808895 3222310480 0 0 17 0
		
¿ì¸®°¡ ¸¸µé°íÀÚÇÏ´Â ÇÁ·Î±×·¥Àº À§ÀÇ stat Á¤º¸¸¦ ºÐ¼®ÇÏ°Ô µÉ°ÍÀÌ´Ù.

3.1Àý. ¿¹Á¦ÄÚµå

ÇÁ·Î±×·¥ÀÇ À̸§Àº qps·Î Çϵµ·Ï ÇÏ°Ú´Ù.
ÀÌÇÁ·Î±×·¥ÀÇ ½î¾²´Â ¸î°³ÀÇ ¸ðµâ·Î ÀÌ·ç¾îÁ® ÀÖÀ¸¸ç, ½î¾²°ü¸®¸¦ À§Çؼ­ MakefileÀ» »ç¿ëÇÒ°ÍÀÌ´Ù. ´ÙÀ½Àº ¸¸µé°íÀÚ ÇÏ´Â qpsÀÇ ½î¾²Æ®¸® ±¸Á¶ÀÌ´Ù.
-+-- Makefile
 |
 +-- main.cc
 |
 +-- proc.cc
 |
 +-- qps.cc
 |
 +-- include ----+-- proc.h 
                 |
                 +-- qps.h
			
´ÙÀ½Àº °¢ ÆÄÀϵ鿡 ´ëÇÑ ¼³¸íÀÌ´Ù.
Ç¥ 1. qps ½î¾²ÆÄÀÏ ¼³¸í
Makefile make¿¡¼­ »ç¿ëÇÒ make rule ÆÄÀÏ
main.cc mainÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â ÄÚµå, ÃÖ¼ÒÇÑÀÇ Äڵ常À» °¡Áø´Ù
proc.cc ½ÇÁ¦ procÆÄÀϽýºÅÛÀ» ÂüÁ¶Çؼ­ °¢Á¾ ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ¾ò¾î¿Â´Ù.
qps.cc proc.cc¿¡ Á¤ÀÇµÈ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ¾ò¾î¿À°í À̸¦ È­¸é¿¡ º¸±âÁÁ°Ô Ãâ·ÂÇÑ´Ù.
include/proc.h proc.cc¿¡¼­ »ç¿ëµÉ ÇÔ¼ö¼±¾ð
include/qps.h qps.cc¿¡¼­ »ç¿ëµÉ ÇÔ¼ö¼±¾ð

3.1.1Àý. Makefile

½î¾²ÄÚµåµéÀ» °ü¸®Çϱâ À§ÇÑ MakefileÀÌ´Ù. ÀÌÇØÇϴµ¥ º°´Ù¸¥ ¾î·Á¿òÀº ¾øÀ»°ÍÀÌ´Ù.
	
#############################################################################
# Makefile for building qps
# Generated by tmake at 23:10, 2003/04/08
#     Project: qps
#    Template: app
#############################################################################

####### Compiler, tools and options

CC  =   gcc
CXX =   g++
CFLAGS  =   -pipe -Wall -W -O2 -DNO_DEBUG
CXXFLAGS=   -pipe -Wall -W -O2 -DNO_DEBUG
INCPATH =   -I./include
LINK    =   g++
LFLAGS  =

TAR =   tar -cf
GZIP    =   gzip -9f

####### Files

HEADERS =   include/proc.h \
        include/qps.h
SOURCES =   main.cc \
        proc.cc \
        qps.cc
OBJECTS =   main.o \
        proc.o \
        qps.o

TARGET  =   qps
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) qps.tar qps.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST)
    $(GZIP) qps.tar

clean:
    -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET)
    -rm -f *~ core

####### Compile

main.o: main.cc

proc.o: proc.cc

qps.o: qps.cc
				

3.1.2Àý. proc.h, proc.cc

½ÇÁúÀûÀ¸·Î stat¸¦ ºÐ¼®Çؼ­ ÇÁ·Î¼¼½ºµ¥ÀÌŸ¸¦ ¾ò¾î¿À´Â ÇÔ¼öµéÀ» Æ÷ÇÔÇÑ´Ù. opendir(2)ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ /proc µð·ºÅ丮¹Ø¿¡ ÀÖ´Â ÆÄÀϵéÀÇ ¸ñ·ÏÀ» ¾ò¾î¿À°í, ¸¸¾à ¾ò¾î¿Â ÆÄÀÏÀÌ µð·ºÅ丮À̸鼭 ¼ýÀڷεǾîÀÖÀ»°æ¿ì ÇÁ·Î¼¼½ºÁ¤º¸ µð·ºÅ丮¶ó°í ÆÇ´ÜÇÏ°í, ¼­ºêµð·ºÅ丮¿¡ ÀÖ´Â stat ÆÄÀÏÀ» ÀоîµéÀδÙ.
ÀоîµéÀÎ statÁ¤º¸´Â " "¸¦ ±âÁØÀ¸·Î ÆĽÌÇؼ­ ¹è¿­(vector)¿¡ Áý¾î³Ö´Â´Ù. ´õºÒ¾î ¿ì¸®°¡ ¸¸µé°íÀÚÇÏ´Â qpsÇÁ·Î±×·¥Àº ÇØ´çÇÁ·Î¼¼½ºÀÇ À¯ÀúÀ̸§µµ °¡Á®¿Í¾ß ÇÑ´Ù. /proc/[PID]/stat ÆÄÀÏÀº ÇÁ·Î¼¼½º¼ÒÀ¯ÀÚÀÇ ±ÇÇÑÀ¸·Î ¸¸µé¾îÁø´Ù. ¿ì¸®´Â stat(2)°è¿­ÇÔ¼ö¸¦ »ç¿ëÇϸé ÇØ´ç ÆÄÀÏÀÇ UID¸¦ ¾ò¾î¿Ã¼ö ÀÖ´Ù´Â°É ¾Ë¼öÀÖ´Ù. ¶ÇÇÑ getpwuid(3)¸¦ ÀÌ¿ëÇϸé ÇØ´ç UID¿¡ ´ëÇÑ À¯ÀúÀ̸§µµ ¾ò¾î¿Ã¼ö ÀÖ´Ù.
ÀÌ·¸°Ô Çؼ­ ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡ ´ëÇÑÁ¤º¸°¡ ¸¸µé¾îÁ³´Ù. ±×·±µ¥ ¿ì¸®´Â ÇÁ·Î¼¼½ºÀÇ ¸ñ·ÏÀ» °¡Á®¿Í¾ß ÇÔÀ¸·Î À̵é Á¤º¸´Â ´Ù½Ã ¹è¿­ÀÇ ¿ø¼Ò·Î µé¾î°¡¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÀڷᱸÁ¶(¹è¿­ÀÇ ¹è¿­)¸¦ À§Çؼ­ ÇÊÀÚ´Â (¼ÓÆíÇÏ°Ô)vector¸¦ »ç¿ëÇß´Ù.
´ÙÀ½Àº ½ÇÁ¦ ÄÚµåµéÀÌ´Ù. À§ÀÇ ³»¿ëµéÀº Äڵ带 ÅëÇؼ­ ÀÌÇØÇϱ⠹ٶõ´Ù. ±×¸®¾î·Á¿î ÄÚµåµéÀº ¾Æ´ÔÀ¸·Î ÁÖ¼®¸¸À¸·Îµµ ÃæºÐÈ÷ ÀÌÇØ°¡´ÉÇÒ°ÍÀÌ´Ù.
¿¹Á¦ : include/proc.h
#ifndef _PROC_H_
#define _PROC_H_

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <vector>
#include <dirent.h>
#include <string>

using namespace std;

// ÇÁ·Î¼¼½º µ¥ÀÌŸ ÀúÀå 
typedef struct _process_info
{
    char            username[32];  // À¯ÀúÀ̸§
    vector<string>  process;       // statÁ¤º¸µéÀÌ µé¾î°£´Ù   	
} process_info;

// ÇÁ·Î¼¼½ºÀÇ ¸®½ºÆ®¸¦ À¯ÁöÇϱâ À§ÇÑ ÀڷᱸÁ¶
// °á±¹Àº ¹è¿­ÀÇ ¹è¿­ÀÌ´Ù. 
typedef vector<process_info> Plist;

class Proc
{
    private:
        int         Processnum;     // ÇöÀç ÇÁ·Î¼¼½º °¹¼ö
        Plist       ProcList;       // ÇÁ·Î¼¼½ºÁ¤º¸ ¸®½ºÆ®

    public:
      
        // »ý¼ºÀÚ¹× ¼Ò¸êÀÚ 
        Proc();
        ~Proc();

        void            MakeProcInfo();      // ÇÁ·Î¼¼½º Á¤º¸¸¦ ¾ò¾î¿Â´Ù.
        vector<string>  ProcParser(char *);  // statÆÄÀÏÀ» ÆĽÌÇÑ´Ù 
        int             ProcNum();           // ÇöÀçÇÁ·Î¼¼½º °¹¼ö¸¦ ³Ñ°ÜÁØ´Ù.
        int             IsDigit(char *);     // ¹®ÀÚ¿­ÀÌ ¼ýÀÚÀÎÁö È®ÀÎÇÑ´Ù. 
        Plist           GetProcList();       // ÇÁ·Î¼¼½ºÁ¤º¸ ¸®½ºÆ®¸¦ µÇµ¹·ÁÁØ´Ù.
};

#endif
				
 
 
¿¹Á¦ : proc.cc
#include "proc.h"
#include <iostream>
#include <pwd.h>
#include <sys/types.h>
#include <sys/stat.h>

Proc::Proc()
{
}

Proc::~Proc()
{
}

/*
 * ÇÁ·Î¼¼½º Á¤º¸¸¦ °¡Á®¿Â´Ù. 
 * ±×·¯±â À§Çؼ­ /proc/[PID]/statÆÄÀÏÀ» ÀоîµéÀÌ°í À̸¦ 
 * Çʵ庰·Î ÆĽÌÇÑ´Ù. ÆĽÌÀº " "¹®ÀÚ¸¦ ±âÁØÀ¸·Î ÇÑ´Ù.  
 * ¶ÇÇÑ ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÑ À¯Àú À̸§µµ ¾ò¾î¿Â´Ù. 
 */
void Proc::MakeProcInfo()
{
    DIR *directory;
    struct dirent *entry = NULL;
    char proc_file[40];
    vector<string> procinfo; 
    process_info lprocess_info;
    struct stat lstat;

    ProcList.clear();

    // proc µð·ºÅ丮¸¦ ¿­¾î¼­ ÆÄÀÏ(µð·ºÅ丮Æ÷ÇÔ)ÀÇ ¸®½ºÆ®¸¦ 
    // ¾ò¾î¿Â´Ù.
    if ((directory = opendir("/proc")) == NULL)
    {
        perror("opendir error :");
        exit(0);
    }

    while((entry = readdir(directory)) != NULL)
    {
        if (strcmp(entry->d_name, ".") !=0 &&
            strcmp(entry->d_name, "..") != 0)
        {
            sprintf(proc_file,"/proc/%s/stat", entry->d_name);
            // stat ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇÏ°í È®ÀÎÇÏ°í
            if (access(proc_file, F_OK) != 0)
            {
                continue;
            }

            // µð·ºÅ丮 À̸§ÀÌ ¼ýÀÚÀÎÁö È®ÀÎÇÑ´Ù. 
            // µð·ºÅ丮 À̸§ÀÌ ¼ýÀÚ¶ó¸é À̸¦ ÆĽÌÇÑ´Ù.  
            // ¶ÇÇÑ statÆÄÀÏÀÇ ¼ÒÀ¯ UID¸¦ ÀÌ¿ëÇؼ­ À¯ÀúÀ̸§µµ ¾ò¾î¿Â´Ù. 
            if (IsDigit(entry->d_name))
            {
                struct passwd *upasswd;
                stat(proc_file,&lstat);
                lprocess_info.process  = ProcParser(proc_file);

                upasswd = getpwuid(lstat.st_uid);
                strncpy(lprocess_info.username, upasswd->pw_name, 32);
                if(atoi(lprocess_info.process[0].c_str()) == atoi(entry->d_name))
                {
                    ProcList.push_back(lprocess_info);
                }
            }
            else
            {
            }
        }
    }

}

/*
 * MakeProcInfo¸¦ ÅëÇظ¸µé¾îÁø ÇÁ·Î¼¼½ºÁ¤º¸ ¸®½ºÆ®¸¦ µÇµ¹·ÁÁØ´Ù.
 */
Plist Proc::GetProcList()
{
    return ProcList;
}

/* 
 * ÇÁ·Î¼¼½ºÀÇ °¹¼ö¸¦ µÇµ¹·ÁÁØ´Ù.  
 * °¹¼ö´Â ÇÁ·Î¼¼½ºÀڷᱸÁ¶(vector)ÀÇ ¿ø¼ÒÀÇ Å©±â°¡ µÈ´Ù. 
 */
int Proc::ProcNum()
{
    return ProcList.size();
}

/*
 * stat ÆÄÀÏÀ» ¿­¾î¼­ " "¹®ÀÚ¸¦ ±âÁØÀ¸·Î ÆĽÌÇؼ­ 
 * ¹è¿­(vector)¿¡ Áý¾î³Ö´Â´Ù.   
 */
vector<string> Proc::ProcParser(char *proc_file)
{
    FILE *fp;
    char buf[512] = {0x00,};
    char field[80];
    int index = 0;
    unsigned int i, j = 0;
    vector<string> vproc;

    fp = fopen(proc_file, "r");
    if (fp == NULL)
    {
        perror("error : ");
        exit(0);
    }

    memset(field, 0x00, 80);
    fgets(buf, 511, fp);
    for(i = 0; i < strlen(buf); i++)
    {
        if (buf[i] != ' ' && i != (strlen(buf) -1))
        {
            field[j++] = buf[i];
        }
        else
        {
            if (index == 1)
            {
                field[strlen(field)-1] = 0x00;
                vproc.push_back(field+1);
            }
            else
                vproc.push_back(field);
            memset(field, 0x00, 80);
            j = 0;
            index++;
        }
    }
    fclose(fp);
    return vproc;
}   

/*
 * ÆÄÀÏÀ̸§ÀÌ ¼ýÀÚÀÎÁö È®ÀÎÇÑ´Ù. 
 */ 
int Proc::IsDigit(char *str)
{
    int i;
    for (i = 0; i < strlen(str); i++)
    {
        if (isdigit(str[i])==0)
            return 0;
    }
    return 1;
}
				

3.1.3Àý. qps.h, qps.cc

À§¿¡¼­ ¼³¸íÇÑ proc.cc¸¦ ÅëÇؼ­ stat¸¦ ºÐ¼®ÇÑ ÇÁ·Î¼¼½ºµ¥ÀÌŸ°¡ ¸¸µé¾îÁ³À½À¸·Î ÀÌÁ¦ ÀÌ°ÍÀ» °¡Áö°í ¿Í¼­ È­¸é¿¡ Àû´çÈ÷ »Ñ·ÁÁà¾ß ÇÒ°ÍÀÌ´Ù. ´ÙÀ½Àº ÀÌ¿Í °ü·ÃµÈ ÇÔ¼öµéÀÌ´Ù. ÇÁ·Î¼¼¼¼ÀÇ CPU»ç¿ëÀ²À» °¡Á®¿À±â À§ÇÑ getcputime()ÇÔ¼ö¿Ü¿¡´Â º°Æ¯º°ÇÑ°Ç ¾øÀ»°ÍÀÌ´Ù.
include/qps.h
#ifndef _QPS_H_
#define _QPS_H_
#include "proc.h"

// ÇÁ·Î¼¼½º ¸ñ·ÏÀ» Àû´çÈ÷ °¡°øÇؼ­ Ãâ·ÂÇÑ´Ù.
int viewProc();

// °¢ÇÁ·Î¼¼½ºÀÇ CPU »ç¿ëÀ²À» ¾ò¾î¿Â´Ù. 
int getcputime(ulong utime, ulong stime, ulong starttime, int seconds);

// OSÀÇ uptime(ºÎÆÃÈÄ Áö±Ý±îÁöÀÇ °¡µ¿½Ã°£)À» ¾ò¾î¿Â´Ù.  
int uptime();
#endif
				
qps.cc
// Local Çì´õÆÄÀÏ
#include "qps.h"

// Ç¥ÁØ C++ Çì´õÆÄÀϵé
#include <iostream>
#include <vector>
#include <string>

// Ç¥ÁØ C Çì´õÆÄÀÏ
#include <stdio.h>

using namespace std;

/*
 * ÇÁ·Î¼¼½ºÁ¤º¸ ¸®½ºÆ®¸¦ ¾ò¾î¿Í¼­ º¸±âÁÁ°Ô Ãâ·ÂÇÑ´Ù.  
 */
int viewProc()
{
    Proc *mproc;
    unsigned i;
    int pcpu;
    int seconds = 0;

    Plist ProcList;
    mproc = new Proc;
    mproc->MakeProcInfo();

    // ÇÁ·Î¼¼½ºÁ¤º¸ ¸®½ºÆ®¸¦ ¾ò¾î¿Â´Ù. 
    ProcList = mproc->GetProcList(); 

    int total_cpu = 0;  

    // OSÀÇ uptimeÀ» ¾ò¾î¿Â´Ù. 
    // ¾ò¾î¿Â Á¤º¸´Â ÇÁ·Î¼¼½ºÀÇ CPU »ç¿ëÀ²À» ±¸Çϱâ À§ÇÑ ±âÃÊÁ¤º¸·Î 
    // »ç¿ëµÈ´Ù.  
    seconds = uptime();
    printf("%-10s %7s %7s %2s %16s %4s %9s\n", "USER", "PID", "PPID",
                                              "ST", "NAME", "CPU", "VMEM"); 
    printf("==============================================================\n");
    for (i = 0; i < mproc->ProcNum(); i++)
    {
        // CPU»ç¿ëÀ²À» ¾ò¾î¿Â´Ù. 
        pcpu = getcputime(atol(ProcList[i].process[13].c_str()),
            atol(ProcList[i].process[14].c_str()),
            atol(ProcList[i].process[21].c_str()), seconds);

        // º¸±âÁÁ°Ô Ãâ·ÂÇÑ´Ù. 
        printf("%-10s %7s %7s %2s %16s %2d.%d %9s\n", ProcList[i].username, 
                                    ProcList[i].process[0].c_str(),
                                    ProcList[i].process[3].c_str(),
                                    ProcList[i].process[2].c_str(), 
                                    ProcList[i].process[1].c_str(), pcpu/10, pcpu%10,
                                    ProcList[i].process[22].c_str());
    }   
    return 1;
}

/*
 * ÇÁ·Î¼¼½ºÀÇ CPU»ç¿ëÀ²À» ¾ò±â À§Çؼ­ »ç¿ëÇÑ´Ù. 
 * utime     : À¯Àú¸ðµå¿¡¼­ ÇÁ·Î¼¼½º°¡ ½ºÄÉÁ층µÇ¸é¼­ »ç¿ëÇÑ jiffies ¼öÀÌ´Ù. 
 *             ÇÁ·Î¼¼½º°¡ ½ºÄÉÁ층µÉ¶§¸¶´Ù Áõ°¡µÇ´Â ¼öÄ¡ÀÌ´Ù.  
 * stime     : Ä¿³Î¸ðµå¿¡¼­ ÇÁ·Î¼¼½º°¡ ½ºÄÉÁ층µÇ¸é¼­ »ç¿ëÇÑ jiffies ¼öÀÌ´Ù. 
 * starttime : ¿î¿µÃ¼Á¦°¡ ½ÃÀÛµÇ°í³ª¼­ ¸î jiffies°¡ Áö³­ÈÄ 
 *             ÇÁ·Î¼¼½º°¡ ½ÃÀ۵Ǿú´ÂÁö 
 */
int getcputime(ulong utime, ulong stime, ulong starttime, int seconds)
{   
    unsigned long long total_time;
    int pcpu=0;

    // À¯Àú jiffies ¿Í Ä¿³Î jiffies¸¦ ´õÇÑ´Ù.
    total_time = utime + stime;

    // 100Àº HZ°ªÀÌ´Ù. HZÀÌ ÀÛ¾ÆÁú¼ö·Ï context switching°¡ »¡¶óÁø´Ù.  
    // ÀÌ°ªÀº /usr/include/asm/param.h¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. 
    // 100. ´ë½Å¿¡ (unsigned long long)HZ Á¤µµ·Î Äڵ带 
    // ÀÛ¼ºÇÏ´Â°Ô Á»´õ ¾ÈÀüÇÒ°ÍÀÌ´Ù. ¿©±â¿¡¼­´Â Á÷°üÀûÀ¸·Î ¼³¸íÇϱâ 
    // À§Çؼ­ ÇϵåÄÚµùÇß´Ù.  
    seconds = seconds - (int)(starttime/100.);

    if(seconds)
    {
        pcpu = (int)(total_time * 1000ULL/100.)/seconds;
    }

    return pcpu;
}

/*
 * ¿î¿µÃ¼Á¦°¡ ºÎÆÃÇÏ°í ³ª¼­ ¾ó¸¶ÀÇ ½Ã°£ÀÌ Áö³µ´ÂÁö
 */
int uptime()
{
    FILE *fp;
    char buf[36];
    double stime;
    double idletime;

    if ((fp = fopen("/proc/uptime", "r")) == NULL)
    {
        perror("fopen error : ");
        exit(0);
    }
    fgets(buf, 36, fp);
    sscanf(buf, "%lf %lf", &stime, &idletime);
    fclose(fp);

    return (int)stime;
}
				

3.1.4Àý. main.cc

mainÇÔ¼ö´Ù. ´õÀÌ»ó ¼³¸íÇÒ ÇÊ¿äµµ ¾ø´Â °£´ÜÇÑ ÄÚµåÀÌ´Ù.
¿¹Á¦ main.cc
#include <iostream>
#include "qps.h"

int main(int argc, char **argv)
{
        viewProc();
}
				

3.2Àý. Å×½ºÆ®

ÄÄÆÄÀÏÀº make¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. ´ÙÀ½Àº ¿ì¸®°¡ ¸¸µç ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ È­¸éÀÌ´Ù.
±×¸² 2. qps Å×½ºÆ®È­¸é
±×·°Àú·° Àßµ¹¾Æ°¡´Â°É È®ÀÎÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.

4Àý. °á·Ð

ÀÌ»ó procÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇؼ­ ¾î¶»°Ô ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ¾ò¾î¿À´ÂÁö¿¡ ´ëÇؼ­ ¾Ë¾Æ°í, ÀÌ ¾ò¾î¿ÂÁ¤º¸¸¦ °¡°øÇؼ­ ½ÇÁ¦ °ü¸®ÀÚ³ª, ÇÁ·Î±×·¡¸Ó¿¡°Ô À¯¿ëÇÑ Á¤º¸·Î ¸¸µå´Â ¹æ¹ýÀ» ¾Ë¾Æº¸¾Ò´Ù.
½Ã°£ÀÌ ³²´Â´Ù¸é ¸î°¡Áö ´Ù¸¥ ºÎ°¡ÀûÀÎ ½Ã½ºÅÛÁ¤º¸±îÁö Æ÷ÇÔ½ÃÄѼ­ Top¿Í °°Àº Á»´õ °­·ÂÇÑ ÇÁ·Î±×·¥À» ¸¸µå´Â°Íµµ Àç¹ÌÀÖÀ»°ÍÀÌ´Ù. ȤÀº QT, GTKµîÀ» ÀÌ¿ëÇؼ­ GUIȯ°æ¿¡¼­ ÀÛµ¿ÇÏ´Â ½Ã½ºÅÛÇÁ·Î¼¼½º ¸ð´ÏÅ͸µ ÇÁ·Î±×·¥À» ¸¸µé¼öµµ ÀÖÀ»°ÍÀÌ´Ù. 

À̸§ Æнº¿öµå
ºñ¹Ð±Û (üũÇÏ¸é ±Û¾´À̸¸ ³»¿ëÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.)
¿ÞÂÊÀÇ ±ÛÀÚ¸¦ ÀÔ·ÂÇϼ¼¿ä.
   

 



 
»çÀÌÆ®¸í : ¸ðÁö¸®³× | ´ëÇ¥ : ÀÌ°æÇö | °³ÀÎÄ¿¹Â´ÏƼ : ·©Å°´åÄÄ ¿î¿µÃ¼Á¦(OS) | °æ±âµµ ¼º³²½Ã ºÐ´ç±¸ | ÀüÀÚ¿ìÆí : mojily°ñ¹ðÀÌchonnom.com Copyright ¨Ï www.chonnom.com www.kyunghyun.net www.mojily.net. All rights reserved.