There are 2 immediate things that I can think of:
- Advising the process scheduler via nice
- Advising the I/O scheduler via ionice
Other than that you could look for periods of time where the system is almost idle, and only allow your program to run during those periods. But that would have to be done manually, as it's non-trivial to code (IMO). Software like BOINC just wait for a certain time of no user input to determine "idle".
Or, if you know that the process will be very CPU intensive for a short period of time, start it with a very low niceness, so that impact on the system will be as short as possible.