Kısım I · Makine · Bölüm 5

Hafıza

Bir devre nasıl hatırlar (Memory: flip-flops, registers, RAM)

Neden burada · Neye dayanıyor

Neden burada: Önceki bölümde ALU'ya iki sayı verip toplam alabildik. Ama ALU, az önce hangi toplamı verdiğini bilmez. Girdileri değiştirirsen başka bir sonuç üretir. Hukuk uygulamamızın puanı ise her soruda sıfırdan başlamamalı; önceki cevapların sonucunu taşımalı. Bu bölüm hesap devresine eksik olan şeyi ekliyor: zaman boyunca korunabilen bilgi.

Neye dayanıyor: Bölüm 3.4'teki seçici, iki girdiden birini çıkışa geçiriyordu. Yeni değer ile eski değer arasında seçim yaparken onu kullanacağız. Bölüm 4.5'teki kombinasyonel devrenin çıktısı yalnızca o anki girdilere bağlıydı. Şimdi bu sınırın ötesine geçeceğiz. Bit ve byte hesabı gerektiğinde dayanağımız Bölüm 2.3.

  1. Kat 3İşlemci ve bellekHatırlayan parçalar, sonraki bölümde program çalıştıran makineye katılacak.
  2. Kat 2Devreler: hesap ve hafızaALU'nun yanına bilgiyi zaman boyunca tutan devreyi koyuyoruz.
  3. Kat 1Transistör ve mantık kapılarıBelleğin de fiziksel yapı taşları. Bölüm 3.
  4. Kat 0Elektrik ve bitHatırlanan şey yine 0 ve 1 desenleri. Bölüm 2.

Bölüm sonunda bir devrenin geçmişe nasıl bağlanabildiğini, saat sinyalinin ne işe yaradığını, tek bitten yazmaca ve yazmaçlardan RAM'e nasıl çıkıldığını anlatabileceksin. Sonra ilk bölümdeki puan kutusuna yeniden bakacağız: programcının verdiği ad ile makinenin tuttuğu bitlerin aynı anlatım katmanında olmadığını göreceğiz. Burada bir bellek çipi tasarlamayı değil, belleğin verdiği sözü anlamayı hedefliyoruz.

5.1 Ardışık devre ve geri besleme

Bir devreye aynı girdileri iki kez verdiğini düşün. ALU'nun kontrol bitleri de aynıysa, yerleşmiş çıkış değeri iki seferde de aynıdır. Çünkü bu devre için “geçen sefer” diye bir bilgi yoktur. Ardışık devre (sequential logic) ise o anki girdilerle birlikte daha önce saklanmış bilgiyi de kullanır. Aynı yeni girdi, farklı geçmişler üzerine gelince farklı sonuç doğurabilir. Bellek kurabilmemizin temel farkı budur.1

Basit örnek: “doğru cevap verildi” girdisi gelsin. Başlangıç puanın 20 ise yeni puan 30; başlangıç puanın 70 ise yeni puan 80 olsun. Girdi aynı, çıktı farklıdır; çünkü devrenin kullanacağı eski değer farklıdır. Burada puan kuralı, öğretim amacıyla seçtiğimiz bir kuraldır. Gerçek prototipindeki puan hesabını görmedik. Sayıların nasıl toplandığını Bölüm 4 açıklıyordu; eski sayının bir sonraki hesaba nasıl taşındığını bu bölüm açıklıyor.

Geçmişin devreye geri dönmesi

Geri besleme (feedback), bir devrenin çıktısının yeniden kendi giriş tarafındaki bir yola katılmasıdır. Bir önceki adımda tuttuğun bilgi, sonraki adımın girdilerinden biri olur. Nand2Tetris'in bellek tasarımında bu yol, zamanı ayıran bir saklama elemanından geçirilir. Böylece “şimdiki çıkış kendisini aynı anda belirlesin” demeyiz; “sonraki değer, şimdiki değerden hesaplanabilsin” deriz.1

şimdiki saklanan değer ─────┐
                            ▼
