사용률이 0.0% 란 사실만으로 추측할 수 있는건
"런큐에 있는데 다른일로 바뻐서 해당 프로세스가 실해되지 못했다"도 있고
"Sleep 상태라 실행될 필요가 없다" 도 있습니다.
CPU가 작동하지 않고 멈춰있는 상태란 존재하지 않습니다.
CPU에서는 무언가가 계속 처리가 되어 있고 있는게 진실이지요.
역시 프로세스가 구동 되어 있다면 뭔가 하고 있긴 할테니깐
PS 로 확인했을 때 사용중이여야 마땅하지요.
가령 FTP 서버라고 했을때 client 로 부터 데이터를 입/출력하지 않는다 하더라도
사용자가 접속 요청을 할 수 있으므로, 항상 접속 요청이 있었는지 여부를 확인해야 합니다.
계속해서 접속 요청이 있었는지 여부를 확인하고 있다면
그 FTP 서버는 CPU 사용률이 0% 보단 커야하는게 맞지요.
네트워크로 데이터 수신 조차 되지 않았을 때도, 우직한 FTP 서버는 하염없이 접속 요청한 사용자를
놓칠세라 계속 해서 접속 요청한 사용자가 없는지 확인을 해봅니다.
그 덕에 다른 프로세스가 CPU 를 사용할 수 있는 시간이 조금 줄어 버렸습니다.
이런 상황을 OS 설계자나 컴퓨터 하드웨어 설계자들은 너무 비효율적이라는 생각을 했고
그래서 소프트웨어나 하드웨어로 이런 문제점을 피해갈 방법을 모색했습니다.
다행이 피해갈 방법이 존재 했습니다. 물론, 소프트웨어만으로 불가능했죠.
하드웨어의 뒷받침이 있어야 했습니다.
그 하드웨어가 뒷받침해줘야할 기능에 인터럽트란 이름을 붙였습니다.
그리고 그 기능을 이용해서 이렇게 하면 좋겠다고 생각했습니다.
접속 요청을 기다리는 프로세스가 스스로 계속 요청이 있는지 체크하지 말고
프로세스는 그냥 놀고 있고, 요청이 있다면 커널이 해당 프로세스에게 알려주겠다. 이거지요.
해당 프로세스는 요청 기다리는거 말고 다른거 할거 있으면 하고 없으면 sleep 모드로
커널의 알림을 기다리는 거지요.
Sleep 모드인 프로세스는 CPU를 사용하지 않고, 다른 프로세스에게 CPU 사용을 양보하거나
커널에게 양보를 합니다. 이때가 바로 PS로 봤을 때 Sleep 모드로 인해 CPU 사용이 0% 되는 경우입니다.
그럼 커널은 계속 네트워크 장비에 뭔가 수신이 됐는지 확인을 해야하는 문제가 있지요.
커널이 이것을 확인하는 작업말고 다른 할일도 많다면, 조금 비 효율적이라는 생각이 듭니다.
그래서 역시 커널도 네트워크 장비에게 난 딴일을 하고 있으테니깐
혹시 무슨일 생기면 난테 인터럽트 걸어~ 라고 알려주고
본인을 다른일을 합니다.
네트워크장비에 데이터가 수신되면, CPU에게 인터럽트를 발생 시킵니다.
그럼 커널은 무슨 일이가 네트워크 장비에 접근해서 확인하고
만약 네트워크 접속 요청이라면 이 요청을 기다리는 프로세스가 있는지 확인해 봅니다.
요청을 기다리는 프로세스가 sleep 모드라면 녀석을 깨웁니다.
대충 이런 과정입니다.
물론, 모든 프로세스가 sleep 모드고 커널도 딱히 다른 할일 없고 다른 하드웨어가 인터럽트 거는 일도
없는 아주 심심한 때도 발생할겁니다. 이때가 바로 idle time 입니다.
이때 역시 CPU 는 뭔가 해야하기 때문에 "백수가 방안에서 할거 없어서 장판 디자인하는 무의미한 짓"을 하듯
커널도 무의미한 코드를 실행합니다.
(사실 진정 무의미한 코드를 실행하는건 아닙니다. 가령 컴퓨터 시간을 체크해서 알람 시그널을 보내줘야 하는 프로세스가 있는지
확인한다던지 하는 것들을 체크하지요.)
프로세스는 sleep 모드로 가야 할지 계속 작동해야할지 어떻게 아느냐? 인공지능으로 스스로 판단?
프로세스 스스로는 알 수가 없습니다.
해당 프로세스를 개발한 개발자가 상황을 검사하고 할이 없다 싶으면 sleep 모드로 가게하는 함수를 실행하므로서
해당 프로세스가 sleep 하게 됩니다.
sleep 모드로 가게 하는 함수는 다양합니다.
직접적으로 sleep 모드로 가게 하는 함수는
unsigned int sleep(unsigned int seconds);
int pause(void);
int sigsuspend(const sigset_t *mask);
pid_t wait(int *status);
등등이 있고
간접적은 함수는
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
ssize_t read(int fd, void *buf, size_t count);
등등 있습니다.
간접적인 함수는 항상 call 했을 때 sleep 로 가는게 아니고, 상황에 따라 갈 수도 있고 안갈 수도 있고 그렇습니다.
사용률이 0.0% 란
사용률이 0.0% 란 사실만으로 추측할 수 있는건
"런큐에 있는데 다른일로 바뻐서 해당 프로세스가 실해되지 못했다"도 있고
"Sleep 상태라 실행될 필요가 없다" 도 있습니다.
CPU가 작동하지 않고 멈춰있는 상태란 존재하지 않습니다.
CPU에서는 무언가가 계속 처리가 되어 있고 있는게 진실이지요.
역시 프로세스가 구동 되어 있다면 뭔가 하고 있긴 할테니깐
PS 로 확인했을 때 사용중이여야 마땅하지요.
가령 FTP 서버라고 했을때 client 로 부터 데이터를 입/출력하지 않는다 하더라도
사용자가 접속 요청을 할 수 있으므로, 항상 접속 요청이 있었는지 여부를 확인해야 합니다.
계속해서 접속 요청이 있었는지 여부를 확인하고 있다면
그 FTP 서버는 CPU 사용률이 0% 보단 커야하는게 맞지요.
네트워크로 데이터 수신 조차 되지 않았을 때도, 우직한 FTP 서버는 하염없이 접속 요청한 사용자를
놓칠세라 계속 해서 접속 요청한 사용자가 없는지 확인을 해봅니다.
그 덕에 다른 프로세스가 CPU 를 사용할 수 있는 시간이 조금 줄어 버렸습니다.
이런 상황을 OS 설계자나 컴퓨터 하드웨어 설계자들은 너무 비효율적이라는 생각을 했고
그래서 소프트웨어나 하드웨어로 이런 문제점을 피해갈 방법을 모색했습니다.
다행이 피해갈 방법이 존재 했습니다. 물론, 소프트웨어만으로 불가능했죠.
하드웨어의 뒷받침이 있어야 했습니다.
그 하드웨어가 뒷받침해줘야할 기능에 인터럽트란 이름을 붙였습니다.
그리고 그 기능을 이용해서 이렇게 하면 좋겠다고 생각했습니다.
접속 요청을 기다리는 프로세스가 스스로 계속 요청이 있는지 체크하지 말고
프로세스는 그냥 놀고 있고, 요청이 있다면 커널이 해당 프로세스에게 알려주겠다. 이거지요.
해당 프로세스는 요청 기다리는거 말고 다른거 할거 있으면 하고 없으면 sleep 모드로
커널의 알림을 기다리는 거지요.
Sleep 모드인 프로세스는 CPU를 사용하지 않고, 다른 프로세스에게 CPU 사용을 양보하거나
커널에게 양보를 합니다. 이때가 바로 PS로 봤을 때 Sleep 모드로 인해 CPU 사용이 0% 되는 경우입니다.
그럼 커널은 계속 네트워크 장비에 뭔가 수신이 됐는지 확인을 해야하는 문제가 있지요.
커널이 이것을 확인하는 작업말고 다른 할일도 많다면, 조금 비 효율적이라는 생각이 듭니다.
그래서 역시 커널도 네트워크 장비에게 난 딴일을 하고 있으테니깐
혹시 무슨일 생기면 난테 인터럽트 걸어~ 라고 알려주고
본인을 다른일을 합니다.
네트워크장비에 데이터가 수신되면, CPU에게 인터럽트를 발생 시킵니다.
그럼 커널은 무슨 일이가 네트워크 장비에 접근해서 확인하고
만약 네트워크 접속 요청이라면 이 요청을 기다리는 프로세스가 있는지 확인해 봅니다.
요청을 기다리는 프로세스가 sleep 모드라면 녀석을 깨웁니다.
대충 이런 과정입니다.
물론, 모든 프로세스가 sleep 모드고 커널도 딱히 다른 할일 없고 다른 하드웨어가 인터럽트 거는 일도
없는 아주 심심한 때도 발생할겁니다. 이때가 바로 idle time 입니다.
이때 역시 CPU 는 뭔가 해야하기 때문에 "백수가 방안에서 할거 없어서 장판 디자인하는 무의미한 짓"을 하듯
커널도 무의미한 코드를 실행합니다.
(사실 진정 무의미한 코드를 실행하는건 아닙니다. 가령 컴퓨터 시간을 체크해서 알람 시그널을 보내줘야 하는 프로세스가 있는지
확인한다던지 하는 것들을 체크하지요.)
프로세스는 sleep 모드로 가야 할지 계속 작동해야할지 어떻게 아느냐? 인공지능으로 스스로 판단?
프로세스 스스로는 알 수가 없습니다.
해당 프로세스를 개발한 개발자가 상황을 검사하고 할이 없다 싶으면 sleep 모드로 가게하는 함수를 실행하므로서
해당 프로세스가 sleep 하게 됩니다.
sleep 모드로 가게 하는 함수는 다양합니다.
직접적으로 sleep 모드로 가게 하는 함수는
unsigned int sleep(unsigned int seconds);
int pause(void);
int sigsuspend(const sigset_t *mask);
pid_t wait(int *status);
등등이 있고
간접적은 함수는
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
ssize_t read(int fd, void *buf, size_t count);
등등 있습니다.
간접적인 함수는 항상 call 했을 때 sleep 로 가는게 아니고, 상황에 따라 갈 수도 있고 안갈 수도 있고 그렇습니다.
댓글 달기