Ana içeriğe geç

Yan yana

ProcessvsThread

Süreç (process) ile iş parçacığı (thread) arasındaki fark nedir?

Güncellendi 2 dk okuma7 fark

Kısaca

Süreç, kendi belleği olan çalışan bir programdır; iş parçacıkları ise bir sürecin içinde çalışıp onun belleğini paylaşır: daha hafif ama koordinasyonu daha zor.

Process

Süreç

Process, bir programın çalışan örneğidir; işletim sistemi tarafından yönetilen kendi bellek alanına, kaynaklarına ve en az bir yürütme iş parçacığına sahiptir.

Process sayfasını oku

Thread

İş Parçacığı

Thread, işletim sisteminin zamanlayabileceği en küçük yürütme birimidir; bir process içinde çalışır ve o process'in belleğini diğer thread'lerle paylaşır.

Thread sayfasını oku

Process ve Thread karşılaştırması

ÖzellikProcessThread
TanımKendi kaynaklarına sahip çalışan bir programBir süreç içindeki bir yürütme yolu
BellekAyrı, yalıtılmış adres alanıSürecin belleğini diğer iş parçacıklarıyla paylaşır
Oluşturma maliyetiDaha ağır: yeni bir adres alanı ve kaynaklarDaha hafif: esas olarak bir yığın (stack) ve yazmaçlar (register)
Bağlam değiştirmeDaha yavaş; bellek eşlemesi değiştiği içinAynı süreç içinde daha hızlı
İletişimBorular, soketler, mesaj kuyrukları, paylaşılan bellekPaylaşılan değişkenler üzerinden doğrudan
Hatanın etkisiBir çökme genellikle o süreçle sınırlı kalırBir çökme tüm süreci çökertebilir
Ana riskEk yük ve daha yavaş veri alışverişiYarış koşulları ve kilitlenmeler (deadlock)

Fark, açıklamalı

Süreç, çalışan bir programın örneğidir: işletim sistemi ona kendi sanal adres alanını, açık dosyalarını ve diğer kaynaklarını verir. İş parçacığı ise CPU'nun zamanladığı bir komut dizisidir; her süreç bir iş parçacığıyla başlar ve aynı sürecin içinde çalışan daha fazlasını oluşturabilir.

Asıl fark bellek paylaşımıdır. Süreçler yalıtılmıştır; biri çökse ya da hatalı davransa diğerini nadiren etkiler, ama iletişim kurmak için borular (pipe), soketler ya da paylaşılan bellek gibi açık mekanizmalara ihtiyaç duyarlar. İş parçacıkları sürecin heap'ini ve global değişkenlerini paylaşır; bu yüzden veriyi anında alışverişi yapabilir, oluşturmaları ve aralarında geçiş yapmak daha ucuzdur, ama yarış koşullarından (race condition) kaçınmak için kilitlere ya da başka senkronizasyona ihtiyaç duyarlar.

Gerçek uygulamalar ikisini de karıştırır. Bir web tarayıcısı güvenlik ve kararlılık için siteleri ayrı süreçlerde çalıştırır, bu süreçlerin her biri de çizim, ağ ve betikler için birçok iş parçacığı kullanır. Sunucular çoğu zaman CPU çekirdeği başına yaklaşık bir tane olmak üzere birkaç işçi süreci çalıştırır; her biri istekleri bir iş parçacığı havuzuyla ya da bir olay döngüsüyle ele alır.

Sık yapılan bir yanlış, daha fazla iş parçacığının her zaman daha fazla hız anlamına geldiği düşüncesidir. İş parçacıkları yalnızca birden çok çekirdekte gerçekten paralel çalışır ve CPython'un varsayılan derlemesi gibi bazı çalışma ortamlarında global bir kilit, aynı anda yalnızca bir iş parçacığının Python kodu çalıştırmasına izin verir. Çok fazla iş parçacığı da bağlam değiştirmede ve paylaşılan kilitleri beklemekte zaman harcar.

Hangisini kullanmalısınız?

Process şu durumlarda doğru seçim:

  • Görevler yalıtılmalı, böylece biri başarısız olduğunda diğerlerini çökertmemeli.
  • Güvenilmeyen kod çalıştırmak gibi durumlar için bir güvenlik sınırına ihtiyacınız var.
  • CPU yoğun işlerin, global kilidi olan bir çalışma ortamında paralel çalışması gerekiyor.

Thread şu durumlarda doğru seçim:

  • Görevlerin çok miktarda veriyi hızlıca paylaşması gerekiyor.
  • G/Ç'ye bağlı birçok görev için hafif eşzamanlılık istiyorsunuz.
  • Arka plan işi sürerken kullanıcı arayüzünü duyarlı tutmanız gerekiyor.

Ayrı bellek ile paylaşılan bellek

Processpython
from multiprocessing import Process
counter = 0

def work():
    global counter
    counter += 1  # changes the child process's own copy

if __name__ == "__main__":
    p = Process(target=work)
    p.start()
    p.join()
    print(counter)  # 0: the child had its own memory
Threadpython
from threading import Thread
counter = 0

def work():
    global counter
    counter += 1  # changes the variable all threads share

t = Thread(target=work)
t.start()
t.join()
print(counter)  # 1: threads share the process's memory

Sık sorulan sorular

Bir sürecin birden çok iş parçacığı olabilir mi?

Evet. Her süreç bir iş parçacığıyla, yani ana iş parçacığıyla başlar ve eşzamanlı çalışan, sürecin belleğini paylaşan daha fazlasını oluşturabilir.

İş parçacıkları süreçlerden daha mı hızlı?

İş parçacıklarının oluşturulması ve veri alışverişi, bellek paylaştıkları için daha hızlıdır. Global kilidi olan çalışma ortamlarında CPU'ya bağlı işler için ya da yalıtımın önemli olduğu durumlarda süreçler yine de daha iyi seçim olabilir.

Bir süreç bittiğinde iş parçacıklarına ne olur?

Hepsi durur. İş parçacıkları kendi süreçlerinin içinde yaşar; bu yüzden süreç sona erdiğinde ya da çöktüğünde içindeki her iş parçacığı da sona erer.

Daha fazla

Ayarlar