首页 > 其他分享 >CS 550操作系统

CS 550操作系统

时间:2024-03-24 14:12:51浏览次数:16  
标签:MLFQ 优先级 操作系统 PID 550 调度 PRT CS 进程

CS 550操作系统,2024年春季
编程项目2(PROJ2)输出:2024年2月25日,SUN截止日期:2024年3月23日,SAT 23:59:59这个项目有两个部分:编码和问答。在编码部分,您将实现在xv6中分叉后更改竞赛条件结果的功能,并实现xv6的类似MLFQ的调度器。在问答部分,您需要回答有关xv6的问题过程调度。
1基线源代码
您将处理需要从您自己的私人GitHub克隆/下载的基本代码存储库。确保您阅读了整个章节以及评分指南(第5节),然后转到本节末尾的以下链接。?转到本节尾的链接接受分配。?处理代码并将其提交到存储库的默认分支。不要创建新的分支机构。否则将导致评分脚本出现问题,并扣5分你的项目成绩。分配链接:https://classroom.github.com/a/2n4W593t(继续到下一页。)1.2 xv6-编码中的进程调度(70分)2.1分叉后的比赛情况()(20分)正如我们在课堂上所讨论的,在fork()之后,父进程或子进程都可以计划先运行。一些操作系统通常会安排父操作系统首先运行,而其他操作系统则允许孩子大多是第一个跑的。正如您将看到的,xv6操作系统将父系统安排为在fork()主要是。在本部分中,您将更改此竞赛条件,以允许用户程序指定在fork()返回后,哪个进程应该首先运行(即成为赢家)。
2.1.1测试驱动程序和预期输出
基线代码包含了一个测试驱动程序fork-rc测试,它允许您检查分叉后的竞赛条件()。该程序在fork-rc test.c中实现程序中,父进程重复调用fork()。在fork()之后,父进程将打印运行时字符串为“父进程”,子进程打印字符串“子进程”并退出。该程序采用一个参数来指定哪个进程应该是之后的“赢家”进程fork()返回。以下是该程序的用法:
$fork_rc_test用法:fork_rc_test 0|1
0:父项计划最频繁运行1:孩子被安排为最经常跑步
当使用“fork-rc test 0”调用程序时,父进程是fork-winner,并且是计划在fork()之后首先运行,这是xv6的默认行为。你会请参见以下输出:
$fork_rc_test 0
正在将父级设置为分叉赢家。。。
试用0:家长!小孩
试用1:家长!小孩
试用2:家长!小孩
试用3:亲孩子!nt!
试用4:家长!小孩
试用5:家长!小孩
...
第45次审判:孩子!父母亲
第46次审判:家长!小孩
审判47:家长!小孩
第48次审判:亲子关系!
第49次审判:生孩子!nt!
请注意,在上面的输出中,父级并不总是首先运行。但大多数试验都是如此。是什么决定了哪个进程在分叉之后首先运行?想想原因。你会回答的问答部分后面的相关问题(第3节)。当使用“fork-rc test1”调用程序时,子进程是fork-winner,并且是计划在fork()之后首先运行。通过正确的实施,预期测试驱动程序的输出如下所示:
2.
$fork_rc_test 1
正在将孩子设置为分叉赢家。。。
试用0:child!父母亲
试验1:孩子!父母亲
试验2:孩子!父母亲
试用3:c家长!希尔德!
试验4:孩子!父母亲
审判5:孩子!父母亲
...
第45次审判:孩子!父母亲
第46次审判:孩子!父母亲
审判47:孩子!父母亲
第48次审判:孩子!父母亲
第49次审判:孩子!父母亲
2.1.2该怎么办
(1) 弄清楚如何更改竞争条件以启用更改fork的功能
赢家
(2) 实现一个设置分叉赢家的系统调用。
(3) 为上述系统调用实现一个用户空间包装器函数,并在“user.h”中声明。
这个包装函数的原型应该是
int fork_winner(int winner);此函数接受一个参数:?如果参数为0(即fork-winner(0)),则父进程为赢家,并且通常应该在fork()之后首先调度(这是默认行为);?如果自变量为1(即分叉赢家(1)),则子进程是赢家,并且应该通常在fork()之后首先安排。注意:为了正确编译基本代码,fork-rc测试程序有一个存根上面包装器函数的实现。开发后记得评论出来您自己的解决方案。提示:理解fork和CPU调度的代码是关键。更改的实际代码竞赛条件(不包括与系统调用相关的代码)可以小于2LOC。(继续到下一页。)3.
2.2 MLFQ调度(50分)
xv6的默认调度程序采用循环(RR)策略。在这一部分中,代 写CS 550您将实现采用类似于MLFQ调度策略的调度算法的调度器我们在课堂上讨论过。具体来说,类似MLFQ的进程调度器应该按照以下规则工作:?规则1:有三种不同的调度优先级:3、2和1,其中3是最高的
1是最低的。?规则2:在任何给定时间,流程的调度优先级设置为以下三项之一值以上。
?规则3:可运行的进程是根据其调度优先级进行调度的:进程具有较高优先级的将被安排在具有较低优先级的之前。RR用于调度具有相同优先级的进程。
?规则4:当进程分叉时,其调度优先级设置为3,优先级为使用以下规则进行了更改。
?规则5:除最低优先级(即优先级1)外,每个优先级都与调度分配,这是具有此优先级的进程可以执行的次数在进程降级到下一个较低优先级之前安排。例如–创建流程时,其调度优先级设置为3。当这个过程自其调度优先级设置为3以来已调度x次,即其调度优先级被降级为2。因此,优先级3的调度分配为x。默认情况下
的值为2。–当调度优先级为2的进程自其调度优先级设置为2以来已调度y次时,其调度优先级将降级为1。因此,优先级2的调度分配是y。y的默认值是4。
?规则6:进程的调度优先级降级为1后,它将保持该优先级直到它完成。?规则7:当用户代码使用set sched()接口将调度策略设置为MLFQ,应该将调度程序重置为新启动。这意味着调度现有进程的优先级应重置回3。
2.2.1测试程序、测试用例及其预期输出
(1) 为了帮助您实现和调试,已将计划跟踪功能添加到基本代码。当启用此跟踪功能时,内核会打印一个字符串,如在安排流程之前,每次都要遵循。
[MLFQ]PID:7 | PRT:3上面的字符串表示MLFQ调度器将使用PID 7来调度进程,并且进程的调度优先级为3。使用此计划跟踪功能,您可以看到器调度的进程序列。
4.(2) 将用于评分(schdtest)的测试程序的代码(schdtest.c)已经假如除了注释掉或删除之外,不应该更改此代码存根在顶部起作用。阅读和理解本测试程序以及测试用例会有所帮助。
(3) 测试程序中使用了五个测试用例。每个测试用例及其预期输出如下所述。?测试用例1:在该测试用例中,父进程启用调度跟踪功能,将调度程序类型设置为默认类型(即RR),创建3个子进程,每一个都执行一些长的计算并等待它们的完成。什么时候三个子进程全部完成,父进程将禁用调度跟踪。这个预期的调度跟踪输出如下:

