Nhân Linux và các chức năng cốt lõi của một hệ điều hành
Trong bài viết này, chúng ta sẽ cùng tìm hiểu về lịch sử của nhân Linux (Linux kernel), một số lợi ích khi sử dụng Linux và một vài chức năng cốt lõi của một hệ điều hành.
Ai đã phát triển hệ điều hành Linux?
Phía dưới tiêu đề của bài viết chính là hình ảnh của Linus Torvalds người đã phát triển Linux vào năm 1991. Linus bắt đầu phát triển Linux như một dự án cá nhân khi đang theo học ngành khoa học máy tính tại Đại học Helsinki. Ý định ban đầu của ông là tạo ra một hạt nhân miễn phí dựa trên Unix. Và theo thời gian, dự án này trở thành một trong những hệ thống miễn phí được sử dụng, nghiên cứu và luôn nhận được một sự quan tâm đặc biệt trong giới công nghệ cho đến tận bây giờ.
Lợi ích mà Linux đem lại
Có lẽ rằng lợi ích đầu tiên và cũng là quan trọng nhất của Linux chính là nó không phải là một hệ điều hành mang tính thương mại. Mã nguồn Linux có giấy phép GNU General Public License, có nghĩa là bất kỳ ai cũng có quyền truy cập để sử dụng mã nguồn cho việc nghiên cứu. Bạn có thể xem mã nguồn của Linux tại đây: https://github.com/torvalds/linux.
Ngoài ra tính công khai này của mã nguồn Linux cũng mang lại một số lợi ích quan trọng khác. Điển hình như việc Linux hoàn toàn miễn phí để tải xuống và sử dụng và hoàn toàn có thể tùy chỉnh. Cũng chính vì thế, kể từ khi Linux được tạo ra vào năm 1991, mã nguồn của nó đã được đóng góp bởi vô số developer giỏi - những kỹ sư về công nghệ này đã giúp cho Linux trở thành một trong những hệ thống mạnh nhất hiện nay.
Hệ điều hành hoạt động như thế nào?
Thực chất về mặt kỹ thuật, Linux không phải là một hệ điều hành (Operating System) mà là một nhân (Kernel) - tức đoạn mã đầu tiên được nạp vào RAM khi máy tính được khởi động. Kernel cung cấp các chức năng chính để điều hành mọi thứ khác trên hệ thống, chẳng hạn như giao tiếp với phần cứng, quyền truy cập vào bộ nhớ và hơn thế nữa.
Tuy nhiên, hạt nhân vẫn còn thiếu nhiều thứ để giúp cho hệ điều hành hoạt động, theo cách mà chúng ta đã quen. Ví dụ, hạt nhân thiếu màn hình đồ họa, hệ thống tệp, trình biên dịch, trình soạn thảo văn bản,... Những tiện ích này thường được tìm thấy trong Linux Distributions - là hệ điều hành hoàn chỉnh được xây dựng dựa trên nhân Linux. Vì hạt nhân có vai trò quan trọng trong việc định hình và quyết định khả năng của một hệ thống nên các nhà khoa học máy tính thường sử dụng thuật ngữ hệ điều hành và hạt nhân để thay thế cho nhau.
Các vai trò chính của một hệ điều hành:
Giao tiếp với phần cứng (chẳng hạn như RAM, CPU, đĩa cứng,...)
Cung cấp môi trường cho các chương trình cấp cao hơn thực thi
Một điểm chính cần lưu ý về các vai trò được liệt kê ở trên là tất cả các chương trình cấp cao hơn đều yêu cầu quyền truy cập vào một số phần cứng để thực thi. Trong các hệ thống giống Unix, hệ điều hành hoạt động như một liên lạc giữa các chương trình người dùng và phần cứng. Vì vậy, bất cứ khi nào một chương trình cần quyền truy cập vào phần cứng, nó cần phải yêu cầu một số tài nguyên đưuọc cung cấp bởi hệ điều hành. Trong đó hạt nhân chịu trách nhiệm xác định xem có thực hiện yêu cầu hay không. Giả sử yêu cầu được chấp thuận, hạt nhân sẽ giao tiếp với phần cứng thay cho chương trình người dùng.
Hệ thống giao tiếp phần cứng này được quản lý thông qua việc sử dụng các chế độ thực thi. Các chế độ này do phần cứng đưa vào, đặt ra các hạn chế cụ thể tùy thuộc vào chế độ chương trình đang ở. Về cơ bản, các chương trình của người dùng hoạt động ở Chế độ người dùng (User mode), có nghĩa là chúng có quyền truy cập vào một tập hợp con nhỏ trong tài nguyên của hệ thống. Tuy nhiên, hạt nhân hoạt động ở Kernel mode, có nghĩa là nó có quyền truy cập vào tất cả những gì hệ thống cung cấp.
Process vs Program (Tiến trình vs Chương trình)
Một phần trừu tượng rất quan trọng được tìm thấy trong mọi hệ điều hành là tiến trình. Các tiến trình được định nghĩa là “một thực thể của một chương trình đang được thực thi”. Một tiến trình yêu cầu một số tài nguyên nhất định để chạy, đó là bộ nhớ và quyền truy cập vào CPU. Tiến trình chạy trong một không gian địa chỉ (address space) - một tập con của bộ nhớ mà hạt nhân cho phép tiến trình được truy cập. Thêm vào đó, quyền truy cập vào CPU chỉ được cấp khi bộ lập lịch - một thành phần cơ bản trong hệ điều hành - tiến hành cấp quyền truy cập.
Xử lý nhiều tiến trình (Handling Multiple Processes)
Giả sử rằng cả tôi và Jimbo thức dậy vào một buổi sáng và phát hiện ra rằng mỗi người chúng tôi nợ 1000 đô la cho việc sửa chữa ô tô. Jimbo sống cách tôi khoảng 15 phút và ở gần một chi nhánh khác của ngân hàng. Vì vậy, mỗi chúng tôi đều đến các chi nhánh gần nơi ở của mình và rút $1000.
Có hai kết có thể xảy ra: kết quả rõ ràng nhất là một trong hai khoản rút tiền của chúng tôi được xử lý trước và người còn lại đang cố gắng rút $1000 từ tài khoản hiện có số dư là $0.
Tuy nhiên, một kết quả khác vẫn có thể xảy ra nếu ngân hàng nơi tôi rút đọc số dư tài khoản của tôi và thấy $1000. Đồng thời, ngân hàng của Jimbo cũng thấy rằng số dư tài khoản là $1000. Sau đó, cả hai ngân hàng đều kích hoạt rút tiền vào cùng một thời điểm và chúng tôi còn lại số dư - $1000.
Hệ điều hành có trách nhiệm ngăn chặn tình trạng này thông qua việc sử dụng mutex’s và semaphores. Cả hai thuật ngữ này rất quan trọng khi nói về các hệ thống xử lý đa chương giống như Linux.
Ngoài xử lý những rủi ro về việc bộ nhớ được chia sẻ giữa nhiều tiến trình, một điều không nen bỏ qua là cách mà Linux quản lý việc thực thi nhiều tiến trình trong đó có hai lệnh gọi hệ thống là fork () và exit (), chúng được sử dụng để tạo và hủy các quy trình tương ứng.
Một tiến trình gọi ra lệnh gọi hệ thống (system call) fork() được gọi là tiến trình mẹ, trong khi tiến trình mới sinh ra được gọi là tiến trình con. Vì chúng ta biết rằng một tiến trình về cơ bản là một quá trình thực thi tuần tự các dòng của một chương trình, nên dễ dàng suy ra khả năng sinh ra các tiến trình mới nằm ở đâu.
Ví dụ sẽ là các trò chơi có tính năng trò chuyện thoại, chẳng hạn như Call of Duty. Khi bạn tham gia sảnh đợi trước trò chơi, bạn có thể giao tiếp với những người chơi khác trong trò chơi. Tiến trình cốt lõi của trò chơi là liên hệ với máy chủ Call of Duty, tìm thấy một sảnh để bạn tham gia, tạo ra một tiến trình con xử lý giao tiếp giữa bạn và những người chơi khác.
Một câu hỏi quan trọng là làm thế nào các tiến trình biết khi nào kết thúc. Ví dụ như sau khi rời khỏi trò chơi Call of Duty, bạn có thể nghe thấy tiếng nói chuyện luyên thuyên của đồng đội không? Ví thế mà, đồng bộ hóa các tiến trình là một chức năng cốt lõi khác của hệ điều hành.
Xử lý bộ nhớ (Handling Memory)
Quản lý bộ nhớ được xem là khía cạnh phức tạp nhất của Linux. Linux triển khai một số hệ thống để cho phép truy cập bộ nhớ một cách an toàn và đáng tin cậy. Các hệ thống này bao gồm:
Kernel Memory Allocator: Đây là một hệ thống con bên trong hạt nhân có nhiệm vụ đáp ứng các yêu cầu bộ nhớ từ tất cả các phần của hệ thống. Các yêu cầu này có thể đến từ các hệ thống con, hạt nhân khác hoặc các lệnh gọi hệ thống từ các chương trình người dùng.
Bộ nhớ đệm: Bộ nhớ đệm cho phép truy cập vào bộ nhớ nhanh hơn khi xử lý trên đĩa cứng. Giao tiếp với đĩa cứng cực kỳ chậm so với giao tiếp với RAM, vì vậy Linux có một hệ thống "đoán" các thông tin mà một tiến trình có thể cần từ đĩa cứng và lưu trữ một bản sao của nó trên RAM. Sau đó, khi tiến trình đưa ra yêu cầu đối với thông tin đó, hạt nhân trước tiên sẽ kiểm tra bộ đệm, nếu thông tin được tìm thấy trên bộ nhớ đệm (cache) thì tốc độ truy cập bộ nhớ sẽ nhanh hơn nhiều.