Content updated first on mandarm.github.io; should propagate to the mirror at ISI every hour.
Introduction (overview of indexing, retrieval, Vector Space Model, term-weighting) |
Evaluation – I | |
MapReduce | Spark accompanying notebook | |
Inverted indices | Query processing | Indexing |
Retrieval models: language modeling | Retrieval models: classical probabilistic models | |
Query expansion | LSI | |
Crawling | Deduplication | Link analysis |
Dictionaries and tolerant retrieval | Query suggestion | |
Learning to rank | Traditional question answering |
The material in the slides is a proper subset of the material in the notes.
Mid-sem exams: 2024 2022 2018 2017 2016 2015 2014 2012 2011 2010
End-sem exams: 2024 2022 2018 2017 2016 2015 2014 2012 2011 2010
Bootstrapping process
(locally stored pdf)
(Thanks to Arindam Pal, MTCS 2013-2015, for detecting and repairing broken links.)
Lamport's Bakery algorithm
(local copy)
Starvation-free solution to the Readers-Writers Problem
White Paper on SunOS 5.0 Multithread Architecture
Virtual memory in Linux
(local copy of older version)
Memory Management in Linux
Program to demonstrate sharing of stdin between parent and child
What is scheduled first after a fork?
According to Section 3.2.3 (Process Scheduling) from "Advanced
Linux programming" (Mark Mitchell, Jeffrey Oldham, Alex Samuel,
Sams Publishing, 2001):
Linux schedules the parent and child process independently; there's no guarantee of which one will run first, or how long it will run before Linux interrupts it and lets the other process (or some other process on the system) run.
However, the following passage from Section 3.4.1.1 of "Understanding the Linux Kernel, 3rd Edition" (Daniel P. Bovet, Marco Cesati, O'Reilly, 2005) is more up-to-date and sounds much more convincing:
If the child will run on the same CPU as the parent, and parent and child do not share the same set of page tables (CLONE_VM flag cleared), it then forces the child to run before the parent by inserting it into the parent's runqueue right before the parent. This simple step yields better performance if the child flushes its address space and executes a new program right after the forking. If we let the parent run first, the Copy On Write mechanism would give rise to a series of unnecessary page duplications. Otherwise, if the child will not be run on the same CPU as the parent, or if parent and child share the same set of page tables (CLONE_VM flag set), it inserts the child in the last position of the parent's runqueue.
stat x/y/z/abc.txt editor x/y/z/abc.txt rm x/y/z/abc.txt OR rm -rf x /* save x/y/z/abc.txt in editor */ stat x/y/z/abc.txt
Introduction | Post's Correspondence Problem |
Introduction | Intermediate code generation |
Lexical Analysis | Run-time environments |
Parsing | Code generation |
Syntax-directed translation | Code optimisation |
Mid-sem exams: 2014 2013 2012 2011 2010 2009
End-sem exams: 2014 2013 2012 2011 2010 2009
Non-LL(k) grammars (see the example near the end of the page)
Inherited attributes in Yacc / Bison: From the bison
documentation:
$n
with n zero or negative is allowed
for reference to tokens and groupings on the stack before those
that match the current rule. This is a very risky practice, and to use it
reliably you must be certain of the context in which the rule is applied.
Here is a case in which you can use this reliably:
foo: expr bar '+' expr { … } | expr bar '-' expr { … } ; bar: %empty { previous_expr = $0; } ;
As long as bar
is used only in the fashion shown here,
$0
always refers to the expr
which precedes
bar
in the definition of foo
.
So the possible alternatives are to use non-positive indices as suggested above, or to use global variables. In both cases, one has to be careful.
Last modified: Mon Apr 14 13:22:40 IST 2025