Home PC Games Linux Windows Database Network Programming Server Mobile  
           
  Home \ Programming \ Linux process or thread is bound to a CPU     - CentOS 6.5 Telnet SecureCRT use management tools (Linux)

- Android official recommendation: DialogFragment create dialog (Programming)

- Try debugfs restore the deleted files ext3 file system (Linux)

- Oracle 10g, 11g database silent installation of small differences (Database)

- Linux shell scripts bubble sort (Programming)

- How to run Kali Linux 2.0 in Docker container (Linux)

- Use value type build better applications Swift (Programming)

- Ubuntu install VMware Workstation 11 tutorials at 14.04 / 14.10 (Linux)

- linux firewall configuration (Linux)

- JavaScript function closures Quick Start (Programming)

- How to create a someone project on github (Linux)

- SQL MySQL query table duplicate data (Database)

- CentOS 6.5 installation and simple configuration Nginx (Server)

- MySQL In can not be overridden with an internal connection (Database)

- Copy and paste in Linux terminal and Vim (Linux)

- Java programmers talk about those advanced knowledge and direction (Programming)

- Linux Command Tutorial: cat command to view the contents of the file (Linux)

- EXP-00091: Exporting questionable statistics Processing Method (Database)

- Zabbix installation under Linux (Server)

- Installation Docker FAQ on Ubuntu (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:      
 
- In-depth summary of the PHP core of object-oriented (Programming)
- Talk about Java in the collection (Programming)
- Making Linux root file system problems on-link library (Programming)
- Management Linux Container with Docker in Ubuntu (Linux)
- Linux system security check method (Linux)
- C language function pointer and a callback function (Programming)
- Ubuntu 14.04 install PostgreSQL 9.2 (Database)
- SendMail version of Java implementation with attachments (Programming)
- Linux performance monitoring and common commands Introduction (Linux)
- Shell programming entry (Programming)
- Installation of JDK and Tomcat under Linux (CentOS) (Linux)
- Git Tutorial Comments (Linux)
- Deb package installation method under ubuntu (Linux)
- Oracle 10g relations with the constraint of column properties NULLABLE (Database)
- Linux System Getting Started Tutorial: Linux file permissions brief description (Linux)
- The sublime into IDE (Linux)
- The difference between equals and == in Java (Programming)
- Ubuntu 14.04 and derivative version of the user on how to install cURL 7.37.1 (Linux)
- shellinabox: one uses AJAX Web-based terminal emulator (Linux)
- Mac OS X 10.9 build Nginx + MySQL + php-fpm environment (Server)
     
           
     
  CopyRight 2002-2022 newfreesoft.com, All Rights Reserved.