1. The fundamental differences between internal fragmentation and external fragmentation are: Internal fragmentation is the wasted space within each allocated block because of rounding up from the actual requested allocation to the allocation granularity. External fragmentation is the various free spaced holes that are generated in either your memory or disk space. External fragmented blocks are available for allocation, but may be too small to be of any use.
2. External fragmentation is reduced by compaction. Compaction moves memory around until it is all placed together in one big block.
3. Relocation process must be performed before running the program. This process is typically done by the linker during compilation (at compile time), although it can be done at runtime by a relocating loader. Compilers or assemblers typically generate the executable with zero as the lower-most, starting address. Before the execution of object code, these addresses should be adjusted so that they denote the correct runtime addresses.
4. A. The longer the program runs the more memory it consumes, the more memory it consumes the less memory is available for other applications, the computer tends to get slower and slower, the application gets slower and slower, until eventually something has to give.
B. On older OS' this could be a real problem and crash the whole system, other systems were more stable and would just terminate the process but often left the system in some compromising state etc.
C. Most modern OS' actually handle the situation pretty well and just close the application and recover whatever resources can be recovered (however some resources may still remain open, for example file locks might persist, child processes might continue etc.