yeni girdi ─────────► [karar / hesap] ──► sonraki saklanan değer
                                              │
                         sonraki adımda ◄─────┘

Çizimde bir sihirli “hatırlama oku” yok. Hatırlanan bilginin fiziksel karşılığı, iki ayırt edilebilir durumdan birini koruyabilen devredir. Nand2Tetris bunu en altta hazır kabul ettiği flip-flop ile modeller; SRAM (Static Random Access Memory) denen bellek teknolojisinde de bit, güç varken iki kararlı durumdan birinde kalan hücreyle tutulur. Ancak her saklama teknolojisi aynı fiziksel yöntemle çalışmaz. Özellikle ana bellekte yaygın DRAM (Dynamic Random Access Memory)'i sıradan flip-flopların dev bir kopyası sanmayacağız. İkisi de RAM teknolojisidir; yenileme ve güç ayrımını 5.4'te tamamlayacağız.14

Burada bir sınır önemli: bir mantık kapısının çıkışını rastgele kendi girdisine bağlamak, kullanışlı bellek kurduğunu göstermez. Bağlantı, kararsız veya istenmeyen davranış üretebilir. Geri besleme yolunun ve zamanlamanın tasarlanmış olması gerekir. Kitabın yaklaşımı bu ayrıntıyı küçük bir arayüzün arkasına koymaktır: bir bit alabilen, uygun anda saklayabilen ve sakladığını dışarı verebilen parça.1

Bir kavramı yerine koy: hesap başka, hatırlama başka

“20 ile 10'u topla” bir hesap görevidir. “Çıkan 30'u bir sonraki soruya kadar tut” bir saklama görevidir. Aynı program satırında yan yana görünmeleri onları aynı devre işi yapmaz. ALU yeni değeri üretir; hatırlayan devre onu kabul eder. Böylece Bölüm 1'in işlem ve saklama ayrımı, Kat 2'de iki somut parçaya dönüşür.

5.2 Mandal, flip-flop ve saat sinyali

Bir bitlik bellek için iki soruya cevap vermelisin: “hangi değeri tutacağım?” ve “yeni değeri ne zaman kabul edeceğim?” İkinci soruyu atlamak kolaydır. Oysa kapılardan geçen elektrik sinyalleri aynı anda yerleşmez; ALU girdileri değiştikten hemen sonra çıkışın doğru son değere ulaşması zaman alır. Hesap yerleşmeden sonucu saklamak istemeyiz. Zamanlama, doğru hesabı doğru anda teslim alma meselesidir.1

Mandal: açıkken izle, kapalıyken tut

Mandal (latch), burada ele alacağımız D tipi örneğinde, bir etkinleştirme sinyalinin düzeyine göre veri girişini izleyen veya önceki değerini tutan saklama elemanıdır. Etkinleştirme açıkken giriş değişirse çıkış onu izler; etkinleştirme kapanınca son kabul edilen değer korunur. Texas Instruments'ın SN74HC373A açıklaması bunu doğrudan belirtir: LE yüksekken Q çıkışları D girişlerini izler; LE düşük olduğunda eldeki değer tutulur.2

Benzetme olarak, bir not defterinin üstünde açık bir kopyalama penceresi düşün. Pencere açıkken önündeki sayfayı güncelliyorsun; kapandığında son kopya duruyor. Mandalın açık olduğu aralığın bütünü önemlidir. “Bir anda fotoğraf çekti” benzetmesi bu yüzden mandal için tam isabetli değildir; onu bir sonraki parça için kullanacağız.

Flip-flop: seçilen geçişte örnek al

Flip-flop (flip-flop) için burada kenar tetiklemeli D tipi modelini kullanacağız. Veri girişindeki biti, saat sinyalinin belirli bir geçişinde kabul eder; arada giriş değişse de saklanan çıkış hemen değişmez. Örneğin TI'ın SN74HC74 parçası pozitif kenarda, yani saat düşükten yükseğe geçerken tetiklenen D tipi flip-floplar içerir. Mandalın düzeye duyarlılığı ile bu modelin kenara duyarlılığı aynı değildir.3

