티스토리 뷰

https://kldp.org/node/31797






왜 while, for문을 돌리면 CPU가 100%까지 올라가죠??



ole2000의 아바타

지금 JAVA로 진행중인 프로젝트가 막바지에 다달았습니다.

이제까지 짠 모든것들을 GUI로 올리기만 하면 됩니다.

근데 마지막에 문제가 생겨버렸네요..

물론 다른 방법으로하면 쉽게 해결이 가능하지만..

교수가 Driver Code를 짜주고 우리는 그 Driver Code를 기반으로

우리가 짠 시뮬레이션을 돌려야합니다.

교수가.. 짜준 Driver Code의 마지막에 run()이라는 메쏘드를

이용해서.. 시뮬레이션을 돌리게끔합니다.

자세히 설명을 하자면 복잡하고.. 글이 길어질것 같고..

어쨌든... while문을 반드시 사용해야합니다.

run()이라는 메소드는..

public void run()
{
while(running)
{
}
}

이렇습니다.

보시다시피 while문속에서 하는일이 없습니다. 그냥 running이 true인동안

계속 돌려주기만 하면 됩니다.

근데 문제는 이렇게해야 프로그램이 돌아가는데..

CPU가 100%까지 올라가버린다는거죠..

그래서 해결책으로..

Thread.sleep(10000L);

이라는걸 사용했습니다.

그랬더니.. CPU 사용율이 줄어들더군요..

여기서 제가 궁금한거는...

PHP도 그랬고.. 제가 사용해본 프로그램언어에서는 모두 반복문을

사용하게되면 CPU가 항상 100%까지 올라가버립니다.

왜 꼭 CPU가 100%까지 올라가야 되죠??

그리고 사실 위에서 Thread.sleep(10000L); 라는것이

하는일을 정확히 모릅니다. 저렇게하면 CPU사용율이 줄어든다는건

알았지만.. 왜?? 어떻게해서 줄어드는지는 아직 모르겠습니다.

그렇다면.. 저렇게하면 while문을 사용하더라도.. CPU사용율을

줄일수있는데.. 왜 첨부터 JAVA나 PHP언어 자체를 개발할당시부터

저런 방법이나.. 여타 다른 방법을 통해서 CPU사용율을 낮추지 못했나요??

그냥.. 프로그래밍을 하다가.. 상당히 궁금해서 물어보는겁니다.

아직 이론적으로 깊이배우지 못한 상태라.. 궁금증이 상당히 많네요...

간단하게 설명 가능하다면 부탁드리겠습니다.

oprsystem의 아바타

안녕하세요..프로그램은 프로그램 카운터(PC)에 의한 instruct

안녕하세요..
프로그램은 프로그램 카운터(PC)에 의한 instruction 의 패치를 의미 합니다.
우리가 글을 한 단어씩만 읽을수 있다고 가정한다면 글의 흐름을(PC) 라고 할수 있고 단어를 TEXT (instruction) 이라고 할수 있습니다.
따라서 while(1) ; 이것은 
loop : jump loop
즉 이런식으로 읽었던곳 을 계속 읽고 있으라고 cpu 에게 시킨것과 같지요. 즉 눈동자를 고정하고 한단어만 쳐다 보는셈입니다.
커널(OS) 을 우리의 뇌라고 가정한다면 
Thread.sleep(10000L); 이것은 뇌에게 잠시 쉬었다가 (슬립) 다시 아까 봤던곳을 다시 보라는 의미 입니다.
범용 운영체제들은 cpu 시간을 쪼개서 쓰레드가 돌기 때문에 쓰레드가 잠들어 있는동안은 cpu시간을 쓰지 않습니다.따라서 cpu 점유율이 낮아 지는것이지요.

무지한 제가 답변을 올려서 오히려 혼란을 더 드리지 않나 염려 됩니다.
모쪼록 도움이 되길 빌겠습니다. 
그리고 잘못된점 있으면 질책 부탁 드립니다..

모래요정

황혼보다 어두운 자여 
내 몸에 흐르는 피보다 더 붉은 자여 
시간의 흐름 속에 파뭍힌 위대한 그대의 이름을 걸고 나 여기서 어둠에 맹세하노라 
우리 앞을 가로막고 있는 모든 어리석은 자 들에게 
나와 그대의 힘을 
위대한 파멸의 힘을 보여줄 것을

