Both is the answer to your question. The OS has to be aware of multiple cores/CPUs before an app can make use of them.
But after that, the answer depends on what kind of utilization you mean. Because there's different approaches to this problem. For example, there's load balancing, which tries to evenly distribute the load across all cores/processors. Then there's a spillover method, where once one core reaches its capacity, everything "spills over" to the next core/processor.
Generally speaking, it seems to have fallen on individual application makers to really take advantage of this, but at the same time I think OS makers could be doing more. The ill fated BeOS was really about 10 years too early. The most impressive feature of BeOS was that it was fully multi-threaded from top to bottom, and something like that on today's multi-core systems would be a truly spectacular sight to behold. Unfortunately, doing that to any existing OS would basically require a complete top to bottom rewrite. A huge undertaking. So, app vendors are generally left to do what they can, and hope that the spiritual successor to BeOS comes along. If only BeOS had come along even 5 years later.
One question about Multi-Core and Mulit-Processor machines. It is the duty of the operating system to make use of all the cores and CPUs? or it is the duty of the running application? And which one should optimize this task?