Nand2Tetris'in DFF arayüzü bu davranışı öğretim için zaman adımlarıyla sadeleştirir: yeni zaman adımındaki çıkış, önceki adımda sunulan giriştir. Bunu out(t+1) = in(t) diye okuyabilirsin. Parantezdeki t, belirli bir adımın adı; t+1, bir sonraki adım. Bu ifade “her gerçek çipte veri tam bir saniye bekler” demez. Adımın fiziksel süresini saat belirler.1

ParçaYeni değeri ne zaman izler?Neyi ayırmamızı sağlar?
D tipi mandalEtkinleştirme açık kaldığı aralıktaİzleme aralığı ile tutma aralığını
Kenar tetiklemeli D flip-flopSeçilen saat geçişindeBir hesap adımı ile sonraki hesap adımını

Bütün flip-flop çeşitlerinin aynı ayrıntılara sahip olduğunu varsayma. Bazılarının sıfırlama gibi ek girişleri bulunur; gerçek parçaların zamanlama koşulları vardır. Buradaki iki örneğin amacı bir elektronik katalog ezberletmek değil, “girişini her an izlemek” ile “belirli anda kabul etmek” farkını kurmaktır.23

Saat: işlemciye takılmış duvar saati değil

Saat sinyali (clock), düşük ve yüksek düzeyler arasında düzenli geçiş yapan, devrenin zamanlamasını eşgüdümleyen sinyaldir. Tam tekrarına saat çevrimi (clock cycle) deriz. Burada “saat”, günün kaç olduğunu söylemez; “şimdi bir sonraki saklanan değerlere geçiyoruz” düzenini sağlar. Nand2Tetris'te bütün bu adımlar ortak bir saat modeliyle ilerler.1

saat:  düşük ── yükselir ── yüksek ── düşer ── düşük ── yükselir
                    ▲                                      ▲
          bu örnekte kabul anı                   sonraki kabul anı

Bu düzen sayesinde bir çevrim içinde ALU hesap yaparken, sonraki kabul anına kadar sonucun yerleşmesine zaman bırakılır. Bir toplantıdaki herkesin bir sonraki gündem maddesine ortak işaretle geçmesine benzer; ama “yönetici bir insan düşünüp karar veriyor” gibi anlamamalısın. Sinyal ve devre bağlantıları, geçişi fiziksel olarak gerçekleştirir.1

Saat hızı (clock speed), saniyedeki çevrim sayısıdır. Hertz birimi saniyede bir çevrim; gigahertz, yani GHz, saniyede bir milyar çevrim demektir. Öğretim örneği olarak 2 GHz seçersek saniyede 2.000.000.000 çevrim ve çevrim başına 0,5 nanosaniye elde ederiz. Nanosaniye, saniyenin milyarda biridir. Bu, belirli bir bilgisayarın ölçümü değil; birimlerin Python ile doğrulanmış dönüşümüdür.5

GHz, saniyedeki program satırı sayısı değildir

Bir çevrim, bir JavaScript satırına eşit değildir. Hatta gerçek işlemcilerde bir makine komutu ile bir çevrim arasında da genel bir bire bir ilişki yoktur: adımlar örtüşebilir, işlemci veri bekleyebilir. Dolayısıyla “2 GHz, saniyede iki milyar soru cevabı değerlendirir” sonucu çıkmaz. Saat, zamanlama bilgisidir; programın bitiş süresi için tek başına yeterli bilgi değildir. İşlemcinin adımlarını Bölüm 6.2'de birbirine bağlayacağız.5

5.3 Yazmaç: birkaç byte'lık, en hızlı hafıza

Tek bir DFF, her adımda girişindeki biti kabul ediyorsa bir sorunumuz kaldı: yeni değer yazmak istemediğimiz adımlarda ne olacak? Sürekli yeni dış girdiyi kabul ederse aynı bilgiyi koruyamayız. Çözüm, Bölüm 3'te tanıdığın seçicidir: DFF'nin önüne seçici koy; bir girişine dışarıdan gelen yeni biti, öbürüne DFF'nin sakladığı eski biti bağla. Seçiciyi bir load kontrol bitiyle yönet.1

