Komik | Linux eşzamanlılığı ve yarış koşulları tam olarak nedir?

Yazar | Kod yazan basketbol topu salağı

Baş Editör | Guo Rui

Linux öğrenirken kesinlikle kilitlerle ilgili her türlü bilgiyle karşılaşacağım Bazen biraz öğrendim ve yarım kova suda kılıçlar hakkında konuşabileceğimi hissediyorum ve aniden yeni bir bilgi noktası beliriyor. Yeni bilgi noktaları için zaman olduğunda, bu da tuhaftır. MCU'nun çıplak metal kodunu üniversitede yazmaya başladım.İşletim sisteminde kilidin ne olduğunu anlamadım.MCU'dan gömülü Linux'a kadar çok görevli bir sistem de var. Anlamayanlar Baidu'ya kontrol etmesini öneriyor.

Eşzamanlılık ve yarış koşulları nelerdir?

İlk Linux çekirdeğinde, nispeten az sayıda eşzamanlı kaynak vardı. Çekirdek simetrik çok işlemcili (SMP) sistemleri desteklemez ve eşzamanlılık sorunlarının tek nedeni kesintilerdir.

İşlemcilerde giderek daha fazla CPU çekirdeği olması, sistemin olaylara hızlı bir şekilde yanıt vermesini gerektirir. Modern donanım ve uygulamaların ihtiyaçlarını karşılamak için Linux çekirdeği, aynı anda daha fazla şeyin yapılabileceği noktaya kadar geliştirilmiştir. Bu evrim, daha fazla ölçeklenebilirlik getirdi. Ancak, bu aynı zamanda çekirdek programlama görevini büyük ölçüde karmaşıklaştırır. Aygıt sürücüsü programcıları artık tasarımlarında eşzamanlılığı en başından dikkate almalı ve eşzamanlılık sorunlarını derinlemesine anlamalı ve bu tür sorunlarla başa çıkmak için çekirdek tarafından sağlanan araçları kullanmalıdır.

Yukarıdakileri bitirdikten sonra konuya girin. Eşzamanlılık, birden fazla yürütme görevinin aynı anda ve paralel olarak yürütüldüğü anlamına gelir; yarış, kelimenin tam anlamıyla rekabet anlamına gelir ve eşzamanlı yürütme birimleri, paylaşılan kaynaklara (donanım kaynakları ve yazılım global değişkenleri, statik değişkenler, vb.) Erişirken yarış koşullarına yatkındır.

Örneğin, bir karakter aygıtının hatası: Bir sanal karakter aygıt sürücüsü için, bir yürütme birimi A'nın ona 300 karakter'a 'yazdığını ve başka bir yürütme birimi B'nin ona 300 karakter' b 'yazdığını ve üçüncüsünün Her yürütme birimi tüm karakterleri okur. A ve B sıralı ve seri olarak çalıştırılırsa, C okunurken hata olmaz, ancak A ve B aynı anda çalıştırılırsa sonuç beklenmedik olur.

Yarış koşulları

  • Simetrik Çok İşlemcili (SMP) Çoklu CPU'lar: SMP, sıkıca bağlanmış ve bellek paylaşımlı bir sistem modelidir.Ortak bir sistem veriyolu kullanan çoklu CPU'larla karakterize edilir, böylece ortak çevre birimlerine ve hafızalara erişebilirler.
  • Tek bir CPU içindeki işlemler ve onu önleyen işlemler: Linux 2.6 çekirdeği, önleyici zamanlamayı destekler ve çekirdek yürütülürken bir işlem başka bir yüksek öncelikli işlem tarafından kesintiye uğrayabilir.
  • Kesinti (sert kesinti, yumuşak kesinti, görev uygulaması, alt yarı) ve süreç: Kesinti, yürütme sürecini kesintiye uğratabilir ve kesintiye uğrayan program ile kesintiye uğramış süreç arasında yarış koşulları da oluşabilir.

Yarış çözümü

Yarış koşulunu çözmenin yolu, paylaşılan kaynaklara özel erişim sağlamaktır. Paylaşılan kaynaklara erişen kod alanı denir Kritik Bölüm Kritik alan karşılıklı dışlama mekanizması ile korunmalıdır. Linux aygıt sürücülerindeki ortak karşılıklı dışlama mekanizmaları aşağıdaki yöntemleri içerir: kesme koruması, atomik işlemler, döndürme kilitleri ve semaforlar.

Çoğu okuyucu, bu senaryonun en iyi şekilde önleneceği konusunda hemfikirdir.

