Add another test that checks priority scheduling in the case of
[pintos-anon] / TODO
1 -*- text -*-
2
3 Godmar says:
4
5 - In Project 2, we're missing tests that pass arguments to system calls
6 that span multiple pages, where some are mapped and some are not. 
7 An implementation that only checks the first page, rather than all pages 
8 that can be touched during a call to read()/write() passes all tests.
9
10 - In Project 2, we're missing a test that would fail if they assumed
11 that contiguous user-virtual addresses are laid out contiguously 
12 in memory.  The loading code should ensure that non-contiguous 
13 physical pages are allocated for the data segment (at least.)
14
15 - Need some tests that test that illegal accesses lead to process
16 termination. I have written some, will add them. In P2, obviously, 
17 this would require that the students break this functionality since 
18 the page directory is initialized for them, still it would be good 
19 to have.
20
21 - There does not appear to be a test that checks that they close all
22 fd's on exit.  Idea: add statistics & self-diagnostics code to palloc.c
23 and malloc.c.  Self-diagnostics code could be used for debugging.
24 The statistics code would report how much kernel memory is free.
25 Add a system call "get_kernel_memory_information".  User programs
26 could engage in a variety of activities and notice leaks by checking
27 the kernel memory statistics.
28
29 From: "Godmar Back" <godmar@gmail.com>
30 Subject: multiple threads waking up at same clock tick
31 To: "Ben Pfaff" <blp@cs.stanford.edu>
32 Date: Wed, 1 Mar 2006 08:14:47 -0500
33
34 Greg Benson points out another potential TODO item for P1.
35
36 ----
37 One thing I recall:
38
39 The alarm tests do not test to see if multiple threads are woken up if
40 their timers have expired.  That is, students can write a solution
41 that just wakes up the first thread on the sleep queue rather than
42 check for additional threads.  Of course, the next thread will be
43 woken up on the next tick.  Also, this might be hard to test.
44
45 ---
46 Way to test this: (from Godmar Back)
47
48 Thread A with high priority spins until 'ticks' changes, then calls to
49 timer_sleep(X), Thread B with lower priority is then resumed, calls
50 set_priority to make its priority equal to that of thread A, then
51 calls timer_sleep(X), all of that before the next clock interrupt
52 arrives.
53
54 On wakeup, each thread records wake-up time and calls yield
55 immediately, forcing the scheduler to switch to the other
56 equal-priority thread. Both wake-up times must be the same (and match
57 the planned wake-up time.)
58
59 PS:
60 I actually tested it and it's hard to pass with the current ips setting.
61 The bounds on how quickly a thread would need to be able to return after
62 sleep appear too tight.  Need another idea.
63
64 From: "Godmar Back" <godmar@gmail.com>
65
66 For reasons I don't currently understand, some of our students seem
67 hesitant to include each thread in a second "all-threads" list and are
68 looking for ways to implement the advanced scheduler without one.
69
70 Currently, I believe, all tests for the mlfqs are such that all
71 threads are either ready or sleeping in timer_sleep(). This allows for
72 an incorrect implementation in which recent-cpu and priorities are
73 updated only for those threads that are on the alarm list or the ready
74 list.
75
76 The todo item would be a test where a thread is blocked on a
77 semaphore, lock or condition variable and have its recent_cpu decay to
78 zero, and check that it's scheduled right after the unlock/up/signal.
79
80 From: "Godmar Back" <godmar@gmail.com>
81 Subject: set_priority & donation - a TODO item
82 To: "Ben Pfaff" <blp@cs.stanford.edu>
83 Date: Mon, 20 Feb 2006 22:20:26 -0500
84
85 Ben,
86
87 it seems that there are currently no tests that check the proper
88 behavior of thread_set_priority() when called by a thread that is
89 running under priority donation.  The proper behavior, I assume, is to
90 temporarily drop the donation if the set priority is higher, and to
91 reassume the donation should the thread subsequently set its own
92 priority again to a level that's lower than a still active donation.
93
94  - Godmar
95
96 From: Godmar Back <godmar@gmail.com>
97 Subject: project 4 question/comment regarding caching inode data
98 To: Ben Pfaff <blp@cs.stanford.edu>
99 Date: Sat, 14 Jan 2006 15:59:33 -0500
100
101 Ben,
102
103 in section 6.3.3 in the P4 FAQ, you write:
104
105 "You can store a pointer to inode data in struct inode, if you want,"
106
107 Should you point out that if they indeed do that, they likely wouldn't
108 be able to support more than 64 open inodes systemwide at any given
109 point in time.
110
111 (This seems like a rather strong limitation; do your current tests
112 open more than 64 files?
113 It would also point to an obvious way to make the projects harder by
114 specifically disallowing that inode data be locked in memory during
115 the entire time an inode is kept open.)
116
117  - Godmar
118
119 From: Godmar Back <godmar@gmail.com>
120 Subject: on caching in project 4
121 To: Ben Pfaff <blp@cs.stanford.edu>
122 Date: Mon, 9 Jan 2006 20:58:01 -0500
123
124 here's an idea for future semesters.
125
126 I'm in the middle of project 4, I've started by implementing a buffer
127 cache and plugging it into the existing filesystem.  Along the way I
128 was wondering how we could test the cache.
129
130 Maybe one could adopt a similar testing strategy as in project 1 for
131 the MLQFS scheduler: add a function that reads "get_cache_accesses()"
132 and a function "get_cache_hits()".  Then create a version of pintos
133 that creates access traces for a to-be-determined workload.  Run an
134 off-line analysis that would determine how many hits a perfect cache
135 would have (MAX), and how much say an LRU strategy would give (MIN).
136 Then add a fudge factor to account for different index strategies and
137 test that the reported number of cache hits/accesses is within (MIN,
138 MAX) +/- fudge factor.
139
140 (As an aside - I am curious why you chose to use a clock-style
141 algorithm rather than the more straightforward LRU for your buffer
142 cache implementation in your sample solution. Is there a reason for
143 that?  I was curious to see if it made a difference, so I implemented
144 LRU for your cache implementation and ran the test workload of project
145 4 and printed cache hits/accesses.
146 I found that for that workload, the clock-based algorithm performs
147 almost identical to LRU (within about 1%, but I ran nondeterministally
148 with QEMU). I then reduced the cache size to 32 blocks and found again
149 the same performance, which raises the suspicion that the test
150 workload might not force any cache replacement, so the eviction
151 strategy doesn't matter.)
152
153 Godmar Back <godmar@gmail.com> writes:
154
155 > in your sample solution to P4, dir_reopen does not take any locks when
156 > changing a directory's open_cnt. This looks like a race condition to
157 > me, considering that dir_reopen is called from execute_process without
158 > any filesystem locks held.
159
160 * Get rid of rox--causes more trouble than it's worth
161
162 * Reconsider command line arg style--confuses everyone.
163
164 * Finish writing tour.
165
166 via Godmar Back:
167
168 * Get rid of mmap syscall, add sbrk.
169
170 * page-linear, page-shuffle VM tests do not use enough memory to force
171   eviction.  Should increase memory consumption.
172
173 * Add FS persistence test(s).
174
175 * process_death test needs improvement
176
177 * Internal tests.
178
179 * Improve automatic interpretation of exception messages.
180
181 * Userprog project:
182
183   - Mark read-only pages as actually read-only in the page table.  Or,
184     since this was consistently rated as the easiest project by the
185     students, require them to do it.
186
187   - Don't provide per-process pagedir implementation but only
188     single-process implementation and require students to implement
189     the separation?  This project was rated as the easiest after all.
190     Alternately we could just remove the synchronization on pid
191     selection and check that students fix it.
192
193 * Filesys project:
194
195   - Need a better way to measure performance improvement of buffer
196     cache.  Some students reported that their system was slower with
197     cache--likely, Bochs doesn't simulate a disk with a realistic
198     speed.
199
200 * Documentation:
201
202   - Add "Digging Deeper" sections that describe the nitty-gritty x86
203     details for the benefit of those interested.
204
205   - Add explanations of what "real" OSes do to give students some
206     perspective.
207
208 * Assignments:
209
210   - Add extra credit:
211
212     . Low-level x86 stuff, like paged page tables.
213
214     . Specifics on how to implement sbrk, malloc.
215
216     . Other good ideas.
217
218     . opendir/readdir/closedir
219
220     . everything needed for getcwd()
221
222 To add partition support:
223
224 - Find four partition types that are more or less unused and choose to
225   use them for Pintos.  (This is implemented.)
226
227 - Bootloader reads partition tables of all BIOS devices to find the
228   first that has the "Pintos kernel" partition type.  (This is
229   implemented.)  Ideally the bootloader would make sure there is
230   exactly one such partition, but I didn't implement that yet.
231
232 - Bootloader reads kernel into memory at 1 MB using BIOS calls.  (This
233   is implemented.)
234
235 - Kernel arguments have to go into a separate sector because the
236   bootloader is otherwise too big to fit now?  (I don't recall if I
237   did anything about this.)
238
239 - Kernel at boot also scans partition tables of all the disks it can
240   find to find the ones with the four Pintos partition types (perhaps
241   not all exist).  After that, it makes them available to the rest of
242   the kernel (and doesn't allow access to other devices, for safety).
243
244 - "pintos" and "pintos-mkdisk" need to write a partition table to the
245   disks that they create.  "pintos-mkdisk" will need to take a new
246   parameter specifying the type.  (I might have partially implemented
247   this, don't remember.)
248
249 - "pintos" should insist on finding a partition header on disks handed
250   to it, for safety.
251
252 - Need some way for "pintos" to assemble multiple disks or partitions
253   into a single image that can be copied directly to a USB block
254   device.  (I don't know whether I came up with a good solution yet or
255   not, or whether I implemented any of it.)
256
257 To add USB support:
258
259 - Needs to be able to scan PCI bus for UHCI controller.  (I
260   implemented this partially.)
261
262 - May want to be able to initialize USB controllers over CardBus
263   bridges.  I don't know whether this requires additional work or if
264   it's useful enough to warrant extra work.  (It's of special interest
265   for me because I have a laptop that only has USB via CardBus.)
266
267 - There are many protocol layers involved: SCSI over USB-Mass Storage
268   over USB over UHCI over PCI.  (I may be forgetting one.)  I don't
269   know yet whether it's best to separate the layers or to merge (some
270   of) them.  I think that a simple and clean organization should be a
271   priority.
272
273 - VMware can likely be used for testing because it can expose host USB
274   devices as guest USB devices.  This is safer and more convenient
275   than using real hardware for testing.
276
277 - Should test with a variety of USB keychain devices because there
278   seems to be wide variation among them, especially in the SCSI
279   protocols they support.  Should try to use a "lowest-common
280   denominator" SCSI protocol if any such thing really exists.
281
282 - Might want to add a feature whereby kernel arguments can be given
283   interactively, rather than passed on-disk.  Needs some though.