eski çıkış ───► [ seçici ] ───► [ DFF ] ───► saklanan çıkış
                   ▲                            │
yeni bit ──────────┤                            │
load ──────────────┘       eski değer yolu ◄─────┘

“Yazma kapalı” demek, bu modelde saat ortadan kalktı demek değildir. Saklanan değeri değiştirecek yeni bir bilgi seçilmedi demektir. İstersen aynı işi kısa bir davranış kuralıyla söyle: sonraki = load ? yeni : eski. Buradaki soru işareti JavaScript'teki koşullu seçimin yazımıdır; devrenin kendisi JavaScript çalıştırmıyor, yalnızca bu seçimin fiziksel karşılığını yapıyor.1

Birden fazla böyle bitlik hücreyi yan yana koyunca yazmaç (register) elde ederiz: bir değerin bitlerini tutan küçük saklama birimi. Ortak load sinyali, bütün bitlerin aynı güncellemede yeni değeri almasını sağlar. Nand2Tetris'in Register parçası 16 bit genişliğindedir; bu, 16 ÷ 8 = 2 byte eder. 64 bit genişliğindeki bir yazmaç ise 8 byte tutar. Genişlik, yazmacın kaç ayrı değeri aynı anda tuttuğu değil, tek bit deseninin kaç bit olduğudur.1

Şimdiki değerYeni girişloadSonraki saklanan değer
2030020
2030130
3080030
3080180

Tablo bir donanım ölçümü değil, yukarıdaki arayüz kuralının örneğidir. İlk satırda girişte 30 bulunmasına rağmen çıkışta 20 kalması, belleğin neden yalnızca bir tel olmadığını gösterir. Üçüncü satırda da 80 kapıda bekler ama yazma izni verilmediği için eski bilgi korunur. “Yazma” ile “girişe bir değer koyma” aynı eylem değildir.

İşlemcinin içindeki yazmaçlar ALU'nun yakınındaki çalışma alanıdır. İki değeri hesap birimine vermek veya ara sonucu tutmak için kullanılır; böylece her ara adımda uzak ana belleğe gidip gelmek gerekmez. Başlıktaki “en hızlı hafıza”yı bu anlamda oku: işlemcinin doğrudan kullandığı küçük ve yakın saklama alanı. Her yazmaç erişimi her makinede sıfır zaman alır gibi bir fizik yasası iddia etmiyoruz. Yazmaç, önbellek ve RAM arasındaki hız–kapasite ilişkisini Bölüm 8'de açacağız.54

Terimde bir kapsam ayrımı var. Nand2Tetris, RAM'i de çok sayıda yazmaçtan kurduğu için her adreslenebilir küçük kutuya “register” diyebilir. İşlemci konuşurken ise “yazmaç” ile genellikle CPU'nun içindeki özel küçük kümeyi kastediyoruz. RAM'deki her yerin CPU'nun hızlı yazmaçlarından biri olduğunu düşünme. Aynı arayüz fikri, farklı ölçekte ve farklı fiziksel gerçeklemeyle kullanılabilir.16

5.4 RAM: adres, hücre, okuma ve yazma

Bir avuç yazmaçla bir toplamanın ara sonucunu tutabilirsin. Ama uygulamadaki bütün sorular, kullanıcı bilgileri ve çalışan programın diğer verileri için daha büyük alan gerekir. RAM (Random Access Memory), burada kullandığımız anlamıyla, bir konumu adresle seçip içeriğini okuyabildiğin veya değiştirebildiğin bellektir. “Random access”, bilgisayarın rastgele sayı çekmesi demek değildir; konumlara sıralarını izlemek zorunda olmadan doğrudan erişebilmek demektir.1