Bu nedenle, spinlock'lar için geçerli olan temel kural, herhangi bir kodun

bir spinlock tutarken atomik olmalıdır. Uyuyamaz; aslında, toservice dışında herhangi bir nedenle işlemciyi bırakamaz

keser (ve bazen o zaman bile).

Yukarıdaki çıkmaza dair derin bir anlayışınız yoksa, bu İngilizce hakkında dikkatlice yorum yapabilirsiniz.

Kilitlenme

Geliştirme sırasında dikkatli olmadığınız zaman kilitlenme sorunu ile karşılaşılabilir SMP sisteminde, bir CPU kilitlendiğinde, tıpkı lastiği delinmiş bir araba gibi çalışmaya devam edebilen başka CPU'lar vardır. Teorik olarak, hala çalışabilir, yani hızlı sürülmezse veya hızlı sürülürse, asılması kolay olacaktır.

Çok süreçli programlama kilitlenmeye neden olur

Aşağıdaki dört durum kilitlenmeye neden olacaktır:

  • Birbirini dışlayan. Bir iş parçacığı veya işlem, kaynağın özel kullanımı gibi her zaman paylaşılan kaynakları kullanır.
  • Bir döngü içinde bekleyin. Örneğin, A süreci B sürecini bekliyor, B süreci C sürecini bekliyor ve C süreci A sürecini bekliyor.
  • Kısmi tahsis. Kaynaklar kısmen tahsis edilmiştir. Örneğin, hem A hem de B işlemlerinin bir dosyaya erişmesi ve ayrıca bir yazıcı kullanması gerekir.A İşlemi dosya kaynağını alır ve B işlemi yazıcı kaynağını alır, ancak hiçbir işlem tüm kaynakları alamaz.
  • Öncelik eksikliği. Bir işlem kaynağı elde eder, ancak işlem engellense bile kaynağı asla serbest bırakmaz.

Spesifik kullanım sahnesi daha karmaşık olacaktır ve gerçek duruma göre analiz edilmesi gerekir.

Tek iş parçacığı kilitlenmeye neden oluyor

Tek iş parçacığının neden olduğu kilitlenme genellikle (copy_from_user (), copy_to_ser () ve kmalloc ()) gibi engelleme işlevinin çağrılmasından kaynaklanır. Sistem planlaması, engellemeden sonra gerçekleştirilir ve önceki edinme, programlama işlemi sırasında çağrılabilir. Kilidin işlevi, bu kaçınılmaz olarak kilitlenmeye yol açacaktır.

Diğeri ise, döndürme kilidi işlevinin, kilidi serbest bırakmadan aynı döndürme kilidi için geçerli olmasıdır Bu tür düşük seviyeli sorunlar, döndürme kilidine de neden olabilir.

Muteksler, döndürme kilitleri ve semaforlar arasındaki fark nedir?

Mutex ve mutex benim anlayışıma göre aynıdır ve farklı adlandırılırlar.

Genel olarak konuşursak, karşılıklı dışlamayı başaran tüm senkronizasyon mekanizmalarına değer olabilir. Dar anlamda, muteksin belirli ikili kilit mekanizmasına atıfta bulunur. Karşılıklı dışlama kilitlerinin rolü karşılıklı dışlamadır, kritik bölümü (kritik bölüm) korumak için karşılıklı dışlama kullanılır. Sözde kritik bölüm, kodun bir bölümüdür.İki iş parçacığı aynı anda çalışırsa, sorunlar olabilir, bu nedenle korumak için karşılıklı dışlama kilitlerine ihtiyaç vardır.

Semafor Daha gelişmiş bir senkronizasyon mekanizmasıdır, mutex (karşılıklı dışlama kilidi) öyle diyebilirsin semafor (semafor) Değerin yalnızca 0/1 olduğu özel bir durum. Semafor, yalnızca iş parçacıkları arasında karşılıklı dışlama değil, daha karmaşık senkronizasyon elde etmek için daha fazla değer alanına sahip olabilir.

Döndürme kilidi Bir Mutex Bunu başarmanın yolu bu, genel muteks kilidi ile karşılaştırıldığında, bekleme süresi boyunca cpu'yu bırakacak. Spinlock Cpu her zaman meşgul olacak şekilde sürekli olarak döngüye girer ve kilidin durumunu test eder. Döndürme kilitleri ve semaforlara kıyasla, kilit uygulaması başarısız olursa, döndürme kilidi sorgulamaya devam edecek, uygulama iş parçacığı uykuya geçmeyecek, semafor ve muteks kilit uygulaması başarısız olursa, iş parçacığı uykuya geçecektir. Serbest bırakıldıktan sonra uyku ipliği uyanacaktır.

