[Kiến trúc máy tính] Phần 2: Kiến trúc phân tầng

Language

Khi cần nhờ máy tính thực thi một công việc (task) nào đó trong thực tế, ví dụ như đặt xe công nghệ, nhắn tin, mua hàng online,... chúng ta phải viết chương trình (program), tương ứng với Grab, Zalo, Tiki,... để máy tính thực hiện giúp. Về bản chất, một chương trình là tập hợp các dòng lệnh (instruction) sẽ được thực thi lần lượt nhằm hoàn thành công việc được giao. Tập hợp tất cả các instruction sẽ tạo thành một loại ngôn ngữ (language).

Ở thời điểm ban đầu, chúng ta chỉ có ngôn ngữ máy (machine language), được viết dưới dạng mã nhị phân. Tuy thích hợp cho máy tính đọc hiểu và thực thi, nhưng machine language gây khó khăn cho con người trong việc lập trình. Để giải quyết vấn đề này, ta hướng đến việc thiết kế một loại language mới, thân thiện với con người hơn, để lập trình viên có thể dễ dàng sử dụng. Language mới cũng có tập instruction mới, do đó, thay vì làm việc với machine language, ta có thể lập trình trực tiếp trên language này, vốn dễ dàng và thuận tiện hơn. Sau khi program được viết xong, thì các instruction của nó sẽ được dịch sang machine language để máy tính thực thi.

Translation và Interpretation

Lần lượt gọi machine language và language mới được thiết kế là L0 và L1. Các program ngày nay chủ yếu được viết ở L1. Tuy nhiên, như đã nói, những program như vậy không thể được máy tính thực thi ngay, mà trước tiên phải được dịch sang L0. Hiện nay, có hai chiến lược để dịch và thực thi một program L1:

- Cách thứ nhất, toàn bộ các instruction trong program ở L1 sẽ được thay thế bằng instruction tương ứng ở L0. Vì instruction ở L1 phức tạp hơn ở L0, nên một instruction ở L1 có thể ứng với một hoặc một chuỗi các instruction L0. Sau khi dịch xong, thì một program L0 mới được tạo ra, và program L1 không còn được sử dụng nữa. Program L0 sau đó được nạp vào memory để thực thi, đồng thời giữ quyền điều khiển máy tính trong suốt khoảng thời gian này. Kỹ thuật trên được gọi là translation, tức biên dịch.

- Cách thứ hai, thay vì dịch toàn bộ các instruction trong program L1 ngay từ đầu, thì từng instruction trong program L1 được lấy ra, dịch sang L0 và thực thi, lần lượt, lần lượt từng instruction L1. Có thể thấy, ở đây không có program L0 nào được tạo ra như cách thứ nhất. Kỹ thuật này được gọi là interpretation, tức thông dịch; và chương trình thực hiện việc thông dịch được gọi là interpreter. Trong quá trình thực thi, interpreter được nạp vào memory, giữ quyền điều khiển máy tính, còn program L1 là dữ liệu đầu vào cho interpreter đó.

Nhận xét: hai chiến lược translation và interpretation về mục tiêu thì hoàn toàn giống nhau, đều thực hiện việc dịch program L1 sang L0 rồi thực thi. Điểm khác biệt ở đây chính là cách vận hành của chúng, ở điểm đâu là program và đâu là data trong memory khi thực thi.

Layers (Levels)

Trong thực tế, để đảm bảo tính đơn giản và khả thi cho các chương trình dịch, thì L1 và L0 không được phép khác biệt nhau quá lớn. Điều này nghĩa là mặc dù L1, so với L0, thì có vẻ thân thiện với con người hơn, nhưng vẫn còn khoảng cách rất xa đến loại language lý tưởng mà con người đang mong đợi. Có thể nhận thấy, để giải quyết vấn đề này, cách làm khá đơn giản. Như cái cách mà L1 được tạo ra, ta sẽ tiếp tục thiết kế L2, L3,... Ln, mỗi language được xây dựng dựa trên language ngay trước nó, cho đến khi đạt được một language mà ta cảm thấy chấp nhận và sử dụng được. Một mô hình nhiều lớp như vậy được gọi là mô hình kiến trúc phân tầng (layers hay levels).

