码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 内核进程的调度与进程切换


    进程被创建到了链表中,如何再进行进一步的调用和调用?

    进程调度

            void schedule(void);        进程调度

            switch_to(next);        进程切换函数

    1. void schedule(void)
    2. {
    3. int i,next,c;
    4. struct task_struct ** p;
    5. /* check alarm, wake up any interruptible tasks that have got a signal */
    6. for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
    7. if (*p) {
    8. if ((*p)->alarm && (*p)->alarm < jiffies) {
    9. (*p)->signal |= (1<<(SIGALRM-1));
    10. (*p)->alarm = 0;
    11. }
    12. //信号不为空,并且去除不能引发进程就绪状态的阻塞信号,且现在进程为可中断状态
    13. if ((*p)->signal && (*p)->state==TASK_INTERRUPTIBLE)
    14. (*p)->state=TASK_RUNNING;
    15. }
    16. /* this is the scheduler proper: */
    17. while (1) {
    18. c = -1;
    19. next = 0;
    20. i = NR_TASKS;
    21. p = &task[NR_TASKS];
    22. while (--i) {
    23. if (!*--p)
    24. continue;
    25. //找到当前counter最大值
    26. if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
    27. c = (*p)->counter, next = i;
    28. }
    29. if (c) break;
    30. //如果task链表中所有进程的时间片为0,则进行时间片重分配
    31. for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
    32. if (*p)
    33. (*p)->counter = ((*p)->counter >> 1) +
    34. (*p)->priority; //counter = counter/2+pri
    35. }
    36. switch_to(next);
    37. }

    进程状态:

    运行状态                           #define TASK_RUNNING        0  可以被运行,就绪状态,只有这种状态才能被运行

    可中断睡眠状态                 #define TASK_INTERRUPTIBLE  1  可以被信号中断,使其变成RUNING

    不可中断睡眠状态             #define TASK_UNINTERRUPTIBLE    2  只能被wakeup唤醒变成RUNNING

    暂停状态                           #define TASK_STOPPED        4   被相关STOP信号暂停

    僵死状态                          #define TASK_ZOMBIE     3   进程停止运行,但是没有被父进程进行回收

    进程切换:

    将进程切换为当前执行进程

    1.将需要切换的进程赋值给当前执行进程

    2.切换进程上下文(TSS等信息),堆栈信息

    1. #define switch_to(n) {\
    2. struct {long a,b;} __tmp; \
    3. __asm__("cmpl %%ecx,_current\n\t" \ //比较一下是否为当前进程
    4. "je 1f\n\t" \
    5. "xchgl %%ecx,_current\n\t" \
    6. "movw %%dx,%1\n\t" \
    7. "ljmp %0\n\t" \
    8. "cmpl %%ecx,%2\n\t" \
    9. "jne 1f\n\t" \
    10. "clts\n" \
    11. "1:" \
    12. ::"m" (*&__tmp.a),"m" (*&__tmp.b), \
    13. "m" (last_task_used_math),"d" _TSS(n),"c" ((long) task[n])); \
    14. }

    进程睡眠函数:

    1. void sleep_on(struct task_struct **p)
    2. {
    3. struct task_struct *tmp;
    4. if (!p)
    5. return;
    6. if (current == &(init_task.task))
    7. panic("task[0] trying to sleep");
    8. tmp = *p;
    9. *p = current;
    10. current->state = TASK_UNINTERRUPTIBLE;
    11. schedule();
    12. if (tmp)
    13. tmp->state=0;
    14. }

  • 相关阅读:
    前端性能优化——首屏时间&&白屏时间
    ElasticSearch集群内存占用高?如何降低内存占用看这篇文章就够啦!(冻结索引)
    【Pytorch】各种维度变换函数总结
    echarts 地图 点聚合功能
    Python高级语法-类访问控制
    微电网优化调度(风、光、储能、柴油机)(Python代码实现)
    jdbc-plus是一款基于JdbcTemplate增强工具包, 基于JdbcTemplate已实现分页、多租户等插件,可自定义扩展插件
    Covalent(CQT)降低数据可用性成本,加快 Layer2 在 Web3 领域的扩张
    如何解决kafka rebalance导致的暂时性不能消费数据问题
    『Python学习笔记』使用Cython编程语言编译python文件
  • 原文地址:https://blog.csdn.net/weixin_66218530/article/details/134055265
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号