Senkronizasyon kilidi Özel bir şey yok gibi görünüyor, tüm senkronizasyon kilitlerinin semaforlar gibi senkronizasyon kilitleri olarak adlandırılabileceğini anlayabilirsiniz. Son olarak, bu isimlerin boynuzlarına girmeyin, bu şeylerin arkasındaki prensipleri anlamak daha önemlidir, isimler hakkında söylenecek bir şey yoktur. Bunlar farklı dillerde ve platformlarda farklı adlandırılabilir, ama aslında özü budur.

Yarış koşullarından kaynaklanan sorunlar nasıl çözülür?

Yukarıda yarış koşullarının nedenlerini, olanları ve çözümlerini inceledik.Aşağıda ortak çözümleri tek tek analiz ediyoruz.

Maskeyi kes

Yani, tek bir CPU'da yarış koşullarından kaçınmanın basit bir yolu, kritik bölüme girmeden önce sistem kesintisini korumaktır. Linux'un asenkron I / O, süreç zamanlaması ve diğer pek çok şey kesintilere dayandığından, kritik bölümdeki kodu mümkün olan en kısa sürede çalıştırmalıyız, yani kritik bölümdeki kod mümkün olduğunca küçük olmalıdır.

Linux çekirdeği aşağıdaki özel yöntemleri sağlar:

Local_irq_disable (); // Kalkan kesintisi Local_irq_enable (); // Kesmeyi aç Local_irq_save (flags); // Kesintileri yasaklayın ve mevcut cpu kesinti bit bilgilerini kaydedin

Atomik işlem

Atomik işlemler, yürütme sırasında başka bir kod tarafından kesintiye uğratılmayacak işlemleri ifade eder.

Linux çekirdeği, çekirdekte atomik işlemleri gerçekleştirmek için bir dizi işlev sağlar.Bu işlemler, biri tamsayı atomik işlemler ve diğeri bit atomik işlemler olmak üzere iki türe ayrılır ve bunların tümü temel CPU'nun atomik işlemlerinin uygulanmasına dayanır. Bu işlevler, CPU mimarisiyle yakından ilgilidir.

1. Tamsayı atomik işlemler

  • a) Atomik değişkenin değerini ayarlayın
atomic_t v = ATOMIC_INIT (0); // Atomik değişken v'yi tanımlayın ve 0 olarak başlatın void atomic_set (atomic_t * v, int i); // Atomik değişken değerini i olarak ayarlayın
  • b) Atomik değişkenin değerini alın
atomic_read (atomic_t * v); // atom değişkeninin değerini döndürür v
  • c) Atomik değişken toplama ve çıkarma işlemleri
void atomic_add (int i, atomic_t * v); // atomik değişken v, i'yi artırır void atomic_sub (int I, atomic_t * v); // Atomik değişken v, i'yi azaltır
  • d) Atomik değişkenlerin kendi kendine artması ve kendi kendine azalması
void atomic_inc (atomic_t * v); // atomik değişken v 1 artış void atomic_dec (atomic_t * v); // atomik değişken v azalma 1
  • e) Çalıştırın ve test edin
int atomic_inc_and_test (atomic_t * v); int atomic_dec_and_test (atomic_t * v); int atomic_sub_and_test (int i, atomic_t * v); / * Yukarıdaki üç işlev, atomik değişken v'yi (toplamadan) otomatik olarak artırır, azaltır ve çıkarır ve 0 olup olmadığını test eder, 0 ise doğru döndür, aksi takdirde yanlış döndür * /
  • f) İşlet ve geri dön
int atomic_add_return (int i, atomic_t * v); int atomic_sub_return (int i, atomic_t * v); int atomic_inc_return (atomic_t * v); int atomic_dec_return (atomic_t * v); / * Yukarıdaki işlev, atomik değişken v üzerinde otomatik artış, otomatik çıkarma, toplama ve çıkarma işlemlerini gerçekleştirir ve yeni bir değer döndürür * /

2. Bit atomik işlem

  • a) Bit ayarla
void set_bit (nr, void * addr); // adres adresinin nr bitini ayarlayın yani bu bite 1 yazın.
  • b) Biti temizle
void clear_bit (nr, void * addr); // adres adresinin nr bitini sil, yani bu bite 0 yaz.
  • c) Biti değiştirin
