QNX
Da dies wie eine "Wikipage des Codes" ist, möchte ich etwas Code aus der QNX Knowledge Base hinzufügen (Anmerkung: dies ist nicht meine Arbeit, aber ich habe es überprüft und es funktioniert gut auf meinem System):
So erhalten Sie die CPU-Auslastung in %: http://www.qnx.com/support/knowledgebase.html?id=50130000000P9b5
#include <atomic.h>
#include <libc.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/iofunc.h>
#include <sys/neutrino.h>
#include <sys/resmgr.h>
#include <sys/syspage.h>
#include <unistd.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/debug.h>
#include <sys/procfs.h>
#include <sys/syspage.h>
#include <sys/neutrino.h>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include <devctl.h>
#include <errno.h>
#define MAX_CPUS 32
static float Loads[MAX_CPUS];
static _uint64 LastSutime[MAX_CPUS];
static _uint64 LastNsec[MAX_CPUS];
static int ProcFd = -1;
static int NumCpus = 0;
int find_ncpus(void) {
return NumCpus;
}
int get_cpu(int cpu) {
int ret;
ret = (int)Loads[ cpu % MAX_CPUS ];
ret = max(0,ret);
ret = min(100,ret);
return( ret );
}
static _uint64 nanoseconds( void ) {
_uint64 sec, usec;
struct timeval tval;
gettimeofday( &tval, NULL );
sec = tval.tv_sec;
usec = tval.tv_usec;
return( ( ( sec * 1000000 ) + usec ) * 1000 );
}
int sample_cpus( void ) {
int i;
debug_thread_t debug_data;
_uint64 current_nsec, sutime_delta, time_delta;
memset( &debug_data, 0, sizeof( debug_data ) );
for( i=0; i<NumCpus; i++ ) {
/* Get the sutime of the idle thread #i+1 */
debug_data.tid = i + 1;
devctl( ProcFd, DCMD_PROC_TIDSTATUS,
&debug_data, sizeof( debug_data ), NULL );
/* Get the current time */
current_nsec = nanoseconds();
/* Get the deltas between now and the last samples */
sutime_delta = debug_data.sutime - LastSutime[i];
time_delta = current_nsec - LastNsec[i];
/* Figure out the load */
Loads[i] = 100.0 - ( (float)( sutime_delta * 100 ) / (float)time_delta );
/* Flat out strange rounding issues. */
if( Loads[i] < 0 ) {
Loads[i] = 0;
}
/* Keep these for reference in the next cycle */
LastNsec[i] = current_nsec;
LastSutime[i] = debug_data.sutime;
}
return EOK;
}
int init_cpu( void ) {
int i;
debug_thread_t debug_data;
memset( &debug_data, 0, sizeof( debug_data ) );
/* Open a connection to proc to talk over.*/
ProcFd = open( "/proc/1/as", O_RDONLY );
if( ProcFd == -1 ) {
fprintf( stderr, "pload: Unable to access procnto: %s\n",strerror( errno ) );
fflush( stderr );
return -1;
}
i = fcntl(ProcFd,F_GETFD);
if(i != -1){
i |= FD_CLOEXEC;
if(fcntl(ProcFd,F_SETFD,i) != -1){
/* Grab this value */
NumCpus = _syspage_ptr->num_cpu;
/* Get a starting point for the comparisons */
for( i=0; i<NumCpus; i++ ) {
/*
* the sutime of idle thread is how much
* time that thread has been using, we can compare this
* against how much time has passed to get an idea of the
* load on the system.
*/
debug_data.tid = i + 1;
devctl( ProcFd, DCMD_PROC_TIDSTATUS, &debug_data, sizeof( debug_data ), NULL );
LastSutime[i] = debug_data.sutime;
LastNsec[i] = nanoseconds();
}
return(EOK);
}
}
close(ProcFd);
return(-1);
}
void close_cpu(void){
if(ProcFd != -1){
close(ProcFd);
ProcFd = -1;
}
}
int main(int argc, char* argv[]){
int i,j;
init_cpu();
printf("System has: %d CPUs\n", NumCpus);
for(i=0; i<20; i++) {
sample_cpus();
for(j=0; j<NumCpus;j++)
printf("CPU #%d: %f\n", j, Loads[j]);
sleep(1);
}
close_cpu();
}
Wie man den kostenlosen (!) Speicher erhält: http://www.qnx.com/support/knowledgebase.html?id=50130000000mlbx
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <err.h>
#include <sys/stat.h>
#include <sys/types.h>
int main( int argc, char *argv[] ){
struct stat statbuf;
paddr_t freemem;
stat( "/proc", &statbuf );
freemem = (paddr_t)statbuf.st_size;
printf( "Free memory: %d bytes\n", freemem );
printf( "Free memory: %d KB\n", freemem / 1024 );
printf( "Free memory: %d MB\n", freemem / ( 1024 * 1024 ) );
return 0;
}
19 Stimmen
Die Angabe "gesamter verfügbarer virtueller Speicher" ist auf modernen Betriebssystemen bedeutungslos.
82 Stimmen
Warum ist sie bedeutungslos? Macht sie die Antwort hier ungültig? stackoverflow.com/questions/3296211/ ... bitte keine Cliffhanger in den Kommentaren, das ist keine Fernsehserie.
6 Stimmen
@MindaugasBernatavicius: Die verlinkte Frage bezieht sich auf den "gesamten physischen Speicher", der eine dem Betriebssystem bekannte Hardware-Tatsache ist. Man erhält die Summe, indem man die Größen aller Speichermodule addiert. "Verfügbarer virtueller Gesamtspeicher" hingegen, was bedeutet das überhaupt? Ist das der kombinierte virtuelle Adressraum aller Prozesse, die theoretisch erstellt werden könnten? Diese Zahl liegt bei etwa 2^80 Byte und ist damit sicherlich bedeutungslos.
5 Stimmen
@MSalters - danke für das Engagement. Ich glaube, dass die Frage, was der OP im Sinn hatte, viel freundlicher und gesünder ist, als zu behaupten, dass etwas sinnlos ist (ohne eine Erklärung). Wie Sie bemerken, gehen die Antworten auch von einer bestimmten Position in dieser Hinsicht aus: Virtueller Speicher = RAM + SWAP (oder PAGEFILE) - was eine vernünftige Annahme ist. Daraus wissen wir, dass es nicht bedeutungslos ist, da es eine bestimmte Interpretation dieses Begriffs gibt (die vielleicht nicht die technisch korrekteste ist, ein Kolloquelismus), die eine Bedeutung hat.
5 Stimmen
@MindaugasBernatavicius: Das ignoriert Memory-Mapped-Dateien und Code, der nicht ausgelagert ist. Linux hat nicht gebundene Speicherzuweisungen (nicht durch RAM oder Swap gesichert) und Windows hat nicht gebundene Stacks.
1 Stimmen
@DavidSchwartz "insgesamt verfügbarer virtueller Speicher" hat eine Bedeutung. Ich arbeite mit einem Linux-System, bei dem der virtuelle Speicher auf den physischen begrenzt ist. Der Versuch, den virtuellen Speicher darüber hinaus zu nutzen, führt zum Abbruch des Programms.
1 Stimmen
@DavidSchwartz Ohne Ihr Bedürfnis nach Beschimpfungen zu berücksichtigen, ist dies eine bewusste Politik auf großen Supercomputern. Ein echter virtueller Speicher würde die Leistung unberechenbar machen. Stellen Sie sich vor, Sie arbeiten auf 1000 Knoten und einer von ihnen wird aufgrund von Swapping langsamer. Das wäre eine grobe Verschwendung von Ressourcen. Es ist besser, den Benutzern zu sagen, dass sie sich mit den Einschränkungen abfinden und darüber nachdenken müssen, was sie tun. Wenn Sie beispielsweise einen schnellen Zugriff auf eine Datei benötigen, sollten Sie sie auf dem parallelen Dateisystem richtig strippen.
0 Stimmen
@VictorEijkhout Ich kann nicht folgen. Sie strippen also ordentlich im parallelen Dateisystem und es sind 4 GB. Warum verschwenden wir genau 4 GB RAM? Ich schätze, wenn man denkt, dass man so viel RAM hat, dass man viel davon verschwenden kann, dann kann man das wohl so sehen. Aber es wäre Wahnsinn, einen Allzweckrechner so zu konfigurieren.
0 Stimmen
@VictorEijkhout Ich kann nicht folgen. Ihr Hochgeschwindigkeits-Dateisystem erlaubt es Ihnen nicht, Dateien im Speicher abzubilden? Wie führen Sie ausführbare Dateien aus? Wie rufen Sie Bibliotheken auf? Wie führen Sie mathematischen Analysecode aus, der Dateien im Speicher abbildet? Ich bin mir nicht sicher, welches "Argument gegen die Aktivierung von virtuellem Speicher" Sie meinen, aber das würde es praktisch unmöglich machen, mehr als einen Prozess gleichzeitig laufen zu lassen (und wie würde
fork
arbeiten?). Auch hier handelt es sich um eine ziemlich schreckliche Einschränkung, die in der allgemeinen Datenverarbeitung nichts zu suchen hat.0 Stimmen
Wir wollen diese Diskussion im Chat fortsetzen .
0 Stimmen
Weiß jemand, wie man das auch in C# machen kann?