Home PC Games Linux Windows Database Network Programming Server Mobile  
           
  Home \ Programming \ Linux process or thread is bound to a CPU     - MongoDB replication instance (Database)

- Linux garbled file delete method (Linux)

- Swift used in the application to add a local push at the specified time (Programming)

- Cobbler remotely install CentOS system (Linux)

- Household use Linux Security (Linux)

- Ubuntu PPA install SMPlayer 14.9 (Linux)

- Iptables command in detail (Linux)

- Nginx caching using the official guide (Server)

- Haproxy multi-domain certificate HTTPS (Server)

- How to update the ISPConfig 3 SSL Certificates (Server)

- Oracle 11g maintenance partitions (Seven) - Modifying Real Attributes of Partitions (Database)

- Upgrade to Linux Mint 16 petra Mint 17 Qiana (Linux)

- TPCC-MySQL Benchmark (Database)

- Linux `dirname $ 0` (Linux)

- CentOS 6.5 dual card configuration, one of the external network, a local area network connection (Linux)

- Linux operating system security tools of the Logs (Linux)

- Linux delete duplicate files Artifact: dupeGuru (Linux)

- Will Laravel become the most successful PHP framework? (Programming)

- Linux boot process (Linux)

- VMware Workstation + Ubuntu 10.04 Download the Android 2.2 source code (Linux)

 
         
  Linux process or thread is bound to a CPU
     
  Add Date : 2018-11-21      
         
         
         
  In order for the program to have a better performance, sometimes you need to process or thread is bound to a specific CPU, thus reducing the overhead of scheduling and protect critical processes or threads.

Process bound to CPU

Linux provides an interface, the process can be bound to a specific CPU:

#include < sched.h>

int sched_setaffinity (pid_t pid, size_t cpusetsize, const cpu_set_t * mask);

int sched_getaffinity (pid_t pid, size_t cpusetsize, cpu_set_t * mask);

parameter

pid: id number process If pid is 0, it indicates that this process

cpusetsize: mask size

mask: running processes CPU, the following functions can be operated by mask

#define CPU_SET (cpu, cpusetp) // set cpu

#define CPU_CLR (cpu, cpusetp) // delete cpu

#define CPU_ISSET (cpu, cpusetp) // determine cpu

#define CPU_ZERO (cpusetp) // initialized to 0

Sample Code

#include < stdio.h>
#include < unistd.h>
#include < math.h>
#include < sched.h>
 
void WasteTime ()
{
    int abc = 10000000;
    while (abc--)
    {
        int tmp = 10000 * 10000;
    }
    sleep (1);

}

int main (int argc, char ** argv)
{
    cpu_set_t mask;
    while (1)
    {
 
        CPU_ZERO (& mask);
        CPU_SET (0, & mask);
        if (sched_setaffinity (0, sizeof (mask), & mask) < 0) {
            perror ( "sched_setaffinity");
        }
        WasteTime ();
 
        CPU_ZERO (& mask);
        CPU_SET (1, & mask);
        if (sched_setaffinity (0, sizeof (mask), & mask) < 0) {
            perror ( "sched_setaffinity");
        }
        WasteTime ();
    
        CPU_ZERO (& mask);
        CPU_SET (2, & mask);
        if (sched_setaffinity (0, sizeof (mask), & mask) < 0) {
            perror ( "sched_setaffinity");
        }
        WasteTime ();
    
        CPU_ZERO (& mask);
        CPU_SET (3, & mask);
        if (sched_setaffinity (0, sizeof (mask), & mask) < 0) {
            perror ( "sched_setaffinity");
        }
        WasteTime ();
    }
}

test

After compiling the program, enter the command top -p process id, enter f, input j, press enter, you can see the process of constantly switching between cpu0123.

Threads are bound to CPU

Not only the process can be bound to a CPU, the thread can be. Linux provides an interface threads can be bound to a specific CPU:

#include < pthread.h>

int pthread_setaffinity_np (pthread_t thread, size_t cpusetsize, const cpu_set_t * cpuset);

