Tuy rằng nói ra thì có lẽ sẽ làm nản lòng một số chiến sĩ, nhưng chúng ta đôi lúc cũng nên tìm hiểu một chút về nền tảng mà mình đang sử dụng. Bên cạnh đó ôn lại một số kiến thức khi ngồi trong ghế trường học luôn.
Trước hết mình xin đính chính một thông tin sai lệch, đó là Android chạy chậm và kém mượt là do ứng dụng của nó phải chạy trên máy ảo (Virtual Machine) Davik, thực sự thì vấn đề hiệu năng không phải là do ứng dụng Android chạy thông qua VM hay không. Bản chất các ứng dụng của Android khi được chạy là mã nguồn bytecode được "tạm thời biên dịch" sang machine binary code trước khi thực thi.
Ai sử dụng Android thì cũng đều biết là nó sẽ mất 256MB Heap size RAM dành cho một thứ gọi là Dalvik Cache thứ mà không có trên tất cả các HĐH khác từ trước đến giờ, kể cả những HĐH sử dụng Java. Nó đóng vai trò như một vùng nhớ đệm, chứa phần mã máy đã được tạm thời biên dịch và thực thi nó như là các mã máy bình thường khác. Về nguyên tắc thì dù là chạy trên VM thì tốc độ của Android cũng không bị ảnh hưởng gì cả, có chăng là sẽ tốn thêm thời gian để nạp ứng dụng và biên dịch JIT, một khi anh ấy đã hoạt động rồi thì không có gì cản trở cả.
Trước hết ta phải nói đến "hành vi" sử dụng smartphone không giống như sử dụng máy tính, trên smartphone anh không cần dùng "cửa sổ" này mà vẫn thấy cửa sổ khác, và anh không cần các cửa sổ phải cùng nhau hoạt động cùng một lúc. Bởi vì cửa sổ duy nhất mà anh cần đó là cái màn hình hiện tại. Vì vậy Apple mới đưa ra một kỹ thuật gọi là Pseudo Multitasking, nó hoạt động kiểu như thế này:
- Ứng dụng sẽ không được "keep running" khi mà anh chuyển đổi từ ứng dụng này sang ứng dụng khác, nói một cách khác nó sẽ bị tắt hoàn toàn. Nhưng trước khi nó được tắt, Apple cung cấp cho chúng ta một state, ở đó ta có thể lưu lại những dữ liệu cần dùng trong lần khởi động tới (những dữ liệu này sẽ được gọi là session), ứng dụng tắt hoàn toàn hệ thống không cần phải quản lý gì nữa, mọi thứ clean.
Trước hết mình xin đính chính một thông tin sai lệch, đó là Android chạy chậm và kém mượt là do ứng dụng của nó phải chạy trên máy ảo (Virtual Machine) Davik, thực sự thì vấn đề hiệu năng không phải là do ứng dụng Android chạy thông qua VM hay không. Bản chất các ứng dụng của Android khi được chạy là mã nguồn bytecode được "tạm thời biên dịch" sang machine binary code trước khi thực thi.
Ai sử dụng Android thì cũng đều biết là nó sẽ mất 256MB Heap size RAM dành cho một thứ gọi là Dalvik Cache thứ mà không có trên tất cả các HĐH khác từ trước đến giờ, kể cả những HĐH sử dụng Java. Nó đóng vai trò như một vùng nhớ đệm, chứa phần mã máy đã được tạm thời biên dịch và thực thi nó như là các mã máy bình thường khác. Về nguyên tắc thì dù là chạy trên VM thì tốc độ của Android cũng không bị ảnh hưởng gì cả, có chăng là sẽ tốn thêm thời gian để nạp ứng dụng và biên dịch JIT, một khi anh ấy đã hoạt động rồi thì không có gì cản trở cả.
Quay lại vấn đề tại sao hiệu suất Android lại bị đánh giá thấp hơn iOS, WP hay BB10. Vấn đề nằm ở tư tưởng thiết kế HĐH.
Trước hết ta phải nói đến "hành vi" sử dụng smartphone không giống như sử dụng máy tính, trên smartphone anh không cần dùng "cửa sổ" này mà vẫn thấy cửa sổ khác, và anh không cần các cửa sổ phải cùng nhau hoạt động cùng một lúc. Bởi vì cửa sổ duy nhất mà anh cần đó là cái màn hình hiện tại. Vì vậy Apple mới đưa ra một kỹ thuật gọi là Pseudo Multitasking, nó hoạt động kiểu như thế này:
- Ứng dụng sẽ không được "keep running" khi mà anh chuyển đổi từ ứng dụng này sang ứng dụng khác, nói một cách khác nó sẽ bị tắt hoàn toàn. Nhưng trước khi nó được tắt, Apple cung cấp cho chúng ta một state, ở đó ta có thể lưu lại những dữ liệu cần dùng trong lần khởi động tới (những dữ liệu này sẽ được gọi là session), ứng dụng tắt hoàn toàn hệ thống không cần phải quản lý gì nữa, mọi thứ clean.
- Ở lần khởi động thứ 2, sau khi app started và trước khi "show hàng" apple lại cung cấp cho chúng ta một state, ở đấy đọc những dữ liệu đã được ghi trước đó, và phục hồi lại trạng thái ứng dụng trước khi tắt ở lần trước.
Về phía Android, ứng dụng sẽ được chạy theo một mô hinh lifecycle phức tạp hơn gồm nhiều trạng thái tương tự như iOS, nhưng có một điểm khác. Đó là ứng dụng Android vẫn "keep running" khi bạn thoát ra.
Lý giải cho việc ứng dụng được giữ tiếp tục chạy trong hệ thống, đội ngũ phát triển Android của Google nói rằng, như vậy khi nào cần thì mọi thứ đã có sẵn, ứng dụng không cần phải đợi nạp lại. Khi nào cần đến chỉ việc gọi thôi.
Tuy nhiên kéo theo đó là cả một hệ lụy
Trước hết mình nói thêm về 2 khái niệm cơ bản của HĐH để anh em tiện theo dõi:
- Memory paging hay còn gọi là "phân trang", thực tế viết đầy đủ là Memory allocation in paging systems, nhưng mình gọi tắt là MP quen rồi, đây là một tính năng của HĐH nhằm phân chia tài nguyên RAM của hệ thống, khi ta nạp 1 ứng dụng lên thì HĐH cần phải biết vị trí nào trong RAM còn trống, đủ kích thước nạp ứng dụng đó, và khi cần xử lý thì nó phải có một index chỉ đường đến vị trí nạp ứng dụng chứ nếu không làm sao mà biết đường lần trong hàng tỉ ô nhớ của hệ thống.
- System scheduling, gọi là "định thì" hệ thống, nó khá là quan trọng, bởi vì bản chất của CPU nó chỉ xử lý có một lệnh / 1 IPC thôi, trong khi có nhiều process cần được xử lý, vì vậy mới cần thằng "cảnh sát giao thông" này, nó là thằng quyết định xem process nào được vào gặp "sếp lớn", còn những thằng còn lại sẽ phải đứng chờ trong một "hàng đợi", còn đợi bao lâu thì tùy vào thuật toán định thì cụ thể. Ở cả Android lẫn iOS thì mặc định thuật toán định thì đều là dạng tuần tự theo lượt, vào trước ra trước FIFO. Tuy nhiên do tính mở Android có thể thay đổi được bằng các Kernel bên ngoài.
OK! Quay trở lại việc tại sao hiệu suất của Android lại kém thế, mình muốn nhấn mạnh là ở đây mình sẽ dùng từ hiệu suất chứ không phải hiệu năng nhé. Và vì sao Android lại tốn pin, và không mượt bằng iOS hay WP.
Quảng cáo
Có lẽ khi đọc về "phân trang" và "định thì" thì bạn cũng hiểu ra phần nào rồi, lý do đơn giản là việc phân phối tài nguyên của hệ thống. Ngoài ra số lượng process mà iOS phải xử lý sẽ ít hơn (vì khi chuyển ứng dụng thì process đã bị tắt cùng với ứng dụng trước đó rồi)
Với iOS toàn bộ tài nguyên của hệ thống có thể được huy động tối đa để phục vụ cho một ứng dụng, ngoài ra việc phân trang và định thì của hệ thống không phải là gánh nặng và vì thế nó có thể hoạt động trơn tru hơn Android mặc dù CPU có thể yêu hơn, RAM có thể ít hơn, và vì lý do đó nên tiêu thụ năng lượng cũng ít hơn dẫn đến thời lượng pin sẽ nhiều hơn.
Với Android, điều đáng buồn là một HĐH di động lại bị kỳ vọng quá mức vào khả năng xử lý multitasking, Google muốn biến nó trở thành một HĐH máy tính???
Sử dụng true multitasking đồng nghĩ với anh phải phân chia tài nguyên cho nhiều ứng dụng hơn, phân trang phức tạp hơn, định thì phức tạp hơn anh phải xử lý tranh chấp tài nguyên, ngăn ngừa deadlock... Tất cả những cái đó vô hình chung làm cho Android hiệu suất kém hơn, tốn tài nguyên hơn và tiêu thụ nhiều năng lượng hơn (do phải xử lý nhiều hơn ấy mà)
Việc so sánh giữa iOS với Android cũng giống như kiểu có 2 anh lực sĩ, anh iOS dùng cả 2 tay nâng 1 quả tạ 100kg, còn anh Android thì mỗi tay một quả 100kg, ngoài ra còn phải treo trên người một tá phụ kiện lỉnh kỉnh nữa.
Bởi vậy nên với các thiết bị Android, người ta mới dùng giải pháp là cung cấp thêm tài nguyên hệ thống, bằng cách nâng cấp thêm CPU, RAM, tăng thêm pin.
Điều đáng buồn là hiện tại trong tất cả các HĐH di động chỉ có một mình Android là xây dựng theo thiết kế true multitasking, còn lại cả WP, lẫn BB10 đều thiết kế theo mô hình tương tự như Apple có chỉnh sửa phù hợp với "triết lý" của họ.
Quảng cáo
Có một số bạn từng hỏi mình là nếu như thiết kế của Apple tốt thế thì Android giờ "cải lùi" thiết kế lại Android theo cách đó được không? Câu trả lời là có thể và cũng không thể. Việc nâng cấp từ một HĐH đơn nhiệm hoặc giả đa nhiệm lên đa nhiệm dễ hơn là làm ngược lại, bởi vì nâng cấp thì chỉ cần chèn thêm các states mới vào mô hình chạy ứng dụng thôi, các ứng dụng vẫn có thể chạy bình thường. Còn làm ngược lại thì các ứng dụng cũ có các state mà đơn nhiệm không có sẽ... mất bới tính năng, mất công phát triển lại lắm, cũng giống như các apps chạy qua VM giả lập trên BB10 có nhiều cái không đầy đủ tính năng như chạy trên Android.
Android hiện tại thì vẫn đang phát triển, và bên cạnh đó chính những yếu điểm của nó cũng có lợi ích làm kéo theo cuộc đua phần cứng. Tạm không nói đến vấn đề tư tưởng thiết kế của iOS tốt hơn hay Android tốt hơn. Nhưng có một điều rõ ràng ta phải công nhận, Android là một cuộc cánh mạng, vì nó cho chúng ta có thêm lựa chọn và nhờ đó thúc đẩy thế giới sang một thời kỳ mới, kỷ nguyên của smartphone và điện toán di động.
Ta không thể nào trông chờ vào một cái gì đó hoàn hảo, vì điều hoàn hảo vốn không tồn tại trên thế giới này, mọi thứ đều có điểm tốt và điểm xấu của, điều chúng ta phải làm là học cách chấp nhận. Có thể một ngày nào đó Android sẽ tàn lụi, sau khi làm tốt nhiệm vụ của nó, và sau đó có thể Google sẽ lại tung ra một người kế nhiệm của nó "The Android reborn as beginner"
Bài viết có tham khảo một số thông tin từ:
http://developer.android.com
http://developer.apple.com
http://www.xda-developers.com
XDA | The future is computing
The world’s best source for computing news, reviews, editorials guides, and more.
xda-developers.com
Một món quà dành cho những người đã bỏ thời gian đọc bài viết của mình 😃