Akış ve kuyruk arasındaki fark nedir?


13

Akış ve kuyruk arasındaki fark nedir? Her ikisinin de sıralı bir elemanlar seti kavramı vardır, ancak farklı uygulamalara ve farklı bir 'insert' / 'ekstre' (akarsu) ve 'enqueue' / 'dequeue' (kuyruk) kelimelerine sahip olma eğilimindedir. Bunlar değiştirilebilir mi? Farklı kavramlar veya modeller öneriyorlar mı? Eğer öyleyse, farklar nelerdir?


Görünüşe göre "akış", farklı bağlamlardaki farklı şeyleri ifade eder. COM'daki Windows IStream arabirimi ile mimarideki bir olay akışının karşılaştırması arasındaki karakter akışı arasındaki karakteristik farklılıklar vardır . Açıklayabilir misin?
rwong

Bir ormancı bir dereden biraz su toplar, ancak tüm suyu tüketmezler . Dolayısıyla, bir akıştan tamamen tüketmeden bir miktar toplama hissi vardır. Öte yandan, kuyruktaki öğeler tükenebilir.
emallove

Yanıtlar:


11

Bir akış gerçekte böyle bir veri yapısı değildir (kavramsal olarak), ancak bilgi iletmek veya almak için kullanılan dijital olarak kodlanmış uyumlu sinyaller dizisidir (veri paketleri veya veri paketleri).

Bir kuyruk sıranın arkasına öğeler eklemek veya önden almak için izin basit FIFO mekanizmadır.

Akışların her zaman bir kaynağı vardır, örneğin bir dosya, ağ konumu vb. Bir Kuyruk doğal olarak herhangi bir veri içermez.

Yani aslında kavram olarak oldukça farklılar ve Mason'un işaret ettiği gibi, farklı şekilde kullanılıyorlar.


Aslında "stream" adı verilen bir veri yapısı var, tüketilecek bir veri listesiyle (etkin bir şekilde), daha fazla elemana ihtiyacınız varsa çağrılabilen bir üretici işlevi kuyruğunda.
Vatikan

Unix 'yes' komutu bir akışa benziyor, ancak belirli bir veri kaynağı yok.
JBRWilkinson

@JBRWilkinson: Bağımsız değişken olmadan çalıştır, veri kaynağı yes(1)katıştırılmış varsayılan dizedir. Bir argümanla çalıştırın, argüman ne olursa olsun.
Blrfl

Evet, haklısınız - tüm veriler bir yerden gelmek zorundadır. Belki de buradaki asıl nokta, bir kuyruğun boş olabileceği ve tanım olarak bir akışın genellikle olmadığıdır?
JBRWilkinson

2
@JBRWilkinson Bu doğru değil. Şema'da (stream)boş bir akış döndürür. Ayrıca, bu cevap yanlıştır, bir akış bir veri yapısıdır, akışlar bir kaynağa sahip olmayabilir ve akışlar doğal olarak herhangi bir veri içermez, sıfır veya boş veya boş liste olabilir. Daha fazla bilgi için SRFI-41'e bakınız .
dadı

5

Temel fark, kullanılma şeklidir. Bir akışta genellikle işlemin yalnızca bir tarafını kullanırsınız: okumak veya yazmak için bir akış açarsınız, ancak her ikisini birden kullanmazsınız. Oysa sıra ile öğeleri giyiyorsunuz ve çıkarıyorsunuz.

Ayrıca, kuyruklar bir şeyleri yerleştirdiğiniz ve çıkardığınız sıraya göre çok katıdır, ancak akışlar genellikle (ancak her zaman değil) bir Seekişlemi destekler , özellikle de onlardan okuyorsanız.


3
FileStreamReadWritemodunda açılabilir .
Robert Harvey

2
..ve öncelik sıraları siparişle ilgili seçenekler sunuyor
Petter Nordlander

5

Deneyimlerime göre, bir akış, akış içindeki veriler tarafından genellikle belirlenen hızda üretilen / tüketilen bir bayt dizisidir. Örneğin, bir MPEG veri akışı, bir sonraki bayt dizisinin ne yaptığını ve kaç tanesinin tüketilmesi gerektiğini tanımlayan çerçeve başlıklarına sahip olacaktır. Bir belgenin ikili serileştirmesi benzer olacaktır. Her zaman kendini tanımlamaz: STDOUT'a yazmak akış açısından yapılabilir, ancak insanca okunabilir / ayrıştırılamaz veriler olabilir.

Tersine, bir kuyruk genellikle bütünüyle tüketilen iyi bilinen bir nesne tipidir (veya arayüz destekleyici nesneler). Bir örnek, bir dizi veritabanı çalışanı tarafından işlenen bir veritabanı işleri kuyruğu olabilir.


5

Akış ve kuyruk arasındaki fark, veri hızının kontrol edilme şeklidir:

  • kuyrukta, gönderen okuyucunun hızına uyum sağlar. Gönderen, kuyruk doluysa ne yapılacağına karar verir: kuyruğun kullanılabilirliğini bekleyin veya verileri atın.

  • bir akışta okuyucu gönderenin hızına uyum sağlar, okuyucu eski veriler tüketilmeden önce yeni veriler gelmesi durumunda ne yapacağına karar verir.

