│
▼
Context Switch
│
▼
Thread B
│
├── Instruction X
├── Instruction Y
│
▼
Context Switch
│
▼
Thread A
│
└── Instruction 3
پس ترتیب زمانی اجرای یک برنامه فقط به کد خودش بستگی نداره
Scheduler
و وضعیت کل سیستم هم روی زمان بندی اجرای Threadها تاثیر میذارن
Process یا Thread
اینجا یه نکته خیلی مهم داریم
در سیستم های مدرن معمولا Scheduler چیزی رو که واقعا باید روی CPU اجرا بشه در سطح Thread زمان بندی میکنه
نه اینکه Process رو همیشه به عنوان یک واحد غیرقابل تقسیم در نظر بگیره
مثلا:
Process A
├── Thread 1
├── Thread 2
└── Thread 3
Process B
├── Thread 1
└── Thread 2
Scheduler
میتونه Thread های آماده رو برای اجرا انتخاب کنه یعنی وقتی بعداً وارد مبحث Thread بشیم این موضوع خیلی مهم تر میشه
یک نکته درباره CPU Core
اگه یک Core داشته باشیم در هر لحظه فقط یک Thread میتونه واقعا روی اون Core اجرا بشه ولی با جابه جایی سریع بین Threadها اینطور به نظر میرسه که چند برنامه همزمان دارن اجرا میشن
مثلا:
Time
│
├── Thread A
├── Thread B
├── Thread C
├── Thread A
└── Thread B
اگه چند Core داشته باشیم چند Thread میتونن واقعا به صورت همزمان روی Coreهای مختلف اجرا بشن
اینجاست که تفاوت بین
Concurrency و Parallelism هم مهم میشه
CPU Scheduling
یعنی Kernel تصمیم میگیره کدوم Thread یا Process آماده باید CPU رو دریافت کنه
به صورت ساده
Ready
│
▼
Scheduler
│
▼
Running
│
├── Time Slice تموم میشه
│
▼
Preemption
│
▼
Context Switch
│
▼
Thread یا Process دیگه
مفاهیم مهم این قسمت
Scheduler
انتخاب کننده واحد قابل اجرا
Ready Queue
محل مفهومی واحدهای آماده اجرا
Preemption
گرفتن CPU از واحدی که در حال اجراست
Timer Interrupt
یکی از مکانیزم هایی که میتونه باعث بشه Kernel فرصت بررسی وضعیت و زمان بندی دوباره رو پیدا کنه
Context Switch
جابه جایی وضعیت اجرای واحد فعلی و آماده کردن واحد بعدی
Thread
واحدی که در سیستم های مدرن معمولا مستقیما برای اجرا زمان بندی میشه
@reverseengine
Post #1819
56