测试用例1:测试默认调度程序(RR)。。。
父级:已创建子级(pid=4)!
父级:已创建子级(pid=5)!
父级:已创建子级(pid=6)!
[RR]PID:4|PRT:0->[RR]PID:5|PRT:0->[RR]PID:6|PRT:0-0>
[RR]PID:4|PRT:0->[RR]PID:5|PRT:0->[RR]PID:6|PRT:0-0>
[RR]PID:4|PRT:0->[RR]PID:5|PRT:0->[RR]PID:6|PRT:0-0>
...
[RR]PID:3|PRT:0->[RR]PID:6|PRT:0->[RR]PID:6| PRT:0->
[RR]PID:6|PRT:0->[RR]PID:6|PRT:0->[RR]PID:6| PRT:0->
[RR]PID:3 | PRT:0->
由于RR调度器不使用调度优先级,因此当RR生效时,各个进程的调度优先级应设置为0。从输出中我们可以看到RR确实是调度策略。?测试用例2:在此测试用例中,父进程启用调度跟踪功能,将调度程序类型设置为MLFQ,创建3个子进程,每个进程执行一些漫长的计算,并等待它们的完成。当所有三个子进程完成后,父进程将禁用调度跟踪。预期的日程安排跟踪输出如下:
测试用例2:使用默认分配测试MLFQ调度程序。。。
父级:已创建子级(pid=7)!
父级:已创建子级(pid=8)!
父级:已创建子级(pid=9)!
[MLFQ]PID:7 | PRT:3->[MLFQ]PID:8 | PRT:3->[MLFQ]PID:9 | PRT:3->
[MLFQ]PID:7 | PRT:3->[MLFQ]PID:8 | PRT:3->[MLFQ]PID:9 | PRT:3->
[MLFQ]PID:7 | PRT:2->[MLFQ]PID:8 | PRT:2->[MLFQ]PID:9 | PRT:2->
[MLFQ]PID:7 | PRT:2->[MLFQ]PID:8 | PRT:2->[MLFQ]PID:9 | PRT:2->
[MLFQ]PID:7 | PRT:2->[MLFQ]PID:8 | PRT:2->[MLFQ]PID:9 | PRT:2->
[MLFQ]PID:7 | PRT:2->[MLFQ]PID:8 | PRT:2->[MLFQ]PID:9 | PRT:2->
[MLFQ]PID:7 | PRT:1->[MLFQ]PID:8 | PRT:1->[MLFQ]PID:9 | PRT:1->
[MLFQ]PID:7 | PRT:1->[MLFQ]PID:8 | PRT:1->[MLFQ]PID:9 | PRT:1->
...
[MLFQ]PID:7 | PRT:1->[MLFQ]PID:8 | PRT:1->[MLFQ]PID:9 | PRT:1->
[MLFQ]PID:7 | PRT:1->[MLFQ]PID:3 | PRT:3->[MLFQ]PID:8 | PRT:1->
[MLFQ]PID:3|PRT:3->[MLFQ]PID:9|PRT:1->[MLFQ]PID:9| PRT:1->

