狠狠综合久久久久综合网址-a毛片网站-欧美啊v在线观看-中文字幕久久熟女人妻av免费-无码av一区二区三区不卡-亚洲综合av色婷婷五月蜜臀-夜夜操天天摸-a级在线免费观看-三上悠亚91-国产丰满乱子伦无码专区-视频一区中文字幕-黑人大战欲求不满人妻-精品亚洲国产成人蜜臀av-男人你懂得-97超碰人人爽-五月丁香六月综合缴情在线

代寫CSIE3310、代做c++/Python編程

時間:2024-03-21  來源:  作者: 我要糾錯



Machine Problem 1 - Thread Package
CSIE3310 - Operating Systems
National Taiwan University
Total Points: 100
Release Date: March 5
Due Date: March 19, 23:59:00
TA e-mail: ntuos@googlegroups.com
TA hours: Wed. & Thu. 10:00-12:00 before the due date, CSIE Building R428
Contents
1 Summary 1
2 Environment Setup 2
3 Part 1 (60 points) 2
3.1 Function Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
3.2 Sample Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
4 Part 2 (40 points) 4
4.1 Function Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.2 Reminders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.3 Sample Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
5 Run Public Test Cases 5
6 Submission and Grading 5
6.1 Source Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
6.2 Folder Structure after Unzip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
6.3 Grading Policy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
7 Appendix 6
1 Summary
In this MP, you’ll try to implement a user-level thread package with the help of setjmp and longjmp. The
threads explicitly yield when they no longer require CPU time. When a thread yields or exits, the next thread
should run. The thread can assign additional tasks to other threads, including itself. There are two parts in
this MP. In the first part, you’ll need to implement the following functions:
• thread add runqueue
• thread yield
• dispatch
• schedule
• thread exit
• thread start threading
In the second part, you’ll need to implement the following functions:
• thread assign task
The following function has been implemented for you:
• thread create
Each thread should be represented by a struct thread that contains, at a minimum, a function pointer to the
thread’s function and a pointer of type void * as the function parameters. The function of the thread will take
the void * as its argument when executed. The struct should include a pointer to its stack and some jmp buf
to store it’s current state when thread yield is called. It should be enough to use only setjmp and longjmp
to save and restore the context of a thread.
2 Environment Setup
1. Download the MP1.zip from NTUCOOL, unzip it, and enter it.
$ unzip MP1.zip
$ cd mp1
2. Pull Docker image from Docker Hub.
$ docker pull ntuos/mp1
3. Use docker run to start the process in a container and allocate a TTY for the container process.
$ docker run -it -v $(pwd)/xv6:/home ntuos/mp1
4. Execute xv6
$ make qemu
5. You will use the skeleton of threads.h and threads.c provided in xv6/user folder. Make sure you are
familiar with the concept of stack frame and stack pointer taught in System Programming. It is also
recommended to checkout the appendix given.
3 Part 1 (60 points)
3.1 Function Description
1. struct thread *thread create(void (*f)(void *), void *arg): This function creates a new thread
and allocates the space in stack to the thread. Note, if you would like to allocate a new stack for the
thread, it is important that the address of the stack pointer should be divisible by 8. The function returns
the initialized structure. If you want to use your own template for creating thread, make sure it works
for the provided test cases.
2. void thread add runqueue(struct thread *t): This function adds an initialized struct thread to
the runqueue. To implement the scheduling functionality, you’ll need to maintain a circular linked list
of struct thread. You should implement that by maintaining the next and previous field in struct
thread which always points to the next to-be-executed thread and the previously executed thread respectively. You should also maintain the static variable struct thread *current thread that always
points to the currently executed thread. Note: Please insert the new thread at the end of the runqueue,
i.e. the newly inserted thread should be current thread->previous.
3. void thread yield(void): This function suspends the current thread by saving its context to the
jmp buf in struct thread using setjmp. The setjmp in xv6 is provided to you, therefore you only need
to add #include "user/setjmp.h" to your code. After saving the context, you should call schedule()
to determine which thread to run next and then call dispatch() to execute the new thread. If the thread
is resumed later, thread yield() should return to the calling place in the function.
4. void dispatch(void): This function executes a thread which decided by schedule(). In case the thread
has never run before, you may need to do some initialization such as moving the stack pointer sp to the
allocated stack of the thread. The stack pointer sp could be accessed and modified using setjmp and
longjmp. Please take a look at setjmp.h to understand where the sp is stored in jmp buf. If the thread
was executed before, restoring the context with longjmp is enough. In case the thread’s function just
returns, the thread needs to be removed from the runqueue and the next one has to be dispatched. The
easiest way to do this is to call thread exit().
5. void schedule(void): This function will decide which thread to run next. It is actually trivial, since you
will just run the next thread in the circular linked list of threads. You can simply change current thread
to the next field of current thread.
6. void thread exit(void): This function removes the calling thread from the runqueue, frees its stack
and the struct thread, updates current thread with the next to-be-executed thread in the runqueue
and calls dispatch().
Furthermore, think about what happens when the last thread exits (should return to the main function
by some means).
7. void thread start threading(void): This function will be called by the main function after some
thread is added to the runqueue. It should return only if all threads have exited.
3.2 Sample Output
The output of mp1-part1-0 should look like the following.
$ mp1-part1-0
mp1-part1-0
thread 1: 100
thread 2: 0
thread 3: 10000
thread 1: 101
thread 2: 1
thread 3: 10001
thread 1: 102
thread 2: 2
thread 3: 10002
thread 1: 103
thread 2: 3
thread 3: 10003
thread 1: 104
thread 2: 4
thread 3: 10004
thread 1: 105
thread 2: 5
thread 1: 106
thread 2: 6
thread 1: 107
thread 2: 7
thread 1: 108
thread 2: 8
thread 1: 109
thread 2: 9
exited
4 Part 2 (40 points)
In this part, you are required to implement an additional function thread assign task. This function enables
each thread to manage multiple tasks, with the most recently assigned task being executed first. Note that,
child threads should not inherit tasks from their parent when they are created.
4.1 Function Description
1. void thread assign task(struct thread *t, void (*f)(void *), void *arg): This function assigns a task to the thread t. The second argument, f, is a pointer to the task function, while the third
argument, arg, represents the argument of f. If t has unfinished tasks, the most recently assigned task
will be executed first when t is resumed later. The execution of the original thread function must wait
until all tasks are finished. Note that, this function only assigns tasks and does not trigger any context
switch.
In order to complete this part, you need to modify the following functions:
1. void thread yield(void): Because this function can also be called in the task function, you should save
the context in different jmp bufs according to whether the thread is executing the task function or not.
Specifically, if this function is called in the thread function, you can save the context just like in part 1.
If this function is called in the task function, you should save the context in another jmp buf to prevent
from discarding the context of the thread function.
2. void dispatch(void): If a task is assigned, this function should execute the most recently assigned task
function. If this function has never run before, you may need to do some initialization. If this function
was executed before, restoring the context with longjmp is sufficient. In case this task function just
returns, the thread should execute the next task function. The process follows the same approach as with
the previous task function. Surely, It is possible for a task to be assigned before the thread executes its
thread function.
Feel free to make more modification, such as adding properties in struct thread, designing new structure
for encapsulating task-related logic, etc. The only requirement is that all defined function should work as
described above.
4.2 Reminders
1. When creating a new thread in thread create, ensure that the new thread has no assigned tasks initially.
2. The parameter struct thread *t in thread assign task must exist and not have exited yet.
3. Tasks are executed in Last-Come-First-Serve (LCFS) order. That is, if a thread returns from a task
function and there are unfinished tasks, the most recently assigned task will be executed next.
4. While you are encouraged to add properties in struct thread, modifying the existing properties is not
allowed.
5. The task function may call thread create, thread add runqueue, thread yield, thread exit, or
thread assign task.
6. The memory space allocated to each thread by thread create is sufficient to execute task functions in
all test cases.
7. In all test cases, a thread may have at most 20 unfinished tasks at any moment.
8. If you intend to use global variables in threads.h, threads.c, or your test files, it is recommended to
add the static keyword to prevent unexpected situations.
4.3 Sample Output
The output of mp1-part2-0 should look like the following.
$ mp1-part2-0
mp1-part2-0
thread 1: 100
task 2: 101
thread 2: 0
thread 1: 101
thread 2: 1
thread 1: 102
task 2: 103
thread 1: 103
thread 2: 2
thread 1: 104
task 2: 105
thread 2: 3
thread 1: 105
thread 2: 4
exited
5 Run Public Test Cases
You can get 35 points (100 points in total) if you pass all public test cases. You can judge the code by running
the following command in the docker container (not in xv6; this should run in the same place as make qemu).
Note that you should only modify xv6/user/thread.c and xv6/user/thread.h. We do not guarantee that
you can get the public points from us if you modify other files to pass all test cases during local testing.
$ make grade
If you successfully pass all the public test cases, the output should be similar to the one below.
== Test thread package with public testcase part1-0 (10%) ==
thread package with public testcase part1-0: OK (16.8s)
== Test thread package with public testcase part1-1 (10%) ==
thread package with public testcase part1-1: OK (1.3s)
== Test thread package with public testcase part2-0 (5%) ==
thread package with public testcase part2-0: OK (0.8s)
== Test thread package with public testcase part2-1 (5%) ==
thread package with public testcase part2-1: OK (0.9s)
== Test thread package with public testcase part2-2 (5%) ==
thread package with public testcase part2-2: OK (1.0s)
Score: 35/35
If you want to know the details about the test cases, please check xv6/grade-mp1, xv6/user/mp1-part1-0.c,
xv6/user/mp1-part1-1.c, xv6/user/mp1-part2-0.c, xv6/user/mp1-part2-1.c and xv6/user/mp1-part2-2.c.
6 Submission and Grading
6.1 Source Code
Run the command below to pack your code into a zip named in your lowercase student ID, for example,
r11922088.zip. Upload the zip file to NTUCOOL.
$ make STUDENT_ID=<student_id> zip # set your ID here
Please ensure that your student ID is in lowercase letters. E.g., it should be r11922088 instead of
R11922088. Besides, make sure your xv6 can be compiled by make qemu.
6.2 Folder Structure after Unzip
We will unzip your submission using unzip command. The unzipped folder structure looks like this.
<student_id>
|
+-- threads.c
|
+-- threads.h
6.3 Grading Policy
• There are 2 public test cases and 4 private test cases in Part 1.
– Public test cases (20%): mp1-part1-0 and mp1-part1-1. 10% each.
– Private test cases (40%): 10% each.
• There are 3 public test cases and 4 private test cases in Part 2.
– Public test cases (15%): mp1-part2-0, mp1-part2-1 and mp1-part2-2. 5% each.
– Private test cases (25%): 5%, 5%, 7.5%, 7.5%.
• You will get 0 if we cannot compile your submission.
• You will be deducted 10 points if we cannot unzip your file through the command line using the unzip
command in Linux.
• You will be deducted 10 points if the folder structure is wrong. Using uppercase in the <student id> is
also a type of wrong folder structure.
• If your submission is late for n days, your score will be max(raw score − 20 × ⌈n⌉, 0) points. Note that
you will not get any points if ⌈n⌉ >= 5.
• Our grading library has a timeout mechanism so that we can handle the submission that will run forever.
Currently, the execution time limit is set to 240 seconds. We may extend the execution time limit if we
find that such a time limit is not sufficient for programs written correctly. That is, you do not have to
worry about the time limit.
• You can submit your work as many times as you want, but only the last submission will be graded.
Previous submissions will be ignored.
• The grading will be done on a Linux server.
請加QQ:99515681  郵箱:99515681@qq.com   WX:codehelp 