ㅡ,.ㅡ;;의 아바타

음..어떤대기를 할것이면..인트럽트로 깨어나든지 유닉스에서는 알람..

음..어떤대기를 할것이면..
인트럽트로 깨어나든지 유닉스에서는 알람..
최소한 루프를 돌때는 내부에 sleep 을 줘야합니다.
아무것도 주지않은 것은 사실말도안되는..ㅎㅎ
그것은 당연히 시퓨가 100%일하게 만드는것입니다.
말그대로 쉴새없이 일하도록 프로그램했기때문이죠..
쉬지않고 일하라고 했는데 시퓨가농땡이 치고 있다면 컴타 뽀싸야합니다..

----------------------------------------------------------------------------

alsong의 아바타

while(1){} 일입니다. CPU(OS)입장에서는 최대한 많은 루

while(1){} 
일입니다. CPU(OS)입장에서는 최대한 많은 루틴을 수행하려고 하겠죠.
sleep을 사용하면 CPU점유율은 떨어지지만 일을 수행한 양이 떨어집니다.
1억번 돌거 만번으로 줄듯이.....
거꾸로 생각하시면 해야할 일이 있는데 CPU를 100%사용 안할 이유가 없습니다.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

운형의 아바타

루프를 인스트럭션 측면에서 설명한게 100%라는 수치를 설명하기에 적절하

루프를 인스트럭션 측면에서 설명한게 100%라는 수치를 설명하기에 적절하네요.

sleep시 CPU점유 율이 떨어 지는 건 다음과 같이 설명 가능합니다.
프로세스 혹은 스레드가 CPU를 점유하고 일정 시간 사용하고 종료 되거나 다시 CPU를 사용하기 위해 대기 열에 들어가겠죠. 이때 대기 열에 들어가는 것이 자발 적인 경우와 스케줄러에 의한 것으로 구분이 가능한데, sleep, pause 등의 함수 들은 자발적으로 CPU를 반납하는 형식으로 구현 되있습니다. 윈도우쪽에서의 구현은 대강 그렇다는 정도구, 리눅스 쪽에서는 거의 확실(? 눈으로 확인 안해봐서 ㅎㅎ)

운영 체제 구현에 관련된 책들을 보시면 이런 부분에 관한 이야기가 꽤 나오죠...
메모리 관리하고 프로세스 관리가 운영체제의 상당 부분을 차지하니까.. -_0

Do you think that's the air you are breathing now?

sisap의 아바타

그냥 지나가다 들렸는데..

읽다보니 의문이 꼬리에 꼬리를..-_-;;

평소에 별로 생각안했던 부분인데 문득 생각해 보니 그러네요..흠..

그래서 저도 그냥 메인 함수에서 for( ; ; ) {} 도는 프로세스와 for( ; ; ) {usleep(1);} 를 도는 프로세스 두개를 만들어서 돌려 봤습니다. 리눅스에서..

for( ; ; ) {}는 당연히 프로세스가 cpu 100%가까이 먹고요.. idle타임은 빵에 가까워지고..

그럼 단지 usleep(1) 한줄 추가한 프로세스 같은 경우는 단지(!) 1초도 아니고 1 마이크로 세컨드(마이크로 세컨든지 나노세컨든지는 지금 잘 모르겠지만하여간..)를 쉬는것일 뿐인데 cpu점유율은 거의 빵이고 idle 타임은 당연히 99%로 나오는군요..

음.. 그냥 막연히 생각할때는 for( ; ; ) {}는 cpu 100%를 사용하니까, 단지 1 마이크로 세컨드의 쉼표만을 준 프로세스는 cpu를 머 80%라던가 90%는 사용해야 되는거 아닌가 하는 생각이 들었는데 cpu 점유율이 거의 빵이 된다는게 잘이해가 안가네요..

이건 어떻게 해석을 해야 하는거죠?
한번도 안쉬고 뺑뺑이 도는 넘이랑 뺑뺑이 도는 중간에 1마이크로 세컨드만 쉬는 넘이랑 씨피유 점유율은 최소한 비슷이라도 해야 되는거 아닌가 하는데, 그렇지가 안네요..
흠..
오에스쪽에 대한 지식이 좀 있어야 하겠네요..쩝.

