zoukankan      html  css  js  c++  java
  • 内核线程

    创建内核线程由内核线程kthreadd完成

    rest_init->kthreadd->create_kthread->kernel_thread->do_fork
    int kthreadd(void *unused)
    {
        for(;;)
        {
            if (list_empty(&kthread_create_list))
                schedule();
    
            spin_lock(&kthread_create_lock);
            while (!list_empty(&kthread_create_list))
            {
                struct kthread_create_info *create;
    
                create = list_entry(kthread_create_list.next,
                            struct kthread_create_info, list);
                list_del_init(&create->list);
                spin_unlock(&kthread_create_lock);
    
                create_kthread(create);
    
                spin_lock(&kthread_create_lock);
            }
            spin_unlock(&kthread_create_lock);
        }
    
        return 0;
    }

    创建

    #define kthread_run(threadfn, data, namefmt, ...) 
    ({ 
        struct task_struct *__k 
            = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); 
        if (!IS_ERR(__k)) 
            wake_up_process(__k); 
        __k; 
    })
    struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], ...) 
    __attribute__((format(printf, 3, 4)));

    终止

    int kthread_stop(struct task_struct *k)
    {
        kthread->should_stop = 1;
    }
    int kthread_should_stop(void) //子线程退出条件
    {
        return to_kthread(current)->should_stop;
    }

    终止子线程需要手动置1使子线程退出循环

    绑定CPU

    void kthread_bind(struct task_struct *p, unsigned int cpu)

    提高内核线程的工作效率

    查看CPU

    #define cpu_possible_map    (*(cpumask_t *)cpu_possible_mask)
    #define cpu_online_map      (*(cpumask_t *)cpu_online_mask)
    #define cpu_present_map     (*(cpumask_t *)cpu_present_mask)
    #define cpu_active_map      (*(cpumask_t *)cpu_active_mask)

    cpu_possible_map:
    最多有多少个CPU,包括本机的CPU,以及可以热插拔的CPU
    1. 假设cpu_possible_map为10,本机CPU个数为8个,则最多可以再添加2个可插拔CPU
    cpu_present_map:
    当前有多少个CPU
    1. 本机CPU个数为8个,都是online的,则cpu_present_map为8
    2. 再插入1个可插拔CPU,则cpu_present_map为9
    cpu_online_map:
    在当前的CPU中,有多少个可用的CPU
    1. 本机CPU个数为8个,都是online的,则cpu_online_map为8
    2. 将其中一个设置为offline,则cpu_online_map变为7

    #define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask)
    #define for_each_online_cpu(cpu)   for_each_cpu((cpu), cpu_online_mask)
    #define for_each_present_cpu(cpu)  for_each_cpu((cpu), cpu_present_mask)

    总结
    线程是跑在CPU上的,如果是单CPU单核,那么主子线程只能有一个在跑;除非是多CPU或多核心,才会多线程同时跑

  • 相关阅读:
    UDP案例_在线咨询
    MFC对话框水平和垂直滚动条功能
    对话框中滚动条
    ON_COMMAND_RANGE 多个按钮响应一个函数
    char**赋值
    MFC如何使dialog对话框置顶
    如何让CListBox控件滚动条自动向下滚动?
    不带,以及带参数,带返回值的Lambda表达式
    JAVA学习_多线程技术
    最烦有些技术帖上来就放代码
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709797.html
Copyright © 2011-2022 走看看