Dynamic Cache Partitioning For Multi-Core Systems