This document discusses multithreading and multicore processors. It begins by explaining that instruction level parallelism is difficult to achieve for a single program, but that thread level parallelism exists when running multiple threads or programs simultaneously. It then covers different multithreading paradigms including coarse-grained and fine-grained multithreading as well as challenges with context switching. The document also discusses techniques for multicore processors including cache sharing and instruction fetching policies. It provides examples of commercial multicore chips and research prototypes.