[MLFQ]PID:9|PRT:1->[MLFQ]PID:9| PRT:1->[MLFQ][MLFQ]pip:9|PRT=1->
[MLFQ]PID:9 | PRT:1->[MLFQ]PID:3 | PRT:2->
在这个测试用例中使用默认分配。因此,如调度所示跟踪输出,三个子进程开始时优先级为3。他们以RR方式调度了2次,并且被降级为优先级2(因为优先级3的默认分配是2)。虽然他们的日程安排优先级是2,但他们以RR方式调度4次,然后被降级为优先级1(因为优先级2的默认分配是4)。请注意,在本例中,父进程的PID为3。父进程是直到跟踪结束才计划,因为它正在等待子进程'完成它在最后被安排了三次(见输出中的最后三行),其中一个子进程退出时,每个进程都从wait()返回。?测试用例3:这是测试用例1的重复。?测试用例4:在此测试用例中,父进程启用调度跟踪功能,将调度程序类型设置为MLFQ,创建3个子进程,每个子进程执行一些漫长的计算,并等待它们的完成。在长计算的中间,三个子进程中的一个子进程(其PID为3的倍数)派生出一个子进程在测试代码中被称为“运时生成的进程”的进程,并等待它的完成。当所有三个子进程完成时,父进程将禁用调度跟踪。预期的调度跟踪输出如下:

