A CPU não faz os cálculos de uso por si só. Pode ter recursos de hardware para facilitar essa tarefa, mas é principalmente o trabalho do sistema operacional. Então, obviamente, os detalhes das implementações variam (especialmente no caso de sistemas multicore). A idéia geral é ver quanto tempo é a fila de coisas que a CPU precisa fazer. O sistema operacional pode examinar o planejador periodicamente para determinar a quantidade de coisas que ele precisa fazer. Quanto à segunda parte da sua pergunta, a maioria dos sistemas operacionais modernos são multitarefa. Isso significa que o sistema operacional não permitirá que os programas ocupem todo o tempo de processamento e não tenham nenhum por si (a menos que você faça isso). Em outras palavras, mesmo que um aplicativo pareça pendurado, o sistema operacional ainda pode roubar algum tempo para o seu próprio trabalho. Existe uma tarefa especial chamada de tarefa ociosa que é executada quando nenhuma outra tarefa pode ser executada. O uso é apenas a porcentagem do tempo que não estava executando a tarefa ociosa. O sistema operacional manterá um total em execução do tempo gasto executando a tarefa ociosa: quando alternarmos para a tarefa ociosa, configure t hora atual quando alternarmos da tarefa ociosa, adicione (tempo atual - t) ao total em execução Se nós Pegue duas amostras do total de corridas n segundos, podemos calcular a porcentagem desses n segundos gastos executando a tarefa inativa como (segunda amostra - primeira amostra) n Observe que isso é algo que o SO faz, e não a CPU. O conceito de uma tarefa não existe no nível da CPU (na prática, a tarefa ociosa colocará o processador a dormir com uma instrução HLT, de modo que a CPU sabe quando não está sendo usada) Quanto à segunda questão, sistemas operacionais modernos são Preemptively Multi-Tarefas, o que significa que o sistema operacional pode mudar de sua tarefa a qualquer momento. Como o sistema operacional realmente rouba a CPU longe de sua tarefa Interrompe: en. wikipedia. orgwikiInterrupt Para obter o uso da CPU, experimente periodicamente o tempo total do processo e encontre a diferença. Por exemplo, se estes são os tempos de CPU para o processo 1: e então você os obtém novamente dois segundos depois, e eles são: você subtrai os tempos do kernel (para uma diferença de 0,03) e os tempos de usuário (0,61), adicione-os juntos (0,64), e divida pelo tempo de amostra de 2 segundos (0,32). Assim, nos últimos dois segundos, o processo usou uma média de 32 tempos de CPU. As chamadas de sistema específicas necessárias para obter essas informações são (obviamente) diferentes em todas as plataformas. No Windows, você pode usar o GetProcessTimes. Ou GetSystemTimes se você quiser um atalho para o tempo total utilizado ou ocioso da CPU. Respondeu 10 de setembro 10 às 1:38 Uma maneira de fazê-lo é a seguinte: Escolha um intervalo de amostragem, diga a cada 5 min (300 segundos) do tempo real decorrido. Você pode obter isso de gettimeofday. Obtenha o tempo de processo que você usou naquele 300 segundos. Você pode usar a chamada times () para obter isso. Esse seria o novo tempo de processamento - antigo tempo de processamento. Onde o tempo antigo é o tempo de processo que você salvou do último intervalo de tempo. Sua porcentagem de CPU é, então, (tempo de processamento) 100.0 Você pode configurar um alarme para sinalizar você a cada 300 segundos para fazer esses cálculos. Eu tenho um processo que eu não quero usar mais do que uma determinada porcentagem cúbica alvo. Este método funciona muito bem e concorda bem com o monitor do meu sistema. Se estivéssemos usando muita CPU, nós estamos desapontados por um pouco. Respondeu 6 de outubro 12 às 21:18 Bem, na medida em que eu entendo, há um loop gigante que os sistemas operacionais rodam. Seu processo é gerenciado a partir desse loop. Permite que o código externo seja executado diretamente no processador em pedaços. Sem exagerar demais, esta é uma simplificação do que está acontecendo realmente. Respondeu 20 de setembro 10 às 1:24 Este é o meu entendimento básico de ter uma pequena exposição ao código similar. Programas como o Gerenciador de Tarefas ou o sistema de acesso de widgets chamam NtQuerySystemInformation () e usam as informações coletadas do sistema operacional para fazer o cálculo simples da porcentagem de tempo em que uma CPU está ociosa ou sendo usada (em uma quantidade de tempo padrão). Uma CPU sabe quando está ocioso, portanto, pode determinar quando não está ocioso. Esses programas podem realmente ser obstruídos. Meu gerenciador de tarefas do laptops grosseiro congela o tempo todo quando calcula o uso da CPU quando é topping out em 100. Um bit legal de código de exemplo pode ser encontrado no site do MSDNs que mostra as chamadas de função para calcular o uso da CPU para um conjunto de instruções: msdn. microsoften - Uslibraryaa364157 (VS.85).aspx O que essas chamadas de sistema fazem é acessar o código do kernel, eu acredito. Que está além do alcance do meu entendimento. Respondeu 20 de setembro 10 às 1:28 há várias maneiras de fazê-lo: o processador mantém vários contadores que medem o desempenho, você pode acessá-los usando a interface Papi. Por exemplo, aqui é uma breve introdução: blogs. oraclejonhentryperformancecountergenericevents o contador que você deseja que seja PAPITOTCYC, que é o número de ciclos ocupados (se eu me lembro corretamente). 20 de setembro 10 às 1:22 Sua resposta 2017 Stack Exchange, IncWhat Inigoesdr e o site heshe Os pontos para escrever são mais ou menos corretos, mas lembre-se de que a média de carga não é realmente uma média matemática regular, é uma média móvel exponencialmente amortizada. Este é um artigo muito bom e aprofundado sobre o tema de porcentagem de CPU e média de carga, e como eles são calculados no linux. A Wikipedia também tem um bom artigo sobre isso (explicando algumas diferenças entre a média de carga no linux versus a maioria dos sistemas UNIX, por exemplo). Respondeu 25 de outubro às 23:55
No comments:
Post a Comment