Trong khoa học máy tính, mô hình phân tầng được sử dụng rất nhiều, do các tính chất sau:

- Khi làm việc với một lớp, ta chỉ cần quan tâm đến các tính chất bên trong lớp đó, mà không cần phải để ý đến lớp bên dưới được xây dựng chi tiết như thế nào, chỉ cần biết lớp dưới cung cấp những gì cho lớp trên là đủ. Do đó, nó mang đến tính chuyên môn hóa trong việc phát triển hệ thống.

- Khi thay đổi nội dung trong một lớp, chỉ cần vẫn đảm bảo được yêu cầu đầu vào cho lớp trên nó, ngoài ra, bất kỳ thay đổi nào trong một lớp sẽ không ảnh hưởng gì đến toàn hệ thống. Do đó, nó mang lại tính độc lập, dễ bảo trì, sửa đổi giữa các lớp.

- Đảm bảo các lớp phía trên chỉ có thể thực thi những tác vụ được cung cấp bởi lớp dưới, từ đó bảo vệ được hệ thống, tránh những rủi ro, ngoại lệ có thể được xảy ra cho các lớp dưới do các lớp trên gây ra.

Mô hình phân lớp được sử dụng trong Kiến trúc máy tính, mô hình mạng OSI hay mô hình lập trình hướng đối tượng OOP,...

Virtual machine

Ở mỗi lớp n, sẽ có Ln dành riêng cho nó. Bên cạnh đó, ta có thể hình dung tồn tại một máy tính Mn chịu trách nhiệm thực thi Ln. Dù thực tế, Ln sẽ không được thực thi bởi Mn, mà sẽ lần lượt được dịch sang Ln-1, Ln-2,... L0; nhưng ta hoàn toàn có thể xem như Mn tồn tại ở mức luận lý. Trong toàn hệ thống, chỉ có M0 là thực sự tồn tại ở mức vật lý.

Đến đây, câu hỏi được đặt ra là tại sao phải thiết kế một hệ thống cồng kềnh như vậy, mà không chọn cách đơn giản là tạo ra một máy tính Mn vật lý thực sự. Cần biết, với các công nghệ hiện nay, việc tạo ra một máy tính như Mn là hoàn toàn có thể. Tuy nhiên, sự khác biệt ở đây chính là giá thành và độ hiệu quả.

- Việc tạo ra một máy thực Mn là rất phức tạp, ở cả việc thiết kế lẫn chế tạo ra các circuit thực hiện instruction cho Ln. Do đó, giá thành tạo ra chiếc máy tính Mn sẽ cao hơn so với M0.

- Giá thành cao hơn M0, nhưng tính hiệu quả dựa trên chi phí thì lại kém M0. Ta có thể thấy một chiếc máy tính Mn sau khi được làm ra, thì thiết kế và ứng dụng của rất cứng nhắc, không hề mang tính linh hoạt. Nghĩa là, Mn chỉ có thể làm việc được với Ln. Vậy trong trường hợp có một lỗi nhỏ trong thiết kế Mn, hay có một tính năng nâng cấp, sửa đổi, thì phải rã toàn bộ linh kiện Mn ra để làm lại. Trong khi với mô hình phân tầng, chỉ cần phải thay đổi ở một tầng nhất định, toàn bộ các lớp còn lại vẫn giữ nguyên. Việc sửa đổi ở các máy ảo Mn là rất dễ dàng, chỉ có rủi ro lớn nhất là phải thay đổi ở M0. Do đó, ta chỉ cần tập trung công sức kiểm thử cho M0. Một khi M0 ổn định, các Mn có thể vừa được phát triển, vừa được bảo trì, sửa đổi dễ dàng ở giai đoạn sau. Đây chính là lý do tại sao mô hình phân tầng lại hiệu quả hơn.

Tham khảo: Andrew S. Tanenbaum, Todd Austin. Structured Computer Organization (6th edition). 

Comments

Popular posts from this blog

[Kiến trúc máy tính] Phần 1: Từ tín hiệu sóng điện từ đến phần mềm máy tính

Chặng đường thứ nhất: Toán học và khát khao

Hợp và tan