Một số khái niệm mà bạn cần phân biệt rõ:
x86: Đây là tên của một bộ tập lệnh chỉ dẫn do Intel và AMD phát triển. Nó được xây dựng dựa trên vi xử lí Intel 8086, một con chip ra mắt năm 1978. Lý do có chữ "x86" đó là vì những model kế nhiệm cho 8086 cũng được đặt tên có đuôi là "86". Trước đây x86 hỗ trợ điện toán 16-bit, giờ đây là 32-bit. Đối thủ cạnh tranh với x86 chính là ARMv7, tập lệnh chỉ dẫn do hãng ARM của Anh phát triển và hiện đang được dùng cực kì nhiều trong các thiết bị di động như smartphone, tablet.
x86-64: còn có tên khác là x64, x86_64 hoặc amd64. Đây là cái tên dùng để chỉ phiên bản 64-bit của tập chỉ dẫn x86 mà mình mới nói tới. Cấu hình x86-64 ban đầu được tạo ra bởi AMD. Lúc mới ra mắt, AMD gọi x86-64 là AMD64, Intel thì gọi bằng cái tên IA-32e và EMT64. Cách gọi tập chỉ dẫn này cũng khác nhau với các hãng phần mềm, Apple thì gọi là x86_64, Sun Microsystem (giờ đã thuộc về Oracle) và Microsoft thì gọi là x64, nhiều bản distro Linux lại dùng chữ AMD64. AMD K8 là vi xử lí đầu tiên trên thế giới sử dụng x86-64. Đối thủ của x86-64 là ARMv8, phiên bản hỗ trợ điện toán 64-bit tiếp nối cho ARM v7.
Nói về hệ điều hành: Windows 95, 98, XP, Vista, 7 chỉ chạy được trên chip x86/x64, Windows 8 có bản cho x86/x64 và ARM. Linux, Android thì có thể chạy cả trên chip x86/64 lẫn chip ARM. iOS hiện chỉ mới có thiết bị dùng CPU ARM.
IA-64: kiến trúc này sử dụng trong dòng vi xử Intel Itanium, chủ yếu xuất hiện trong những máy chủ doanh nghiệp hoặc hệ thống tính toán hiệu năng cao chứ ít dùng trong máy tính cá nhân. IA-64 hoàn toàn khác biệt và cũng không tương thích với các lệnh của tập lệnh x86 hay x86-64.
32-bit và 64-bit: Hai con số này dùng để chỉ độ dài thanh ghi (register) của CPU và là một loại hình điện toán chứ không phải là một tập kiến trúc lệnh như ba thứ mà bạn vừa đọc ở trên. Người ta có thể dùng khái niệm 32-bit và 64-bit để chỉ CPU hoặc phần mềm.
CPU hoạt động như thế nào?
Về cơ bản, CPU dùng để thực hiện những phép tính toán. Những phần mềm mà chúng ta sử dụng hằng ngày thực chất cũng là mỗi chuỗi rất rất nhiều các phép toán chứ không phải khi nào bạn chạy app calculator mới gọi là tính. Chẳng hạn, nếu muốn một cái nút xuất hiện thì hệ điều hành hoặc phần mềm phải dùng dữ liệu để tính và vẽ nó ra, với tọa độ và kích thước như mong muốn. Hoặc khi bạn nhập liệu, máy tính phải "dịch" các bit 010101 để chuyển nó thành kí tự cho chúng ta xem. Tương tự khi chơi game, việc tính toán bước đi, đường đạn,… cũng đều là chuỗi các phép tính.
CPU gồm nhiều bộ phận, nhưng ở đây chúng ta sẽ miêu tả hoạt động của nó qua 2 thành phần chính: ALU (Arithmetic logic unit - bộ xử lý tính toán) và registers (thanh ghi). Register, ALU, và một số linh kiện khác hợp thành một nhân CPU. ALU có thể thực hiện những phép toán thông thường như cộng trừ, nhân, chia; ngoài ra còn có thể chạy những phép logic như so sánh 'hoặc', 'và'. Những CPU đời mới còn có phần xử lí dấu chấm động riêng (FPU) để thực hiện những phép tính rất phức tạp.
Trong khi đó, register thực chất là một loại bộ nhớ được tích hợp thẳng vào CPU và nó có tốc độ hoạt động bằng hoặc gần sát với CPU. Dung lượng của register thường rất nhỏ. Có nhiều loại register lắm, ví dụ như data register (chứa dữ liệu số học, dấu chấm động, kí tự, mảng dữ liệu), address register (chuyên dùng để chứa địa chỉ của dữ liệu nào đó trên bộ nhớ), general purpose register (có thể chứa cả dữ liệu và địa chỉ), vector register (chứa dữ liệu để xứ lí vector), integer register (chuyên chứa số thực), SIMD (dùng để tính toán song song)...
Về con số 32-bit hay 64-bit, những CPU 32-bit sẽ có bộ ALU và register với độ rộng là 32-bit, còn CPU 64-bit thì sẽ có độ rộng của những thành phần này là 64-bit.
Cấu trúc bộ nhớ máy tính
Vậy tại sao đã có RAM là bộ nhớ, lại có thêm register và cache (L1, L2, L3) để làm gì? Register và cache ra đời để khắc phục hiện tượng nghẽn cổ chai khi mà tốc độ CPU quá nhanh, trong khi tốc độ RAM thì không bằng nên gây ra "thời gian chết" vì RAM không kịp đưa dữ liệu cho CPU xử lí. Như đã nói ở trên, register có tốc độ họa động cực nhanh, gần như bằng với CPU, cache thì có tốc độ thấp hơn một chút nhưng vẫn nhanh hơn nhiều so với RAM. Nếu trong register không có dữ liệu CPU cần, nó sẽ tìm trong cache. Nếu có thì xử lí, nếu không thì tiếp tục lấy từ RAM. Tương tự, nếu trong RAM vẫn chưa có dữ liệu mà CPU cần, nó sẽ tìm trong ổ lưu trữ vĩnh viễn, chính là HDD, SSD, thẻ nhớ, chip eMMC,... Càng tìm nhiều thì mất thời gian càng nhiều. Kim tự tháp ở trên chính là cấu trúc bộ nhớ máy tính và CPU sẽ tìm lần lượt từ trên xuống dưới.
Ở trong hình là sơ đồ giản lược của một CPU. Ngoài ALU và register, bạn cần biết một số khái niệm quan trọng khác như:
- Address bus: là chiếc xe buýt để "chở" địa chỉ nơi cất giữ giá trị trên bộ nhớ (RAM hoặc ROM) đến với CPU. Đây thực chất là một tập hợp các dây dẫn. Bus có kích thước, hay còn gọi là độ rộng (width), tương tự như số chỗ ngồi trên xe. Ví dụ, nếu width của bus là 16-bit thì nó có thể chuyên chở 16 bit dữ liệu cùng lúc. Ngoài ra bus còn có tốc độ của riêng mình và được đo bằng đơn vị MHz. Đây chính là con số theo sau RAM mà bạn hay thấy, ví dụ DDR3 1333MHz, 1600MHz.
- Data bus: chiếc xe buýt "chở" dữ liệu thật sự từ bộ nhớ đến CPU hoặc ngược lại. Data bus cũng có kích cỡ và tốc độ như đã nói ở trên.
- Read (RD) và Write (WR) line: CPU sẽ dùng hai dòng này để nói với bộ nhớ rằng nó đang muốn lấy dữ liệu (read) hay đang muốn ghi dữ liệu (write) lên địa chỉ đã định trước.
Để thực hiện phép toán trên thực ra cần rất nhiều bước:
Bước 1: CPU cần biết địa chỉ, nơi cất giữ giá trị của biến a trong bộ nhớ (RAM). CPU sau đó sẽ chuyển địa chỉ đó cho 1 chiếc xe buýt, và chiếc xe buýt đó sẽ chở dữ liệu của biến a đến thanh ghi registerA trên CPU.
Bước 2: Điều tương tự sẽ diễn ra với b, dữ liệu của biến b được ghi vào thanh ghi registerB.
Bước 3: ALU sẽ thực hiện phép cộng và ghi kết quả vào thanh ghi registerC.
Bước 4: CPU lại gọi bus và chuyển kết quả từ registerC đến gán cho biến c. Khi đó giá trị của biến c sẽ được lưu trên RAM và phần mềm yêu cầu thực hiện phép tính sẽ biết được kết quả phép tính là bao nhiêu.
32-bit hay 64-bit đóng vai trò gì trong kiến trúc của CPU?
Như đã nói ở trên, 32-bit và 64-bit chính là độ dài của register, và đồng thời là độ dài của địa chỉ mà CPU sử dụng.
Để đơn giản thì mình ví dụ độ dài của thanh ghi lần lượt là các chữ số thập phân. Để thực hiện phép tính 12+34 trên CPU có thanh ghi độ dài 1, ALU sẽ phải thực hiện 2 phép tính: 1+3 và 2+4, sau đó nối kết quả lại với nhau. Nếu CPU có độ dài là 2 thì nó sẽ có thể thực hiện phép tính 12+34 và cho ra kết quả ngay lập tức, khỏi phải tính từng bước.
Còn về độ dài địa chỉ thì nó giống như độ dài số điện thoại. Nếu số điện thoại của bạn chỉ có 6 chữ số nghĩa là có tối đa 1 triệu số điện thoại khác biệt nhau. Tương tự vậy, mỗi byte dữ liệu trên RAM cần 1 địa chỉ để liên lạc và chứa dữ liệu. Với kiến trúc 32-bit, như đã nói ở trên, ta sẽ có 2^32 = 4294967296 số địa chỉ, tức khoảng 4,29 tỉ địa chỉ, và cũng tương ứng với dung lượng 4GB. Trong trường hợp này, nếu có nhiều hơn 4GB RAM thì phần nhiều hơn đó sẽ không có địa chỉ, và CPU không cách gì "liên lạc" đến chúng được.
Do nhu cầu sử dụng bộ nhớ ngày càng lớn hơn nên người ta mới cần đến kiến trúc 64-bit. Khi đó, chúng ta sẽ có 2^64 địa chỉ có thể xài được, tức khoảng 1.8446744 x 10^19 địa chỉ, tương đương dung lượng 16 exbibyte, lớn hơn rất rất rất nhiều so với kiến trúc 32-bit. Ngày nay bạn có thể bắt gặp những chiếc máy tính RAM 6GB, 8GB, 16GB, 32GB một cách dễ dàng. Chưa kể đến các máy chủ, chúng có đến hàng trăm GB RAM. Tất nhiên là tổng số địa chỉ (dung lượng RAM) mà hệ điều hành 64-bit hỗ trợ thì không đạt đến con số rất lớn như trên, giới hạn phần cứng trên mainboard cũng là yếu tố khác, nhưng nhìn chung thì vẫn vượt xa mức 4GB của các OS 32-bit. Bên dưới là bảng dung lượng RAM tối đa mà Windows 7, Windows 8 và OS X có thể hỗ trợ.
No comments:
Post a Comment