혹시 대충이라도 설명해 주실수 있으시면.. 부탁드리겠습니다..
좋은 하루 되시고요..

alsong의 아바타

단순 계산을 한다면... ^^;1Ghz cpu를 초당 10억개의

단순 계산을 한다면... ^^;

1Ghz cpu를 초당 10억개의 연산을 한다고 하면

1초당 usleep이 호출될수 있는 최대수 100만번(기본 스케쥴링 타임이있어서 이만큼 호출 못하겠지만... )

100만번 일을 한다고 가정함 cpu 성능의 1/1000(10억분의100만) 사용하게 됩니다.
사용률 0.1%죠

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

ssehoony의 아바타

어제 이 글을 읽고 설명을 해드리려다 그냥 취소했는데 질문을 하셔서 sl

어제 이 글을 읽고 설명을 해드리려다 그냥 취소했는데 질문을 하셔서 sleep(1) 만했는데도 시퓨 점유율이 많이 떨어지는 것에 대한 설명을 간단히 해드리겠습니다.

MS windows 2000, 
시퓨는 1개 일때,
프로그램 내에 sleep() 을 제외한 다른 이유로 cpu 자원을 반환하는 경우가 없을 때
를 기준을 설명을 드리겠습니다.
일단, 시퓨는 항상 100% 일합니다.
그럼 idle 은 뭐냐?
기본 프로세스중에 idle process 라고 있습니다.
그녀석이 얼마나 많이 실행되는냐가 시퓨가 얼마나 노느냐입니다.
idle process 는 우선순위가 가장 낮습니다.
즉 다른 running 프로세스가 있으면 스케줄링때 무조건 그 녀석이 실행됩니다.
sleep(1) 을 하면 그 순간 OS는 스케줄링을 시작하고 다른 녀석을 실행하는데 그 중엔 idle process 도 포함이 되져. 그래서 idle 프로세스가 런닝 횟수가 급격히 증가하게 되서 시퓨 점유율이 많이 떨어져 보입니다.
하지만 실제는 while(true) sleep(1) 을 부른 녀석이 대부분의 시퓨를 사용하고 있는게 사실이지요. ^^
그럼 ide %를 믿지 못하겠다고요? 아닙니다. 그래도 OS에서 알려주는 시퓨 점유율 표시를 믿어도 됩니다.
왜냐? sleep(1) 을 하면 스케줄링에 들어가기 때문에 다른 어떤 프로세스가 running 상태에 있으면 바로 그녀석에게 실행 권한을 주게 되니깐 사용자 입장에서는 idle %가 높은 것하고 같습니다.

그와 같은 경우로 예를 들면
게임 프로그램의 경우가 while(true) {game_process();}
식으로 무한 루프를 도는데요. 이렇게 하면 시퓨 100% 점유율을 갖게 되는데
이걸 while(true) {game_process(); sleep(0);} 으로 하면 점유율이 많이 떨어집니다. 가령 30%로 떨어 질 수도 있습니다. 하지만 실제 게임의 fps 를 보면 sleep(0) 이 있을때와 없을때의 차이가 거의 없습니다. 그 이유는 위에서 말씀드린 것 처럼 실제로는 게임이 시퓨 를 거의 대부분 여전히 사용하고 있으니까요. 하지만 sleep(0) 때문에 idle 프로세스가 실행되는 횟수가 대폭 늘어나서 OS입장에서는 시퓨가 여유가 있어 보이는거죠.
근데 만약 while(true) {game_process();} 이렇게 되있는 경우 다른 프로그램에서 while(true) {other_process();} 라는게 하나 생기면 이론상은 프로세스가 각각 50 : 50 으로 시퓨를 사용하게 되는데요. 이때 게임은 while(true) {game_process();sleep(0);} 이렇게 되어 있으면 게임 : other = 20: 80 하는 식으로 점유율이 달라지고 게임은 많이 느려지게 되지요.
이때 게임은 우선순이가 낮게 되있고 other 프로그램은 우선순위가 높다면 20:80 도 아니고 1:99 하는 식으로 극단적으로 변해 버릴 수 있습니다.

ㅡ,.ㅡ;;의 아바타

Re: 그냥 지나가다 들렸는데..

sisap wrote:
읽다보니 의문이 꼬리에 꼬리를..-_-;;

평소에 별로 생각안했던 부분인데 문득 생각해 보니 그러네요..흠..

