Hẳn các bác đều đã làm quen với Linux kernel nhưng các khái niệm cơ bản hay cách thức hoạt động của nó các bác đã thực sự nắm rõ chưa :3 nếu chưa thì xin mời đến với loạt bài này của em: (Bài viết khá nhàm chán do đa phần là lý thuyết ^^ e sẽ cố trình bày dễ hiểu nhất)…
————————————————————————
****Kernel là gì và nhiệm vụ:
Kernel là 1 lớp nằm giữa phần cứng và phần mềm. Nhằm mục đích quản lý mọi yêu cầu từ các ứng dụng đến phần cứng và đóng vai trò là một driver cấp thấp để điều khiển các thiết bị và các thành phần của hệ thống. Có nhiều cách để đánh giá kernel như:
– Kernel có thể được coi là một máy tăng cường từ hướng đánh giá của application. Ví dụ để hiểu rõ chức năng của máy tăng cường, giả sừ khi kernel thao tác với ổ cứng, nó cần quyết định dữ liệu cư trú tại đường dẫn nào cần để copy dữ liệu, lệnh nào cần được gửi…Về phía appication chỉ cần yêu cầu dữ liệu nào sẽ được gửi. Còn gửi như thế nào sẽ là công việc của kernel. Application không trực tiếp tác động vào phần cứng mà chỉ có kernel có thể.
– Coi kernel như một resource manager. Trong cách nhìn nhận này, kernel là một cá thể chia sẻ tài nguyên có sẵn, có giới hạn của hệ thống như thời gian sử dụng CPU, bộ nhớ, kết nối mạng,.. giữa các process mà vẫn bảo toàn được hệ thống.
– Cũng có thể coi kernel như một library cung cấp một tập hợp lệnh điều khiển hệ thống.
****Các cách triển khai kernel
Microkernels: trong cách triển khai này chỉ có các function cơ bản, thiết yếu được implement trong kernel. Tất cả các function khác được giao cho các process độc lập, các process sẽ giao tiếp với kernel thông qua các giao diện giao tiếp, ví dụ như hệ thống filesystem, hệ thống quản lý bộ nhớ… Về lý thuyết, cách tiếp cận này rất khéo léo vì các phần được tách riêng với nhau, điều này yêu cầu các lập trình viên cần có trình độ lập trình nhất định. Lợi ích khác là có khả năng mở rộng động và khả năng swap các thành phần quan trọng trong thời gian thực. Dù vậy nó cũng có hạn chế, thời gian CPU cần để thực hiện giao tiếp giữa cách thành phần tốn nhiều hơn nên nó không được áp dụng trong thực tế.
Monolithic Kernels: Với cách này, toàn bộ mã của kernel bao gồm tất cả các subsystem của nó như quản lý bộ nhớ, filesystem,… và được đóng gói thành một file duy nhất. Mỗi function có quyền truy cập vào toàn bộ các phần khác của kernel. Nó dẫn đến việc chồng chéo mã nguồn nếu không cẩn thận. Nhưng hiệu suất của nó lại lớn hơn microkernels nên nó vẫn được sử dụng đến ngày nay
Có một cách triển khai mới được giới thiệu “Modules”. Với việc kernel code có thể được chèn thêm hoặc gỡ bỏ trong khi hệ thống vẫn chạy.
****Các thành phần của kernel:
Trước khi tìm hiểu cần hiểu rõ các khái niệm processes, task switching and scheduling
Processes: các ứng dụng, servers và các chương trình khác chạy trên Unix đều được coi là process. Mỗi process được cấp phát một không gian địa chỉ ảo (virtual memory) của CPU. Không gian địa chỉ này của mỗi process là hoàn toàn độc lập với nhau nên nó giúp cho process nghĩ rằng chỉ có mình nó trong hệ thống.
Vì linux là hệ điều hành đa nhiệm, nó giúp người dùng có cảm giác nhiều process được chạy đồng thời. Có nhiều process trong hệ thống mà chỉ có một process nhất định được phép sử dụng CPU trong cùng một thời điểm nên kernel cần switch các process một cách nhanh chóng để người dùng có cảm giác đa nhiệm. Lúc này có 2 vấn đề, switch như thế nào và một process được phép sử dụng CPU trong thời gian bao lâu:
Task switching: Mỗi process riêng biệt cần có ảo tưởng rẳng CPU luôn sẵn sàng hoạt động. Vậy khi một process được đặt vào trạng thái không hoạt động, giải phóng tài nguyên CPU để chuyển đổi sang process khác cần phải lưu giữ lại các trạng thái của nó -> Khi process hoạt động trở lại, các tài nguyên được khôi phục. sự chuyển đổi giữa các process được biết đến là task switching.
Scheduling: Kernel cần quyết định xem phải chia sẻ thời gian sử dụng CPU như thế nào giữa các process. Các process quan trọng cần có thời gian sử dụng CPU lâu hơn. Cách quyết định process nào sẽ được chạy trong thời gian bao lâu được gọi là scheduling.
Very interesting. Thank you guys.