void change_bit (nr, void * addr); // Adres adresinin nr değerini ters çevir
  • d) Test biti
int test_bit (nr, void * addr); // adres adresinin nr bitini döndürür
  • e) Ucu test edin ve çalıştırın
int test_and_set_bit (nr, void * addr); int test_and_clear_bit (nr, void * adres); int test_and_change_bit (nr, void * addr); / * Yukarıdaki işlev, test_bit'i çalıştırmaya ve ardından xxx_bit işlevini yürütmeye eşdeğerdir * /

Döndürme kilidi

Döndürme kilitleri, kritik kaynaklara karşılıklı olarak münhasır erişimin bir yoludur.

Döndürme kilidini elde etmek için, belirli bir CPU üzerinde çalışan kodun önce atomik bir işlemi gerçekleştirmesi gerekir.Bu işlem, belirli bir bellek değişkenini test eder ve ayarlar.Atomik bir işlem olduğu için, diğer yürütme birimlerinin işlem tamamlanmadan bu belleğe erişmesi imkansızdır. Değişken. Test sonucu serbest olduğunu gösterirse, program döndürme kilidini alır ve çalışmaya devam eder. Test sonucu kilidin hala meşgul olduğunu gösterirse, program bu "test ve ayarla" işlemini küçük bir döngüde tekrarlayacaktır, bu sözde Meslekten olmayanın terimleriyle "dönüş", "yerinde döndürmektir".

Linux çekirdeğindeki döndürme kilitleriyle ilgili ana işlemler şunlardır:

  • 1) Döndürme kilidini tanımlayın
spinlock_t kilidi;
  • 2) İlk döndürme kilidi
spin_lock_init (kilit);
  • 3) Döndürme kilidi alın
spin_lock (lock); // Döndürme kilidi alın spin_trylock (lock); // Kilidi elde etmeye çalışın Kilit elde edilemezse yanlış bir değer döndürün ve yerinde dönmeyin.
  • 4) Sıkma kilidini açın
spin_unlock (lock); // Döndürme kilidini kaldır

Kritik bölüm kodunu çalıştırdığımızda kesintiye uğramadığımızdan emin olmak için bizi etkileyen döndürme kilidi aşağıdaki içeriğe sahiptir.

  • 5) Spin kilidi türevi
spin_lock_irq () = spin_lock () + local_irq_disable () spin_unlock_irq () = spin_unlock () + local_irq_enable () spin_lock_irqsave () = spin_lock () + local_irq_save () spin_unlock_irqrestore () = spin_unlock () + local_irq_restore () spin_lock_bh () = spin_lock () + local_bh_disable () spin_unlock_bh () = spin_unlock () + local_bh_disable ()

Kullanım önlemleri:

  • Döndürme kilitleri esasen meşgul bekleyen kilitlerdir, bu nedenle kilit süresi çok kısa olduğunda kilit kullanmak mantıklıdır, aksi takdirde sistem performansını etkiler;
  • Döndürme kilidi sistemin kilitlenmesine neden olabilir;
  • İşlem programlamasına neden olabilecek işlevler spinlock kilidi sırasında çağrılamaz.

Okuma-yazma döndürme kilidi

Döndürme kilidinde birden çok birimin eşzamanlı okuma işlemine izin verilememesi sorununu çözmek için, eşzamanlı yazma işlemlerine izin vermeyen, ancak eşzamanlı okuma işlemlerine izin veren bir okuma-yazma döndürme kilidi türetilir.

Linux çekirdeğindeki döndürme kilitlerini okuma ve yazma ile ilgili ana işlemler şunlardır:

  • 1) Okuma-yazma döndürme kilidini tanımlama ve başlatma
rwlock_t my_rwlock = RW_LOCK_UNLOCKED; // statik başlatma rwlock_t my_rwlock; rwlock_init (my_rwlock); // Dinamik başlatma
  • 2) Kilidi oku
read_lock (); read_lock_irqsave (); read_lock_irq (); read_lock_bh ();
  • 3) Kilit açma oku
read_unlock (); read_unlock_irqrestore (); read_unlock_irq (); read_unlock_bh ();
  • 4) Yazma kilidi
write_lock (); write_lock_irqsave (); write_lock_irq (); write_lock_bh (); write_trylock ();
  • 5) Kilit açma yaz
write_unlock (); write_unlock_irqrestore (); write_unlock_irq (); write_unlock_bh ();

Sıra kilidi