Adres (address), hangi konumun seçileceğini belirleyen sayıdır. Bellek hücresi (memory cell) en küçük saklama elemanı için, çoğu fiziksel açıklamada bir bit için kullanılır. Adresle seçilen birim ise bir bit, bir byte veya birkaç byte'lık sözcük olabilir; bağlama bakmalısın. Bizim küçük Hack örneğimizde her RAM adresi 16 bitlik bir sözcük seçer. Modern programcıya sunulan byte adresli bellek modelinde ise ardışık adresler ardışık byte konumlarını gösterir.14

Adres, değer değildir

AdresO adreste saklanan değerÖrnekte verdiğimiz anlam
020Puan
17Seri
23Kalan can
30Henüz kullanılmayan konum

“1 adresini oku” deyince gelen değer 7'dir; 1 değil. “1 adresine 8 yaz” deyince adresin adı değişmez, içindeki değer değişir. Bir dolap numarasıyla dolaptaki dosya numarasını ayırmak gibi. Tabloyu gerçek prototipinin bellek yerleşimi sanma; yalnızca adres–içerik ayrımını göstermek için seçtik. Program değişkenlerinin gerçek yerleşimini ileride dil araçları ve işletim sistemi belirleyecek.

Nand2Tetris'in RAM8 parçasını düşün: sekiz tane 16 bitlik yazmaç ve bunlardan birini seçen mantık. Sekiz yer için üç adres biti yeterlidir: 000 ilk yeri, 001 ikinciyi, 111 son yeri seçer. Toplam içerik 8 × 16 = 128 bit = 16 byte'tır. Bu hesabın dışında adres ve kontrol telleri bulunur; bu teller saklanan verinin kapasitesine dahil değildir.1

Okuma ve yazma, arayüzün iki ayrı işi

Okuma (read), seçilen konumun içeriğini çıkıştan almaktır. Hack RAM modelinde adresi girişe koyarsın, seçim mantığı ilgili yazmacın değerini çıkışa taşır. Yazma (write) ise yeni değeri o konuma kabul ettirmektir: adresi, yeni veriyi ve load = 1 bilgisini verirsin; güncelleme sonraki zaman adımında saklanır. Öbür yazmaçlar değişmez.1

adres = 1, load = 0              → çıkış: eski seri değeri 7
adres = 1, giriş = 8, load = 1   → sonraki adımda RAM[1] = 8
adres = 0, load = 0              → çıkış: puan değeri 20

İlk satır yalnızca okur. İkinci satır seri için seçtiğimiz konumu günceller. Üçüncü satır puanın aynı kaldığını gösterir. Köşeli parantez RAM[1], “RAM'in 1 adresindeki içerik” demenin kısa yoludur. Fiziksel devrede parantez yoktur; adres bitleri ve seçim bağlantıları vardır.

Bu öğretim RAM'inde okuma kombinasyonel, yazma saatlidir. Bundan “satın alınan her RAM aynı zamanlama uçlarına sahiptir” sonucu çıkmaz. Gerçek ana bellek; denetleyiciler, aktarım kuralları ve kendi zamanlama koşullarıyla çalışır. Nand2Tetris'in açık uyarısı da budur: modern bellekler, burada çizilen flip-flop dizilerinden farklı, teknolojiye göre çok dikkatli iyileştirilmiş fiziksel tasarımlar kullanabilir.1

Büyük bellek: aynı arayüzü büyütmek

Sekiz küçük RAM'i bir araya koyup bir üst seçme katmanı eklersen daha büyük RAM kurarsın. Nand2Tetris'in RAM64 örneğinde altı adres biti vardır: üst üç bit sekiz RAM8'den birini, alt üç bit seçilen RAM8 içindeki sekiz konumdan birini seçer. Mesela 010101 adresini 010 | 101 diye ayırınca 2 numaralı alt birimin 5 numaralı konumunu seçersin; toplam adres 2 × 8 + 5 = 21'dir. Burada iki numaralandırma da sıfırdan başlar.1

