Scheduling a task on the same processor enables it to benefit from the data cached from the previous scheduling instance. It also eliminates the need to flush the cache on a context switch to maintain consistency. In contrast, scheduling a task on a different processor can increase the number of cache misses and degrade performance. A scheduler that takes processor affinities into account while making scheduling decisions can improve cache effectiveness and the overall system performance. We propose techniques to account for processor affinities while scheduling tasks in multiprocessor environments. These techniques are incorporated in a proportional share schedulers and results in a practical approach for scheduling tasks in a multiprocessor system. The schedulability of each process is enforced by a guaranteed CPU service rate, independent of the demands of other processes. The resulting scheduler is simulated and evaluated its performance using various application and benchmarks.