• neohope
    置顶
    2021-07-07
    一、数据结构 全局有一个osschedcls变量,其数据结构为schedclass_t,用于管理所有cpu的所有进程。 schedclass_t包括一个 schdata_t数组,每个cpu对应一个。 schedclass_t.schdata_t[i],用于管理第i个cpu的全部进程。 schedclass_t.schdata_t[i]包括一个thrdlst_t数组,每个进程优先级对应一个。 schedclass_t.schdata_t[i].thrdlst_t[j]中,管理了第i个cpu的,优先级为j的全部进程。 二、idel进程 idel进程初始化及启动: init_krl->init_krlcpuidle->new_cpuidle->new_cpuidle_thread->krlthread_kernstack_init【krlcpuidle_main传参】->krlschedul->krlcpuidle_start->retnfrom_first_sched启动idel进程 idel进程调度: idel进程启动后,会不停的在krlcpuidle_main函数中循环调用krlschedul,只要有其他进程可以运行,就让渡CPU使用权给到其他进程; 其他进程调用krlschedul让渡CPU使用权时,如果找不到”下一进程“,会将CPU使用权给回到idel进程; 三、进程的等待与唤醒【信号量为例】 信号量sem_t,有一个等待进程列表kwlst_t,保存了等待获取信号量的全部进程列表 获取信号量: 进程调用krlsem_down->当信号量不足时krlwlst_wait->主动调用krlsched_wait让渡CPU使用权,让其他进程优先运行 即使其他进程把CPU使用权又还回来,也会继续循环,不断尝试获取信号量 释放信号量: 进程调用krlsem_up->krlwlst_allup->对kwlst_t中全部等待进程,依次调用krlsched_up->被给与CPU使用权的进程,会立即唤醒并尝试获取信号量 最后,有一个问题没想清楚,还请老师帮忙解答一下: 系统的idel进程只有一个,如果多个cpu同时空闲,会不会有问题啊?空闲进程不用per_cpu吗?
    展开

    作者回复: 不会有问题的 因 SMP下每个CPU会对应一个idle 进程 运行同一份代码

    
    8
  • pedro
    置顶
    2021-07-07
    并不会,进程进入等待只是进程状态发生了改变,进程还未让出当前CPU的执行权,待调度后,即 krlschedul(),会寻找已经准备好的其它进程,切换CPU上下文,让出CPU,此时该进程才会真正的停止。 所以调度函数至关重要!

    作者回复: 66666 对的

    共 2 条评论
    15
  • geek2020
    2021-07-15
    好奇很多资料说java执行了Thread.sleep()后,会主动让出CPU的使用权,是怎么做到的?

    作者回复: sleep 会设置定时器 然后 主动 调用调度器

    共 3 条评论
    3
  • Feen
    2021-07-13
    进程进入等待状态后,进程本身处于等待状态,进程被剥夺CPU使用权是通过krlschedul()函数剥夺的,而进程本身并没有调用krlschedul()函数,所以不会立即停止运行,而剥夺CPU使用权是由krlschedul()函数控制的,当保存当前进程寄存器和栈,并且准备好下一个进程的运行函数后,才会让当前进程退出CPU而停止运行了。

    作者回复: 对的

    
    1
  • 青玉白露
    2021-07-07
    进程不会马上停止运行,调用krlschedul()之后,会调度新的进程。

    作者回复: 是的 正确

    
    1
  • Ivan.Qi
    2022-08-24 来自湖北
    遇到一个问题,暂时没什么头绪 1. 通过krlnew_thread 初始化一个进程 krlnew_thread("kernelthread-a", (void*)thread_a_main, KERNTHREAD_FLG, PRILG_SYS, PRITY_MIN, DAFT_TDUSRSTKSZ, DAFT_TDKRLSTKSZ); 2. 进程自定义函数 void thread_a_main(){ uint_t i = 0; kprint("进程A运行:%x\n", i); } 3. 然后程序执行 1. new_cpuidle 2. init_a_thread 3. krlcpuidle_start -> retnfrom_first_sched 4. 最后提示 当前进程: kernelthread-a,犯了不该犯的错误:13, 所以要杀

    作者回复: 你修改代码 了吗

    共 3 条评论
    
  • 我是新手ABC
    2022-05-23
    有个疑问:如果空转函数一直运行的话,也就是CPU不是在运行用户代码就是在运行空转函数,那CPU的使用率会不会一直是100%呢?

    作者回复: 是的 但系统中不只有空转进程

    共 2 条评论
    
  • 艾恩凝
    2022-05-05
    自己建的工程,怎么新建空转进程的时候 运行到krlthread_kernstack_init 函数中,就会报14号异常,这是怎么回事,就是初始化内核栈的时候,按道理说这都是物理地址,怎么还是会进入14 异常

    作者回复: 是不是 地址 映射 的问题

    共 3 条评论
    
  • 胡涂涂
    2022-04-26
    这个调度机制很像嵌入式中实时操作系统的多任务调度,空转进程对标空闲任务。空转任务中,可以做一些维护性的任务,不能让cpu闲下来,哈哈哈

    作者回复: 是的

    
    
  • 阿顺
    2021-08-28
    想咨询下进程如何决策何时要等待,并让出cpu?

    作者回复: 当然是资源 不满足时

    
    