Üst katın bildiği şey değişmez: “bir adres ver, bir değer al; yazma açıkken yeni değeri bırak.” İçeride sekiz mi, altmış dört mü, daha fazla birim mi olduğu arayüzün arkasında kalır. Bölüm 1'in soyutlama fikri tam burada yeniden işe yarar. Belleği kullanan işlemci, her bitin hangi transistörlerle tutulduğunu bilmek zorunda değildir.

Elektrik kesilirse?

Uçucu bellek (volatile memory), besleme gücü kesilince tuttuğu bilgiyi koruyamayan bellektir. Ana bellekte kullanılan DRAM de, önbellekte kullanılan SRAM de uçucudur. DRAM ayrıca güç varken bile hücrelerdeki bilgiyi korumak için düzenli yenileme ister. SRAM'in “statik” adı, elektrik olmadan saklar demek değildir; DRAM'deki gibi periyodik yenileme gerektirmemesiyle ilgilidir.4

Bu yüzden RAM'e yazılmış bir puan ile kalıcı olarak kaydedilmiş bir puan aynı şey değildir. RAM, çalışan programın çalışma alanıdır. Elektrik kesilmesinden sonra da yaşaması gereken bilgi için SSD gibi kalıcı depolama gerekir; o ayrımı Bölüm 8.3'te açacağız. Bir uygulama kapanınca verinin kaybolması ise elektrik kesilmese de mümkündür: programın elindeki değer başka yere kaydedilmemiş olabilir. Donanımın uçuculuğu ile programın bir değeri saklama kararı ayrı sorulardır.

5.5 Durum: puan ve seri değişkeninin fiziksel karşılığı

Durum (state), bir sistemin sonraki davranışını etkileyen, o anda saklı bilgileridir. “Bu kullanıcı şimdi hangi soruda?”, “kaç canı kaldı?”, “puanı kaç?” sorularının cevapları, küçük bir öğrenme oturumunun durumunu tarif edebilir. Devre katında bu, yazmaçlarda ve bellek konumlarında korunan bit desenleridir. Program katında ise aynı bilgilere değişken adları ve daha büyük veri düzenleriyle bakarız.16

Bir durum geçişini, “eski durum + yeni girdi → yeni durum” diye yazabilirsin. Örneğin seçtiğimiz öğretim kuralında eski puan 20 ve yeni girdi doğru cevapsa, yeni puan 30 olur. Yanlış cevapsa puan aynı kalabilir, can azalabilir. Devre için bunların hiçbiri “başarı” ya da “öğrenme” değildir. Yalnızca bitler okunur, hesaplanır ve seçilen yerlere yazılır. Anlamı, programın kuralı verir; Bölüm 2.8'in bağlam fikri burada da geçerlidir.

Uygulamamızda

Prototipinin kodunu görmediğimiz için aşağıdaki satır, gerçek dosyandan alıntı değil; puan artışının öğretim örneğidir:

puan = puan + 10;

Satırın sağ tarafı, eldeki puan değerinden yeni değeri üretir. Sol tarafı, yeni değerin bundan sonraki adımlarda puan adıyla kullanılmasını ister. Bunu makine düzeyinde “oku → hesapla → sakla” akışı olarak düşünebilirsin. Her JavaScript değişkeninin daima tek, sabit bir fiziksel RAM hücresine bağlı olduğunu düşünme: dil araçları değerleri yazmaçlarda tutabilir veya temsili değiştirebilir. Bizim burada kurduğumuz temel, bilginin fiziksel olarak bir yerde temsil edilmesi ve durumun güncellenmesidir.56

Seri için tek bir sayıyı artırmak yetmez; hangi günlerin sayıldığına karar veren bir program kuralı gerekir. Bellek, “bugün dünün ertesi mi?” sorusunun anlamını bilmez. Ona verilen sonucu tutar. Şimdiki vanilla HTML/CSS/JS prototipinden planlanan Expo + TypeScript ön yüze ve Go arka uca geçilse de bu ayrım kalır: kuralı yazılım belirler, çalışan yazılımın durumu donanımdaki bitlerle temsil edilir. Kullanıcılar arasında kalıcı ve ortak kayıt için planlanan Postgres'i Bölüm 38'de ele alacağız.

