There is.
Programs can be written using a technique called exceptions. Here's a simplified description of how they work:
- The idea is that you can tell a part of a program, when it comes across an error or something it can't deal with, to throw an exception.
- Another part of the program will have been previously setup to catch exceptions - this is the exception handler.
- If the error is something that even the exception handler can't deal with it, it can do one of two things:
- Throw it to another exception handler that might be able to handle it.
- Just throw it "out there" to anything - if there is no exception handler willing/available to take it, the operating system itself catches it and you see the crash dialog.
So when a program crashes, it has literally given up and terminated execution.
This is different when a program stops responding. Windows programs maintain communication with the OS using a message loop. If the program gets stuck, either waiting on I/O or an infinite loop, it will stop getting messages from the loop, and Windows then tells you the program is not responding. One thing that can cause programs to unexpectedly wait on I/O is when you are low on RAM and the OS has to use the page file to handle memory requests. Another might be if your disk suddenly fails and the programmer never considered the possibility that writes to a file might be interrupted with something like that - or the programmer did something like "if this operation fails, retry forever."
So in this case, the program is still running, it's just not talking to Windows any more.