【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

自己以前没有写过smp os,关于这方面的os也看得比较少。如果有,也是关于linux smp的部分,但是Linux上面会涉及到负载均衡,也很复杂,理解上面有一定的难度。然而是等到自己真正写的时候,发现困难也是可以克服的。抛却均衡负载不谈,自己写smp os也是可以做到的。下面就是我在实践中的一些做法。

(1) 每个任务一旦分配到具体cpu上之后,就不再迁移

// scheduler functionSTATUS schedule() {u8 cpuid;Task* p_task;cpuid = get_local_cpu();if(is_in_irq()) {return IN_IRQ;}if(is_sched_lock()) {return OS_SCHED_LOCKED;}DISABLE_IE();p_task = get_list_entry(g_ready[cpuid].next, Task, rdy);sched_task[cpuid] = p_task;if(current_task[cpuid] != p_task){p_task-> state = RUNNING;CONTEXT_SWITCH();}ENABLE_IE();return SUCCESS;
}

(2)因为任务无法迁移,所以如果需要唤醒的时候只能是由核间中断来完成,下面的这个信号量可以说明问题,

// create semSTATUS create_sem(Sem* p_sem, u32 count){if(NULL == p_sem) {return PARAM_ERROR;}p_sem-> blk_type = SEM_TYPE;spin_lock_init(&p_sem-> lock);list_init(&p_sem-> head);p_sem-> count = count;return SUCCESS;
}// get semSTATUS get_sem(Sem* p_sem, u8 wait){u8 cpuid;cpuid = get_local_cpu();if(is_in_irq()) {return IN_IRQ;}if(NULL == p_sem) {return PARAM_ERROR;}if(SEM_TYPE != p_sem-> blk_type) {return WRONG_BLOCK_TYPE;}DISABLE_IE();spin_lock(&p_sem-> lock);if(p_sem-> count) {p_sem-> count --;spin_unlock(&p_sem-> lock);ENABLE_IE();return SUCCESS;}if(is_sched_lock()) {spin_unlock(&p_sem-> lock);ENABLE_IE();return OS_SCHED_LOCKED;}if(!wait) {spin_unlock(&p_sem-> lock);ENABLE_IE();return NOT_WAIT;}remove_from_rdy_queue(current_task[cpuid]);add_to_blk_queue(&p_sem-> head, current_task[cpuid]);current_task[cpuid]-> state =  BLOCKED;current_task[cpuid]-> blk_data = p_sem;spin_unlock(&p_sem-> lock);ENABLE_IE();schedule();return SUCCESS;
}// put semSTATUS put_sem(Sem* p_sem) {u8 cpuid;Task* p_task;if(NULL == p_sem) {return PARAM_ERROR;}if(SEM_TYPE != p_sem-> blk_type){return WRONG_BLOCK_TYPE;}DISABLE_IE();spin_lock(&p_sem-> lock);if(is_list_empty(&p_sem-> head)){p_sem-> count ++;spin_unlock(&p_sem-> lock);ENABLE_IE();return SUCCESS;}p_task = get_list_entry(p_sem->head.next, Task, blk);remove_from_blk_queue(p_task);list_init(&p_task-> blk);cpuid = get_local_cpu();if(cpuid != p_task-> cpuid) {// send ipi to target cpusend_ipi(WAKE_UP_TASK, p_task, p_task-> cpuid);spin_unlock(&p_sem-> lock);ENABLE_IE();return SUCCESS;}add_to_rdy_queue(&g_ready[cpuid], p_task);p_task-> state = READY;p_task-> blk_data = NULL;spin_unlock(&p_sem-> lock);ENABLE_IE();return SUCCESS;
}

(3)核间中断,重新将任务加入就绪队列

// send ipivoid send_ipi(u32 cmd, void* p_data, u8 cpuid) {spin_lock(&g_ipi_lock[cpuid]);g_ipi_cmd[cpuid] = cmd;g_ipi_data[cpuid] = p_data;ipi_trigger(cpuid);
}// ipi isr func, for all coresvoid ipi_isr_func() {u8 cpuid;u32 cmd;void* p_data;Task* p_task;cpuid = get_local_cpu();cmd = g_ipi_cmd[cpuid];p_data = g_ipi_data[cpuid];// ready to get other ipi cmdspin_unlock(&g_ipi_lock[cpuid]);DISABLE_IE();p_task = (Task*) p_data;if(BLOCKED == p_task-> state) {add_to_rdy_queue(&g_ready[cpuid], p_task);p_task-> blk_data = NULL;p_task-> state = READY;}ENABLE_IE();
}

(4)目前大多数pc都是多核形式,用pc写smp os最好不过了,用vc调试起来也方便,

