首页
网站开发
桌面应用
管理软件
微信开发
App开发
嵌入式软件
工具软件
数据采集与分析
其他
首页
>
> 详细
CMPSC473程序辅导、讲解program语言程序、辅导c/c++编程 辅导Python编程|调试Matlab程序
项目预算:
开发周期:
发布时间:
要求地区:
CMPSC473, Spring 2021
Malloc Lab: Writing a Dynamic Storage Allocator
Assigned: Feb. 16
Checkpoint 1 Due: Sun., Feb. 28,
11:59:59 PM
Checkpoint 2 Due: Sat., Mar. 06,
11:59:59 PM
Due: Fri., Mar. 12, 11:59:59PM
Please read this document carefully!
1 Introduction
In this lab, you will be writing a dynamic storage allocator for C programs, i.e., your own version of the malloc,
free, and realloc functions. You are encouraged to explore the design space creatively and implement an allocator
that is correct, space efficient, and fast.
The only file you will be modifying is mm.c. Modifications in other files will not be used in the grading. You will be
implementing the following functions:
• bool mm init(void)
• void* malloc(size t size)
• void free(void* ptr)
• void* realloc(void* oldptr, size t size)
• bool mm checkheap(int lineno)
You are encouraged to define other (static) helper functions, structures, etc. to better structure your code.
2 Programming Rules
• IMPORTANT: You are required to implement a heap checker (see Section 5) that will be graded. The
heap checker will help you debug your code.
• IMPORTANT:You are required to write commentsfor all of your code including the heap checker. Additionally,
you need to write a file comment at the top of the file describing your overall malloc design. See
Section 7 for grading details.
• IMPORTANT: You must show your partial work on this assignment by periodically committing and
submitting (i.e., pushing) your code to git. This will be used both for grading the checkpoints as well as
ensuring academic integrity.
• You are not allowed to change any of the interfaces inmm.c.
2
• You are not allowed to invoke any memory-management related library calls or system calls. For example, you
are not allowed to use sbrk, brk, or the standard library versions of malloc, calloc, free, or realloc.
Instead of sbrk, you should use our provided mem sbrk.
• Your code is expected to work in 64-bit environments, and you should assume that allocation sizes and offsets
will require 8 byte (64-bit) representations.
• You are not allowed to use macros as they can be error-prone. The better style is to use static functions and let
the compiler inline the simple static functions foryou.
• You are limited to 128 bytes of global space for arrays, structs, etc. If you need large amounts of space for
storing extra tracking data, you can put it in the heaparea.
• IMPORTANT: Failure to abide by these requirements may result in a 0 for the assignment.
3 Description of the dynamic memory allocator functions
• mm init: Before calling malloc, realloc, calloc, or free, the application program (i.e., the tracedriven
driver program that will evaluate your code) calls your mm init function to perform any necessary
initializations, such as allocating the initial heap area. The return value should be true on success and false if
there were any problems in performing the initialization.
• malloc: The malloc function returns a pointer to an allocated block payload of at least size bytes. The
entire allocated block should lie within the heap region and should not overlap with any other allocated chunk.
If the requested size is 0 or if mem sbrk is unable to extend the heap, then you should return NULL. Similar
to how the standard C library (libc) always returns payload pointers that are aligned to 16 bytes, your malloc
implementation should do likewise and always return 16-byte alignedpointers.
• free: The free function frees the block pointed to by ptr. It returns nothing. This function is only
guaranteed to work when the passed pointer (ptr) was returned by an earlier call to malloc, calloc, or
realloc and has not yet been freed. If ptr is NULL, then free should do nothing.
• realloc: The realloc function returns a pointer to an allocated region of at least size bytes with the
following constraints.
– if ptr is NULL, the call is equivalent to malloc(size);
– if sizeis equal to zero, the call is equivalent to free(ptr);
– if ptr is not NULL, it must have been returned by an earlier call to malloc, calloc, or realloc.
The call to realloc changes the size of the memory block pointed to by ptr (the old block) to size
bytes and returns the address of the new block. Notice that the address of the new block might be the same
as the old block, or it might be different, depending on your implementation, the amount of internal
fragmentation in the old block, and the size of the reallocrequest.
The contents of the new block are the same as those of the old ptr block, up to the minimum of the old
and new sizes. Everything else is uninitialized. For example, if the old block is 8 bytes and the new block
is 12 bytes, then the first 8 bytes of the new block are identical to the first 8 bytes of the old block and the
last 4 bytes are uninitialized. Similarly, if the old block is 8 bytes and the new block is 4 bytes, then the
contents of the new block are identical to the first 4 bytes of the oldblock.
These semantics match the the semantics of the corresponding libc malloc, realloc, and free functions. Run
man malloc to view complete documentation.
3
4 Support Functions
The memlib.c package simulates the memory system for your dynamic memory allocator. You can invoke the
following functions in memlib.c:
• void* mem sbrk(int incr): Expands the heap by incr bytes, where incr is a positive non-zero integer.
It returns a generic pointer to the first byte of the newly allocated heap area. The semantics are identicalto
the Unix sbrk function, except that mem sbrk accepts only a non-negative integer argument.
You must use our version, mem sbrk, for the tests to work. Do not use sbrk.
• void* mem heap lo(void): Returns a generic pointer to the first byte in the heap.
• void* mem heap hi(void): Returns a generic pointer to the last byte in the heap.
• size_t mem heapsize(void): Returns the current size of the heap in bytes.
• size_t mem pagesize(void): Returns the system’s page size in bytes (4K on Linux systems).
• void* memset(void* ptr, int value, size t n): Sets the first n bytes of memory pointed to
by ptr to value.
• void* memcpy(void* dst, const void* src, size t n): Copies n bytes from src to dst.
5 Heap Consistency Checker
Dynamic memory allocators are notoriously tricky beasts to program correctly and efficiently. They are difficult to
program correctly because they involve a lot of untyped pointer manipulation and low-level manipulation of bits and
bytes. You will find it very helpful to write a heap checker mm checkheap that scans the heap and checks it for
consistency. The heap checker will check for invariants which should always be true.
Some examples of what a heap checker might check are:
• Is every block in the free list marked asfree?
• Are there any contiguous free blocks that somehow escapedcoalescing?
• Is every free block actually in the free list?
• Do the pointers in the free list point to valid free blocks?
• Do any allocated blocks overlap?
• Do the pointers in a heap block point to valid heapaddresses?
You should implement checks for any invariants you consider prudent. It returns true if your heap is in a valid,
consistent state and false otherwise. You are not limited to the listed suggestions nor are you required to check all of
them. You are encouraged to print out error messages when the check fails. You can use dbg printf to print
messages in your code in debug mode. To enable debug mode, uncomment the line #define DEBUG.
To call the heap checker, you can use mm checkheap( LINE ), which will pass in the line number of the caller.
This can be used to identify which line detected a problem.
You are required to implement a heap checker for your code, both for grading and debugging purposes. See
Section 7 for details on grading.
4
6 Testing your code
First, you need to compile/build your code by running: make. You need to do this every time you change your code
for the tests to utilize your latest changes.
To run all the tests after building your code, run: make test.
To test a single trace file after building your code, run: ./mdriver -f traces/tracefile.rep.
Each trace file contains a sequence of allocate, reallocate, and free commands that instruct the driver to call your
malloc, realloc, and freefunctions in some sequence.
Other command line options can be found by running: ./mdriver -h
To debug your code with gdb, run: gdb mdriver.
7 Evaluation
You will receive zero points if:
• you break any of the programming rules in Section2
• your code does not compile/build
• your code is buggy and crashes the driver
Otherwise, your grade will be calculated as follows:
50 pts Checkpoint 1 (Due: Sun., Feb. 28, 11:59:59 PM): This part of the assignment simply tests the correctness of your
code. Space utilization and throughput will not be tested in this checkpoint. Your grade will be based on the
number of trace files that succeed.
100 pts Checkpoint 2 (Due: Sat., Mar. 06, 11:59:59 PM): This part of the assignment requires that your code is entirely
functional and tests the space utilization (60 pts) and throughput (40 pts) of your code. Each metric will have a
min and max target (i.e., goal) where if your utilization/throughputis above the max, you get full score and if it
is below the min, you get no points. Partial points are assigned proportionally between the min and max.
– Space utilization (60 pts): The space utilization is calculated based on the peak ratio between the aggregate
amount of memory used by the driver (i.e., allocated via malloc or realloc but not yet freed via free)
and the size of the heap used by your allocator. You should design good policiesto minimize fragmentation
in order to increase this ratio.
– Throughput (40 pts): The throughput is a performance metric that measures the average number of
operations completed per second. As the performance of your code can vary between executions and
between machines, your score as you’re testing your code is not guaranteed. The performance testing
will be performed on the W204 cluster machines to ensure more consistent results.
100 pts Final submission (Due: Fri., Mar.12, 11:59:59 PM): This part of the assignment is graded identically as Checkpoint
2, except that the grading curve has not been significantly reduced as is the case with Checkpoint 2.
50 pts Code demo and comments (Due: Fri., Mar. 12, 11:59:59 PM): As part of the final submission, we will be
reviewing your heap checker code and commentsthrough your code. You will need to upload a 4-5 minute
demo video describing your design choice, data structures and heap checker code and upload it on canvas
(one demo video per team). The TAs can ask you to schedule an appointment to meet them via zoom to
answer additional questions about your project after the deadline, if necessary. Your heap checker will be
graded based on correctness, completeness, and comments. The comments should be understandable to a
TA. The demo will show correctness. Your explanation of the heap checker and your malloc design will
determine the degree to which your checker is checking invariants.
5
There will be a balance between space efficiency and speed (throughput),so you should not go to extremes to optimize
either the space utilization or the throughput only. To receive a good score, you must achieve a balance between
utilization and throughput.
Grades will be assigned by running your code on W204 machines. So, please check that your code runs on those
machines.
8 Handin Instructions
You must show your partial work on this assignment by periodically committing and submitting (i.e., pushing) your
code to git. To do this, run:
git add mm.c
git commit -m "Write a comment here about your code changes"
git push
We will use the latest submission before each deadline as well as the latest submission before each late deadline for
grading purposes. Each checkpoint and final submission can use the late policy, and we will calculate and use the
better of the normal score and the late score with the late penalty. Thus, make sure you are committing and submitting
to git often. If you want to specify a commit for a specific checkpoint, write it in your readme file.
You have to submit your demo video as an assignment (Project 2) on Canvas.
Additionally, you must submit your github username that you used for the assignment in Canvas (You
should have done this for project 1. No need to re-submit.).
9 Hints
• Use the mdriver -f option. During initial development, using tiny trace files will simplify debugging and
testing. We have included some trace files ending in -short.rep that you can use for initial debugging.
• Write a good heap checker. This will help detect errors much closer to when they occur. This is one of the most
useful techniques for debugging data structures like the malloc memory structure.
• Use gdb; watchpoints can help with finding corruption. gdb will help you isolate and identify out of bounds
memory references as well as where in the code the SEGFAULT occurs. To assist the debugger, you may want
to compile with make debug to produce unoptimized code that is easier to debug. To revert to optimized
code, run make release for improved performance. Additionally, using watchpoints in gdb can help detect
where corruption is occurring if you know the address that is being corrupted.
• The textbooks have detailed malloc examples that can help your understanding. You are allowed to reference
any code within the textbooks as long as you cite the source (as comment in your code). However, directly
copying code from online source is strictly forbidden.
• Encapsulate your pointer arithmetic and bit manipulation in static functions. Pointer arithmetic in your
implementation can be confusing and error-prone because of all the casting that is necessary. You can reduce
the complexity significantly by writing static functions for your pointer operations and bit manipulation. The
compiler should inline these simple functions for you.
• Use git to track your different versions. git will allow you to track your code changes to help you remember
what you’ve done in the past. It can also provide an easy way to revert to prior versions if you made a mistake.
• Use the mdriver -v and -V options. These options allow extra debug information to be printed.
• Start early! Unless you’ve been writing low-level systems code since you were 5, this will probably be some of
the most difficult and sophisticated code you have written so far in your career. So start early, and good luck!
软件开发、广告设计客服
QQ:99515681
邮箱:99515681@qq.com
工作时间:8:00-23:00
微信:codinghelp
热点项目
更多
代写dts207tc、sql编程语言代做
2024-12-25
cs209a代做、java程序设计代写
2024-12-25
cs305程序代做、代写python程序...
2024-12-25
代写csc1001、代做python设计程...
2024-12-24
代写practice test preparatio...
2024-12-24
代写bre2031 – environmental...
2024-12-24
代写ece5550: applied kalman ...
2024-12-24
代做conmgnt 7049 – measurem...
2024-12-24
代写ece3700j introduction to...
2024-12-24
代做adad9311 designing the e...
2024-12-24
代做comp5618 - applied cyber...
2024-12-24
代做ece5550: applied kalman ...
2024-12-24
代做cp1402 assignment - netw...
2024-12-24
热点标签
mktg2509
csci 2600
38170
lng302
csse3010
phas3226
77938
arch1162
engn4536/engn6536
acx5903
comp151101
phl245
cse12
comp9312
stat3016/6016
phas0038
comp2140
6qqmb312
xjco3011
rest0005
ematm0051
5qqmn219
lubs5062m
eee8155
cege0100
eap033
artd1109
mat246
etc3430
ecmm462
mis102
inft6800
ddes9903
comp6521
comp9517
comp3331/9331
comp4337
comp6008
comp9414
bu.231.790.81
man00150m
csb352h
math1041
eengm4100
isys1002
08
6057cem
mktg3504
mthm036
mtrx1701
mth3241
eeee3086
cmp-7038b
cmp-7000a
ints4010
econ2151
infs5710
fins5516
fin3309
fins5510
gsoe9340
math2007
math2036
soee5010
mark3088
infs3605
elec9714
comp2271
ma214
comp2211
infs3604
600426
sit254
acct3091
bbt405
msin0116
com107/com113
mark5826
sit120
comp9021
eco2101
eeen40700
cs253
ece3114
ecmm447
chns3000
math377
itd102
comp9444
comp(2041|9044)
econ0060
econ7230
mgt001371
ecs-323
cs6250
mgdi60012
mdia2012
comm221001
comm5000
ma1008
engl642
econ241
com333
math367
mis201
nbs-7041x
meek16104
econ2003
comm1190
mbas902
comp-1027
dpst1091
comp7315
eppd1033
m06
ee3025
msci231
bb113/bbs1063
fc709
comp3425
comp9417
econ42915
cb9101
math1102e
chme0017
fc307
mkt60104
5522usst
litr1-uc6201.200
ee1102
cosc2803
math39512
omp9727
int2067/int5051
bsb151
mgt253
fc021
babs2202
mis2002s
phya21
18-213
cege0012
mdia1002
math38032
mech5125
07
cisc102
mgx3110
cs240
11175
fin3020s
eco3420
ictten622
comp9727
cpt111
de114102d
mgm320h5s
bafi1019
math21112
efim20036
mn-3503
fins5568
110.807
bcpm000028
info6030
bma0092
bcpm0054
math20212
ce335
cs365
cenv6141
ftec5580
math2010
ec3450
comm1170
ecmt1010
csci-ua.0480-003
econ12-200
ib3960
ectb60h3f
cs247—assignment
tk3163
ics3u
ib3j80
comp20008
comp9334
eppd1063
acct2343
cct109
isys1055/3412
math350-real
math2014
eec180
stat141b
econ2101
msinm014/msing014/msing014b
fit2004
comp643
bu1002
cm2030
联系我们
- QQ: 9951568
© 2021
www.rj363.com
软件定制开发网!