Home PC Games Linux Windows Database Network Programming Server Mobile  
           
  Home \ Programming \ Linux process or thread is bound to a CPU     - How to Install Telegram instant messaging software on Ubuntu (Linux)

- Linux system versions organize local root password cracking method (Linux)

- grep command usage (Linux)

- The basic principle of pointers in C ++ (Programming)

- Android studio multi-channel ultra-compact version of the package (Programming)

- Json data with double backslashes to a single backslash Json data processing (Programming)

- Two minutes thoroughly so that you understand Android Activity Lifecycle (Programming)

- CentOS ClamAV antivirus package updates (Linux)

- IOS interview questions Summary (Programming)

- MySQL thread cache thread_cache_size parameter optimization (Database)

- C ++ Fundamentals study notes (Programming)

- STL source code analysis - iterator each container classification (Programming)

- RPM package management under Linux (Linux)

- Spring multi data source configuration (Programming)

- Three minutes to teach you to easily grasp the grep command regular expression (Linux)

- VMware virtual machine to install CentOS 6.2 (Linux)

- MongoDB 3.2 to upgrade from 3.0.7 (Database)

- VPN built on CentOS (Server)

- C # compiler to achieve functional use in the runtime (Programming)

- Linux detection command (vmstat) (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:      
 
- The top command under Linux (Linux)
- Django how to generate content in non-HTML formats (Programming)
- How to Use Nmap security scanner tool on Linux (Linux)
- The Linux firewall is configured to use proxy (Linux)
- Linux operating system Start Tutorial: Xmanager Remote Access Linux graphical interface (Linux)
- Linux server data backup (Server)
- stat Usage: Get permission to file the corresponding figures (Linux)
- Windows Desktop use VNC remote connect Linux (Linux)
- MySQL completely uninstall and install Configuring Character Sets under Linux (Database)
- Ubuntu download install and configure Plank Dock (Linux)
- Use Python automatically cleared Android Engineering excess resources (Programming)
- What is Java EE (Programming)
- How to back up Debian system backupninja (Linux)
- Ubuntu 14.04 modify environment variables (Linux)
- error 1819 (HY000): your password does not satisfy the current policy requirements (Database)
- Replace font under Linux (Linux)
- Piostat - Monitoring and Statistics Linux process (Linux)
- 25 Git Usage Tips (Linux)
- Get the Linux device PCI ID method (Linux)
- How to create a remote (Linux)
     
           
     
  CopyRight 2002-2020 newfreesoft.com, All Rights Reserved.