u8 get_local_cpu() {s32 CPUInfo[4];__cpuid(CPUInfo, 1);if ((CPUInfo[3] & (1 << 9)) == 0)return -1;return (u8)(CPUInfo[1] >> 24);
}

其实写代码不用怕,越是大胆写,才越能提高自己的能力,才会进步更大。

随想录(无均衡负载的smp os设计)相关推荐

  1. 随想录(关于smp的均衡负载)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 对于各design house的soc来说,smp都是一个必备的基本功能.这年头,如果谁说自己家 ...

  2. 千万级并发HAproxy均衡负载系统介绍

    Haproxy介绍及其定位 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.根据官方数据,其最高极限支持10G的并发. HA ...

  3. [转贴]内核版之OS设计

    hyl (enthusiast) 10/06/02 10:28 [精华] 内核版之OS设计   本贴是索引页, 其回贴是早期系统的一些介绍. 了解最新进展 新闻和进展 Join us 参与问题的解决 ...

  4. 均衡负载集群(LBC)-2

    均衡负载集群(LBC)-2 1.LVS的调度算法讲解 负载均衡集群的调度算法 通用算法-调度 静态调度算法(固定算法):只根据算法本身去调度,不考虑服务器本身 动态调度算法(动态算法):除了考虑算法本 ...

  5. Haproxy+Keepalived+MySQL高可用均衡负载部署

    一.安装主从MySQL 1. 按照Linux-rpm安装MySQL步骤完成MySQL安装: 2. 修改启动的配置文件 (1)复制/usr/share/mysql路径下的my-default.cnf文件 ...

  6. 集群和均衡负载[摘]

    http://www.xxlinux.com/linux/article/network/app/20060921/4464.html 本文目的在于分析Jetspeed支持集群的现状.首先介绍了集群计 ...

  7. 【2022项目复盘】无位置传感器的无刷直流电机驱动设计

    目录 概述 BLDC发展 历史 现状 未来前景 工作原理 BLDC结构 六步法 启动方式 转子预定位 转子的同步加速 切入转子正常旋转程序 反电动势检测法 硬件设计 控制模块最小系统 三相逆变器电路及 ...

  8. kbmMW均衡负载与容灾(3)(转载红鱼儿)

    在kbmMW均衡负载与容灾(1)中,介绍了利用ClientTransport的OnReconnect事件,对联接的应用服务器的地址进行更换,做容灾处理.实际上,作者还给我们提供了另外一种机制,直接在C ...

  9. kbmMW均衡负载与容灾(2)(转载红鱼儿)

    集中式均衡负载 为实现集中式均衡负载方案,需要实现两个不同的应用服务器,一个是只包含均衡负载组件再无其他内容的应用服务器,可称之为均衡负载应用服务器,下文简称LB Server,另外一个就是包含一个或 ...

最新文章

  1. 如何在同一台电脑上多个账户同时登陆MSN
  2. 云计算的服务模型 SaaS PaaS IaaS
  3. 自学python数据分析要多久-如果只有1小时学Python,看这篇就够了
  4. 通过句柄找到广告弹窗进程
  5. 织入业务代码-IModifyService
  6. Bean实例化三种方式
  7. php输出图片没有,ThinkPHP里无法输出图片 设置响应头
  8. 20150203一些移动端H5小bug解决
  9. inline 内联函数详解 内联函数与宏定义的区别
  10. php能用大括号写数组,PHP7.4不再支持使用大括号访问数组以及字符串的偏移
  11. python比较两张图片是否一样_python实战===用python对比两张图片的不同
  12. soul刷屏编程代码_奔涌吧,编程!少儿编程教育在未来会像语文,数学一样重要!...
  13. 非IT专业大学生对erp的思考
  14. 计算机竞赛制作机器人,2016全国中小学电脑制作比赛机器人灭火竞赛规则
  15. python 操作word 修改页眉与页脚
  16. 解决Xposed不联网问题,附带Xposed安装教程雷电夜神逍遥模拟器
  17. python向量运算_2 向量的运算在Python中的实现
  18. android 群英传代码,Android控件架构(Android群英传)
  19. SAP BW学习之基础知识篇
  20. 使用luarocks为lua5.2安装库

热门文章

  1. 9.思科交换路由基本命令操作
  2. tomcat启动时报下面的错
  3. Windows系统错误代码大全
  4. WinAPI: GetCursorPos - 获取鼠标指针的当前位置
  5. 解决AutoCAD acmgd.dll ARX命令中发现异常
  6. C#- Chart Controls (转)
  7. Asp调用函数是否会影响性能?
  8. Re-Order Buffer
  9. ListViewAdapter
  10. MySQL 半同步复制+MMM架构