测试用例4:使用运行时生成的进程测试MLFQ调度器。。。
父级:已创建子级(pid=13)!
父级:已创建子级(pid=14)!
父级:已创建子级(pid=15)!
[MLFQ]PID:13|PRT:3->[MLFQ]PID:14|PRT:3->[MLFQ]PID:15|PRT:3->
[MLFQ]PID:13|PRT:3->[MLFQ]PID:14|PRT:3->[MLFQ]PID:15|PRT:3->
[MLFQ]PID:13 | PRT:2->[MLFQ]PID:14 | PRT:2->[MLFQ]PID:15 | PRT:2->
[MLFQ]PID:13 | PRT:2->[MLFQ]PID:14 | PRT:2->[MLFQ]PID:15 | PRT:2->
[MLFQ]PID:13 | PRT:2->[MLFQ]PID:14 | PRT:2->[MLFQ]PID:15 | PRT:2->
[MLFQ]PID:13 | PRT:2->[MLFQ]PID:14 | PRT:2->[MLFQ]PID:15 | PRT:2->
[MLFQ]PID:13 | PRT:1->[MLFQ]PID:14 | PRT:1->[MLFQ]PID:15 | PRT:1->
...
[MLFQ]PID:13 | PRT:1->[MLFQ]PID:14 | PRT:1->[MLFQ]PID:15 | PRT:1->
[MLFQ]PID:13 | PRT:1->[MLFQ]PID:14 | PRT:1->[MLFQ]PID:15 | PRT:1->
[MLFQ]PID:16|PRT:3->[MLFQ]PID:16| PRT:3->[MLFQ]16|PRT:2->
[MLFQ]PID:16|PRT:2->[MLFQ]PID:16| PRT:2->[MLFQ][MLFQ]pip:16|PRT=2->
[MLFQ]PID:13 | PRT:1->[MLFQ]PID:14 | PRT:1->[MLFQ]pip:16 | PRT:1->
[MLFQ]PID:13 | PRT:1->[MLFQ]PID:14 | PRT:1->[MLFQ]pip:16 | PRT:1->
...
[MLFQ]PID:13 | PRT:1->[MLFQ]PID:14 | PRT:1->[MLFQ]pip:16 | PRT:1->
[MLFQ]PID:13 | PRT:1->[MLFQ]PID:3 | PRT:3->[MLFQ]PID:14 | PRT:1->
[MLFQ]PID:16|PRT:1->[MLFQ]PID:14|PRT:1->[MLFQ]PID:3|PRT:3->
[MLFQ]PID:16|PRT:1->[MLFQ]PID:16| PRT:1->[MLFQ][MLFQ]pip:16|PRT=1->
...
[MLFQ]PID:16 | PRT:1->[MLFQ]PID:15 | PRT:1->[MLFQ]pip:15 | PRT=1->
[MLFQ]PID:15|PRT:1->[MLFQ]PID:15| PRT:1->[MLFQ][MLFQ]pip:15|PRT=1->
...
[MLFQ]PID:15|PRT:1->[MLFQ]PID:15| PRT:1->[MLFQ][MLFQ]pip:15|PRT=1->
[MLFQ]PID:15|PRT:1->[MLFQ]PID:15| PRT:1->[MLFQ]-PID:3|PRT:2->

此测试用例类似于测试用例2,但在运行时生成了一个新流程。在上面的输出中,运行时生成的进程的PID为16情况2,这个测试用例的上述输出应该很容易理解。?测试用例5:此测试用例与测试用例2相似,但分配不同于默认的一个。优先级3和2的分配在测试前设置为4和8,以及在测试之后,它们被设置回默认值。预期的计划跟踪输出如下:

