This talk will look at a number of fundamental issues in developing chip multiprocessors. It will consider concurrency in both virtual and physical manifestations; it will look at different types of synchronisation and where synchronisation is applied in a processor; it will consider the issues of how to program a CMP and the problems faced. It will also consider the engineering constraints that limit any practical implementation and ask what the critical resources are in a CMP. Based on these conclusions a number of abstract models based on the principle of microthreading will be presented and compared to existing approaches. Finally iof time permits, some recent results on scalability will be presented.