Sıralı kilit, okuma-yazma kilidinin bir optimizasyonudur Sıralı kilit kullanılırsa, yazma yürütme birimi, yazma yürütme biriminin tamamlanmasını beklemeden sıra kilidi tarafından korunan paylaşılan kaynağa yazdığında okuma yürütme birimi okumaya devam edebilir. Yürütme biriminin, okuma yürütme biriminin yazma işlemini tamamlamasını beklemesi gerekmez.

Sıra kilidi tarafından korunan paylaşılan kaynak bir işaretçi içermez, çünkü işaretçi yazma yürütme biriminde geçersiz kılınabilir, ancak okuma yürütme birimi bu zamanda işaretçiye erişirse, hata yapacaktır.

Linux çekirdeğindeki sıralı kilitlerle ilgili ana işlemler şunlardır:

  • 1) Sıralı kilit elde etmek için yürütme birimini yazın
write_seqlock (); write_tryseqlock (); write_seqlock_irqsave (); write_seqlock_irq (); write_seqlock_bh ();
  • 2) Sıra kilidini serbest bırakmak için yürütme birimini yazın
write_sequnlock (); write_sequnlock_irqrestore (); write_sequnlock_irq (); write_sequnlock_bh ();
  • 3) Yürütme birimi başlangıcını okuyun
read_seqbegin (); read_seqbegin_irqsave (); // local_irq_save + read_seqbegin
  • 4) Yürütme birimini tekrar oku
read_seqbegin (); read_seqretry (); read_seqretry_irqrestore ();

RCU (okuma-kopyalama-güncelleme)

RCU, okuma-yazma kilidinin yüksek performanslı bir versiyonu olarak kabul edilebilir.Okuma-yazma kilidiyle karşılaştırıldığında, RCU'nun avantajı, çoklu okuma yürütme birimlerinin aynı anda korunan verilere erişmesine izin vermesi ve aynı anda birden çok okuma yürütme birimi ve birden çok yazma yürütme birimine izin vermesidir. Korunan verilere erişim.

RCU okuma-yazma kilidini değiştiremez.

Linux çekirdeğindeki RCU ile ilgili ana işlemler şunlardır:

  • 1) Kilidi oku
rcu_read_lock (); rcu_read_lock_bh ();
  • 2) Kilit açma oku
rcu_read_unlock (); rcu_read_unlock_bh ();
  • 3) RCU'yu senkronize edin
synize_rcu (); // RCU yazma yürütme birimi tarafından çağrıldı senkronize_sched (); // Kesinti işleme fonksiyonunun işlenmesi garanti edilebilir, ancak yumuşak kesinti işleme garanti edilmez
  • 4) Kanca geri arama
call_rcu (); call_rcu_bh ();

RCU'da daha birçok işlem var, İnternet'e başvurabilirsiniz.

sinyal

Semaforlar tarafından kritik bölgeleri korumak için kullanılan yaygın yöntem, döndürme kilitlerine benzer, ancak fark, semafor elde edilemediğinde, işlemin yerinde dönmeyeceği, ancak uyku bekleme durumuna girmesidir.

Linux çekirdeğindeki semaforlarla ilgili işlemler esas olarak şunları içerir:

  • 1) Semaforu tanımlayın
Struct semafor sem;
  • 2) Semaforu başlatın
void sema_init (struct semaphore * sem, int val); // sem'i val'e başlat, elbette, sistem tarafından tanımlanan, burada listelenmeyen başka makro başlatmalar var
  • 3) Semafor alın
void down (struct semaphore * sem); // Uykuya neden olacak ve sinyal tarafından kesintiye uğratılamayacak semafor semini alın int down_interruptible (struct semaphore * sem); // Uykuya geçme bir sinyalle kesintiye uğrayabilir int down_trylock (struct semaphore * sem); // uyumayacak
  • 4) Semaforu serbest bırakın
void up (struct semaphore * sem); // Semaforu serbest bırakın ve bekleme sürecini uyandırın

Not: Semafor başlangıçta 0 olduğunda, senkronizasyon için kullanılabilir.

Senkronizasyon için tamamlama

Yani, Linux'taki senkronizasyon mekanizması. Linux çekirdeğinde Tamamlama ile ilgili işlemler esas olarak şunları içerir:

  • 1) Tamamlamayı Tanımlayın
struct tamamlama * tamamlamam;
  • 2) Tamamlamayı Başlat
void init_completion (yapı tamamlama * x);
  • 3) Tamamlanmayı Beklemek
void wait_for_completion (yapı tamamlama *);
  • 4) Uyanma Tamamlama