测试用例5:使用新的分配测试MLFQ调度器。。。
父级:已创建子级(pid=17)!
父级:已创建子级(pid=18)!
父级:已创建子级(pid=19)!
[MLFQ]PID:17|PRT:3->[MLFQ]PID:18|PRT:3->[MLFQ]PID:19|PRT:3->
[MLFQ]PID:17|PRT:3->[MLFQ]PID:18|PRT:3->[MLFQ]PID:19|PRT:3->
[MLFQ]PID:17|PRT:3->[MLFQ]PID:18|PRT:3->[MLFQ]PID:19|PRT:3->
[MLFQ]PID:17|PRT:3->[MLFQ]PID:18|PRT:3->[MLFQ]PID:19|PRT:3->
[MLFQ]PID:17|PRT:2->[MLFQ]PID:18|PRT:2->[MLFQ]PID:19|PRT:2->
[MLFQ]PID:17|PRT:2->[MLFQ]PID:18|PRT:2->[MLFQ]PID:19|PRT:2->
[MLFQ]PID:17|PRT:2->[MLFQ]PID:18|PRT:2->[MLFQ]PID:19|PRT:2->
[MLFQ]PID:17|PRT:2->[MLFQ]PID:18|PRT:2->[MLFQ]PID:19|PRT:2->
[MLFQ]PID:17|PRT:2->[MLFQ]PID:18|PRT:2->[MLFQ]PID:19|PRT:2->
[MLFQ]PID:17|PRT:2->[MLFQ]PID:18|PRT:2->[MLFQ]PID:19|PRT:2->
[MLFQ]PID:17|PRT:2->[MLFQ]PID:18|PRT:2->[MLFQ]PID:19|PRT:2->
[MLFQ]PID:17|PRT:2->[MLFQ]PID:18|PRT:2->[MLFQ]PID:19|PRT:2->
[MLFQ]PID:17|PRT:1->[MLFQ]PID:18|PRT:1->[MLFQ]PID:19|PRT:1->
[MLFQ]PID:17|PRT:1->[MLFQ]PID:18|PRT:1->[MLFQ]PID:19|PRT:1->
...
[MLFQ]PID:17|PRT:1->[MLFQ]PID:18|PRT:1->[MLFQ]PID:3|PRT:3->
[MLFQ]PID:3|PRT:3->[MLFQ]PID:17|PRT:1->[MLFQ]PID:3| PRT:3->
[MLFQ]PID:3|PRT:3->[MLFQ]PID:19|PRT:1->[MLFQ]PID:19| PRT:1->
[MLFQ]PID:19|PRT:1->[MLFQ]PID:19| PRT:1->[MLFQ][MLFQ]pip:19|PRT=1->
[MLFQ]PID:19|PRT:1->[MLFQ]PID:3|PRT:2->[MLFQ]PID:3| PRT:2->
同样,如果理解测试的话,上面的输出应该很容易理解情况2。
2.2.2该怎么办
(1) 如果运行基本代码中包含的测试程序,您会注意到操作系统的输出内核调度跟踪消息与父进程打印的消息混合在一起。这是因为调度上下文切换发生在父进程分叉子进程时过程。为了确保测试程序能够生成格式良好的输出,如图所示上面,您的工作是实现一个允许用户程序暂停计划的功能不同的过程。编写一个暂停进程调度的系统调用。当进程调度暂停时,S将继续运行当前进程,直到进程调度再次被启用。编写相应的系统调用用户空间包装器函数,并在中声明user.h”。包装器函数的原型应该是:
void pause_scheduling(int pause);
–说明:此功能暂停流程调度。
–参数:此函数接受一个参数。
–pause:若要暂停进程调度,请将此参数设置为1。启用流程
计划,请将此参数设置为0。
–返回值:此函数没有返回值。
(2) 实现允许用户程序设置不同的分配的功能调度优先级。编写一个系统调用,设置调度优先级的分配。编写相应的系统调用用户空间包装器函数,并在中声“user.h”。包装器函数的原型应该是:int mlfq_set_allocation(int优先级,int分配);–说明:此函数将“优先级”(第一个参数)的分配设置为“分配”
(第二个参数)。
–参数:此函数接受两个参数。
–优先级:要设置分配的调度优先级。
–分配:新的分配值。
–返回值:成功设置优先级分配后,此功能
返回0。函数在失败时返回-1。
(3) 实现MLFQ调度策略,删除开头定义的存根函数
的“STUB FUNCS”宏定义),并测试您的
实施注意:您的实现应该保留修复always-100%CPU利用率的补丁问题如果您的代码导致问题再次出现,则扣10分(请参阅中的第4点“分级”部分了解详细信息)。
2.2.3提示
您可能已经注意到,您将要实施的MLFQ调度策略参考在上面的描述中称为类似MLFQ的调度策略。MLFQ之间的差异你将在这个项目中实施的策略,以及你在课堂上学到的MLFQ策略是该项目中的MLFQ策略不强制使用不同队列进行不同的日程安排优先事项。因此,您可以在xv6和
实现所需的MLFQ逻辑。换句话说,这里的“Q”不一定是物理的由队列数据结构支持的队列。它也可以是逻辑队列。在xv6代码中学习进程调度上下文切换是如何发生的,将有助于实现暂停进程调度的功能。(继续到下一页。)
3 xv6中的进程调度-问答(30分)回答以下关于流程调度实施的问题。
Q1:(10分)xv6内核是使用协作方式还是非协作方式来获取在用户进程运行时控制?解释xv6的方法是如何使用xv6的代码工作的。
Q2:(10分)调用fork()后,为什么父进程先于子进程运行在大多数情况下?但在某些情况下,孩子确实会先跑。在什么情况下子进程在fork()之后在父进程之前运行?
Q3:(10分)当调度器取消对旧进程的调度并调度新进程时保存旧进程的上下文(即CPU寄存器)并加载新进程的上下文过程显示执行这些上下文保存/加载操作的代码。展示如何这段代码是在保存旧进程和加载新进程时到达的上下文用您喜欢的任何编辑器输入您对上述问题的答案,并将其导出为PD文件名为“xv6-sched-mechanism.pdf”,并将该文件提交到Brightspace中的分配链接。

