zoukankan      html  css  js  c++  java
  • kernel 进阶API

    1. 

    #define cond_resched() ({            
        ___might_sleep(__FILE__, __LINE__, 0);    
        _cond_resched();            
    })
    
            int __sched _cond_resched(void)
            {
                if (should_resched(0)) {
                    preempt_schedule_common();
                    return 1;
                }
                return 0;
            }
            
                    static __always_inline bool should_resched(int preempt_offset)
                    {
                        return unlikely(preempt_count() == preempt_offset &&
                                tif_need_resched());
                    }
    
                            #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
    
    一个A进程, 在用户态时, 时间滴答如果选出新的高优先级B进程的话, 会立即进程切换, 如果A进程处于
    内核态时,滴答不能立即切换B进程, 只是在A进程的thread_info.flag标志 TIF_NEED_RESCHED , 然后A进程
    从内核态返回用户态时, 系统判断如果有这个TIF_NEED_RESCHED标志, 就立马切换到B进程,所以内核态的程序
    (驱动)如果while(1); 除了中断会得到执行, 其他代码都没机会运行, 因此一个驱动处理完事情尽快返回用户态,
    或者主动调用sleep(), 先休眠, 如果既想贪心执行, 又脸皮薄怕其他进程等太久, 可以通过cond_resched() 判断
    一下自身有没有TIF_NEED_RESCHED, 有的话说明有更急的进程需要执行, 那就切换, 否则就心安理得的跑(不是我不让, 是你们没叫我让)

    2.

    cd->health_thread = kthread_run(genwqe_health_thread, cd, GENWQE_DEVNAME "%d_health", cd->card_idx);
    
    kthread_stop(cd->health_thread);
    
    static int genwqe_health_thread(void *data)
    {
    
        while (!kthread_should_stop()) {
            rc = wait_event_interruptible_timeout(cd->health_waitq,
                 (genwqe_health_check_cond(cd, &gfir) ||
                  (should_stop = kthread_should_stop())),
                    genwqe_health_check_interval * HZ);
    
        }
    }
    
        如果一个线程可以一直做某事就直接while(1) 否则就增加一个判断条件

    3.

    #include <stdio.h>
    
    void test(int a)
    {
            switch(a) {
            case 1: printf("1
    "); break;
            default: printf("default
    "); break;
            case 0: printf("0
    "); break;
            }
    }
    
    void main()
    {
            test(5);
            printf("==============
    ");
            test(0);
    }
    
    default
    ==============
    0
  • 相关阅读:
    行转列问题
    Session对象失效的客户端解决方法
    Spring之依赖注入
    Spring开发入门
    非关系型数据库redis
    Json(JavaScript Object Notation)
    Ajax
    JavaScript框架之JQuery
    Web核心之Filter过滤器
    Web核心练习之分页模块和条件模块(后台代码为主,jsp已经落伍)
  • 原文地址:https://www.cnblogs.com/vedic/p/10791726.html
Copyright © 2011-2022 走看看