Những ai đã từng lập trình trên vi xử lý 8 bit (như Intel 8085, Zilog Z80) chắc đều trải nghiệm lập trình đa nhiệm, tự tay mình lập đa nhiệm. Nói là đa nhiệm nhưng bộ xử lý trong thực tế thực hiện công việc của mình một cách tuần tự. Ví dụ, chúng ta có 10 thread T1, T2, …, T10 thì bộ xử lý chạy T1 trước, sau đó chuyển sang T2 (nhớ điểm dừng ở T1), rồi chuyển sang T3, …, sau đó quay lại T1 và thực hiện từ điểm dừng T1 đã được ghi lại trước đó. Cơ chế nào để chuyển từ T1 sang T2? Dĩ nhiên là phép ngắt (Interrupt), và thường là dùng ngắt thời gian, Timer. Tất cả các bộ xử lý đều phải sử dụng một quartz timer, ví dụ, 100 MHz. Có thể lập một timer cứ 10 miliseconds thì ngắt một lần và nhờ phép ngắt timer chúng ta chuyển từ T1 sang T2 sang T3, … Do thời gian ngắt là rất nhỏ nên chúng ta có cảm giác như các chương trình đang chạy song song. (Chuyện này thì nay đã thành kinh điển, tôi chỉ nhắc lại để cho những ai đã từng mày mò lập trình trên vi xử lý, nhớ lại một trải nghiệm khó quên về đa nhiệm.)
Cùng với thời gian, vào những năm 90 của thế kỷ trước, với sự
ra đời của Internet, các bộ xử lý trước đây được coi là nhanh nhưng vào thời điểm
đó đã tỏ ra quá chậm chạp nếu một server phải chịu tải hàng chục ngàn người
truy cập đồng thời. Thách thức là: một máy tính, dù có đạt tốc độ cao đến bao
nhiêu đi nữa thì vẫn rất khó lòng giải được bài toán số lượng người cùng truy cập
đồng thời lên đến hàng trăm ngàn, hàng triệu.
Nhân loại luôn có người xuất chúng đứng ra giải quyết vấn đề.
Hẳn chúng ta còn nhớ vào năm 1999, 2000 xuất hiện công cụ tìm kiếm Google.
Google cho kết quả tìm kiếm và thời gian tìm kiếm thường dưới 1 giây đồng hồ,
kiểu như: About 508,000 results (0.61 seconds). Đối với những người lập trình
thì công cụ tìm kiếm Google vào thời điểm đó thật là magical - có lẽ đến bây giờ
Google vẫn là magical - (Từ của giới sô bít ở ta là “ảo diệu” 😊). Giới thạo tin lúc đó
nói đến các server farms của Google (những cánh đồng máy chủ) và thuật
toán magical của họ.
Thuật toán mà Google đưa ra có tên gọi là Map/Reduce, tôi tạm
dịch là thuật toán “Lan tỏa/Rút gọn”. Nói một cách đơn giản là thế này: Google
họ để dữ liệu trên hàng chục ngàn máy chủ, mỗi lần có nhu cầu tìm kiếm một cụm
từ nào đó thì họ sẽ “áp” việc kiếm này lên tất cả các máy chủ (gọi là thuật
toán Map – Lan tỏa), sau đó họ “gom” tất cả kết quả lại (gọi là thuật toán
Reduce – Rút gọn”. Toàn bộ ý tưởng vĩ đại nằm ở chỗ đó. Việc của hệ điều hành
là điều phối Map và Reduce, còn việc của người viết ứng dụng là cung cấp hai
hàm Map() và Reduce().
Doug Cutting, Mike Cafarella và cộng sự đã lấy giải pháp của
Google và phát triển thành một dự án nguồn mở có tên là HADOOP. HADOOP xây dựng
kiến trúc khung (framework) cho phép các ứng dụng xử lý dữ liệu cực lớn
với thời gian cực nhanh. Có thể nói HADOOP là “de facto standard” (chuẩn
mặc nhiên) để điều hành các data centers.
Cách mà HADOOP vận hành là “gom” tất cả các servers (con số có
thể lên đến hàng trăm ngàn servers) thành một thể thống nhất (Hadoop
Distributed File System). Các server xử lý theo cách “local” – nghĩa là
server nào lo việc của server đó, còn HADOOP đứng ra “lo việc chung”. Một cách
hình tượng: HADOOP đứng ra phân việc cho hàng ngàn servers cùng xử lý và sau đó
HADOOP gom các kết quả lại và “thanh lý hợp đồng” với khách hàng. Khách hàng =
Application.
Dưới góc nhìn của cá nhân tôi, tôi đặc biệt ấn tượng với 2 đột
phá trong thuật toán, đó là thuật toán Multi-Threading (Đa nhiệm) và thuật toán
Map/Reduce (Lan tỏa/Rút gọn). Chúng đóng vai trò là các mốc tiến hóa trong computing.