그래서 저도 그냥 메인 함수에서 for( ; ; ) {} 도는 프로세스와 for( ; ; ) {usleep(1);} 를 도는 프로세스 두개를 만들어서 돌려 봤습니다. 리눅스에서..

for( ; ; ) {}는 당연히 프로세스가 cpu 100%가까이 먹고요.. idle타임은 빵에 가까워지고..

그럼 단지 usleep(1) 한줄 추가한 프로세스 같은 경우는 단지(!) 1초도 아니고 1 마이크로 세컨드(마이크로 세컨든지 나노세컨든지는 지금 잘 모르겠지만하여간..)를 쉬는것일 뿐인데 cpu점유율은 거의 빵이고 idle 타임은 당연히 99%로 나오는군요..

음.. 그냥 막연히 생각할때는 for( ; ; ) {}는 cpu 100%를 사용하니까, 단지 1 마이크로 세컨드의 쉼표만을 준 프로세스는 cpu를 머 80%라던가 90%는 사용해야 되는거 아닌가 하는 생각이 들었는데 cpu 점유율이 거의 빵이 된다는게 잘이해가 안가네요..

이건 어떻게 해석을 해야 하는거죠?
한번도 안쉬고 뺑뺑이 도는 넘이랑 뺑뺑이 도는 중간에 1마이크로 세컨드만 쉬는 넘이랑 씨피유 점유율은 최소한 비슷이라도 해야 되는거 아닌가 하는데, 그렇지가 안네요..
흠..
오에스쪽에 대한 지식이 좀 있어야 하겠네요..쩝.

혹시 대충이라도 설명해 주실수 있으시면.. 부탁드리겠습니다..
좋은 하루 되시고요..

1usec 라는것은 컴타에게는 엄청긴시간입니다..ㅎㅎ 그러니 부하가 월등히 줄어들지요..즉말하자면.. 루프한바퀴도는데 0.0000001초도 안걸리는거지요..

----------------------------------------------------------------------------

MasterQ의 아바타

참고로...2.4.xx vanilla 커널기준에서uslee

참고로...

2.4.xx vanilla 커널기준에서

usleep(1)은 최소 10ms 입니다.

usleep(10000) 이나 usleep(1) 이나 같은 시간을 sleep합니다.

덧: 저는 꽁수로 usleep(0)을 쓰기도 합니다.

liongo의 아바타

뭐 CPU 점유율을 내리는방법도 물으셨기에한글 적습니다.. 항상

뭐 CPU 점유율을 내리는방법도 물으셨기에

한글 적습니다.. 항상 올리면서 논외대상인가 걱정이 됩니다 ㅡㅡa

혹여 다른처음 프로그래밍하시는분들도 체크하자는 의미해서..

기본적으로 모든 프로그램은 계속 같은일을 반복하며 특정이벤트를

받을경우 처리합니다.. GUI기반의 APP나.. 서버도 그러죠..

지정된시간에 특정일을 하거나..

CPU점유율을 낮추는것은 sleep으로도 가능하나 보통 조금더

효율적인 방법으로 처리를합니다 기본적으로 select나 poll이

일을 처리하기위한 이벤트 채널이라고 생각하시면 되고요.. 특정

이벤트가 생길때까진 잠자니까요 또는 Queue로 일단위를 쌓아놓구

처리하는 방법도 있습니다.. 프로그램은 Queue가 비어있으면

할일이 없으므로 자고 주기적으로 일을 체크하고 자는거죠..

Queue를 다른 Thread가 채운다면.. Queue가 비워질때까지

일을 처리합니다.. 여기서 Queue에 Race Condition을 이용하여서..

멀티쓰레드 기반의 프로그래밍도 가능해지고.. 호곡 또 주제를 벗어나는

군요 ㅡㅡa 보편적으로 쉽고 마니쓰이는 방식으로 이두방식이 있습니다..

참고하시길 바랍니다.. 물론 어떨진 모르겠지만.. usleep(1)로

점유율을 나출일도 있을지도... 모르죠 ^^

모 설계하기 나름이니 이만 줄이도록 하겠습니다...

그럼.. 주제를 벗어난 이야기라도.. 양해를 바라면서...

튀엇! ㄱㅡㅡㄴ

' 형식이 내용을 규정한다. '


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함