Bu bakış açısıyla, Unix kanallar gibi karakter akışları akış olarak değil sıra olarak nitelendirilir.


Uyarlanabilir video akışında, istemci devam etmediği için sunucu daha düşük güvenilirliğe sahip bir akışa ayarlanacaktır.
JBRWilkinson

@JBRWilkinson - Uyarlanabilir video akışında , sunucu yalnızca bir akışın birden fazla varyantını farklı bit hızlarında gönderir. Bu, bu akışlar arasından seçim yapmak hala müşterinin sorumluluğundadır.
mouviciel

Evet, HTTP akışı bunu yapar. Noktadan noktaya ve veri önceden kodlanmamış video görüşmesi demek istedim. Benim hatam - açık olmalıydım.
JBRWilkinson

Bir karakter akışının amacı, verilerin üretildikçe az ya da çok tüketilmesidir: veriyi tutmaktan ziyade bir veri akışıdır. Bunun pratikte mükemmel olmadığını biliyoruz, ancak mecazi açıdan doğru olması bekleniyor: okuyucu akışı geldiği kadar hızlı

5

Kelimelerin yaygın olarak nasıl kullanıldığı hakkında daha görsel olarak düşünürsek , belirli diller ve uygulamalar tarafından belirli kullanımların dağınıklığından kaçınabiliriz, böylece bu terimler aslında bir şey ifade edebilir:

  • Bir sıra insan sırada bekler ve tek tek servis edilir. Kuyruktaki sıraya daha fazla kişi katılıyor. Hizmet ilerledikçe herkes bekler ve hizmet süresinin değişmesi beklenir. Toplamda kaç kişiye hizmet verildiğinden bahsedebilirsiniz.
  • Bir dere bir kapıdan bir binadan çıkarken örneğin insanların, birer birer sunulmayan, onlar sadece daha çok veya daha az sabit bir hızda çıkış noktasını geçmektedir. Gecikmeler beklenmez ve iyi tolere edilmez. Bir grup insandan söz edebilirsiniz: saniyede bir.

Bu terimlerin amacı budur. Onlar metaforlar. (her şey gibi) (Şşşt! hikayeyi mahvedeceksin!)


2

Kuyruk bir akıştan daha yüksek bir kavramdır. Bir kuyruğun temel elemanları , tüketici tarafından kendi başına yorumlanabilen tutarlı (genellikle yazılan) bir veri yapısı olan bir mesaj / nesnedir. Öte yandan, bir akışın tabanında , kendi başına, genellikle uygulama için anlamsız olan (genellikle sabit boyutlu) bitler / bayt / karakterler vardır. Bu karakterlerin bir dizisi bir "mesaj" oluşturabilir, ancak bir akış API'sı karakter dizisini anlamlı parçalara ayırmak için uygulamaya bırakır.

Akış arabellekleri doluysa ve diğer taraf okuma / yazma yapmıyorsa, bir Akış API'sı genellikle kısmi okuma ve yazma işlemlerine de izin verir; kuyrukları işleyen uygulamalar genellikle kuyruğun bunları dahili olarak işlemesini bekler.

Akışın üzerine bir kuyruk uygulanabilir, bu mesaj çerçeveleme uygulanarak yapılır. Örneğin, TCP bir akış arabirimi sağlar, HTTP TCP'nin üzerine inşa edilir ve İçerik Uzunluğu / yığın aktarım kodlaması kullanarak mesaj çerçeveleme ekler. Bir HTTP Bağlantı API'sinin kullanıcılarının HTTP bağlantı akışını HTTP isteklerine bölmekten soyutlanır.

Öte yandan, genellikle, mesaj çerçevesinin işlenmesi gereksiz ek yük eklediğinden, bir akış API'sini sıranın üzerine uygulamak daha az mantıklıdır.


Akış API'sı genellikle tek seferde tek bir öğe üretiyor / tüketiyor, akış API'sı genellikle aynı anda birden çok "kelime" üretiyor / tüketiyor. Kabul etsem de, tanımlayıcı karakteristik bir kuyruğun yüksek seviyeli ve yapılandırılmış olması, bir akışın ise düşük seviyeli ve yapısız olmasıdır.
Alexey

0

İşlevsel programlama dillerinde (örn. Scala) ve belki de diğer dillerde, akışlar gerçekten işlevsel listelere benzer ve kuyruklardır. Ancak, kuyruklar aslında bir çift liste kullanılarak uygulanabileceğini unutmayın . Scala'da ve muhtemelen başka bir yerde bir Akış sadece tembel bir Liste - daha spesifik olarak listenin kuyruğu bir lazy val.

İşlevsel akışlar, listelerin aksine kuyruklarla bir miktar benzerlik paylaşabilir, böylece bunları akışın başlığına referans olmayacak şekilde kullanabilirsiniz - ancak dikkatli olmanız gerekir: https: // stackoverflow.com/a/5159356/3096687 . Bu, bir kuyruğa yönelik bir dequeue çağrısına biraz benzer (bir akış söz konusu olduğunda, bunu dolaylı olarak yapsanız da: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html ).


-1

Akış, seri veya paralel veya toplu sonsuz veri dizisi üretmek ve tüketmek için kullanılan bir kavram / çerçevedir. Que, akışın uygulanabileceği bir veri yapısıdır. tıpkı akışın uygulanabileceği liste veya sıra gibi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.