Home PC Games Linux Windows Database Network Programming Server Mobile  
           
  Home \ Programming \ Linux process or thread is bound to a CPU     - The text formatting tools awk Linux system (Linux)

- There is sort of a directed acyclic graph topology (Programming)

- Effective Java - lazy initialization (Programming)

- Vmstat command Linux Performance Monitoring (Linux)

- rsync + inotify to achieve real-time synchronization (Server)

- J2EE Example of Filter (Programming)

- Linux add a new hard disk (Linux)

- Linux package manager - yum (Linux)

- Hadoop vs spark (Server)

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

- Dell R710 server disk recovery database one case (record) (Server)

- Confrontation dragged Library - Web front-end encryption slow (Linux)

- Linux top command to get started (Linux)

- Haproxy multi-domain certificate HTTPS (Server)

- How to use Quagga BGP (Border Gateway Protocol) router to filter BGP routing (Linux)

- Linux system file directory structure Introduction (Linux)

- Ubuntu 14.04 after the restart the default maximum screen brightness solutions (Linux)

- How to determine whether the Linux server was hacked (Linux)

- CentOS / Linux install VNC Server (Linux)

- MySQL Server Time Synchronization Problem (Database)

 
         
  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:      
 
- Sqoop data export import command (Database)
- On the PC goes heavy security watch your startup items (Linux)
- Integrated security administrator Linux accident management (Linux)
- Linux Systemd-- To start / stop / restart services in RHEL / CentOS 7 (Linux)
- CentOS of NFS (Server)
- Mind mapping software installed in CentOS 7 in XMind (Linux)
- Hadoop 2.6.0 stand-alone / pseudo-distributed installation (Server)
- Ora-1092: OPI colleague K aborting process --- killed by OO Well killer (Database)
- Present Situation and Development Trend of firewall products (Linux)
- Linux kernel RCU (Read Copy Update) lock Brief (Linux)
- Linux System Getting Started Tutorial: How to change the default Java version in Linux (Linux)
- Confrontation dragged Library - Web front-end encryption slow (Linux)
- linux system optimization and security configuration (Linux)
- xargs Detailed description (Linux)
- Android thread mechanism --AsyncTask (Programming)
- Wi-Fi hackers use to attack your seven methods (Linux)
- Getting Started with Linux system to learn: how to check the version of SSH on Linux (Linux)
- awk pattern matching (Programming)
- Unix / Linux commonly used to clean up disk space command (Linux)
- Linux garbled file delete method (Linux)
     
           
     
  CopyRight 2002-2022 newfreesoft.com, All Rights Reserved.