if kill is issued with no signal argument, it defaults to TERM signal. As it is maskable, the process itself fas the possibility to arrange some final steps before exiting (you can use this facility even in a shell script, using trap)
Alhoug the process seems to be hung, it may be in a normal state, in the point of vview of the OS. Executing an endless loop for example.
When TERM signal is delivered to the process, it may have a singnal handler attached to it, and the the processes signal handler will be given control, to stop the process in its own favor. Flushing buffers to open files, close them, etc...
KILL signal ( -9 or -KILL ) is not maskable, the process can not have any handler on it. The footprint of the process is just vanished out of the memory and kernel structures, along with its child processes.
So I suggest the following sequence
kill -TERM <PID>
sleep some time
check if process exists yet
if it does, then kill -KILL <PID>
--Trifo