There are three main limitations on what problems can be solved by computers: execution time may be too long, some problems are not computable by any algorithm, and some problems we do not currently know how to write algorithms for. Turing machines provide an abstract model of computation that defines what is computable. The halting problem, determining if an arbitrary program will halt for all inputs, is noncomputable. Computational complexity classifies problems as tractable if solvable in polynomial time or intractable if requiring exponential time. Determining if P=NP, whether easy and hard problems require equal computational resources, is a major open question in computer science.