Quay lại
30/04/2026 30 phút

Chương 25: Thiết bị ngoại vi

Bộ xử lý trung tâm (CPU) chắc chắn là thành phần quan trọng nhất của máy tính, nhưng nó phải được bổ trợ bởi các phần cứng khác. Như bạn đã thấy, một chiếc máy tính cũng cần có bộ nhớ truy cập ngẫu nhiên (RAM) chứa cả các lệnh mã máy để bộ vi xử lý thực thi và dữ liệu để các lệnh này truy cập. Như bạn cũng nhớ, RAM là loại dễ bay hơi—nó sẽ đánh mất nội dung khi bị cắt điện. Vì vậy, một thành phần hữu ích khác của máy tính là thiết bị lưu trữ dung lượng lớn dài hạn, có thể giữ lại mã và dữ liệu ngay cả khi không có điện.

Máy tính cũng cần một cách để đưa các lệnh đó vào RAM, và một cách để kiểm tra kết quả của chương trình. Các máy tính hiện đại còn có thêm micro, camera và loa, cũng như bộ phát và thu vô tuyến để kết nối Wi-Fi, các thiết bị Bluetooth, và các vệ tinh tạo nên Hệ thống Định vị Toàn cầu (GPS).

Chúng được gọi là các thiết bị đầu vào (input) và đầu ra (output), thường được gọi tắt là I/O, hay dùng một từ mang tính bao quát hơn là thiết bị ngoại vi (peripherals).

Thiết bị ngoại vi dễ thấy nhất có lẽ là màn hình hiển thị video vì bạn thường dán mắt vào nó, bất kể bạn dùng máy tính để bàn, laptop, máy tính bảng hay điện thoại di động. Có khi bạn đang nhìn màn hình để đọc cuốn sách này cũng nên!

Mọi màn hình hiển thị phổ biến hiện nay đều tạo ra hình ảnh từ các hàng và cột pixel (điểm ảnh), tức là những chấm màu nhỏ xíu mà bạn có thể thấy nếu nhìn bằng kính lúp. Tổng số lượng hàng và cột pixel thường được gọi là độ phân giải màn hình (display resolution).

Ví dụ, độ phân giải chuẩn của truyền hình độ nét cao (HDTV) là 1920 × 1080, nghĩa là 1.920 pixel chiều ngang và 1.080 pixel chiều dọc, tổng cộng khoảng 2 triệu pixel, và mỗi pixel đều có thể mang màu sắc khác nhau. Độ phân giải này gần như đã trở thành tối thiểu cho các màn hình máy tính.

Các pixel không phát sáng cùng lúc. Nội dung hiển thị được lưu trong một khối bộ nhớ đặc biệt, và các pixel riêng lẻ trên màn hình được làm mới tuần tự, bắt đầu từ trái sang phải ở hàng trên cùng, rồi tiếp tục đi xuống các hàng dưới. Để tránh hiện tượng nhấp nháy, quá trình này diễn ra cực nhanh, và toàn bộ màn hình thường được làm mới ít nhất 60 lần mỗi giây. Mạch điện điều khiển quá trình này được gọi là video display adapter.

Cần bao nhiêu bộ nhớ để lưu trữ nội dung của một màn hình 1920 × 1080?

Mỗi một trong số 2 triệu pixel là một màu cụ thể, được tạo thành từ sự kết hợp của ba màu cơ bản: đỏ (red), xanh lá (green) và xanh dương (blue), hay còn gọi là màu RGB. (Nếu là dân mỹ thuật, bạn có thể quen với một bộ màu cơ bản khác, nhưng đây là ba màu dùng trong màn hình video.) Thay đổi cường độ của từng thành phần này sẽ tạo ra tất cả các màu sắc trên màn hình. Cường độ thường được điều khiển bởi 1 byte cho mỗi màu cơ bản, được đặt từ 00h (không có màu) đến FFh (cường độ tối đa). Cơ chế này cho phép màn hình video có khả năng hiển thị 256 mức độ đỏ, 256 mức độ xanh lá và 256 mức độ xanh dương, cho ra tổng cộng 256 × 256 × 256, hay 16.777.216 màu sắc khác nhau. (Với triết lý "mọi thứ về máy tính đều có thể cải tiến", một số công ty đang hướng tới tăng dải màu và độ phân giải, đòi hỏi nhiều hơn 8 bit cho mỗi màu cơ bản.)

