Thông thường, mỗi bộ xử lí thực hiện tự lập trình lịch cho các tiến trình chạy trên nó (giả sử có nhiều tiến trình cùng chạy trên bộ xử lí này) mà không cần quan tâm đến việc các bộ xử lí khác đang làm gì. Tuy nhiên, khi có các tiến trình tương tác và có quan hệ với nhau chạy trên các bộ xử lí khác nhau, thì phương pháp scheduling độc lập không còn phù hợp nữa.
Hình 1.18 là một ví dụ, trong đó các tiến trình A và B chạy trên một bộ xử lí, còn C và D chạy trên bộ xử lí kia. Các bộ xử lí hoạt động theo nguyên tắc
chia sẻ thời gian, với time slice là 100ms, A và C sẽ chạy trên các time slice chẵn, B và D chạy trong các time slice lẻ.
Hình 1.18: (a) 2 job chạy lệch pha nhau. (b) Ma trận scheduling cho 8 bộ xử lí, mỗi bộ có 6 khe thời gian, các dấu X chỉ các khe thời gian đã được cấp. Giả sử A gửi nhiều thông điệp hoặc gọi nhiều lệnh cho D. Trong time slice, A khởi tạo và gọi D, nhưng hiện tại D chưa chạy, sau 100ms D mới nhận được thông điệp của A và trả lời ngay, nhưng ở bộ xử lí 0 B đang chạy, và phải mất 100ms sau nữa, A mới nhận được phản hồi này và xử lí nó. Như vậy, việc trao đổi thông điệp phải mất 200ms.
Ousterhour (1982) đã giới thiệu một số giải thuật dựa trên nguyên lí mà ông gọi là co-scheduling, nguyên lí này tính tới các thành phần thông tin giữa các tiến trình, trong khi đảm bảo cho tất cả các thành viên trong một nhóm tiến trình đều chạy đồng thời.
Giải thuật thứ nhất dựa trên ma trận trong đó mỗi cột là một bảng các tiến trình ứng với một bộ xử lí, như ví dụ trong hình 1.18(b). Cột 4 chứa tất cả các tiến trình chạy trên bộ xử lí 4, hàng 3 là tất cả các tiến trình chạy trên khe thời gian thứ 3 của tất cả các bộ xử lí. Bằng cách đặt tất cả các thành viên của một nhóm tiến trình vào cùng một khe thời gian, giải thuật này sẽ đảm bảo cho tất cả các tiến trình này đều chạy cùng một thời điểm, tối đa hoá thông lượng.