Allowing cpu frequency to be set directly by user level process is a security issue. It's a hardware functionality that could affect other processes running on the system. On an ideal system, no user level process should be able to affect the execution of another user's processes, except through explicit interprocess communication (e.g. pipes, signals, files, etc).
Examples of damages that could be done:
- Battery life: a malicious or poorly written could set cpu at a constantly high level, draining more battery than is necessary, without attracting suspicion because it uses little cpu for itself.
- Poor performance: a malicious or poorly written app could set the cpu frequency at constantly low level, resulting in poor performance. This could then be used to trick user into purchasing our downloading unnecessary optimizer apps, among others.
- Conflicting cpu frequency set by multiple apps could lead to really unstable system performance and general havoc as they keep overriding each other. This reason alone could make the whole cpu frequency setting useless.
The solution to this? Any single process should not be able to directly set cpu frequency. Instead non root process should only be able to give hints, and the system could then pick the best frequency setting, taking into account the hints from all processes, system policy, and process accounting information. This is what cpufreq "governers" are. One of the job of operating system is to moderate access to shared resources.
Also, it should be noted that lowering cpu frequency does not always lead to better battery life, depending on the work load, lower frequency could also mean it takes longer time to finish the task, and this could easily negate the savings.