void complete (struct complete *); // Birini uyandır void complete_all (structplete *); // Tamamlamanın tüm yürütme birimlerini uyandır

Semafor oku ve yaz

Döndürme kilitleri ile okuma-yazma döndürme kilitleri arasındaki ilişkiye benzer şekilde, Linux çekirdeğindeki semaforları okuma ve yazma ile ilgili işlemler esas olarak şunları içerir:

  • 1) Okuma-yazma döndürme kilidini tanımlama ve başlatma
struct rw_semaphore sem; init_rwsem (sem);
  • 2) Semafor edinmeyi okuyun
down_read (); down_read_trylock ();
  • 3) Semafor sürümünü okuyun
up_read ();
  • 4) Semafor edinimini yazın
down_write (); down_write_trylock ();
  • 5) Semafor yayını yazın
up_write ();

Mutex

Karşılıklı dışlama işlemlerini gerçekleştirmek için kullanılan Linux çekirdeğindeki muteks ile ilgili ana işlemler şunlardır:

  • 1) Muteksi tanımlayın ve başlatın
struct mutex kilidi; mutex_init (kilit);
  • 2) Mutex'i edinin
void mutex_lock (struct mutex * kilidi); int mutex_lock_interruptible (struct mutex * kilidi); int mutex_lock_killable (struct mutex * kilidi);
  • 3) Muteksi serbest bırakın
void mutex_unlock (struct mutex * kilidi);

Yazar: Bir basketbol fanatiği için kod yazma, gömülü basketbol gibi gömülü basketbol geliştirmede on yıldan fazla deneyim, STC51 mikro denetleyicisi, AVR, STM32'nin başlangıcından mevcut ARM'e, başından günümüze çıplak metal gömülü Linux ve Android'e kadar Sistem, birçok proje yaptım ve birçok büyük ve küçük çukurlara adım attım.Teknoloji alışverişi yapmak ve birlikte gelişmek ve ilerlemek için daha fazla yerleşik arkadaşla tanışmayı umuyorum.

Feragatname: Bu makale yazar tarafından sunulmuştur ve telif hakkı kendisine aittir. Kapak resmi haricinde, makaledeki tüm resimler orijinal yazar tarafından yayınlanmıştır ve CSDN bunun için herhangi bir sorumluluk kabul etmez.

Zhejiang City Affairs Fenghua balıkçı yeni bir deniz ürünleri ticareti modeli başlattı, bir yılda 200.000 yuan'dan fazla kazandı
önceki
Ulusal Halk Kongresinde düzenlenen "Marksist Haber Görüşleri Üzerine On İki Ders" Yayın Forumu
Sonraki
CityTVYeni Yarışmanın Tutkulu Deneyimi, Kros Kayağı Noktaları Grand Prix, Shougang Park Kış Olimpiyat Meydanı'na kayıyor
10.000 ABD doları için şimdi 6.000 yuan daha az harcayın! Sessizce RMB'ye ne oldu, bundan faydalandınız mı?
İyileştirme hissini geliştirin ve pazarla tekrar savaşın
Güney Almanya'da Olağanüstü Hal Yerel yetkililer: Önümüzdeki birkaç gün içinde kar yağmaya devam edecek (Fotoğraflar)
Daha kişiselleştirilmiş ve rafine edilmiş Changan Ford'un yeni keskin dünya beyannamesi haritası ortaya çıktı
Haberler Sabah Çayı Luo Yunshe komik diyalog oturumu dün gece başladı: İki iPhone gönderdiniz mi? ; Li Yanhongun konuşması olay mahallinde parçalandı, Baidu yanıt verdi; en hızlı hafıza kartı doğd
Toplam yatırım 820,5 milyar yuan! Zhejiang'da 653 büyük projenin inşaatına başlayın, memleketinizin neler yapacağını görün
Bilinmeyen bir denizaşırı araştırma, 27 yaşındaki Wu Lei kendini kanıtlayabilir mi?
Bellek seçimi "kaybolmaz"; gelin ve DDR4 belleği seçmenin doğru yolunu görün
2019 Uluslararası Kar Federasyonu Çin Pekin Kros Kayağı Grand Prix kitlesel yarışma ve kitle deneyim etkinlikleri başladı
Cep telefonu yongası AI için verilen savaş: Qualcomm ve MediaTek, Huawei'yi geride bıraktı!
SSD ve bellek fiyatları neden yükselmeye devam ediyor? Hemen satın alın veya Double 11'i bekleyin
To Top