int pthread_getaffinity_np (pthread_t thread, size_t cpusetsize, cpu_set_t * cpuset);

The interface with the process is bound to use interface CPU basically the same.

When the process is bound to a specific CPU, the thread can still bind to other CPU, there is no conflict.

Sample Code

#include < stdio.h>
#include < math.h>
#include < pthread.h>
#include < unistd.h>
#include < sched.h>

void WasteTime ()
{
    int abc = 10000000;
    while (abc--)
    {
        int tmp = 10000 * 10000;
    }
    sleep (1);

}

void * thread_func (void * param)
{
    cpu_set_t mask;
    while (1)
    {
        CPU_ZERO (& mask);
        CPU_SET (1, & mask);

        if (pthread_setaffinity_np (pthread_self (), sizeof (mask),
            & Mask) < 0) {
            perror ( "pthread_setaffinity_np");
        }
 
        WasteTime ();

        CPU_ZERO (& mask);
        CPU_SET (2, & mask);
        if (pthread_setaffinity_np (pthread_self (), sizeof (mask),
            & Mask) < 0) {
            perror ( "pthread_setaffinity_np");
        }

        WasteTime ();
    }
}
 
void * thread_func1 (void * param)
{
    cpu_set_t mask;
    while (1)
    {
        CPU_ZERO (& mask);
        CPU_SET (3, & mask);

        if (pthread_setaffinity_np (pthread_self (), sizeof (mask),
            & Mask) < 0) {
            perror ( "pthread_setaffinity_np");
        }
 
        WasteTime ();

        CPU_ZERO (& mask);
        CPU_SET (4, & mask);
        if (pthread_setaffinity_np (pthread_self (), sizeof (mask),
            & Mask) < 0) {
            perror ( "pthread_setaffinity_np");
        }

        WasteTime ();
    }
}
 
int main (int argc, char * argv [])
{
    cpu_set_t mask;
    CPU_ZERO (& mask);
    CPU_SET (0, & mask);
    if (sched_setaffinity (0, sizeof (mask), & mask) < 0) {
        perror ( "sched_setaffinity");
    }

    pthread_t my_thread;
 
    if (pthread_create (& my_thread, NULL, thread_func,
        NULL)! = 0) {
        perror ( "pthread_create");
    }
    if (pthread_create (& my_thread, NULL, thread_func1,
        NULL)! = 0) {
        perror ( "pthread_create");
    }
    while (1) {WasteTime ();}
    pthread_exit (NULL);

}
 
test

After compiling Run, type command top -p process id, enter f, input j, press enter, enter H, you can see the main thread has remained at cpu0, a thread before cpu12 switch, switch to another thread between cpu34 .
     
         
         
         
  More:      
 
- iptables using summary (Linux)
- Python console achieve progress bar (Programming)
- Installation of Gitlab under Ubuntu (Linux)
- Installation Enpass secure password manager on Ubuntu (Linux)
- MySQL view (Database)
- C # Future: Method Contract (Programming)
- CentOS 7 install Hadoop-cdh-2.6 (Server)
- Oracle 11g on Linux system boot from the startup settings (Database)
- A drop datafile Oracle bug (Database)
- Examples of RAID levels and achieve Operational Details (Linux)
- Ubuntu 14.04 to install file editor KKEdit 0.1.5 version (Linux)
- Android using SVG vector graphics to create cool animation effects (Programming)
- GitLab upgrade to 8.2.0 (Linux)
- Under Ubuntu on how to use iptables firewall (Linux)
- MySQL Online DDL tools of pt-online-schema-change (Database)
- CentOS x86 64bit upgrade to 2.7 Python2.6 (Linux)
- Two network security scanning tools under ubuntu (Linux)
- CentOS 6.4 OpenNebula installation (Linux)
- Ubuntu 14.10 How to install office suite Calligra Suite 2.8.7 (Linux)
- Node.js development environment deployment (Server)
     
           
     
  CopyRight 2002-2022 newfreesoft.com, All Rights Reserved.