用户态实现线程调度(任务调度)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

代码适用于X86与X86_64架构。

不支持抢占,任务只能自己让出CPU。

下面是代码,将代码全部复制到一个.c文件中,即可编译运行。

/* 
 * 本软件为免费、开源软件。
 * 本软件的版权(包括源码及二进制发布版本)归一切公众所有。
 * 您可以自由使用、传播本软件。
 * 您也可以以任何形式、任何目的使用本软件(包括源码及二进制发布版本),而不受任何版权限制。
 * =====================
 * 作者: 孙明保
 * 邮箱: sunmingbao@126.com
 */


/* 
 * 本程序实现了用户态的任务调度。
 * 适用于X86及X86_64架构。
 * 编译运行方法:
 * [root@localhost ~]# gcc sched.c 
 * [root@localhost ~]# ./a.out
 */

#include <stdio.h>
#include <string.h>

#define    MAX_TASK_NUM       (10)
#define    TASK_STACK_SIZE    (4096)

#define    DBG_PRINT(fmt, args...) \
    do \
    { \
        printf("DBG:%s(%d)-%s:\n"fmt"\n", __FILE__,__LINE__,__FUNCTION__,##args); \
    } while (0)

typedef  void * (*task_entry_ptr) (void *);
typedef struct
{
    char               name[64];
    unsigned long      state;
    task_entry_ptr     entry;
    unsigned long      ret;
    unsigned long      sp;
    unsigned long      pc;
    unsigned long      stack[TASK_STACK_SIZE/sizeof(unsigned long)];
} __attribute__((packed)) t_task;

#define    STATE_INVALID    (0)
#define    STATE_SLEEPING   (1)
#define    STATE_RUNNING    (2)
#define    STATE_FINISHED   (3)

t_task g_at_tasks[MAX_TASK_NUM];
int    g_task_cnt = 0;
#define  task_ptr2idx(ptr)  ((t_task *)(ptr)-g_at_tasks)

unsigned long process_main_thread_sp;
t_task        *pt_cur_running_task;
unsigned long prev_task_sp, prev_task_pc;
unsigned long next_task_sp, next_task_pc;

#if defined( __i386)
#define save_context(mem_var_to_save_sp) \
    do \
    { \
        asm volatile("pushfl\n\t" /* save    flags */ \
                     "pushl %%eax\n\t" \
                     "pushl %%edi\n\t" \
                     "pushl %%esi\n\t" \
                     "pushl %%edx\n\t" \
                     "pushl %%ecx\n\t" \
                     "pushl %%ebx\n\t" \
                     "pushl %%ebp\n\t" \
                     "movl %%esp,%[mem_var_to_store_sp]\n\t" \
            : [mem_var_to_store_sp] "=m" (mem_var_to_save_sp)\
                    ); \
    } while (0)


#define restore_context(mem_var_saved_sp) \
    do \
    { \
        asm volatile("movl %[mem_var_contain_sp],%%esp\n\t" \
                     "popl %%ebp\n\t" \
                     "popl %%ebx\n\t" \
                     "popl %%ecx\n\t" \
                     "popl %%edx\n\t" \
                     "popl
股票练习题作业代码 在下水平太拙,用了最简单的探索回溯算法,所以效率很差。 若有算法高手观贴,还望给点指点。 //股票练习题代码 by 孙明保 -- gupiao.h #ifndef __GUPIAO_H__ #define __GUPIAO_H__ #include //may change to float type in future typedef int32_t 阅读详情

相关推荐

C语言实现操作系统级AI任务调度与并行计算框架

在计算机系统中,任务调度与并行计算是提升计算效率的核心技术。其原理在于通过合理的资源分配与任务管理,使多个计算单元协同工作,从而充分利用硬件性能。在嵌入式与边缘计算等资源受限场景中,这一技术的价值尤为凸显,它直接决定了AI推理等计算密集型任务的实时性与能效。本文聚焦于使用C语言在操作系统原生层构建轻量级AI计算环境,通过设计线程安全的任务队列与工作线程池,实现了高效的队列优化与并行计算。该方案特别适用于智能传感器、边缘设备等缺乏Python解释器与大型框架的平台,为嵌入式AI的落地提供了从底层调度到并行执行

weixin_33417488的博客 277

线程调度之用户级调度和系统级调度

用户级调度 可以提供的调度方式: 调整线程优先级:Java线程有优先级,优先级高的线程获得较多的运行机会(运行时间); static int Max_priority 线程可以具有的最高优先级,值为10; static int MIN_PRIORIYT 线程可以具有的最低优先级,值为1; static int NORM_PRIORITY 分配给线程的默认优先级,值为5; Thread类的setP...

weixin_45923633的博客 819

hznu 1464: ST Task(算角度,注意精度)

You get a ST task, that is: given a stick one end of who is moored on the ground, you are asked to turn over the stick by holding the other end. When it reaches the ground again, the task is finishe

芒果街上的小屋(此博客暂时停用) 670

嵌入式 不定参数printf

#define DbgPrintf(fmt, args...)  printf(fmt, ## args)  #define eric_print(...) {print_current_time(); printf(__VA_ARGS__);} eric_print("%s %d the content of sending is : %s\n",__FILE__,__LINE__,buf_

skdkjxy的专栏 1794

php 调度,用户态实现线程调度(任务调度)

代码适用于X86与X86_64架构。不支持抢占,任务只能自己让出CPU。下面是代码,将代码全部复制到1个.c文件中,便可编译运行。/** 本软件为免费、开源软件。* 本软件的版权(包括源码及2进制发布版本)归1切公众所有。* 您可以自由使用、传播本软件。* 您也能够以任何情势、任何目的使用本软件(包括源码及2进制发布版本),而不受任何版权限制。* =====================* 作者...

weixin_31880681的博客 340

进程、线程、协程

【代码】进程、线程、协程。

m0_65769343的博客 437

真象还原操作系统_第九章_线程

pthread_create的函数原型: 参数名称 作用 __newthread 用于存储新线程的id,即uid __attr 用于指定线程的类型,默认类型为NULL __start_routine 函数指针,用于指向线程中所调用的函数的地址 __arg 给在线程中运行的函数__start_routine的参数,如果有2个及以上的参数,则封装为一个结构体 若pthread_create函数返回值为0,则线程创建成功。 线程的实际功能:调用函数。 线程和函数调用的区别:

weixin_45806011的博客 1200

java 线程哪个级别最高_【疑惑】Java多线程与操作系统的“用户级线程”/“核心级线程”...

个人之见,仅供参考:Java的目标是要跨平台,而不同的操作系统(如类Unix和Windows)任务调度机制有很大的不同,故Java在JVM层面抽象了一套自己的线程机制,用以映射不同的操作系统的任务调度。如你所述的一些缺点,Java在1.1版本之后,这个线程模块就是基于内核级别线程[1]。首先,如果一个机器上只有一个逻辑CPU,此时系统调度器通过轮换时间片的方式来调度任务,所以不存在真正的并行,只...

weixin_39832643的博客 107

13 Day:实现内核线程

线程线程线程,编写操作系统线程

GeniusLS的博客 1089

协程的底层实现原理

协程简介 线程是进程的执行体,拥有一个执行入口,以及从进程虚拟地址空间分配的栈信息,包括用户栈和内核栈 操作系统会记录线程控制信息 线程获得CPU时间片以后才可以执行 CPU切换对应线程的栈基、栈指针、指令指针等寄存器 如果线程各自创建几个执行体,给他们各自指定执行入口,申请一些内存分配给他们做执行栈,那么线程就可以按需调度这几个执行体了 为了实现这几个执行体的切换,线程也需要记录执行体的信息,包括ID、栈的位置、执行入口地址、执行现场等等 线程可以选择一个执行体来执行,此时CPU中指令指针就会指向这个执

a...Z 4719

仅限高级开发者:PHP协程任务调度的7个鲜为人知的技巧

掌握PHP协程的任务调度核心技巧,解决高并发场景下的性能瓶颈。涵盖事件循环、多任务并发、异常处理等7个高级应用方法,提升系统响应速度与资源利用率。仅限进阶开发者,值得收藏。

StepLens的博客 851

线程代码案例4-线程

两个任务可能由一个线程或者两个线程来执行任务任务一放到队列中就会有空闲线程取出任务执行,一个线程取出两次是有可能的。举个例子:用人民币或者是用欧元来计算美元,如果用这样的构造方法就会因为。核心员工,老板通过劳动合同签署的正式员工,平时的活都让他们干。多线程执行的顺序还是靠内核调度哦,此处执行顺序是不固定的。另外还有一种创建简单的线程池方法,较为简便,可用于学习。公司允许存在的最大员工数量;的方式创建线程池,这同样是阿里编码规范约定的。用于存放任务,是线程安全的。中的一种,主要目的是。

2301_79245606的博客 1214

协程-协程实现与原理浅析

浅析协程原理

保持敏锐,保持进化。 357

Marl调度器源码剖析:理解Google开源调度框架的设计哲学

Marl是Google开源的C++11混合线程/纤程任务调度器,它通过创新的设计理念和高效的任务管理机制,为开发者提供了轻量级且高性能的并发编程解决方案。本文将深入剖析Marl调度器的核心设计哲学与实现细节,帮助读者理解其如何在多线程环境中优化任务执行效率。 ## 1. 调度器核心架构:线程与纤程的融合之道 Marl调度器的核心在于将传统线程与轻量级纤程(Fiber)相结合,形成一种混合调度

gitblog_00466的博客 806

multicore_pm_ipc.c多核多任务调度+进程间通信(消息队列)

模块功能对应机制Scheduler多核调度模拟,每个核心独立运行队列类似内核中的runqueue模拟 PCB、状态、时间片类似IPC消息队列通信(同步阻塞)类似内核模拟wait_queueLogging带时间戳的系统日志输出模拟printk🧩整体时序图(核心线程+进程+消息通信)🧠各模块交互架构图📜对应的“内核移植版本设计稿”(Nucleus风格)是否希望我帮你画出「时序图 + 架构图」?

weixin_45951242的博客 531

Python的asyncio事件循环:单线程并发是如何实现的?

Python的asyncio库通过事件循环机制,巧妙地实现了单线程下的高并发,既避免了多线程的开销,又提升了程序的执行效率。asyncio的核心是事件循环,它负责调度和执行异步任务。事件循环通过轮询的方式检查任务队列,当某个任务因I/O操作挂起时,事件循环会立即切换到其他可执行任务,从而避免线程阻塞。Future对象代表异步操作的最终结果,事件循环通过监控Future的状态来决定何时恢复协程的执行。asyncio通过事件循环、协程、任务调度和I/O多路复用等技术,在单线程实现了高效的并发处理。

rnfewr_473的博客 263

coroutine php_PHP 与协程

“协程”(Coroutine)概念最早由 Melvin Conway 于1958年提出。协程可以理解为纯用户态线程,其通过协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。总的来说,协程为协同任务提供了一种运行时抽象,这种抽象非常适合于协同多任务调度和数据流处理。在现代操作系统和编程语言中,因为用户态线程切换代价比内核态线程小,协程成为了一种轻...

weixin_30431445的博客 267

C# Task/ThreadPool async/await对比Golang GMP

C#和Go的并发模型差异源于不同的设计哲学。C#基于ThreadPool+Task+async/await,强调线程复用和渐进演化,但线程阻塞会严重影响吞吐。Go的GMP模型则将goroutine与OS线程解耦,通过P处理器实现高效调度,支持抢占和工作窃取,天然适合高并发场景。两种模型本质上是"复杂度分配"的不同选择:C#将复杂度交给开发者控制,Go则内置于运行时。Go的轻量级goroutine和抢占式调度使其在大规模并发中表现更优。

m0_59178355的博客 1382
上一篇: 一款简单的基于Web的投票工具(PHP+SQLite 实现)
下一篇: Linux内核编译详解
无忧老猪
博客等级 码龄17年 200粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值