Bir hata mesajını anlamak için bu ayrımı kullan. Puan yanlış artıyorsa ilk şüphe “RAM toplayamıyor” değildir; RAM zaten toplamakla görevli değil. Kural yanlış olabilir, yanlış değer okunmuş olabilir, yeni değer beklenen yere yazılmamış olabilir. “Hangi bilgi okunuyor, hangi hesap yapılıyor, sonuç nerede tutuluyor?” diye üçe ayırmak, alt ve üst katı birbirine karıştırmanı önler.

Bölüm 3–4 ile bağlantı

Bölüm 3'ün seçicisi yeni ve eski değeri ayırdı. Bölüm 4'ün ALU'su eski durumdan yeni değeri üretti. Bu bölümün hatırlayan devresi o değeri sonraki adıma taşıdı. Artık elinde hesap yapan ve hesap sonucunu koruyan parçalar var. Eksik olan, hangi parçanın hangi anda ne yapacağını programdaki komutlara göre yöneten düzen: işlemci.

Bu bölümde neler kuruldu

Kombinasyonel devre yalnızca şimdiki girdiye bakar; ardışık devre saklanan geçmişi de kullanır. Geri besleme, önceki değeri sonraki adıma taşıyan yoldur. Mandal etkin olduğu düzey boyunca girişini izleyebilir; ele aldığımız D flip-flop ise seçilen saat geçişinde değer kabul eder. Saat sinyali adımları eşgüdümler; GHz bir çevrim sıklığıdır, program satırı sayacı değildir. Bitlik saklama elemanlarıyla yazmaç, seçim mantığı ve adreslerle RAM kurulur. Okuma değeri alır, yazma seçilen değeri değiştirir. Uçucu bellek kalıcı kayıt değildir. Yazılımın “durumu”, bu saklama imkânının üst kattaki anlamlı düzenidir.

Terimler sözlükte, Bölüm 5 başlığı altında.

Birincil okuma

Nisan ve Schocken, The Elements of Computing Systems, Chapter 3: Sequential Logic; özellikle 3.1 Background içindeki “The Clock”, “Flip-Flops”, “Registers”, “Memories” ve 3.2.2 Registers. Derinleşmek için Project 3: Memory'deki parça sırasına ve CS:APP, Chapter 6 önizlemesinin “6.1.1 Random-Access Memory” başlığına bak.

Takıldığın yeri yapay zekâ öğretmenine sor. Ondan eski değer, giriş ve load sütunları olan altı adımlık bir tablo hazırlamasını iste. Sonraki değeri önce sen doldur; sonra “hangi adımda niçin değişmedi?” sorusunu tartışın. Özellikle yazma kapalıyken girişin değiştiği bir satır olsun.

Bölüm sonu soruları

Önce belleğinden cevapla; sonra gerekçeyi oku.

