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或多核心,才会多线程同时跑

  • 相关阅读:
    我读过的书 编程爱好者
    HarmonyOS ListContainer基础用法
    HarmonyOS ListContainer 读取网络json数组
    HarmonyOS Activity页面跳转
    HarmonyOS ListContainer 图文并排
    HarmonyOS 线性布局练习一 登录页面
    jsonserver 环境搭建及使用方法
    HarmonyOS 真机调试
    在win下设置C语言环境变量
    使用 Eclipse 调试 Java 程序的 10 个技巧
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709797.html
Copyright © 2011-2022 走看看