4提交您的作品
一旦你的GitHub私人存储库中的代码准备好进行评分,请提交一条文本名为“DONE”的文件(以及以前的“xv6 sched-mechisms.pdf”)添加到分配Brightspace的链接。在Brightspace中看到“DONE”文件之前,我们无法知道您的GitHub存储库中的代码是否已准备好进行分级。忘记了提交“完成”文件将导致逾期罚款,如稍后的“分级”部分。重要注意事项:?如果您在完成本项目时参考了任何形式的在线材料或资源
(代码和问答),请说明此“完成”文件中的所有参考文献。未能做到这一点,一次检测到,将导致整个项目得零分,并根据违规行为的严重性。?为了鼓励(阻止)早(晚)开始本项目,讲师和助教将未在截止日期回复与项目相关的问题。建议:在提交之前,在CS机器上彻底测试您的代码。10
5分级
以下是本项目和未来所有项目的一般分级指南。(1) 在提交“完成”文件之前,不会对存储库中的代码进行评分到Brightspace。
(2) Brightspace系统上显示的“完成”文件的提交时间将用于确定您的提交是否按时或计算延迟天数。逾期罚款是前两天每迟到一天得分的10%,每迟到一日得分的20%之后
(3) 如果要在部门的远程集群上编译并运行xv6系统,请记住使用我们GitHub课堂提供的基线xv6源代码。编译和运行在其他地方下载的xv6源代码可以导致QEMU上100%的CPU利用率。从基线代码中删除修补程序代码也会导致同样的问题。所以制造在删除它们之前,请确保您理解代码。如果系统管理员报告您在QEMU上以100%的CPU利用率运行QEMU,则扣10分。
(4) 如果提交的修补程序无法成功修补到基线源代码,或者修补的
代码无法编译:
1 TA将尝试解决问题(时间不超过3分钟);2如果(问题已解决)
3 1%-10%的折扣(根据修复的复杂程度,TA自行决定);其他4个
5助教可以通过电子邮件联系学生或安排演示来解决问题;
6如果(问题已解决)
7 11%-20%的折扣(根据修复的复杂程度,TA自行决定);其他8个
9所有点都偏离;
因此,如果TA联系您解决问题,请立即回复TA的电子邮件或准时出席演示预约;否则上面的线9将是有效的。
(5) 如果代码未按项目规范中的要求工作,TA应根据
分配的任务和实际问题的全部要点。
(6) 最后但并非最不重要的是,坚持教学大纲中规定的合作政策:
你可以和同学们讨论,但代码绝对应该保留私有的任何形式的作弊都会导致项目得零分

