This is the process I organized. I wonder why ALFA chooses 0.08 and MIN_DT 20?
command: cpulimit -i -l=3
While (1)
{
/ / find the process by pid
Check to see if the cpulimit process is the same. Do not limit yourself
// limit function
Limit_process (pid, limit, include_children);
}
Limit_process (pid, limit, include_children)
{
// all child processes of the pid are added to the hash table with the pid as the key
// read the proc information /proc/stat of the child process pid
/ *
cputime
starttime
/
Update_process_group -> cpu_usage for each polling calculation process
Tmp_process is the currently reread process information
P is the process information for the last process
Double sample = 1.0 * (tmp_process.cputime-p-> cputime)/dt;
Calculate CPU utilization based on two CPU usage times
The first time, p->cpu_usage = sample
After this, p->cpu_usage = (1.0-0.08) p->cpu_usage + 0.08 sample;
CPU usage start limit ->
Double pcpu = 1;
// traverses the list of sub-processes and statistics the total CPU utilization of sub-processes (non-statistics less than 0)
Pcpu + = p - > cpu_usage;
If the CPU usage of the sub-process is less than 0 pcpu = -1
For the first time:
Pcap = 0.05
Workingrate = 0.05
Twork. tv_nsec = 100000 0.05 1000; // CPU usage usage time
After:
Workinfiring = MIN(workinfiring/pcpu 0.05, 1);
Twork.tv_nsec = 100000 1000 workingrate; // statistics the actual time the process has been running
Tsleep. tv_nsec = 100000 1000 - twork.tv_nsec; // the time the process should sleep
// traversal sends SIGCONT signal to the process to make it run
// sleep twork time to keep the process running for so long
The gettimeofday (& the startwork, NULL);
Nanosleep (& twork, NULL);
The gettimeofday (& endwork, NULL);
//nanosleep may wake up in the middle and calculate the actual running time
Workingtime = timediff (& endwork, & the startwork);
// too much sleep is bad
Long delay = workingtime - twork.tv_nsec/1000;
// traversal process sends SIGSTOP signal
// sleep tsleep time, let the process stop running
}
This is the process I organized. I wonder why ALFA chooses 0.08 and MIN_DT 20? command: cpulimit -i -l=3 While (1) { / / find the process by pid Check to see if the cpulimit process is the same. Do not limit yourself
// limit function Limit_process (pid, limit, include_children); }
Limit_process (pid, limit, include_children) { // all child processes of the pid are added to the hash table with the pid as the key
// read the proc information /proc/stat of the child process pid
/ *
Update_process_group -> cpu_usage for each polling calculation process Tmp_process is the currently reread process information
P is the process information for the last process
Double sample = 1.0 * (tmp_process.cputime-p-> cputime)/dt; Calculate CPU utilization based on two CPU usage times
The first time, p->cpu_usage = sample
After this, p->cpu_usage = (1.0-0.08) p->cpu_usage + 0.08 sample;
CPU usage start limit ->
Double pcpu = 1; // traverses the list of sub-processes and statistics the total CPU utilization of sub-processes (non-statistics less than 0) Pcpu + = p - > cpu_usage;
If the CPU usage of the sub-process is less than 0 pcpu = -1 For the first time: Pcap = 0.05 Workingrate = 0.05 Twork. tv_nsec = 100000 0.05 1000; // CPU usage usage time After: Workinfiring = MIN(workinfiring/pcpu 0.05, 1); Twork.tv_nsec = 100000 1000 workingrate; // statistics the actual time the process has been running Tsleep. tv_nsec = 100000 1000 - twork.tv_nsec; // the time the process should sleep
// traversal sends SIGCONT signal to the process to make it run
// sleep twork time to keep the process running for so long
The gettimeofday (& the startwork, NULL);
Nanosleep (& twork, NULL);
The gettimeofday (& endwork, NULL);
//nanosleep may wake up in the middle and calculate the actual running time
Workingtime = timediff (& endwork, & the startwork);
// too much sleep is bad Long delay = workingtime - twork.tv_nsec/1000;
// traversal process sends SIGSTOP signal
// sleep tsleep time, let the process stop running }