標簽:

掃一掃在手機打開當前頁
  • 上一篇:代寫CPS 1032、Java/Python程序代做
  • 下一篇:代做Lab 2: Time Series Prediction with GP
  • 無相關(guān)信息
    昆明生活資訊

    昆明圖文信息
    蝴蝶泉(4A)-大理旅游
    蝴蝶泉(4A)-大理旅游
    油炸竹蟲
    油炸竹蟲
    酸筍煮魚(雞)
    酸筍煮魚(雞)
    竹筒飯
    竹筒飯
    香茅草烤魚
    香茅草烤魚
    檸檬烤魚
    檸檬烤魚
    昆明西山國家級風景名勝區(qū)
    昆明西山國家級風景名勝區(qū)
    昆明旅游索道攻略
    昆明旅游索道攻略
  • NBA直播 短信驗證碼平臺 幣安官網(wǎng)下載 歐冠直播 WPS下載

    關(guān)于我們 | 打賞支持 | 廣告服務(wù) | 聯(lián)系我們 | 網(wǎng)站地圖 | 免責聲明 | 幫助中心 | 友情鏈接 |

    Copyright © 2025 kmw.cc Inc. All Rights Reserved. 昆明網(wǎng) 版權(quán)所有
    ICP備06013414號-3 公安備 42010502001045

    狠狠综合久久久久综合网址-a毛片网站-欧美啊v在线观看-中文字幕久久熟女人妻av免费-无码av一区二区三区不卡-亚洲综合av色婷婷五月蜜臀-夜夜操天天摸-a级在线免费观看-三上悠亚91-国产丰满乱子伦无码专区-视频一区中文字幕-黑人大战欲求不满人妻-精品亚洲国产成人蜜臀av-男人你懂得-97超碰人人爽-五月丁香六月综合缴情在线
  • <dl id="akume"></dl>
  • <noscript id="akume"><object id="akume"></object></noscript>
  • <nav id="akume"><dl id="akume"></dl></nav>
  • <rt id="akume"></rt>
    <dl id="akume"><acronym id="akume"></acronym></dl><dl id="akume"><xmp id="akume"></xmp></dl>
    免费成人在线视频网站| www.国产区| 国产亚洲天堂网| 久久6免费视频| 亚洲国产精品成人天堂| 日本在线一二三区| 亚洲天堂网2018| 欧美日韩不卡在线视频| 97视频在线免费| 日本人视频jizz页码69| 亚洲国产精品女人| 国产成人艳妇aa视频在线| 国产三级日本三级在线播放| 三级黄色片免费观看| 好男人www社区| 日韩av中文字幕第一页| 7777在线视频| 国产在线视频综合| dy888午夜| 成年人免费观看的视频| 免费看毛片的网址| 一区二区三区网址| 三级在线视频观看| 久久精品午夜福利| 人妻丰满熟妇av无码区app| 欧美视频在线第一页| 国产原创精品在线| 国产免费黄色av| 亚洲国产精品无码观看久久| 中文字幕の友人北条麻妃| 黄色小视频免费网站| 亚洲免费一级视频| 一级在线免费视频| 色婷婷成人在线| 中国黄色片一级| 国产精品中文久久久久久| 天堂社区在线视频| 男女男精品视频站| 日韩视频 中文字幕| 成人在线视频一区二区三区| 男人天堂新网址| 亚洲污视频在线观看| 九九久久久久久| 蜜桃网站在线观看| 成人av一级片| 天天在线免费视频| 国产超碰在线播放| 精品国产一二三四区| 国产香蕉一区二区三区| 亚洲精品高清无码视频| 国产超级av在线| 一区二区三区一级片| 成人免费xxxxx在线视频| 色黄视频免费看| 男人透女人免费视频| 大肉大捧一进一出好爽视频| 最新免费av网址| 蜜桃免费在线视频| 婷婷六月天在线| 777一区二区| 亚洲欧美国产中文| 亚洲欧美一区二区三区不卡| 国产精品视频黄色| 成人免费毛片播放| 另类小说第一页| 五月婷婷丁香综合网| 农村妇女精品一二区| 一区二区在线播放视频| www.com黄色片| 日韩精品第1页| 免费看国产曰批40分钟| 欧美一级欧美一级| 老司机午夜av| 色哟哟免费网站| 欧美精品性生活| 一级黄色在线播放| 日韩国产精品毛片| 亚洲 自拍 另类小说综合图区| 无码播放一区二区三区| www.玖玖玖| 国产成人手机视频| 91丨九色丨蝌蚪| 激情视频小说图片| 久久久亚洲精品无码| 天天碰免费视频| 欧美 日韩 国产在线观看| 激情五月婷婷久久| 日韩一二区视频| 中文字幕永久视频| 国产一线二线三线女| 别急慢慢来1978如如2| 免费的一级黄色片| 91国内在线播放| 国产99久久九九精品无码| 午夜精品在线免费观看| 能在线观看的av网站| 色综合久久久久无码专区| 99精品视频国产| 欧美日韩亚洲国产成人| 免费看a级黄色片| 天天综合网日韩| 国产精品自在自线| 中文久久久久久| 黄色片免费在线观看视频| 国产中文字幕视频在线观看| 五月天开心婷婷| 国产视频九色蝌蚪| 精品人妻大屁股白浆无码| 手机福利在线视频| 红桃视频一区二区三区免费| 男女啪啪网站视频| 国产精品亚洲二区在线观看| 分分操这里只有精品| 国产日本欧美在线| 国产在线拍揄自揄拍无码| 99久re热视频精品98| 美女扒开大腿让男人桶| 久草热视频在线观看| 欧美日韩dvd| 国产天堂在线播放| 国产中文字幕免费观看| 日本成人中文字幕在线| 日韩av加勒比| 97超碰在线人人| 老司机午夜性大片| 欧美乱大交xxxxx潮喷l头像| 日日橹狠狠爱欧美超碰| xxxx在线免费观看| 国产又黄又猛又粗又爽的视频| 美国av在线播放| 免费成人黄色大片| 国产精品欧美激情在线观看| av免费中文字幕| 日韩免费在线观看av| jizz大全欧美jizzcom| 久久免费视频3| 久久综合久久网| 拔插拔插海外华人免费| 国产免费xxx| 日本黄色的视频| 99精品视频国产| 成人短视频在线看| 国产黄色激情视频| 日韩精品免费一区| 人妻无码久久一区二区三区免费| 亚洲综合123| 一级黄色片在线免费观看| 亚洲欧美日韩三级| 久久精品一卡二卡| 日韩欧美视频免费在线观看| 亚洲天堂av免费在线观看| 一级片黄色免费| 爱爱爱视频网站| 可以看毛片的网址| 超碰影院在线观看| 激情黄色小视频| 午夜一级免费视频| 妞干网这里只有精品| 中文字幕第50页| 日韩中文字幕组| www.亚洲成人网| 视频二区在线播放| 被灌满精子的波多野结衣| 影音先锋男人的网站| 日本久久精品一区二区| 热久久久久久久久| 欧美第一页浮力影院| 欧美一级视频在线播放| 亚洲乱码中文字幕久久孕妇黑人| 亚洲精品手机在线观看| 日本一区二区黄色| 乱熟女高潮一区二区在线| 日本熟妇人妻xxxxx| 欧美日韩精品在线一区二区| 国产专区在线视频| 色一情一区二区三区| 成年人在线观看视频免费| 亚洲 欧美 综合 另类 中字| 日本免费成人网| 日韩中文字幕在线不卡| 日韩一二区视频| 国产性生活免费视频| www.avtt| 草草久久久无码国产专区| 91九色丨porny丨国产jk| 国产精品97在线| 亚洲一级片网站| 午夜免费看毛片| 亚洲一区二区三区av无码| 成年人三级黄色片| 天堂av.com| 日韩不卡一二区| 精品少妇人妻av免费久久洗澡| 国产视频一视频二| 青青在线视频免费| 日本不卡一区二区三区四区| 国产亚洲黄色片| 日本一二三区在线| 成年人免费在线播放| 日韩欧美中文视频|