• 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
  • 相关阅读:
    我的大厂面试经历(附100+面试题干货)
    大厂面试题:集群部署时的分布式 session 如何实现?
    【转载】Android数据库(SqlLite)操作和db文件查看
    【转载】android ListView详解
    C#根据经纬度获取物理地址
    C#计算两个经纬度的距离
    EXT编写日志文件
    动态数组
    System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]
    SQL Prompt 3 优秀的SQL查询工具 收藏
  • 原文地址:https://www.cnblogs.com/vedic/p/10791726.html
Copyright © 2020-2023  润新知