Nếu bạn từng làm việc với HTML để thiết kế web, có thể bạn đã biết màu sắc được chỉ định bằng các giá trị thập lục phân gồm sáu chữ số bắt đầu bằng dấu thăng (#). Dưới đây là 16 màu chuẩn do đặc tả HTML 4.01 thiết lập từ năm 1999:

Màu sắc | Thập lục phân | Màu sắc | Thập lục phân
--------+---------------+---------+--------------
Black   | #000000       | Green   | #008000
--------+---------------+---------+--------------
Silver  | #C0C0C0       | Lime    | #00FF00
--------+---------------+---------+--------------
Gray    | #808080       | Olive   | #808000
--------+---------------+---------+--------------
White   | #FFFFFF       | Yellow  | #FFFF00
--------+---------------+---------+--------------
Maroon  | #800000       | Navy    | #000080
--------+---------------+---------+--------------
Red     | #FF0000       | Blue    | #0000FF
--------+---------------+---------+--------------
Purple  | #800080       | Teal    | #008080
--------+---------------+---------+--------------
Fuchsia | #FF00FF       | Aqua    | #00FFFF

Các màu khác nhau được định nghĩa bằng các giá trị khác nhau. Sau dấu thăng là ba cặp chữ số thập lục phân: Cặp đầu tiên là mức độ đỏ (từ 00h đến FFh), cặp thứ hai là mức độ xanh lá, và cặp thứ ba là xanh dương. Màu đen (Black) xuất hiện khi cả ba thành phần đều là 00h, còn màu trắng (White) là khi cả ba đều là FFh. Các sắc độ xám xuất hiện khi cả ba thành phần có giá trị bằng nhau.

Với màn hình 1920 × 1080, mỗi một trong số 2 triệu pixel cần 3 byte cho ba thành phần đỏ, xanh lá, xanh dương, tổng cộng là 6 triệu byte, tức 6 megabyte.

Trong các chương trước, tôi đã coi RAM mà CPU truy cập như một khối bộ nhớ nguyên khối liền mạch. Trên thực tế, bộ nhớ chứa mã lệnh và dữ liệu thường được chia sẻ chung với bộ nhớ dành cho màn hình hiển thị. Cấu hình này cho phép máy tính cập nhật màn hình video cực kỳ nhanh chóng chỉ bằng cách ghi các byte vào RAM, từ đó tạo ra hoạt ảnh đồ họa tốc độ cao.

CPU 8-bit mà tôi làm trong mấy chương trước có một địa chỉ bộ nhớ 16-bit đủ sức địa chỉ hoá 64 kilobyte bộ nhớ. Rõ ràng bạn không thể nhét vừa 6 megabyte bộ nhớ video vào 64 kilobyte bộ nhớ! (Thực ra bạn có thể dùng tạm cơ chế hoán đổi [swap] nhiều khối bộ nhớ ra vào không gian bộ nhớ của CPU, nhưng làm thế sẽ chậm.)

Đây chính là lý do màn hình độ phân giải cao chỉ trở nên khả thi khi bộ nhớ rẻ hơn và khi CPU mạnh hơn có thể truy cập bộ nhớ này linh hoạt hơn. Một CPU 32-bit có thể truy cập bộ nhớ bằng các khối dữ liệu 32-bit, và vì lý do đó, bộ nhớ hiển thị video thường được sắp xếp với 4 byte cho mỗi pixel thay vì chỉ 3 byte cho đỏ, xanh lá, và xanh dương. Điều này có nghĩa là bộ nhớ video cho một màn hình 1920 × 1080 sẽ cần 8 megabyte bộ nhớ thay vì 6 megabyte.

Bộ nhớ video này thường được sắp xếp theo đúng thứ tự mà màn hình được làm mới. Hàng đầu tiên trước, bắt đầu với pixel ngoài cùng bên trái: 3 byte cho các thành phần đỏ, xanh lá, xanh dương, cộng thêm một byte chưa dùng tới. Để vẽ bất cứ thứ gì lên màn hình—cho dù là văn bản hay đồ họa—cần một chương trình xác định được pixel nào cần thiết lập trong bộ nhớ đồ họa.

Đồ họa máy tính thường dính líu đến các công cụ toán học hình học giải tích. Toàn bộ màn hình—hoặc một khu vực hình chữ nhật nhỏ hơn trên màn hình—có thể được xem là một hệ tọa độ đơn giản, trong đó mỗi pixel là một điểm được tham chiếu bằng các tọa độ ngang và dọc (x, y). Ví dụ, pixel ở vị trí (10, 5) nằm cách lề trái mười pixel và cách mép trên năm pixel. Để vẽ một đường chéo từ điểm đó đến vị trí (15, 10), chương trình cần tô màu các pixel tại các điểm (10, 5), (11, 6), (12, 7), (13, 8), (14, 9) và (15, 10). Các kiểu đường kẻ và đường cong khác đương nhiên sẽ phức tạp hơn, nhưng cũng có rất nhiều công cụ phần mềm sẵn sàng trợ giúp.

Văn bản là tập con của đồ họa. Mỗi ký tự của một phông chữ cụ thể được định nghĩa bởi một tập hợp các đường thẳng và đường cong, kèm theo thông tin bổ sung (gọi là "hints") để văn bản được kết xuất với độ sắc nét tối đa.

Đồ họa ba chiều thì phức tạp hơn nhiều, đòi hỏi các loại đổ bóng khác nhau để thể hiện hiệu ứng ánh sáng và bóng tối. Ngày nay, các chương trình thường được hỗ trợ bởi bộ xử lý đồ họa (GPU), chuyên gánh vác các phép toán hạng nặng thường cần thiết cho đồ họa 3D.

Khi máy tính cá nhân mới ra đời, màn hình độ phân giải cao là điều bất khả. Bộ hiển thị đồ họa đầu tiên của IBM PC được gọi là CGA - Color Graphics Adapter, hỗ trợ ba định dạng (hoặc chế độ) đồ họa: 160 × 100 pixel với 16 màu (nhưng dùng 1 byte cho mỗi pixel), 320 × 200 pixel với 4 màu (2 bit mỗi pixel), và 640 × 200 pixel với 2 màu (1 bit mỗi pixel). Bất kể chế độ đồ họa nào, nó cũng chỉ cần 16.000 byte bộ nhớ. Ví dụ: 320 pixel ngang nhân với 200 pixel dọc nhân với ¼ byte mỗi pixel bằng 16.000.

Một số màn hình máy tính đời đầu thậm chí không có khả năng hiển thị đồ họa và bị giới hạn ở văn bản. Đây lại là một cách khác để giảm thiểu yêu cầu bộ nhớ, và đó cũng là tư duy đằng sau MDA - Monochrome Display Adapter, một tùy chọn hiển thị khác có sẵn trên các máy IBM PC đời đầu. MDA chỉ có thể hiển thị 25 dòng văn bản, mỗi dòng 80 ký tự, bằng một màu duy nhất là màu xanh lá cây trên nền đen. Mỗi ký tự được chỉ định bằng một mã ASCII 8-bit và đi kèm với một byte "thuộc tính" để chỉnh độ sáng, video đảo ngược (reverse video), gạch chân, hoặc nhấp nháy. Số lượng byte cần thiết để lưu trữ nội dung hiển thị do đó là 25 × 80 × 2, tức 4.000 byte. Video adapter này chứa một mạch điện sử dụng bộ nhớ chỉ đọc để chuyển đổi mỗi ký tự ASCII thành các hàng và cột pixel. Giống như CPU chứa các bus bên trong để di chuyển dữ liệu giữa các thành phần của nó, bản thân CPU cũng thường được kết nối với các bus bên ngoài để di chuyển dữ liệu giữa CPU, bộ nhớ và các thiết bị ngoại vi.

Bộ nhớ cho màn hình video chiếm trọn không gian bộ nhớ thông thường của CPU. Các thiết bị ngoại vi khác cũng có thể làm điều tương tự. Đây được gọi là I/O ánh xạ bộ nhớ (memory-mapped I/O). Tuy nhiên, một CPU có thể định ra một bus riêng biệt để truy cập các thiết bị ngoại vi, và nó có thể bao gồm các tiện ích đặc biệt để làm việc với các thiết bị đầu vào/đầu ra này.

Trong vài chương trước, tôi đã và đang xây dựng một CPU dựa trên bộ vi xử lý Intel 8080. Nằm trong số 244 lệnh được 8080 thực thi có hai lệnh tên là INOUT:

Lệnh     | Mô tả                   | Opcode
---------+-------------------------+-------
IN port  | Đọc một byte từ đầu vào | DBh
---------+-------------------------+-------
OUT port | Ghi một byte ra đầu ra  | D3h

Cả hai lệnh đều được theo sau bởi một số cổng (port) 8-bit. Nó khá giống với địa chỉ bộ nhớ nhưng chỉ rộng 8 bit và dành riêng cho các thiết bị I/O. Lệnh IN đọc từ cổng đó và lưu kết quả vào bộ tích luỹ. Lệnh OUT ghi nội dung của bộ tích luỹ ra cổng đó. Một tín hiệu đặc biệt từ 8080 sẽ cho biết nó đang truy cập RAM (trường hợp bình thường) hay đang truy cập cổng I/O.

Lấy bàn phím trên máy tính để bàn hoặc laptop làm ví dụ. Mỗi phím trên bàn phím là một công tắc đơn giản, công tắc này sẽ đóng lại khi phím được nhấn. Mỗi phím được xác định bằng một mã định danh duy nhất. Bàn phím này có thể được thiết lập để truy cập dưới dạng cổng số 25h. Một chương trình có thể thực thi lệnh sau:

IN 25h

Bộ tích luỹ sau đó sẽ chứa một mã cho biết phím nào vừa được nhấn.

Dễ lầm tưởng rằng mã này chính là mã ASCII của phím đó. Nhưng việc thiết kế phần cứng tự động suy ra mã ASCII là không thực tế cũng chẳng cần thiết. Ví dụ, phím A trên bàn phím có thể tương ứng với mã ASCII 41h hoặc 61h tùy thuộc vào việc người dùng có đang nhấn thêm phím Shift hay không (phím này quyết định chữ cái được gõ là chữ hoa hay chữ thường). Hơn nữa, bàn phím máy tính có rất nhiều phím (như phím chức năng, phím mũi tên) hoàn toàn không có ký tự ASCII tương ứng. Một chương trình máy tính ngắn gọn hoàn toàn có thể tự tìm ra mã ASCII (nếu có) tương ứng với một phím cụ thể vừa bị bấm.

Nhưng làm sao chương trình biết được khi nào một phím vừa bị bấm? Một cách tiếp cận là chương trình cứ liên tục kiểm tra bàn phím với tần suất dày đặc. Cách này được gọi là polling. Nhưng một cách tối ưu hơn là để bàn phím tự "đánh tiếng" thông báo cho CPU biết khi có phím được nhấn. Trong trường hợp tổng quát, một thiết bị I/O có thể thông báo cho CPU về một sự kiện như vậy bằng cách phát ra một interrupt, vốn dĩ chỉ là một tín hiệu đặc biệt đi vào CPU.

Để hỗ trợ interrupt, CPU 8080 đã triển khai tám lệnh gọi là các lệnh restart:

Lệnh  | Mô tả             | Opcode
------+-------------------+-------
RST 0 | Gọi địa chỉ 0000h | C7h
------+-------------------+-------
RST 1 | Gọi địa chỉ 0008h | CFh
------+-------------------+-------
RST 2 | Gọi địa chỉ 0010h | D7h
------+-------------------+-------
RST 3 | Gọi địa chỉ 0018h | DFh
------+-------------------+-------
RST 4 | Gọi địa chỉ 0020h | E7h
------+-------------------+-------
RST 5 | Gọi địa chỉ 0028h | EFh
------+-------------------+-------
RST 6 | Gọi địa chỉ 0030h | F7h
------+-------------------+-------
RST 7 | Gọi địa chỉ 0038h | FFh

Mỗi lệnh này buộc CPU phải lưu bộ đếm chương trình hiện tại lên stack, và sau đó nhảy tới địa chỉ bộ nhớ 0000h, 0008h, 0010h, và cứ thế. Lệnh RST 0 về cơ bản giống hệt như khởi động lại (reset) CPU, nhưng các lệnh khác có thể chứa các lệnh jump hoặc call.

Cơ chế hoạt động của nó như sau: CPU 8080 có một tín hiệu interrupt ngoài. Khi một thiết bị ngoại vi (như bàn phím vật lý) kích hoạt tín hiệu interrupt này, nó cũng đặt byte mã của một trong các lệnh restart này lên bus dữ liệu. Vị trí bộ nhớ đó sẽ chứa mã để xử lý riêng cho thiết bị I/O cụ thể đó.

Phương pháp này được gọi là interrupt-driven I/O. CPU không cần phải nhọc công thăm dò các thiết bị I/O liên tục. Nó có thể thong thả làm các tác vụ khác cho đến khi thiết bị I/O dùng tín hiệu interrupt để báo cho CPU biết có gì mới xảy ra. Đó là cách một bàn phím báo với CPU rằng một phím vừa được bấm.

Người ta cũng ưu tiên dùng interrupt cho chuột máy tính trên desktop hoặc laptop, touchpad, hay màn hình cảm ứng trên máy tính bảng và điện thoại.

Chuột có vẻ như được kết nối trực tiếp với màn hình hiển thị. Rốt cuộc thì, bạn rê chuột lên, xuống, trái, phải trên mặt bàn, và con trỏ chuột di chuyển tương ứng trên màn hình. Nhưng sự kết nối đó thực chất chỉ là ảo giác. Chuột chỉ truyền đi các xung điện báo hiệu hướng mà nó vừa di chuyển. Trách nhiệm vẽ lại con trỏ chuột ở vị trí mới hoàn toàn thuộc về phần mềm. Bên cạnh việc di chuyển, chuột còn ra tín hiệu cho máy tính biết khi một nút chuột được nhấn và thả ra, hoặc khi con lăn chuột quay.

Màn hình cảm ứng thường là một lớp được phủ lên trên màn hình hiển thị, có khả năng phát hiện sự thay đổi điện dung khi có ngón tay chạm vào. Màn hình cảm ứng có thể chỉ ra vị trí của một hoặc nhiều ngón tay bằng chính các tọa độ (x, y) mà chương trình dùng để hiển thị đồ họa. Các chương trình có thể nhận được thông báo khi một ngón tay chạm vào màn hình, khi nó nhấc lên, và cách nó di chuyển trong quá trình chạm. Nhờ vậy, chương trình có thể thực hiện nhiều tác vụ khác nhau, chẳng hạn như cuộn màn hình hoặc kéo thả một đối tượng đồ họa. Một chương trình cũng có thể dịch ra ý nghĩa của các cử chỉ dùng hai ngón tay như chụm và thu phóng.

Mọi thứ trong máy tính đều là kỹ thuật số. Mọi thứ đều là những con số. Ấy vậy mà thế giới thực lại thường mang tính tương tự (analog). Cảm nhận của chúng ta về ánh sáng và âm thanh mang tính chất liên tục và liền mạch, chứ không bị phân mảnh thành những giá trị số rời rạc.

Để hỗ trợ việc chuyển đổi dữ liệu analog ở thế giới thực thành các con số và ngược lại, hai thiết bị đã được phát minh:

  • Bộ chuyển đổi analog-sang-digital (ADC - Analog-to-digital converter)
  • Bộ chuyển đổi digital-sang-analog (DAC - Digital-to-analog converter)

Đầu vào của một ADC là một điện áp có thể biến thiên liên tục giữa hai giá trị, và đầu ra là một số nhị phân đại diện cho điện áp đó. Các bộ ADC thường có đầu ra 8-bit hoặc 16-bit. Ví dụ, đầu ra của một ADC 8-bit có thể là 00h cho mức điện áp đầu vào 0 volt, 80h cho 2.5 volt, và FFh cho 5 volt.

DAC thì đi theo chiều ngược lại. Đầu vào là một số nhị phân, có thể rộng 8 bit hoặc 16 bit, và đầu ra là một điện áp tương ứng với con số đó.

DAC được dùng trong màn hình hiển thị video để chuyển đổi các giá trị kỹ thuật số của các pixel thành điện áp, nhằm điều khiển cường độ ánh sáng phát ra từ các thành phần đỏ, xanh lá, và xanh dương của mỗi pixel.

Máy ảnh kỹ thuật số sử dụng một mảng cảm biến điểm ảnh hoạt động (APS - active-pixel sensors) để phản ứng với ánh sáng bằng cách phát ra một điện áp, sau đó điện áp này được chuyển đổi thành số bằng ADC. Kết quả là ta có một đối tượng gọi là bitmap, bản chất là một mảng hình chữ nhật gồm các pixel, mỗi pixel là một màu cụ thể. Tương tự như bộ nhớ trong màn hình video, các pixel của một bitmap được lưu trữ tuần tự, theo từng hàng, bắt đầu từ hàng trên cùng xuống hàng dưới cùng, và trong mỗi hàng thì đi từ trái sang phải.

Bitmap có thể lớn. Camera trên điện thoại của tôi tạo ra những bức ảnh rộng 4032 pixel và cao 3024 pixel. Nhưng không phải toàn bộ dữ liệu đó đều cần thiết để tái tạo lại hình ảnh. Vì lý do đó, các kỹ sư và nhà toán học đã nghĩ ra một số kỹ thuật để giảm bớt lượng byte cần thiết để lưu trữ bitmap. Quá trình này được gọi là nén (compression).

Một hình thức nén bitmap đơn giản là mã hóa loạt dài (run-length encoding, hay RLE). Ví dụ, nếu có mười pixel cùng màu xếp thành một hàng, bitmap chỉ cần lưu mã màu đó kèm theo con số 10. Nhưng cách này chỉ hiệu quả cho những hình ảnh có những mảng màu đồng nhất rất lớn.

Một kế hoạch nén tệp tinh vi hơn và hiện vẫn đang phổ biến là Graphics Interchange Format, hay GIF, được phát âm là jif giống như thương hiệu bơ đậu phộng (mặc dù không phải ai cũng đồng ý cách đọc này). Nó được dịch vụ trực tuyến CompuServe phát triển vào năm 1987. Các tệp GIF dùng một kỹ thuật nén tên là LZW (lấy theo tên của ba người tạo ra nó: Lempel, Ziv, và Welch), có khả năng phát hiện các mẫu lặp lại của các pixel có giá trị khác nhau thay vì chỉ tìm các chuỗi pixel cùng màu liên tiếp. Các tệp GIF cũng tích hợp luôn chức năng tạo ảnh động cơ bản bằng cách sử dụng nhiều khung hình.

Tân tiến hơn GIF là Portable Network Graphics (PNG), ra đời năm 1996. Về cơ bản, PNG chuyển đổi các giá trị pixel nằm cạnh nhau thành mức chênh lệch (differences) giữa các giá trị đó, thường sẽ cho ra những con số nhỏ hơn và dễ nén hơn rất nhiều.

Một tệp GIF hay PNG không nhất thiết phải nhỏ hơn bitmap gốc chưa được nén đâu nhé! Nếu một số bitmap bị thu nhỏ lại bằng một quá trình nén cụ thể, thì một số bitmap khác có khi lại còn phình to ra. Điều này có thể xảy ra với những bức ảnh có quá nhiều màu sắc hoặc quá nhiều chi tiết phức tạp.

Trong trường hợp đó, các kỹ thuật khác lại có đất dụng võ. Ra mắt năm 1992, định dạng tệp JPEG (phát âm là jay-peg) đã thành công rực rỡ đối với các tệp bitmap ghi lại hình ảnh thế giới thực. Các camera điện thoại ngày nay đều tạo ra tệp JPEG sẵn sàng để chia sẻ hoặc chuyển sang máy tính khác.

JPEG là viết tắt của Joint Photographic Experts Group (Nhóm Chuyên gia Nhiếp ảnh Liên kết), và khác với các kỹ thuật nén trước đây, nó dựa trên nghiên cứu tâm lý thị giác (psychovisual) để khai thác cách mắt người cảm nhận hình ảnh. Cụ thể, nén JPEG có thể vứt bỏ bớt những dữ liệu ở các điểm chuyển màu sắc nét, giúp giảm đáng kể lượng dữ liệu cần thiết để tái tạo hình ảnh. Chắc chắn là nó có dùng đến những phép toán cực kỳ phức tạp!

Nhược điểm của JPEG là nó không thể đảo ngược (not reversible): Bạn không thể quay trở lại chính xác hình ảnh ban đầu sau khi nó đã bị nén. Ngược lại, GIF và PNG là có thể đảo ngược; không có dữ liệu nào bị mất đi trong quá trình nén. Vì lý do này, GIF và PNG được phân loại là kỹ thuật nén không hao tổn (lossless), trong khi JPEG được phân loại là nén có hao tổn  (lossy). Dữ liệu bị mất đi, và trong những trường hợp bị nén quá đà, điều này có thể dẫn đến hình ảnh bị biến dạng và mờ nhòe.

Máy tính thường có micrô để thu nhận âm thanh từ thế giới thực, và loa để phát ra âm thanh.

Âm thanh là sự rung động. Dây thanh quản của con người rung lên, chiếc kèn tuba rung lên, một cái cây đổ rầm trong rừng cũng rung lên, và những vật thể này làm cho các phân tử không khí dao động. Không khí luân phiên nén và giãn, đẩy tới rồi kéo lui hàng trăm hoặc hàng ngàn lần mỗi giây. Không khí, đến lượt nó, lại làm màng nhĩ của chúng ta rung lên, và thế là ta cảm nhận được âm thanh.

Một micrô phản ứng với những rung động này bằng cách sinh ra một dòng điện có điện áp biến thiên tương tự với sóng âm. Cũng tương đồng với những sóng âm này là những thăng và trầm trong bề mặt giấy bạc mà Thomas Edison đã sử dụng để ghi âm và phát lại âm thanh trong chiếc máy quay đĩa (phonograph) đầu tiên vào năm 1877, hay thăng và trầm trên những chiếc đĩa than vinyl hiện vẫn được giới chơi âm thanh (audiophiles) và những người đam mê công nghệ hoài cổ trân quý.

Nhưng đối với máy tính, điện áp này cần phải được số hóa—tức là chuyển thành các con số—và đó lại là một công việc dành cho bộ ADC.

Âm thanh kỹ thuật số đã tạo ra một cơn sốt trên thị trường tiêu dùng vào năm 1983 với đĩa compact (CD), trở thành câu chuyện thành công nhất mọi thời đại của ngành điện tử tiêu dùng. CD được Philips và Sony phát triển để lưu trữ 74 phút âm thanh kỹ thuật số trên một mặt của chiếc đĩa có đường kính 12 cm. Độ dài 74 phút được chọn để có thể nhét vừa vặn Bản giao hưởng số 9 của Beethoven vào một đĩa CD. (Như lời đồn là vậy.)

Âm thanh được mã hóa trên CD bằng một kỹ thuật gọi là điều chế mã xung (pulse code modulation), hay PCM. Bất chấp cái tên nghe có vẻ hoành tráng, PCM về mặt khái niệm lại là một quy trình khá đơn giản: Điện áp đại diện cho sóng âm được chuyển đổi thành các giá trị kỹ thuật số ở một tốc độ không đổi và được lưu trữ lại. Trong quá trình phát lại, các con số này được chuyển đổi ngược thành dòng điện bằng cách sử dụng bộ DAC.

Điện áp của sóng âm được chuyển đổi thành các con số ở một tốc độ không đổi được gọi là tốc độ lấy mẫu (sampling rate). Năm 1928, Harry Nyquist thuộc Bell Telephone Laboratories đã chứng minh rằng tốc độ lấy mẫu phải ít nhất gấp đôi tần số tối đa cần được ghi âm và phát lại. Thường thì người ta cho rằng con người có thể nghe được âm thanh từ 20 Hz đến 20.000 Hz. Tần số lấy mẫu dùng cho đĩa CD cao hơn gấp đôi mức tối đa đó một chút, cụ thể là 44.100 mẫu mỗi giây.

Số lượng bit trên mỗi mẫu quyết định dải động (dynamic range) của đĩa CD, đây là độ chênh lệch giữa âm thanh lớn nhất và âm thanh nhỏ nhất có thể được ghi âm và phát lại. Đoạn này hơi phức tạp một chút: Khi dòng điện biến thiên tới lui dưới dạng mô phỏng sóng âm, các đỉnh mà nó chạm tới đại diện cho biên độ (amplitude) của dạng sóng. Cảm nhận của chúng ta về cường độ (intensity) của âm thanh tỷ lệ thuận với bình phương biên độ. Một bel (chính là ba phần tư họ của Alexander Graham Bell) biểu thị cường độ tăng lên gấp mười lần; một decibel là một phần mười của một bel. Một decibel xấp xỉ mức tăng âm lượng nhỏ nhất mà một người có thể cảm nhận được.

Hóa ra việc sử dụng 16 bit cho mỗi mẫu cho phép đạt được dải động là 96 decibel, xấp xỉ mức chênh lệch giữa ngưỡng nghe (dưới mức này chúng ta không thể nghe thấy gì) và ngưỡng chói tai, nếu lớn hơn mức này có thể sẽ khiến ta phải ôm đầu bịt tai. Đĩa compact sử dụng 16 bit cho mỗi mẫu.

Đối với mỗi giây âm thanh, một đĩa compact chứa 44.100 mẫu, mỗi mẫu dài 2 byte. Nhưng có lẽ bạn cũng muốn nghe âm thanh nổi (stereo) nữa, thế thì nhân đôi số đó lên thành tổng cộng 176.400 byte mỗi giây. Tương đương với 10.584.000 byte cho mỗi phút âm thanh. (Giờ thì bạn đã hiểu tại sao việc ghi âm kỹ thuật số lại không phổ biến trước những năm 1980 rồi đấy.) Trọn vẹn 74 phút âm thanh nổi trên CD đòi hỏi 783.216.000 byte. Các đĩa CD đời sau đã tăng dung lượng đó lên một chút.

Mặc dù CD đã phai nhạt dần vị thế trong những năm gần đây, các khái niệm về âm thanh kỹ thuật số vẫn không hề thay đổi. Vì bạn không phải lúc nào cũng cần chất lượng cỡ CD khi ghi và phát âm thanh trên máy tính cá nhân, các tốc độ lấy mẫu thấp hơn thường được hỗ trợ, bao gồm 22.050 Hz, 11.025 Hz, và 8.000 Hz. Bạn có thể ghi âm với kích thước mẫu nhỏ hơn là 8 bit, và bạn có thể cắt giảm một nửa dung lượng dữ liệu bằng cách ghi âm đơn sắc (mono).

Giống hệt như với bitmap, chúng ta cũng thường nén các tệp âm thanh để tiết kiệm không gian lưu trữ và giảm thiểu thời gian truyền tệp giữa các máy tính. Một kỹ thuật nén âm thanh cực kỳ phổ biến là MP3, ban đầu có nguồn gốc như một phần của kỹ thuật nén phim ảnh mang tên MPEG (viết tắt của Moving Picture Experts Group). MP3 là chuẩn nén có tổn hao nhưng dựa trên những phân tích âm thanh học tâm lý (psychoacoustic) để mạnh tay loại bỏ những dữ liệu không đóng góp rõ rệt vào nhận thức của con người về âm nhạc.

Các tệp bitmap được nén bằng GIF, PNG hay JPEG, và âm thanh được nén bằng MP3 có thể chiếm dụng bộ nhớ, nhất là trong lúc có một chương trình đang thao tác với các thông tin này, nhưng thông thường chúng được lưu trữ dưới dạng các tệp trên một loại thiết bị lưu trữ nào đó.

Như bạn sẽ nhớ, bộ nhớ truy cập ngẫu nhiên—bất kể được làm từ rơ-le, ống chân không, hay transistor—sẽ quên sạch sành sanh nội dung khi bị ngắt điện. Chính vì lý do này, một hệ thống máy tính hoàn chỉnh cũng rất cần một thiết bị lưu trữ dài hạn. Một phương pháp cổ điển được thời gian kiểm chứng là đục lỗ trên giấy hoặc bìa cứng, giống như các thẻ đục lỗ của IBM. Trong những ngày đầu của máy tính cỡ nhỏ, các cuộn băng giấy được đục lỗ để lưu trữ chương trình và dữ liệu, để sau đó có thể nạp lại vào bộ nhớ. Hiện đại hơn một chút là việc sử dụng băng cassette âm thanh, thứ từng rất thịnh hành trong thập niên 1980 để ghi âm và phát nhạc. Chúng chỉ là phiên bản thu nhỏ của các cuộn băng từ được dùng trên các máy tính lớn (mainframe) để lưu trữ một lượng lớn dữ liệu.

Tuy nhiên, băng từ lại không phải là môi trường lý tưởng cho việc lưu trữ và truy xuất, bởi vì việc di chuyển nhanh đến một vị trí bất kỳ trên băng là không thể. Quá trình tua nhanh hay tua lùi có thể ngốn kha khá thời gian.

Một phương tiện lưu trữ có cấu trúc hình học thuận lợi hơn nhiều cho việc truy cập nhanh chính là đĩa (disk). Bản thân đĩa sẽ quay quanh trục của nó, trong khi một hay nhiều đầu đọc gắn trên các tay gắp có thể di chuyển từ mép ngoài của đĩa vào tâm. Bất kỳ khu vực nào trên đĩa cũng có thể được truy cập cực kỳ chớp nhoáng. Các bit được ghi lại bằng cách từ hóa những vùng nhỏ trên mặt đĩa. Những ổ đĩa đầu tiên dùng cho máy tính được phát minh tại IBM vào năm 1956. Hệ thống Phương pháp Kế toán và Kiểm soát Truy cập Ngẫu nhiên (RAMAC) này chứa 50 chiếc đĩa kim loại đường kính 2 feet (khoảng 60cm) và có thể chứa 5 megabyte dữ liệu.

Thịnh hành trên các máy tính cá nhân là những tấm nhựa phủ từ tính đơn lẻ, được bọc trong một lớp vỏ bảo vệ bằng bìa cứng hoặc nhựa dẻo. Chúng được gọi là đĩa mềm (floppy disks hoặc diskettes), ban đầu có đường kính 8 inch, sau đó thu gọn xuống 5.25 inch, và cuối cùng là 3.5 inch. Đĩa mềm có thể được lấy ra khỏi ổ đĩa, biến chúng thành một công cụ tuyệt vời để truyền dữ liệu từ máy tính này sang máy tính khác. Đĩa mềm cũng từng là một phương tiện phân phối chủ đạo cho các phần mềm thương mại. Ngày nay, đĩa mềm đã gần như tuyệt chủng, ngoại trừ hình ảnh phác họa của một chiếc đĩa mềm 3.5-inch vẫn còn sống thọ với vai trò là biểu tượng "Lưu" (Save icon) trong vô số ứng dụng máy tính.

Một chiếc ổ cứng (hard disk) thi thoảng vẫn còn được tìm thấy bên trong vài dòng máy tính cá nhân thường chứa nhiều đĩa kim loại được gắn chết bên trong ổ. Ổ cứng nhìn chung có tốc độ nhanh hơn đĩa mềm và chứa được lượng dữ liệu lớn hơn nhiều, nhưng đổi lại, bạn không thể dễ dàng tháo rời các đĩa ra được.

Ngày nay, việc lưu trữ chủ yếu được chuyển giao cho các ổ cứng thể rắn (SSD), được tích hợp sẵn bên trong máy tính (hoặc máy tính bảng, điện thoại di động), hoặc nằm dưới dạng bộ nhớ flash trong các ổ đĩa USB (thumb drive) nhỏ gọn có thể bỏ túi.

Các thiết bị lưu trữ dung lượng lớn phải có khả năng tiếp nhận các tệp có đủ mọi kích cỡ, xuất phát từ đủ loại nguồn khác nhau trên máy tính. Để thực hiện điều này, thiết bị lưu trữ được chia cắt thành các vùng có kích thước cố định, gọi là các sector (hay cung từ). Đĩa mềm và ổ cứng đời cũ thường có kích thước sector là 512 byte. SSD thường có kích thước sector là 512 byte và 4.096 byte.

Mỗi tệp được lưu trữ trong một hoặc nhiều sector. Nếu kích thước sector là 512 byte và tệp có dung lượng nhỏ hơn 512 byte, việc lưu tệp chỉ cần đúng một sector, nhưng phần không gian trống còn lại trong sector đó cũng không thể dùng để cất thứ gì khác được. Một tệp 513 byte sẽ cần tới hai sector, và một tệp có kích thước 1 megabyte sẽ chiếm đóng 4.096 sector.

Các sector thuộc cùng một tệp không nhất thiết phải nằm liền kề nhau. Chúng có thể nằm rải rác khắp mọi nơi trên ổ đĩa. Khi các tệp bị xóa, các sector đó sẽ được giải phóng để nhường chỗ cho các tệp khác. Khi các tệp mới được tạo ra, các sector trống sẽ được trưng dụng, nhưng chúng không nhất thiết phải được nhóm lại gần nhau.

Việc theo dõi và quản lý tất cả những thứ này—bao gồm cả toàn bộ quy trình lưu trữ tệp và truy xuất chúng—là lãnh địa của một phần mềm tối quan trọng được biết đến với tên gọi hệ điều hành (operating system).
Cảm ơn bạn đã đọc bài.
0

Thảo luận trên Bluesky

Đi

Đang tải bình luận...

Powered by Bluesky AT Protocol