5.模拟线程切换

本文介绍了如何模拟Windows系统的线程切换过程,包括线程在系统中的状态(如正在运行、等待、调度),线程创建的细节(从下标1开始存储),以及线程切换的关键点——主动让出CPU、通过堆栈而非TSS保存寄存器值。线程切换本质上是堆栈的切换。文中提供了相关的源代码文件(ThreadSwitch.h, ThreadSwitch.c, main.c)供参考。" 81316150,7920121,ROS命名空间与重映射详解,"['ROS', '命名空间', '通信', '重映射']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟Windows线程切换(ThreadSwitch)

在这里插入图片描述

正在运行的线程在KPCR里,等待的线程在等待链表中,调度中的线程在那32个调度链表中。

创建它是从下标1的位置开始存的而不是0,因为main需要一个线程。

创建的线程还不能调度还需要初始化的环境,寄存器的值、当前线程的堆栈要确定

在这里插入图片描述

模拟线程切换总结:

  1. 线程不是被动切换的,而是主动让出CPU
  2. 线程切换并没有使用TSS来保存寄存器,而是使用堆栈.
  3. 线程切换的过程就是堆栈切换的过程

以下是代码:

ThreadSwitch.h

#pragma once
#include <windows.h>
#include "stdio.h"

//最大支持的线程数
#define MAXGMTHREAD 100

//线程信息的结构
typedef struct
{
   
   
	char* name;							//线程名 相当于线程ID
	int Flags;							//线程状态
	int SleepMillsecondDot;				//休眠时间

	void* initialStack;					//线程堆栈起始位置
	void* StackLimit;					//线程堆栈界限
	void* KernelStack;					//线程堆栈当前位置,也就是ESP

	void* lpParameter;					//线程函数的参数
	void(*func)(void* lpParameter);		//线程函数
}GMThread_t;

void GMSleep(int MilliSeconds);
int RegisterGMThread(char* name, void(*func)(void*lpParameter), void* lpParameter);
void Scheduling();

ThreadSwitch.c

#include "ThreadSwitch.h"


//定义线程栈的大小
#define GMTHREADSTACKSIZE 0x80000

//当前线程的索引
int CurrentThreadIndex = 0;

//线程的列表
GMThread_t GMThreadList[MAXGMTHREAD] = {
   
    NULL, 0 };

//线程状态的标志
enum FLAGS
{
   
   
	GMTHREAD_CREATE = 0x1,
	GMTHREAD_READY = 0x2,
	GMTHREAD_SLEEP = 0x4,
	GMTHREAD_EXIT = 0x8,
};

//启动线程的函数
void GMThreadStartup(GMThread_t* GMThreadp)
{
   
   
	GMThreadp->func(GMThreadp->lpParameter);
	GMThreadp->Flags = GMTHREAD_EXIT;
	Scheduling();

	return;
}

//空闲线程的函数
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值