Nanos-操作系统oslab1(2)---sleep和wakeup

这篇博客详细介绍了如何在操作系统中实现睡眠(sleep)和唤醒(wakeup)功能,涉及两个队列的设计——运行队列runningList和等待队列waitingList。作者通过链表的使用来解释节点的加入和遍历,并给出了测试用例,包括生成4个线程的PCB并加入运行队列。在调度函数中讨论了不同场景下的问题,以及wakeup和sleep的具体设计方案。
摘要由CSDN通过智能技术生成

目标:

这次要为进程实现sleep功能和wakeup功能,所以我们需要添加两个队列,一个是运行队列runningList,还有一个则是等待队列waitingList。

链表的使用

提供的链表节点结构如下:

typedef struct ListHead 
{
	ListHead *prev;
	ListHead *next;
}ListHead;
如何使用这个链表节点呢?毕竟平常创建的链表节点,里边可是会在节点定义里边添加value值的啊。
我们可以使用PCB和ListHead来新创建一个节点结构如下:

typedef struct PCBList
{
	PCB *pcb;
        ListHead listNode;
}PCBList;
关于这个链表,它提供了以下几个函数,

链表节点的初始化,链表节点的加入

void list_init(ListHead *list)
{
	assert(list != NULL);
	list->prev = list;
	list->next = list;
	list->value = 0;
}
void list_add(ListHead *prev, ListHead *next, ListHead *data)
{
	assert(data != NULL);
	data->prev = prev;
	data->next = next;
	if (NULL != prev)
	{
		prev->next = data;
	}
	if (NULL != next)
	{
		next->prev = data;
	}
}
void list_add_before(ListHead *list, ListHead *data)
{
	assert(list != NULL);
	list_add(list->prev, list, data);
}
我看到这个双向链表节点的加入感觉好懵懵懂懂啊 委屈,新节点加入之后,链表结构到底是怎么变化的呢?

比如我首先创建一个头结点ListHead head,之后初始化它,那么我们的双向链表就是如下图所示:



加入一个节点之后呢?

ListHead node1;

list_init(node1);

list_add_before(&head, &node1);

我们知道会有这样的操作:

list_add(head->prev, &head, &node1)

也即node1->prev = head->prev;

node1->next = &head;

head->prev->next = node1;

head->prev = node1;

感觉好混乱啊尴尬,画个图来看看吧:

首先head的prev和next都是指向自己的,为了表示更加清晰,我们使用一个单独的head->prev节点,当然了,此时head->prev == head。

接着node1节点加入,然后就是按照上面写的修改指向,也就是此时的中间图。

因为head->prev和head节点时同一个节点,所以合并之后就变成第三幅图了。



那么我再加入一个节点node2情况会怎么样呢?

node2->prev = head->prev;

node2->next = &head;

head->prev->next = node2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值