处理器调度——实时调度算法EDF
实验内容:
- 在Linux环境下采用用户级别线程模拟实现EDF实时调度算法。
- 给定一组周期性实时任务并判断是否可调度。
- 如果可调度,请按算法模拟调度次序,并在终端给出Gantt图。
设计原理:
- select_proc()实现调度算法,proc()执行任务,idle()没有可执行任务时执行,main()初始化。
- 为每个线程设计了一个等待锁,暂不运行的任务等待在相应的锁变量上。
- 主线程按调度算法唤醒子线程,子线程执行一个时间单位后把控制权交给主线程判断是否需要重新调度
实验过程如下
处理器调度——实时调度算法EDF
文本代码
1 |
|
编译并运行,结果如下
1.clone和pthread_create的区别?
功能:
clone
:clone
函数是Linux系统提供的系统调用,它可以创建一个新的进程或线程。它提供了更灵活的选项,可以指定新线程所继承的父线程的资源,如文件描述符表、内存空间等。因此,clone
函数可以创建线程,也可以创建进程,还可以实现进程间的共享资源。pthread_create
:pthread_create
函数是POSIX线程库(pthread)提供的函数,用于创建一个新的线程。它只能用于创建线程,不能创建进程。它创建的线程与父线程共享进程的资源,如文件描述符表和内存空间。
调用方式:
clone
:clone
函数是一个系统调用,使用时需要通过提供一个函数指针作为参数,指定新线程要执行的函数。调用clone
函数时,需要指定一系列的标志和选项来设置新线程的行为和继承关系。pthread_create
:pthread_create
函数是一个库函数,使用时需要提供一个函数指针作为参数,指定新线程要执行的函数。调用pthread_create
函数时,只需要提供线程的属性和参数等少量参数即可。
平台兼容性:
clone
:clone
函数是Linux特有的系统调用,因此只能在Linux系统上使用。pthread_create
:pthread_create
函数是POSIX标准定义的函数,几乎所有的主流操作系统都支持POSIX线程库,所以pthread_create
函数可以在多个操作系统上使用。
clone
函数提供了更多的灵活性,可以创建线程或进程,并且可以继承父线程的资源。而pthread_create
函数只能创建线程,并且新线程与父线程共享进程的资源。选择使用哪个函数取决于具体的需求和平台的兼容性要求。
2.调度算法中ci_left和ti_left作用?
在这段代码中,ci_left
和ti_left
分别表示实时任务的剩余执行时间和剩余周期时间。
ci_left
:表示实时任务的剩余执行时间。在每个时间单位内,实时任务的ci_left
会递减,表示任务执行了一个时间单位。当ci_left
减至0时,表示该任务完成了当前周期的执行。ti_left
:表示实时任务的剩余周期时间。在每个时间单位内,实时任务的ti_left
会递减。当ti_left
减至0时,表示当前周期结束,任务需要开始下一个周期的执行。
这两个变量在调度算法中的作用是:
执行实时任务:当调度器选择一个实时任务进行执行时,会通过减少
ci_left
的值来模拟任务的执行。每次执行一个时间单位,ci_left
减1,直到减至0表示任务完成当前周期的执行。控制周期性执行:通过递减
ti_left
的值,判断是否需要开始下一个周期的执行。当ti_left
减至0时,表示当前周期结束,调度器会将ti_left
重置为初始周期时间,以便任务开始下一个周期的执行。
这样,通过ci_left
和ti_left
的管理,调度器可以控制实时任务的执行时间和周期,实现实时任务的周期性执行和调度。
3.EDF算法任务执行序列如下,请分析你的实验结果是否与次一致,为什么?如何修改?(给出修改部分的代码)
1 | typedef struct { // 实时任务描述 |
1 | if (temp1 > tasks[j].deadline) { |