标签:MLFQ,优先级,操作系统,PID,550,调度,PRT,CS,进程
From: https://www.cnblogs.com/rluanguae/p/18092367

相关文章

  • 【CSP试题回顾】202303-2-垦田计划(优化)
    CSP-202303-2-垦田计划关键点:二分查找在这个问题中,有一系列的田地需要在特定的时间tit_iti......
  • tcs393数据挖掘
    tcs393数据挖掘分组分配【每组2-3名成员】这项课业相当于本模块总分的25%。此课业旨在帮助学生探索和分析一组数据,并将其重建为有意义的数据决策代表。在线环境不断发展,网站成为企业的重要资产,组织和个人。随着互联网的不断发展高效的网站分类变得至关重要。了解网站的性质内容及......
  • P9755 [CSP-S 2023] 种树
    P9755[CSP-S2023]种树首先,容易看出单调性,可以对最少天数二分。转为判定性问题后,我们思考如何判定。对于每棵树,都可以从刚种下长到最后一天。我们由此可以写出\(calc(i,l,r)\)表示第\(i\)棵树从第\(l\)天长到第\(r\)天的高度。\(calc(i,l,r)=\sum\limits_{i=l}^r\max(......
  • wpf add resource dynamically in cs file
    //xaml<Windowx:Class="WpfApp12.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic......
  • C语言UNIX域套接字CS模型
    实验目标:1实现基于流的unix域套接字通信cs模型2实现基于数据报的unix域套接字通信cs模型3可以观察到CS两端的完整启动退出流程,为了实现这一目标仅进行一次通信实验心得:1使用unlink避免地址冲突清理资源2 传统udp在首次sendto时系统临时分配端口,在套接字关闭|程......
  • Linux操作系统的简单终端(Terminal)命令
    ls:列出当前目录下的文件和文件夹。你可以使用ls-l来查看详细信息,或者使用ls-a来显示包括隐藏文件在内的所有文件。cd:用于切换目录。例如,cdDocuments会进入Documents文件夹。你还可以使用cd..来返回上一级目录,或者使用cd~来回到你的主目录。pwd:显示当前所在的目录路径。chm......
  • CSS(二)
    一、CSS的复合选择器1.1什么是复合选择器在CSS中,可以根据选择器的类型把选择器分为基础选择器和复合选择器,复合选择器是建立在基础选择器之上,对基本选择器进行组合形成的。复合选择器可以更准确、更高效的选择目标元素(标签)复合选择器是由两个或多个基础选择器,......
  • HTML5抽奖转盘-CSS3超简单版本
     网上有很多关于抽奖转盘的代码和实例,有使用JavaScript控制动画的,有使用Canvas实现的,它们思路各不相同,本文将介绍一种采用CSS3的方式来实现转盘动画效果,非常简单,只需几行代码即可实现。 核心思路采用CSS3的transition(过渡效果),给定需要旋转的元素设置transform的rotate属性......
  • 【包邮送书】HTML5+CSS3从入门到精通
    欢迎关注博主Mindtechnist或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关注公粽号《机器和智能》回复关键词“python项目实战......
  • CS 2410计算机体系结构
    CS2410计算机体系结构2024年春季课程项目分发时间:2024年2月19日到期时间:4月22日晚上11:592024年介绍这是一个单人项目。允许并鼓励你与同学讨论该项目,但不得分享项目源代码和报告。请在报告中列出您的讨论同行(如果有的话)屈服动态调度处理器的一个优点是它能够容忍延迟或在无序......