1. Ardışık devreyi kombinasyonel devreden ayıran temel özellik nedir?
Ardışık devrenin sonucu, elde tutulan eski durumdan da etkilenir; kombinasyonel devre geçmişi saklamaz. Bkz. 5.1.
2. Bu bölümde ele alınan D tipi mandal hangi davranışı gösterir?
Mandal, etkinleştirme açık olduğu aralıkta girişini izler. Yalnız seçilen kenarda örnek alma ise burada anlatılan flip-flop modelidir. Bkz. 5.2.
3. Bir işlemcinin saat hızının 2 GHz olması ne söyler?
GHz çevrim sıklığıdır. Çevrim, program satırı veya kullanıcı işlemi ile bire bir eşleşmez. Bkz. 5.2.
4. Yazmaçta eski değer 20, giriş 30, load ise 0. Sonraki değer nedir?
load kapalıyken seçici eski değeri geri verir; yeni giriş kendiliğinden yazılmaz. Bkz. 5.3.
5. RAM için “random access” ifadesinin anlamı hangisidir?
Rastgele erişim, öncekileri sırayla geçmeden seçilen konuma erişebilmek demektir; veri rastgele üretilmez. Bkz. 5.4.
6. RAM[1] içinde 7 duruyor. “1 adresini oku” denince hangisi alınır?
Adres bir yeri seçer; okuma, seçilen yerin değerini verir. Adres ile içerik aynı şey değildir. Bkz. 5.4.
7. SRAM'in “statik” olması neden kalıcı depolama olduğu anlamına gelmez?
Statik, DRAM'deki gibi periyodik yenileme gerektirmemesiyle ilgilidir; SRAM de güç kesilince bilgiyi kaybeder. Bkz. 5.4.
8. Öğrenme oturumunun “durumu” hangisiyle en iyi anlatılır?
Puan, can ve soru konumu sonraki davranışı etkileyebilir; durum bu tür saklı bilgilerdir, yalnızca program metni değildir. Bkz. 5.5.
9. Sekiz adet 16 bitlik yazmaçtan oluşan RAM'in veri kapasitesini byte cinsinden hesapla. Kaç adres biti gerekir? Adres bitlerini neden veri kapasitesine eklemiyorsun?
Örnek cevap

8 × 16 = 128 bit, 128 ÷ 8 = 16 byte. Sekiz konum için 2³ = 8 olduğundan üç adres biti gerekir. Adres, hangi konumun kullanılacağını seçen girdidir; saklanan 128 veri bitinden ayrı bir görevi vardır. Bkz. 5.4.

10. “puan = puan + 10” örneğinde ALU, yazmaç veya RAM ve saat hangi işi yapar? Bu satırın kalıcı kayıt sözü vermediğini de açıkla.
Örnek cevap

Eski değer saklama alanından alınır; ALU toplamı üretir; yeni değer yazma izniyle saklama alanına kabul edilir. Saatli modelde saat, kabul anını eşgüdümler. RAM'de tutmak, SSD'ye veya kalıcı veritabanına kaydetmek değildir. Gerçek dil araçları bir değişkeni her zaman aynı fiziksel hücrede tutmak zorunda değildir. Bkz. 5.3, 5.4 ve 5.5.

Kaynaklar

  1. Nisan ve Schocken, The Elements of Computing Systems, Chapter 3: Sequential Logic, 3.1–3.4; ayrıca Project 3: Memory. Zaman modeli, DFF, seçiciyle tutma/yükleme, yazmaçlar, RAM adresleme ve öğretim modeliyle fiziksel bellek arasındaki sınır.
  2. Texas Instruments, SN74HC373A: Octal Transparent D-Type Latches, açıklama: LE yüksekken girişin izlenmesi, düşükken son değerin tutulması.
  3. Texas Instruments, SN74HC74: Dual D-Type Positive-Edge-Triggered Flip-Flops, parça açıklaması: pozitif kenarda tetiklenen D tipi eleman.
  4. Bryant ve O'Hallaron, Computer Systems: A Programmer's Perspective, Chapter 6 önizlemesi, giriş ve 6.1.1 “Random-Access Memory”, “Static RAM”, “Dynamic RAM”, “Nonvolatile Memory”: byte dizisi modeli, SRAM/DRAM, yenileme ve uçuculuk.
  5. Ian Wienand, Computer Science from the Bottom Up, Chapter 3: Computer Architecture; “Clock Speed”, komut adımları, yazmaçlar ve örtüşen yürütme anlatımı. 2 GHz dönüşümü, yazmaç kapasiteleri ve örnek adres hesapları bu bölüm için Python ile hesaplanmıştır.
  6. Nisan ve Schocken, The Elements of Computing Systems, Chapter 5: Computer Architecture, 5.1.3 “Memory” ve 5.1.5 “Registers”: yazılım verilerinin bitlerle temsili ve CPU içi yazmaçların rolü. Uygulama örnekleri açıklama amacıyla yazar tarafından kurulmuştur; gerçek prototipin bellek yerleşimine ilişkin iddia değildir.