30 مرداد 1404
تفاوت Parallel Programming و Concurrent Programming

تفاوت Parallel Programming و Concurrent Programming
خیلی از برنامهنویسهای تازهکار یا حتی میانرده تصور میکنند که Parallel Programming و Concurrent Programming یکی هستند، در حالی که این دو مفهوم تفاوتهای مهمی با هم دارند. در این مقاله به زبان ساده و همراه با مثال توضیح میدهیم که فرق این دو رویکرد چیست.
Parallel Programming (برنامهنویسی موازی)
در Parallel Programming چندین تسک واقعاً و رسماً به صورت همزمان روی چند هستهی CPU اجرا میشوند.
ویژگیها:
-
نیازمند بیش از یک CPU Core است.
-
هر تسک روی یک هستهی جداگانه اجرا میشود.
-
اجرای واقعی (True Parallelism) زمانی ممکن است که سختافزار چند هستهای داشته باشیم.
مثال ساده:
فرض کنید دو هسته CPU داریم. در این حالت:
-
تسک A روی Core1 اجرا میشود.
-
تسک B همزمان روی Core2 اجرا میشود.
این یعنی اجرای موازی واقعی.
Concurrent Programming (برنامهنویسی همزمانی)
در Concurrency ممکن است تنها یک CPU Core داشته باشیم، اما چندین تسک تعریف شوند. CPU با استفاده از Context Switching خیلی سریع بین تسکها جابهجا میشود.
ویژگیها:
-
الزاماً نیازمند چند هسته نیست.
-
در هر لحظه CPU فقط یک تسک را اجرا میکند.
-
جابهجایی بین تسکها (Context Switching) آنقدر سریع است که به کاربر توهم اجرای همزمان میدهد.
مثال ساده:
-
CPU ابتدا بخشی از تسک A را اجرا میکند.
-
سپس سریع به تسک B سوئیچ میکند.
-
دوباره به تسک A برمیگردد.
در ظاهر، هر دو تسک همزمان جلو میروند، اما در واقع پشت صحنه CPU یکییکی آنها را مدیریت میکند.
رابطه Parallel و Concurrent
-
هر Parallel Programming در ذات خود Concurrent هم هست.
-
اما هر Concurrent Programming الزاماً Parallel نیست.
سادهسازی:
-
Concurrency = مدیریت چند کار در یک زمان (حتی اگر CPU تکهستهای باشد).
-
Parallelism = اجرای واقعی چند کار همزمان (با چند Core واقعی).
نمونه کد (جاوااسکریپت)
Concurrency با setTimeout:
console.log("تسک 1 شروع شد");
setTimeout(() => {
console.log("تسک 1 تمام شد");
}, 2000);
console.log("تسک 2 در حال اجراست");
در اینجا جاوااسکریپت به صورت Concurrent عمل میکند: تسک 1 شروع میشود، منتظر نمیماند، و تسک 2 بلافاصله اجرا میشود.
Parallelism (با استفاده از Node.js Cluster یا Worker Threads)
const { Worker } = require('worker_threads');
function runTask(file) {
return new Promise((resolve, reject) => {
const worker = new Worker(file);
worker.on('message', resolve);
worker.on('error', reject);
});
}
(async () => {
await Promise.all([
runTask('./taskA.js'),
runTask('./taskB.js')
]);
})();
در این حالت دو Worker به صورت واقعی روی دو Thread جداگانه اجرا میشوند (نیازمند چند Core است).
جمعبندی
-
Parallel Programming = اجرای واقعی همزمان با استفاده از چندین Core.
-
Concurrent Programming = مدیریت چند کار با استفاده از Context Switching، حتی روی یک Core.
به یاد داشته باشید: هر Parallel برنامهای Concurrent هم هست، ولی هر Concurrent برنامهای Parallel نیست.