Mình đã viết một bài (có lẽ là phải sửa lại không dưới 5 lần mới hơi vừa ý) cho sách của các bạn Spiderum nói về lập trình nhúng trong quyển sách về IT tới. Trong đó, mình có đề cập về một lợi thế nhỏ của các thiết bị nhúng. Thường thì các thiết bị nhúng này tuy là chậm hơn cả ngàn lần một chiếc máy tính cá nhân hay server nhưng mà có thể đảm bảo về thời gian phản hồi hay làm việc mà máy tính cá nhân rất nhanh và có rất nhiều lõi không làm được.
Giả sử như mình phải lập trình một cái máy trợ tim, cứ một giây nó phải bơm một giọt máu một lần. Cho rằng điện năng không thành vấn đề, và có người đề xuất làm máy trợ tim đấy bằng chip nhanh nhất của Intel hay Apple chạy Linux hay iOS có được không? Câu trả lời là không.
Thật sự một nhân CPU chỉ chạy được một "chương trình" (nói đúng hơn là một luồng -- thread) một lúc. Tuy thế, các hệ điều hành đa nhiệm phổ biến như Linux, Windows hay iOS cho ta ảo giác chạy được nhiều chương trình một lúc. Hệ điều hành làm việc này bằng cách chuyển ra chuyển vào các chương trình chạy này rất đều đặn, mỗi chương trình chỉ chạy vài milligiây. Cũng như một nhà có một chiếc xe máy, thì ai khi cần đều có thể lấy xe máy đi giải quyết công chuyện, thế là ai trong nhà cũng nói mình có xe máy. Phần lớn công việc hàng ngày thì CPU máy tính chạy nhanh đến nỗi việc chuyển ra chuyển vào này không thành vấn đề. Nhưng đó là trên thực tế, trên lý thuyết các các hệ điều hành phổ biến này không đảm bảo được nó có bao giờ cho ai chuyển vào dùng CPU không. Cũng như nhà có xe máy này không đảm bảo cho mọi người việc có xe máy khi ai đột nhiên cần dùng xe máy để chở người đi bệnh viện.
Bạn đã nhin thấy thông báo này chưa?
Đó cũng là lý do khi ta dùng Windows, có cái gì dùng hết RAM và Windows bận nới RAM ảo ra thì tất cả các chương trình chạy trên đó đều "not responding" -- tức là "treo đơ" -- trong khi không phải lỗi của chúng. Cũng như nhiều khi đang nghe nhạc MP3 mà máy tính phải xử lý cái gì thì có lúc âm thanh nó giật giật cà lăm cà lăm. Lý do là soundcard cần được đút cho ăn trước khi nó nhả hết sóng âm. Một chương trình chơi MP3 phải đút cho soundcard một đoạn âm thanh vài milligiây một lần. Khi chương trình chơi MP3 được phân bố ít thời gian quá nó không đút kịp cho soundcard thì âm thanh sẽ bị giật.
Chính vì lý do này, ở các ứng dụng mà thời gian phản hồi phải tuyệt đối đảm bảo thì người ta không thể dùng một hệ điều hành đa nhiệm bình thường. Thay vào đó, ta phải dùng hoặc là một hệ thống đơn nhiệm (single-threaded, bare-metal) hoặc là hệ điều hành đa nhiệm thời gian thực (Real-time OS). Nếu ai đã từng dùng Raspberry Pi sẽ thấy rằng viết ứng dụng để chạy đại khái ổn, làm việc đại khái tốt trên đó thì rất dễ nhưng để nhanh và đảm bảo trên Pi thì rất khó. Lý do vì máy tính này vừa chậm lại có một hệ điều hành không đảm bảo thời gian thực.
Đây là một điều rất ngược đời mà khi làm việc bên ngoài mình mới thật sự hiểu được có những lúc thời gian xử lý của một hệ thống đa nhiệm có thể chậm đến mức nào.
Đọc thêm: