UNIX

UNIX là một hệ điều hành đa người dùng, đa nhiệm được Ken Thompson, Dennis Ritchie và các đồng nghiệp bắt đầu phát triển tại Bell Labs ở Hoa Kỳ vào năm 1969, đồ...

Phân loạiHệ điều hành, Hệ điều hành kiểu Unix
Nhà phát triểnKen Thompson, Dennis Ritchie và những người khác
Tổ chức phát triểnBell Labs
Bắt đầu phát triển1969
Phiên bản đầu tiênPhiên bản thứ nhất của Research UNIX năm 1971
Môi trường chạy đầu tiênDEC PDP-7
Ngôn ngữ triển khai chínhHợp ngữ, C (ngôn ngữ lập trình)
Kiến trúc nhânNhân nguyên khối
Chức năng chínhĐa người dùng, đa nhiệm, chia sẻ thời gian
Giao diện người dùngShell, Giao diện dòng lệnh
Các nhánh chínhResearch UNIX, System V, BSD
Các tiêu chuẩn chínhPOSIX, Single UNIX Specification
Quản lý nhãn hiệuThe Open Group
Giấy phépKhác nhau tùy theo phiên bản và nhánh
from computerhistory.org

UNIX là một hệ điều hành đa người dùng, đa nhiệm được Ken Thompson, Dennis Ritchie và các đồng nghiệp bắt đầu phát triển tại Bell Labs ở Hoa Kỳ vào năm 1969, đồng thời cũng là tên gọi dùng để chỉ họ hệ điều hành bắt nguồn từ hệ thống này và môi trường vận hành đã được tiêu chuẩn hóa. UNIX thời kỳ đầu được phát triển với mục tiêu tạo ra một hệ điều hành chia sẻ thời gian đơn giản và linh hoạt, có thể sử dụng trên những hệ thống tương đối nhỏ. Nó đã thiết lập các cấu trúc như hệ thống tệp phân cấp, tiến trình, shell và hệ thống lệnh dựa trên việc kết hợp các chương trình nhỏ. Hệ thống đầu tiên chạy trên PDP-7, sau đó được chuyển sang PDP-11. Khi phần lớn hệ điều hành được viết lại bằng C (ngôn ngữ lập trình), UNIX trở thành một trong những ví dụ tiêu biểu về hệ điều hành có thể được chuyển sang nhiều kiến trúc máy tính khác nhau.[1]

Trong UNIX, tệp không chỉ được sử dụng làm phương tiện lưu trữ dữ liệu mà còn đóng vai trò là giao diện chung để xử lý thiết bị và tài nguyên nhập xuất. Các chương trình thường được cấu thành từ những công cụ nhỏ thực hiện các tác vụ cụ thể, thay vì một chương trình duy nhất đảm nhiệm toàn bộ một chức năng phức tạp. Người dùng chạy chương trình thông qua shell và có thể sử dụng đường ống cùng cơ chế chuyển hướng nhập xuất để kết nối đầu vào và đầu ra của nhiều chương trình. Cấu trúc này đã ảnh hưởng sâu sắc đến các hệ điều hành, công cụ phát triển và môi trường lập trình về sau. Cho đến ngày nay, các nguyên tắc thiết kế của UNIX vẫn được sử dụng trong máy chủ, máy trạm, máy tính cá nhân, thiết bị di động và hệ thống nhúng.

Về mặt lịch sử, UNIX ban đầu dùng để chỉ hệ điều hành gốc được phát triển tại Bell Labs cùng các phiên bản kế tiếp của nó. Tuy nhiên, khi mã nguồn được cung cấp cho các trường đại học và doanh nghiệp, UNIX đã phân nhánh thành BSD, System V và nhiều dòng UNIX thương mại khác. Sau đó, các hệ điều hành tương thích với UNIX hoặc triển khai cấu trúc tương tự như Linux, FreeBSDOpenBSD xuất hiện, khiến các thuật ngữ “hệ điều hành kiểu Unix” hoặc “hệ điều hành Unix-like” cũng được sử dụng rộng rãi để bao quát những hệ thống này. Tuy nhiên, ngay cả khi Linux và các hệ điều hành thuộc họ BSD kế thừa phần lớn giao diện và truyền thống thiết kế của UNIX, không phải mọi hệ điều hành kiểu Unix đều đã nhận được chứng nhận UNIX chính thức.

Hiện nay, UNIX® được viết bằng chữ in hoa cũng là một nhãn hiệu đã đăng ký do The Open Group quản lý. Để một hệ điều hành có thể chính thức sử dụng tên gọi UNIX, nó phải đáp ứng Single UNIX Specification và nhận được chứng nhận. Tiêu chuẩn này định nghĩa giao diện lệnh, lời gọi hệ thống, shell, các tiện ích chung và môi trường thực thi.[2] Các đặc tả cốt lõi của Single UNIX Specification được phát triển cùng với POSIX và ISO/IEC 9945, qua đó xác định một môi trường vận hành tiêu chuẩn để ứng dụng có thể sử dụng những giao diện nhất quán trên các hệ điều hành khác nhau.[3][4]

UNIX không chỉ có nghĩa là một sản phẩm hệ điều hành duy nhất. Tùy theo ngữ cảnh, cần phân biệt UNIX lịch sử của Bell Labs, các họ hệ điều hành bắt nguồn từ UNIX, những hệ điều hành kiểu Unix tuân theo triết lý thiết kế UNIX và các hệ điều hành đã được chứng nhận là đáp ứng Single UNIX Specification. Cấu trúc và các tiêu chuẩn của UNIX, bao quát nhiều ý nghĩa như vậy, tiếp tục ảnh hưởng đến sự hình thành mô hình tiến trình, hệ thống tệp, quản lý quyền hạn, môi trường dòng lệnh, phần mềm mạng và giao diện lập trình hệ thống của các hệ điều hành hiện đại.

Lịch sử

Multics và bối cảnh phát triển

Nguồn gốc của UNIX có thể được truy ngược về Multics, một hệ thống được Viện Công nghệ Massachusetts, Bell LabsGeneral Electric cùng phát triển vào giữa thập niên 1960. Multics hướng tới mục tiêu trở thành một hệ thống chia sẻ thời gian đa dụng, cho phép nhiều người dùng đồng thời sử dụng một máy tính lớn duy nhất, đồng thời bao gồm những khái niệm tiên tiến vào thời điểm đó như hệ thống tệp phân cấp, liên kết động, quyền truy cập và cô lập tiến trình. Ken Thompson, Dennis Ritchie, Douglas McIlroy, Joe Ossanna cùng những người khác tại Bell Labs đã tham gia dự án này và qua đó trải nghiệm tiềm năng của điện toán tương tác và hệ điều hành chia sẻ thời gian.[5]

Tuy nhiên, mục tiêu và cấu trúc của Multics quá phức tạp, trong khi lịch trình phát triển và chi phí cũng liên tục gia tăng. Bell Labs rút khỏi dự án Multics vào năm 1969, nhưng các nhà nghiên cứu không muốn quay lại môi trường điện toán xử lý theo lô trước đó. Thay vào đó, họ muốn triển khai môi trường làm việc tương tác đã trải nghiệm trong Multics dưới dạng một hệ thống nhỏ hơn và đơn giản hơn. UNIX không phải là một hệ điều hành chỉ đơn giản thu nhỏ các chức năng của Multics, mà là kết quả của việc thiết kế lại những khái niệm cốt lõi như môi trường chia sẻ thời gian và hệ thống tệp trên phần cứng có tài nguyên hạn chế.[6]

Sự phát triển của UNIX thời kỳ đầu

Sau khi dự án Multics kết thúc, Ken Thompson tiến hành chuyển 《Space Travel》, một trò chơi mô phỏng thiên văn, sang nhiều loại máy tính khác nhau. Ông phát hiện một máy PDP-7 của DEC gần như không được sử dụng tại Bell Labs và tự viết mã tính toán dấu phẩy động, chức năng hiển thị đồ họa cùng các công cụ gỡ lỗi để chạy trò chơi trên máy tính này. Các chương trình này chạy trên PDP-7, nhưng trong giai đoạn phát triển ban đầu, chúng phải được viết bằng trình hợp dịch chéo chạy trên GE-635 rồi chuyển sang PDP-7 thông qua băng giấy.[7]

Năm 1969, Thompson triển khai một hệ thống tệp phân cấp cho PDP-7, sau đó lần lượt viết các tiện ích sao chép, xóa và hiển thị nội dung tệp, chức năng thực thi tiến trình, trình thông dịch lệnh, trình soạn thảo và trình hợp dịch. Sau khi trình hợp dịch riêng được hoàn thành, các chương trình dành cho UNIX có thể được viết và chạy ngay trên UNIX. Vào khoảng thời điểm này, UNIX thời kỳ đầu bắt đầu hình thành như một hệ điều hành độc lập.

Đôi khi UNIX thời kỳ đầu được mô tả là đã được viết bằng C (ngôn ngữ lập trình) ngay từ đầu, nhưng cách giải thích này đã nhầm lẫn giữa thời điểm UNIX ra đời và thời điểm nó được tái triển khai sau đó. Trong UNIX đầu tiên dành cho PDP-7, không chỉ nhân hệ điều hành mà tất cả chương trình, bao gồm shell và các lệnh quản lý tệp, đều được viết bằng hợp ngữ PDP-7. Vào thời điểm đó, hệ thống thậm chí còn chưa có trình hợp dịch macro hay trình liên kết, vì vậy mỗi chương trình phải được viết dưới dạng mã phụ thuộc máy hoàn chỉnh và độc lập.[8][9]

Ngôn ngữ bậc cao đầu tiên được sử dụng trong UNIX cũng không phải là C. Douglas McIlroy đã chuyển TMG, một ngôn ngữ dùng để xây dựng trình biên dịch, sang hệ thống, còn Ken Thompson sử dụng nó để phát triển B (ngôn ngữ lập trình), một ngôn ngữ chịu ảnh hưởng từ BCPL. B được sử dụng để viết các chương trình hệ thống như trình biên dịch và trình hợp dịch, nhưng không phải là ngôn ngữ dùng để triển khai UNIX đầu tiên, đồng thời cũng không ngay lập tức thay thế nhân và các tiện ích chính ban đầu.[10]

PDP-11 và các phiên bản đầu tiên

Do PDP-7 quá hạn chế để tiếp tục nghiên cứu, nhóm phát triển tìm cách có được một máy tính mạnh hơn. Joe Ossanna và các nhà nghiên cứu nhận được sự chấp thuận đưa PDP-11/20 vào sử dụng với danh nghĩa phát triển một hệ thống xử lý văn bản cho bộ phận bằng sáng chế của Bell Labs. PDP-11 được chuyển đến vào mùa hè năm 1970, nhưng do ổ đĩa được cung cấp chậm, nhóm phát triển trước tiên sử dụng trình hợp dịch chéo chạy trên PDP-7 để viết một hệ thống cơ bản chỉ hoạt động trong bộ nhớ.[11]

UNIX đầu tiên dành cho PDP-11 cũng không phải là một hệ điều hành được viết bằng C. Nó gần với một phiên bản chuyển cấu trúc và mã của bản PDP-7 sang hợp ngữ PDP-11, trong khi nhân và các tiện ích chính tiếp tục được triển khai bằng hợp ngữ. roff dành cho PDP-7 cũng được viết lại bằng hợp ngữ PDP-11, còn trình hợp dịch của chính UNIX cũng được tái triển khai bằng hợp ngữ thay vì một ngôn ngữ bậc cao.[12]

Ngôn ngữ B nhanh chóng được chuyển sang PDP-11 sau khi máy này được đưa vào sử dụng và được dùng để viết một số chương trình như dc. Tuy nhiên, trình biên dịch B khi đó tạo ra mã thông dịch tương đối chậm thay vì mã máy trực tiếp, trong khi cấu trúc xử lý dữ liệu theo đơn vị từ của B cũng không phù hợp với PDP-11 sử dụng cơ chế định địa chỉ theo byte. Vì vậy, phương án viết lại toàn bộ hệ điều hành bằng B không được triển khai một cách đầy đủ, và ngôn ngữ triển khai của UNIX PDP-11 thời kỳ đầu vẫn tiếp tục là hợp ngữ.[13]

Ấn bản đầu tiên của 《UNIX Programmer’s Manual》, được viết vào năm 1971, thường được sử dụng làm mốc cho phiên bản thứ nhất của Research Unix. Phiên bản thứ nhất chạy trên PDP-11/20 và bao gồm hệ thống tệp, chức năng tạo tiến trình, shell, trình soạn thảo văn bản ed, công cụ sắp chữ roff cùng nhiều lệnh khác. Vào thời điểm này, UNIX đã là một hệ điều hành được sử dụng trong công việc xử lý tài liệu thực tế, nhưng vẫn chưa phải là một hệ điều hành được triển khai bằng C.

Sự ra đời của đường ống

Khái niệm đường ống dùng để kết nối đầu ra của nhiều chương trình đã liên tục được Douglas McIlroy đề xuất, và đến năm 1973, Ken Thompson triển khai nó trong hệ thống UNIX thực tế. Nhờ đường ống, đầu ra chuẩn của một chương trình có thể được chuyển trực tiếp thành đầu vào chuẩn của chương trình khác mà không cần lưu vào tệp tạm thời. Để phù hợp với cơ chế này, các lệnh hiện có cũng được sửa đổi để đọc từ đầu vào chuẩn khi không có tệp đầu vào riêng được chỉ định và xuất kết quả ra đầu ra chuẩn.[14]

Sự ra đời của đường ống đã biến các lệnh UNIX từ một tập hợp chương trình độc lập thành một hệ thống công cụ có thể kết hợp với nhau. Thay vì triển khai một chức năng phức tạp trong một chương trình lớn duy nhất, người dùng có thể kết nối các chương trình nhỏ trong shell để tạo ra tác vụ mới. Điều này trở thành nền tảng cốt lõi của triết lý UNIX, thường được diễn đạt là “tạo ra các chương trình làm tốt một việc và khiến các chương trình có thể hoạt động cùng nhau”.

Viết lại bằng ngôn ngữ C và tính khả chuyển

Chỉ sau khi UNIX ra đời, một ngôn ngữ bậc cao phù hợp để triển khai hệ điều hành này mới dần được phát triển. B, được sử dụng trên PDP-7, là ngôn ngữ do Ken Thompson tạo ra dựa trên BCPL. Từ năm 1971, Dennis Ritchie bắt đầu phát triển một ngôn ngữ mới bằng cách bổ sung hệ thống kiểu dữ liệu và khả năng xử lý dữ liệu theo byte vào B. Ngôn ngữ này về sau trở thành C (ngôn ngữ lập trình).[15]

Vì vậy, mối quan hệ giữa UNIX và C được mô tả chính xác hơn là “C được tạo ra trong quá trình triển khai và phát triển UNIX vốn đã được viết bằng hợp ngữ, sau đó UNIX được viết lại bằng C”, thay vì “UNIX ban đầu được tạo ra bằng C”. C phát triển song song với UNIX, nhưng không phải là một ngôn ngữ đã hoàn thiện trước UNIX. Cả UNIX đầu tiên dành cho PDP-7 lẫn UNIX PDP-11 thời kỳ đầu đều dựa trên hợp ngữ.

Trong suốt năm 1972, trình biên dịch C và hệ thống kiểu dữ liệu của ngôn ngữ tiếp tục được phát triển. Đến năm 1973, phần lớn nhân UNIX dành cho PDP-11 được viết lại bằng C. Chỉ một số đoạn mã phụ thuộc trực tiếp vào phần cứng, chẳng hạn như xử lý ngắt và chuyển đổi ngữ cảnh, vẫn được giữ lại bằng hợp ngữ. Việc viết lại này diễn ra khoảng bốn năm sau khi UNIX lần đầu được tạo ra vào năm 1969. Kể từ thời điểm đó, UNIX chuyển từ một hệ điều hành gắn chặt với hợp ngữ của một bộ xử lý cụ thể thành một hệ điều hành được triển khai chủ yếu bằng ngôn ngữ bậc cao.[16][17]

Việc viết lại bằng C tạo cơ hội tổ chức lại cấu trúc nội bộ của UNIX và đưa cơ chế đa chương trình vào hệ thống, đồng thời chứng minh rằng C có thể được sử dụng một cách thực tế cho lập trình hệ thống. Sau đó, các tiện ích và ứng dụng cũng dần được chuyển sang C. Khi phạm vi mã phụ thuộc phần cứng giảm xuống, nền tảng để chuyển UNIX sang nhiều kiến trúc máy tính khác nhau được hình thành.

Công bố và phổ biến Research UNIX

Năm 1973, Ken Thompson và Dennis Ritchie giới thiệu UNIX tại một hội nghị về các nguyên lý hệ điều hành. Năm 1974, họ công bố bài 〈The UNIX Time-Sharing System〉 trên tạp chí học thuật 《Communications of the ACM》. Bài báo mô tả hệ thống tệp, tiến trình, shell và phương pháp triển khai UNIX, qua đó làm gia tăng số lượng yêu cầu sử dụng UNIX từ các trường đại học và cơ sở nghiên cứu.[18]

Vào thời điểm đó, do các quy định đối với ngành viễn thông tại Hoa Kỳ, AT&T gặp khó khăn trong việc triển khai hoạt động kinh doanh máy tính giống như một sản phẩm thương mại thông thường. Vì vậy, UNIX được cung cấp cho các trường đại học và cơ sở nghiên cứu với mã nguồn và mức chi phí tương đối thấp. Trong một số hợp đồng đại học thời kỳ đầu năm 1974, các tổ chức có thể sử dụng hệ thống nội bộ cho mục đích giáo dục và học thuật, đồng thời chỉ phải trả 150 đô la phí hành chính thay vì phí sử dụng phần mềm.[19]

Việc cung cấp mã nguồn có ảnh hưởng quan trọng đến cách UNIX được phổ biến. Các nhà nghiên cứu và sinh viên tại trường đại học có thể trực tiếp đọc và sửa đổi cách triển khai nhân cùng các lệnh, phát triển hỗ trợ phần cứng mới, chương trình và chức năng mạng rồi chia sẻ chúng với các tổ chức sử dụng UNIX khác. UNIX không chỉ được sử dụng như một sản phẩm hoàn chỉnh, mà còn trở thành nền tảng chung cho giáo dục, nghiên cứu và thử nghiệm hệ điều hành. Nhiều thế hệ lập trình viên hệ thống đã học cấu trúc hệ điều hành thông qua mã nguồn UNIX.

Phiên bản thứ sáu của UNIX, được phân phối vào năm 1975, trở thành một trong những phiên bản đầu tiên được sử dụng rộng rãi bên ngoài Bell Labs và được chuyển đến nhiều trường đại học cùng cơ sở nghiên cứu. Phiên bản thứ bảy năm 1979 được đánh giá là một trong những phiên bản có ảnh hưởng lớn nhất của dòng Research Unix thời kỳ đầu, đồng thời trở thành nền tảng chung cho nhiều hệ thống UNIX sau này, bao gồm cả nhánh AT&T và BSD. Phiên bản thứ bảy bao gồm shell được cải tiến, môi trường phát triển C, các công cụ xử lý tài liệu và tiện ích hệ thống, đồng thời tạo nền tảng để chuyển UNIX sang những máy tính khác ngoài PDP-11, chẳng hạn như VAX.[20]

Sự hình thành của BSD

Đại học California, Berkeley là một trong những trường đại học lớn đưa UNIX vào sử dụng. Vào giữa thập niên 1970, Bill Joy, khi đó là nghiên cứu sinh tại Berkeley, bổ sung môi trường Pascal cùng các chương trình như trình soạn thảo exvi vào UNIX. Gói tập hợp những công cụ này được phân phối dưới tên 1BSD vào năm 1978. Sau đó, 2BSD tiếp tục được phát hành và hình thành dòng Berkeley Software Distribution.

Berkeley phát triển 3BSD, hỗ trợ bộ nhớ ảo, dựa trên 32V, một phiên bản UNIX dành cho máy tính DEC VAX. DARPA, trực thuộc Bộ Quốc phòng Hoa Kỳ, hỗ trợ việc phát triển UNIX tại Berkeley nhằm xây dựng một môi trường vận hành chung để kết nối nhiều loại máy tính nghiên cứu khác nhau. Trên cơ sở đó, Computer Systems Research Group được thành lập. 4BSD năm 1980 và 4.1BSD năm 1981 bao gồm bộ nhớ ảo, điều khiển công việc, shell mới và các cải tiến hiệu năng hệ thống.

4.2BSD, được phát hành năm 1983, đưa vào giao diện socket, ngăn xếp giao thức TCP/IP, Fast File System, cơ chế xử lý tín hiệu mới và các chức năng giao tiếp liên tiến trình. Cách triển khai mạng của 4.2BSD được phân phối rộng rãi cho các trường đại học, cơ sở nghiên cứu và nhà sản xuất máy trạm, đồng thời đóng vai trò quan trọng trong việc phổ biến TCP/IP thành giao thức truyền thông chung của các mạng nghiên cứu và Internet.[21]

Mã của BSD sau đó được sử dụng trong SunOS, Ultrix, NeXTSTEP và nhiều hệ thống UNIX thương mại. Ngoài ra, API socket, vi, C shell, các công cụ mạng TCP/IP cùng nhiều giao diện hệ thống được phát triển trong BSD cũng được đưa vào UNIX thuộc nhánh AT&T và các hệ điều hành khác. Nhờ đó, BSD phát triển vượt ra ngoài phạm vi một phiên bản sửa đổi của Research Unix để trở thành một nhánh UNIX lớn và độc lập.

Thương mại hóa và System V

Năm 1982, AT&T công bố UNIX System III, hợp nhất nhiều nhánh phát triển UNIX nội bộ. System III là một phiên bản thương mại kết hợp không chỉ Research Unix của Bell Labs mà còn các chức năng được phát triển trong Programmer’s Workbench và UNIX Support Group của AT&T. Tiếp đó, UNIX System V được công bố vào năm 1983 và trở thành dòng sản phẩm UNIX chủ lực được AT&T chính thức hỗ trợ và kinh doanh.[22]

Sau khi AT&T bị chia tách vào năm 1984, những hạn chế đối với thị trường máy tính và phần mềm được giảm bớt, khiến quá trình thương mại hóa UNIX được đẩy mạnh. AT&T cấp phép System V cho các nhà sản xuất phần cứng, còn các nhà sản xuất sửa đổi hệ thống để phù hợp với kiến trúc máy tính và sản phẩm của riêng họ. Nhiều hệ thống UNIX thương mại xuất hiện, chẳng hạn như AIX của IBM, HP-UX của Hewlett-Packard và IRIX của Silicon Graphics. Microsoft và Santa Cruz Operation cũng phát triển Xenix dành cho máy tính cá nhân.

Trên thị trường UNIX thương mại, các nhánh dựa trên AT&T System V và các nhánh dựa trên chức năng BSD vừa cạnh tranh vừa liên tục trao đổi chức năng với nhau. System V phát triển cơ chế giao tiếp liên tiến trình, hệ thống nhập xuất STREAMS, công cụ quản trị và cơ chế hỗ trợ thương mại. Trong khi đó, BSD duy trì ảnh hưởng mạnh trong TCP/IP, socket, bộ nhớ ảo và môi trường sử dụng tương tác.

System V Release 4 năm 1989 là phiên bản được AT&T và Sun Microsystems hợp tác phát triển nhằm tích hợp các chức năng chính của System V, BSD, SunOS và Xenix. SVR4 trở thành nền tảng chung cho nhiều hệ thống UNIX thương mại, sau đó được sử dụng trong Solaris của Sun, Novell UnixWare và các hệ thống khác.[23]

Cuộc chiến UNIX

Trong thập niên 1980, khi nhiều nhà sản xuất phần cứng và doanh nghiệp phần mềm phát triển phiên bản UNIX riêng, sự khác biệt giữa các lệnh, lời gọi hệ thống và thư viện ngày càng lớn. Ngay cả giữa các hệ thống thuộc cùng họ UNIX cũng không có gì bảo đảm rằng ứng dụng có thể chạy mà không cần sửa đổi. Mỗi doanh nghiệp đều cố gắng biến cách triển khai và tiêu chuẩn của mình thành trung tâm của thị trường.

Năm 1987, khi AT&T và Sun Microsystems quyết định phát triển một UNIX hợp nhất kết hợp các chức năng của System V và BSD, các nhà sản xuất khác lo ngại rằng AT&T và Sun có thể thống trị thị trường UNIX. Các công ty như IBM, DEC và HP thành lập Open Software Foundation vào năm 1988 và phát triển OSF/1. Để đáp lại, AT&T cùng các doanh nghiệp hợp tác thành lập UNIX International. Cuộc cạnh tranh này không chỉ diễn ra quanh việc triển khai hệ điều hành mà còn mở rộng sang môi trường đồ họa, công nghệ điện toán phân tán, tiêu chuẩn và nhãn hiệu, dẫn tới cái gọi là “cuộc chiến UNIX”.[24]

Cuộc chiến UNIX thúc đẩy sự phát triển công nghệ và mở rộng lựa chọn, nhưng đồng thời cũng làm gia tăng số lượng sản phẩm và giao diện không tương thích với nhau. Khi mỗi nhà sản xuất phần cứng cung cấp UNIX và môi trường phát triển riêng, các nhà phát triển ứng dụng phải hỗ trợ từng nền tảng một cách riêng biệt. Sự phân mảnh này càng làm nổi bật nhu cầu về công việc tiêu chuẩn hóa nhằm xác định các giao diện chung.

POSIX và các tiêu chuẩn hệ thống mở

Việc tiêu chuẩn hóa khả năng tương thích UNIX được nhiều tổ chức và doanh nghiệp tiến hành từ đầu thập niên 1980. System V Interface Definition của AT&T, X/Open Portability Guide bắt nguồn từ các nhóm người dùng UNIX tại châu Âu, cùng công việc của các tổ chức tiêu chuẩn hóa Hoa Kỳ và IEEE được triển khai song song. Trong số đó, POSIX do IEEE phát triển tập trung vào việc tiêu chuẩn hóa các giao diện hệ thống, shell và hành vi của tiện ích mà ứng dụng sử dụng, thay vì cấu trúc triển khai nội bộ của hệ điều hành.

Tiêu chuẩn POSIX.1 đầu tiên, IEEE 1003.1-1988, được công bố vào năm 1988. Các chương trình tuân theo POSIX có thể sử dụng các hàm và giao diện tiêu chuẩn mà không phụ thuộc trực tiếp vào cấu trúc nội bộ của một sản phẩm UNIX cụ thể. Điều này nâng cao tính khả chuyển của mã nguồn giữa các hệ thống UNIX và hệ điều hành kiểu Unix khác nhau.[25]

X/Open xác định một môi trường ứng dụng mà nhiều nhà sản xuất UNIX có thể cùng hỗ trợ. X/Open Portability Guide định nghĩa lời gọi hệ thống, lệnh, ngôn ngữ lập trình, quản lý dữ liệu và giao diện đồ họa, đồng thời xác nhận việc tuân thủ tiêu chuẩn bằng cách cấp nhãn hiệu cho các hệ thống đáp ứng đặc tả. Công việc này về sau trở thành nền tảng của Single UNIX Specification.

Sự độc lập của BSD và các dòng phần mềm tự do

Berkeley bắt đầu xây dựng một hệ thống có thể phân phối mà không cần giấy phép mã nguồn UNIX của AT&T bằng cách thay thế mã AT&T trong BSD bằng mã do chính họ viết. Năm 1988, Networking Release 1, tập trung vào mã mạng TCP/IP, được công bố. Đến năm 1991, Networking Release 2, bao gồm nhiều mã hệ thống hơn, được phân phối.[26]

386BSD và BSD/386 được phát triển dựa trên Networking Release 2, từ đó FreeBSD, NetBSD và sau này là OpenBSD được hình thành. Tuy nhiên, UNIX System Laboratories cho rằng các bản phân phối BSD có chứa mã và bí mật thương mại của mình, nên đã khởi kiện Đại học Berkeley và Berkeley Software Design. Theo thỏa thuận năm 1994, một số tệp được sửa đổi hoặc loại bỏ, còn Berkeley phân phối 4.4BSD-Lite, trong đó phần lớn mã AT&T đã bị loại bỏ.

Tranh chấp pháp lý và quá trình xử lý mã đã làm chậm sự phổ biến của các dòng BSD có thể phân phối tự do, nhưng 4.4BSD-Lite về sau trở thành nền tảng của FreeBSD, NetBSD, OpenBSD và nhiều hệ điều hành khác. Mã của dòng BSD cũng được truyền tiếp qua NeXTSTEP và Darwin đến macOSiOS, trong khi ngăn xếp mạng và các tiện ích hệ thống của nó còn được sử dụng trong những hệ điều hành ngoài dòng UNIX.

Nhãn hiệu UNIX và Single UNIX Specification

Hoạt động kinh doanh cùng quyền sở hữu trí tuệ liên quan đến UNIX được chuyển qua nhiều tổ chức theo sự thay đổi trong cơ cấu doanh nghiệp của AT&T. Năm 1989, AT&T tách hoạt động kinh doanh UNIX thành UNIX System Laboratories. Năm 1993, Novell mua lại UNIX System Laboratories. Cũng trong năm đó, Novell tách quyền nhãn hiệu UNIX khỏi các sản phẩm mã nguồn cụ thể và chuyển nó cho X/Open, một tổ chức tiêu chuẩn hóa trung lập.[27]

Sau khi quyền nhãn hiệu được chuyển giao, UNIX chuyển từ ý nghĩa một dòng mã nguồn duy nhất do một công ty cụ thể phát triển thành một thương hiệu chứng nhận được cấp cho các hệ điều hành đáp ứng đặc tả công khai. X/Open kết hợp môi trường ứng dụng chung hiện có với các đặc tả giao diện UNIX để thiết lập Single UNIX Specification, đồng thời giới thiệu thương hiệu UNIX 95 vào năm 1995. Các nhà sản xuất hệ điều hành phải vượt qua thử nghiệm phù hợp và quy trình chứng nhận để có thể chính thức sử dụng nhãn hiệu UNIX.[28]

Năm 1996, X/Open và Open Software Foundation hợp nhất để thành lập The Open Group. Kể từ đó, The Open Group quản lý nhãn hiệu UNIX, chương trình chứng nhận và Single UNIX Specification. Tiêu chuẩn UNIX được duy trì cùng với POSIX của IEEE và ISO/IEC 9945, sau đó phát triển thành UNIX 98, UNIX 03 và các hệ thống chứng nhận về sau.[29]

Linux và sự mở rộng của hệ điều hành kiểu Unix

Trong thập niên 1980, các nỗ lực xây dựng một hệ điều hành tự do tương thích với UNIX cũng bắt đầu xuất hiện. Richard Stallman công bố Dự án GNU vào năm 1983 và bắt đầu phát triển một hệ điều hành tự do tương thích với UNIX. Dự án GNU phát triển các trình biên dịch, shell và tiện ích hệ thống như GCC, GNU C Library, Bash và Coreutils, nhưng quá trình phát triển nhân cần thiết để cấu thành một hệ điều hành hoàn chỉnh diễn ra chậm.

Năm 1991, Linus Torvalds bắt đầu phát triển nhân Linux, qua đó hình thành một hệ điều hành kiểu Unix tự do kết hợp các công cụ GNU với nhân Linux. Linux không phải là hệ điều hành trực tiếp bắt nguồn từ mã nguồn UNIX gốc của AT&T, mà là một nhân triển khai độc lập các giao diện lập trình và môi trường sử dụng của UNIX. Tuy nhiên, bằng cách tuân theo POSIX cùng mô hình tiến trình, hệ thống tệp, quyền truy cập và môi trường shell của dòng UNIX, Linux nhanh chóng phổ biến trên máy chủ, siêu máy tính, thiết bị nhúng và nền tảng di động.

Sự phát triển của Linux và các dòng BSD tự do đã mở rộng trung tâm của hệ sinh thái UNIX từ những sản phẩm thương mại cụ thể sang các hệ điều hành kiểu Unix được phát triển công khai. Đồng thời, UNIX thương mại tiếp tục được sử dụng trong thị trường máy chủ lớn và máy trạm. Những hệ thống như Solaris, AIX và HP-UX tiếp tục phát triển kết hợp với phần cứng doanh nghiệp.

UNIX và hệ điều hành kiểu Unix hiện đại

UNIX hiện đại không chỉ có nghĩa là những phiên bản kế tiếp trực tiếp của Research Unix lịch sử. Hiện nay, tên gọi UNIX chính thức có thể được sử dụng cho các hệ thống đáp ứng Single UNIX Specification của The Open Group và đã được chứng nhận. Dòng dõi mã nguồn của hệ điều hành và tình trạng chứng nhận là hai yếu tố được phân biệt với nhau. Ngay cả một hệ thống trực tiếp hoặc gián tiếp bắt nguồn từ mã nguồn UNIX cũng không thể sử dụng thương hiệu UNIX chính thức nếu chưa được chứng nhận. Ngược lại, việc tuân thủ đặc tả công khai là tiêu chí cốt lõi của chứng nhận hơn là một dòng dõi mã nguồn lịch sử cụ thể.[30]

macOS là một hệ điều hành kiểu Unix sử dụng không gian người dùng dựa trên BSD của Darwin và nhân XNU, trong đó nhiều phiên bản đã nhận chứng nhận Single UNIX Specification. Các hệ thống UNIX thương mại truyền thống như IBM AIX và HP-UX cũng duy trì hệ thống chứng nhận. Linux, FreeBSD và OpenBSD thường được phân loại là các hệ điều hành kiểu Unix tuân theo cấu trúc và giao diện của UNIX, nhưng toàn bộ bản phân phối hoặc hệ thống không nhất thiết đã nhận chứng nhận UNIX.

Dòng lịch sử của UNIX đã phân tách thành nhiều nhánh, nhưng mô hình tiến trình, hệ thống tệp phân cấp, shell và đường ống, cùng môi trường lập trình hệ thống dựa trên C được hình thành tại Bell Labs thời kỳ đầu vẫn tiếp tục tồn tại trong các hệ điều hành hiện đại. UNIX khởi đầu như một sản phẩm duy nhất, sau đó mở rộng thành một cộng đồng mã nguồn học thuật, một thị trường hệ điều hành thương mại, các tiêu chuẩn công khai và hệ sinh thái phần mềm tự do. Nó tiếp tục có ảnh hưởng sâu rộng đến cấu trúc hệ điều hành và văn hóa phát triển của điện toán hiện đại.

Cấu trúc và hoạt động

UNIX được cấu thành từ nhân hệ điều hành, bộ phận quản lý phần cứng và tài nguyên hệ thống, cùng các chương trình không gian người dùng sử dụng những chức năng do nhân cung cấp. Ứng dụng thường không trực tiếp điều khiển phần cứng mà yêu cầu nhân thực hiện truy cập tệp, tạo tiến trình, quản lý bộ nhớ, nhập xuất thiết bị và liên lạc thông qua các lời gọi hệ thống. Shell và các tiện ích dòng lệnh cũng là chương trình không gian người dùng nằm bên ngoài nhân. Vì vậy, môi trường người dùng của UNIX không chỉ được hình thành từ một nhân duy nhất mà từ sự kết hợp giữa shell, thư viện hệ thống và nhiều tiện ích khác nhau.

UNIX lịch sử và các hệ điều hành thuộc họ UNIX hiện đại khác nhau về quy mô triển khai và cấu trúc nội bộ. Nhân UNIX thời kỳ đầu có cấu trúc tương đối nhỏ, xử lý quản lý tiến trình, hệ thống tệp và nhập xuất thiết bị trong một không gian địa chỉ nhân duy nhất. Trong khi đó, UNIX và các hệ điều hành kiểu Unix hiện đại bao gồm bộ nhớ ảo, lập lịch đa bộ xử lý, ngăn xếp mạng, hệ thống bảo mật và nhiều loại hệ thống tệp. Tuy nhiên, mô hình thực thi cơ bản dựa trên tiến trình, bộ mô tả tệp, hệ thống tệp phân cấp, lời gọi hệ thống, shell và đường ống để kết nối các chương trình vẫn tiếp tục được duy trì.[31]

Nhân và không gian người dùng

Nhân là phần cốt lõi của hệ điều hành, quản lý các tài nguyên như thời gian bộ xử lý, bộ nhớ, thiết bị lưu trữ, thiết bị đầu cuối và giao diện mạng. Nhân phân phối tài nguyên giữa các tiến trình đang chạy và phân tách vùng thực thi để một tiến trình không thể tùy ý thay đổi bộ nhớ của tiến trình khác hoặc của nhân. Việc xử lý ngắt phát sinh từ thiết bị và thực hiện các yêu cầu nhập xuất thông qua hệ thống tệp cùng trình điều khiển thiết bị cũng là nhiệm vụ của nhân.

Trong không gian người dùng, shell, trình biên dịch, trình soạn thảo, công cụ quản trị hệ thống, daemon và các ứng dụng thông thường được thực thi. Những chương trình này chạy ở mức đặc quyền hạn chế của bộ xử lý. Khi cần truy cập tài nguyên được bảo vệ, chúng sử dụng lời gọi hệ thống để chuyển quyền điều khiển thực thi sang nhân. Nhân kiểm tra tác vụ được yêu cầu có được phép hay không, thực hiện tác vụ rồi trả kết quả hoặc lỗi về cho tiến trình gọi.

Sự phân chia giữa nhân và không gian người dùng có nghĩa là không phải mọi thành phần của UNIX đều nằm trong nhân. Những chức năng như diễn giải lệnh, hiển thị danh sách tệp, tìm kiếm văn bản và sao chép tệp thường do các chương trình không gian người dùng độc lập như sh, ls, grepcp đảm nhiệm. Vì vậy, các chương trình này có thể được thay thế hoặc triển khai lại, đồng thời nhiều shell và môi trường người dùng khác nhau có thể được xây dựng trên cùng một nhân.

Nhân UNIX truyền thống được phân loại là kiến trúc nhân nguyên khối, trong đó các dịch vụ chính của hệ điều hành được cung cấp bên trong nhân. Tuy nhiên, các hệ điều hành thuộc họ UNIX hiện đại cũng sử dụng cấu trúc cho phép bổ sung mô-đun nhân trong lúc hệ thống đang chạy hoặc tách một số chức năng thành các lớp riêng biệt. Ngoài ra còn có những cách triển khai kết hợp nhiều yếu tố thiết kế nhân khác nhau, như XNU của macOS. Vì vậy, không phải mọi hệ điều hành thuộc họ UNIX đều có cấu trúc nhân nội bộ hoàn toàn giống nhau.

Lời gọi hệ thống

Lời gọi hệ thống là giao diện để chương trình không gian người dùng yêu cầu chức năng của nhân. Những ví dụ tiêu biểu bao gồm open để mở tệp, readwrite để đọc và ghi dữ liệu, fork để tạo tiến trình, họ exec để thực thi chương trình, wait để chờ tiến trình kết thúc, mmap để ánh xạ bộ nhớ và socket để tạo điểm cuối liên lạc.

Ứng dụng thường không trực tiếp viết lệnh gọi hệ thống mà gọi các hàm do thư viện chuẩn C hoặc thư viện hệ thống cung cấp. Hàm thư viện sắp xếp các đối số cần thiết rồi chuyển vào nhân theo quy ước gọi được hệ điều hành và bộ xử lý quy định. Nhân kiểm tra số hiệu lời gọi hệ thống và các đối số, thực hiện tác vụ tương ứng rồi trả kết quả gọi dưới dạng số nguyên, con trỏ hoặc giá trị khác.

Lời gọi hệ thống và hàm thư viện thông thường không phải là một. Lời gọi hệ thống vượt qua ranh giới của nhân để thực thi chức năng được bảo vệ của hệ điều hành, trong khi hàm thư viện thông thường có thể hoàn thành việc tính toán hoặc xử lý dữ liệu hoàn toàn trong không gian người dùng. Chẳng hạn, hàm tính độ dài chuỗi không cần truy cập nhân, nhưng hàm đọc dữ liệu từ tệp cuối cùng phải sử dụng chức năng nhập xuất của nhân.

POSIX định nghĩa các giao diện hệ thống chính mà ứng dụng có thể sử dụng cùng hành vi của chúng, nhưng không quy định rằng phương thức triển khai chức năng đó bên trong nhân phải giống nhau. Vì vậy, các hệ điều hành thuộc họ UNIX khác nhau có thể cung cấp cùng giao diện open, forkexec, trong khi sử dụng cấu trúc dữ liệu và thuật toán nội bộ khác nhau.[32]

Tiến trình và môi trường thực thi

Trong UNIX, đơn vị cơ bản của một chương trình đang chạy là tiến trình. Nếu chương trình là tệp thực thi tồn tại trên thiết bị lưu trữ, thì tiến trình là trạng thái trong đó chương trình đó được nạp vào bộ nhớ và thực sự được thực thi. Nhiều tiến trình có thể được tạo từ một tệp thực thi duy nhất, và mỗi tiến trình có mã định danh tiến trình cùng ngữ cảnh thực thi riêng.

Ngữ cảnh thực thi của tiến trình bao gồm mã và dữ liệu chương trình, ngăn xếp, các bộ mô tả tệp đang mở, thư mục làm việc hiện tại, biến môi trường, mã định danh người dùng và nhóm, trạng thái xử lý tín hiệu cùng giới hạn tài nguyên. Trong các hệ điều hành thuộc họ UNIX hiện đại, một tiến trình có thể chứa nhiều luồng. Các luồng chia sẻ tài nguyên như không gian địa chỉ và bộ mô tả tệp của cùng một tiến trình, đồng thời có luồng thực thi riêng.

Các tiến trình chạy trong những không gian địa chỉ ảo độc lập với nhau. Một tiến trình thường không thể trực tiếp đọc hoặc ghi bộ nhớ của tiến trình khác. Khi cần, chúng sử dụng các chức năng giao tiếp liên tiến trình như đường ống, socket và bộ nhớ dùng chung. Sự phân tách này làm giảm khả năng lỗi của một chương trình lan truyền trực tiếp sang tiến trình khác hoặc toàn bộ hệ điều hành, đồng thời tạo nền tảng để cô lập công việc của những người dùng khác nhau trong môi trường đa người dùng.

Mỗi tiến trình được liên kết với các mã định danh biểu thị người dùng và nhóm thực, cùng mã định danh người dùng và nhóm hiệu lực được sử dụng để kiểm tra quyền. Khi xử lý yêu cầu như truy cập tệp hoặc điều khiển tiến trình khác, nhân kiểm tra thông tin xác thực này và quyền truy cập của tài nguyên đích.

Tạo tiến trình và thực thi chương trình

Việc tạo tiến trình trong UNIX truyền thống được thực hiện bằng sự kết hợp giữa lời gọi hệ thống fork và họ exec. fork tạo một tiến trình con mới dựa trên tiến trình cha gọi nó. Sau fork, tiến trình cha và tiến trình con chạy như hai tiến trình khác nhau, nhưng tiến trình con kế thừa ngữ cảnh thực thi cùng các bộ mô tả tệp đang mở của tiến trình cha.[33]

Trong mô hình khái niệm ban đầu, có thể giải thích rằng tiến trình con sao chép nội dung bộ nhớ của tiến trình cha. Trong các cách triển khai hiện đại, thay vì lập tức sao chép toàn bộ bộ nhớ thực, tiến trình cha và tiến trình con thường chia sẻ cùng các trang bộ nhớ vật lý ở chế độ chỉ đọc. Khi một bên thay đổi nội dung, chỉ trang tương ứng mới được sao chép bằng cơ chế sao chép khi ghi. Điều này làm giảm việc sao chép bộ nhớ không cần thiết trong luồng xử lý phổ biến, nơi một chương trình khác được thực thi ngay sau fork.

Họ lời gọi hệ thống exec không tạo thêm một tiến trình mới mà thay thế ảnh chương trình của tiến trình hiện tại bằng một tệp thực thi khác. Nếu thực thi thành công, mã, dữ liệu và ngăn xếp của chương trình cũ được thay thế bằng nội dung của chương trình mới, nhưng mã định danh tiến trình vẫn được giữ nguyên. Các bộ mô tả tệp không được cấu hình để tự động đóng cũng có thể tiếp tục được chương trình mới kế thừa.

Khi thực thi một lệnh bên ngoài trong shell, shell thường tạo tiến trình con bằng fork. Tiến trình con thiết lập chuyển hướng nhập xuất và kết nối đường ống, sau đó gọi exec để tự thay thế bằng chương trình được yêu cầu. Nếu đó là tác vụ chạy ở tiền cảnh, shell cha chờ đến khi tiến trình con kết thúc hoặc thay đổi trạng thái. Nếu đó là tác vụ chạy nền, shell tiếp tục nhận lệnh nhập.

Việc tách riêng thao tác tạo tiến trình và thực thi chương trình cho phép điều chỉnh thư mục làm việc, biến môi trường, quyền người dùng và bộ mô tả tệp trước khi chương trình mới bắt đầu. Shell sử dụng cấu trúc này để thay đổi kết nối nhập xuất chuẩn trước khi thực thi, ngay cả khi chương trình riêng biệt không được viết để nhận biết đặc biệt về chuyển hướng nhập xuất hoặc đường ống.

Môi trường POSIX hiện đại còn định nghĩa posix_spawn, biểu diễn việc tạo tiến trình và thực thi chương trình trong một giao diện duy nhất bên cạnh sự kết hợp giữa forkexec. Giao diện này có thể được sử dụng trong những hệ thống mà việc sao chép toàn bộ không gian địa chỉ gây tốn kém hoặc một quy trình tạo riêng hiệu quả hơn tùy theo môi trường triển khai.[34]

Cây tiến trình và kết thúc

Các tiến trình được tạo bằng fork hình thành quan hệ cha và con. Mỗi tiến trình có mã định danh tiến trình riêng và mã định danh tiến trình cha, còn quan hệ tạo tiến trình tạo thành một cấu trúc phân cấp. Khi hệ thống khởi động, nhân thực thi tiến trình không gian người dùng đầu tiên. Các dịch vụ hệ thống và tiến trình người dùng sau đó được tạo ra từ dòng tiến trình này.

Khi một tiến trình kết thúc, nhân giải phóng không gian địa chỉ và các tài nguyên đang mở mà tiến trình sử dụng. Tuy nhiên, nhân tạm thời giữ lại mã định danh tiến trình, mã thoát và một số thống kê thực thi để tiến trình cha có thể kiểm tra trạng thái kết thúc. Một tiến trình đã kết thúc nhưng trạng thái chưa được tiến trình cha thu hồi bằng wait hoặc giao diện liên quan thường được gọi là tiến trình zombie.

Nếu tiến trình cha kết thúc trước tiến trình con, hệ điều hành chuyển quan hệ cha của tiến trình con sang một tiến trình hệ thống khác để xử lý. Đối tượng tiếp nhận cụ thể và cách xử lý nội bộ có thể khác nhau tùy cách triển khai UNIX, nhưng hệ thống cung cấp một chủ thể có thể thu hồi trạng thái kết thúc của tiến trình con để trạng thái này không tồn tại vĩnh viễn.

Tiến trình có thể kết thúc bằng việc trả về bình thường hoặc gọi exit, cũng có thể bị kết thúc do lỗi không được xử lý hoặc tín hiệu từ tiến trình khác. Trạng thái kết thúc được truyền đến tiến trình cha hoặc shell. Trong script shell, giá trị này có thể được dùng để xác định lệnh có thành công hay không và quyết định luồng xử lý tiếp theo.

Lập lịch tiến trình và chia sẻ thời gian

UNIX là một hệ điều hành đa nhiệm, trong đó nhiều tiến trình cùng sử dụng một hệ thống. Nếu số tiến trình có thể chạy nhiều hơn số bộ xử lý, bộ lập lịch của nhân quyết định tiến trình nào được chạy và chạy vào thời điểm nào. Mỗi tiến trình có thể chạy trong một khoảng thời gian ngắn rồi nhường cơ hội thực thi cho tiến trình khác, khiến người dùng có cảm giác nhiều tác vụ diễn ra đồng thời.

Tiến trình có thể ở các trạng thái như đang chạy, có thể chạy, đang chờ hoặc bị dừng. Tiến trình chờ đầu vào từ tệp hoặc mạng được chuyển sang trạng thái chờ cho đến khi kết quả sẵn sàng. Trong thời gian đó, bộ xử lý thực thi các tiến trình có thể chạy khác. Khi nhập xuất hoàn tất hoặc sự kiện được chờ xảy ra, tiến trình trở lại trạng thái có thể chạy.

Bộ lập lịch của các hệ điều hành thuộc họ UNIX hiện đại xem xét mức ưu tiên, mức sử dụng bộ xử lý, khả năng phản hồi tương tác, chính sách thời gian thực và tải của nhiều bộ xử lý. Thuật toán lập lịch cụ thể khác nhau giữa các hệ điều hành, vì vậy không thể coi một thuật toán duy nhất là cấu trúc cố định của toàn bộ UNIX. Ngoài môi trường chia sẻ thời gian thông thường, POSIX còn định nghĩa một số chính sách lập lịch thời gian thực và giao diện ưu tiên.

Mô hình chia sẻ thời gian của UNIX phát triển trong môi trường nhiều người dùng kết nối vào cùng một máy tính qua thiết bị đầu cuối. Hệ thống phải xử lý đồng thời các công việc tính toán kéo dài và công việc tương tác lặp lại những lệnh ngắn. Mức ưu tiên tiến trình và cơ chế chiếm quyền trở thành phương tiện điều chỉnh khả năng phản hồi cùng tổng thông lượng.

Bộ nhớ ảo

Các hệ điều hành thuộc họ UNIX hiện đại cung cấp cho mỗi tiến trình một không gian địa chỉ bộ nhớ ảo độc lập. Địa chỉ mà chương trình sử dụng thường không trực tiếp trùng với vị trí trong bộ nhớ vật lý. Nhân và đơn vị quản lý bộ nhớ của bộ xử lý ánh xạ địa chỉ ảo sang các trang vật lý thực tế.

Không gian địa chỉ ảo có thể được cấu thành từ mã thực thi, dữ liệu tĩnh, heap được cấp phát động, ngăn xếp lưu lời gọi hàm và biến cục bộ, thư viện dùng chung cùng các vùng ánh xạ bộ nhớ. Nhiều tiến trình sử dụng cùng một tệp thực thi hoặc thư viện dùng chung có thể chia sẻ vật lý các trang mã không bị thay đổi, trong khi vẫn duy trì không gian địa chỉ độc lập với nhau.

Khi tiến trình truy cập một trang chưa được nạp vào bộ nhớ vật lý, lỗi trang phát sinh. Nhân đọc dữ liệu cần thiết từ tệp thực thi, tệp đã ánh xạ, vùng hoán đổi hoặc nguồn khác, đặt nó vào một trang vật lý rồi tiếp tục thực thi tiến trình. Nếu bộ nhớ vật lý khả dụng không đủ, hệ thống có thể thu hồi các trang ít được sử dụng hoặc chuyển chúng sang thiết bị lưu trữ phụ.

mmap, giao diện liên kết một phần của tệp với không gian địa chỉ ảo, kết hợp nhập xuất tệp và quản lý bộ nhớ. Chương trình có thể truy cập dữ liệu tệp bằng cách đọc và ghi bộ nhớ đã ánh xạ, đồng thời có thể tạo vùng bộ nhớ không trực tiếp tương ứng với tệp thông qua ánh xạ ẩn danh.

Chi tiết triển khai bộ nhớ ảo khác nhau giữa các hệ điều hành thuộc họ UNIX. Chẳng hạn, hệ thống bộ nhớ ảo của FreeBSD biểu diễn bộ nhớ ẩn danh, vùng hoán đổi, thiết bị vật lý và tệp dưới dạng các đối tượng bộ nhớ ảo, đồng thời liên kết bộ nhớ đệm hệ thống tệp với các trang bộ nhớ ảo.[35]

Hệ thống tệp phân cấp

Hệ thống tệp UNIX sử dụng một không gian tên phân cấp bắt đầu từ thư mục gốc /. Tệp và thư mục được nhận diện bằng đường dẫn như /home/user/file, trong đó mỗi tên tạo thành đường dẫn biểu thị một mục trong thư mục cha. Các thiết bị lưu trữ và hệ thống tệp riêng biệt cũng được gắn vào một thư mục cụ thể rồi liên kết vào cùng một cây thư mục.

Đường dẫn được chia thành đường dẫn tuyệt đối bắt đầu từ thư mục gốc và đường dẫn tương đối được diễn giải dựa trên thư mục làm việc hiện tại của tiến trình. Mỗi tiến trình có một thư mục làm việc hiện tại. Lệnh cd của shell thay đổi thư mục làm việc hiện tại của chính tiến trình shell. Tiến trình con thường kế thừa thư mục làm việc hiện tại của tiến trình cha.

Thư mục không trực tiếp lưu nội dung thực tế của tệp mà đóng vai trò liên kết tên với đối tượng hệ thống tệp. Trong hệ thống tệp UNIX truyền thống, siêu dữ liệu của tệp được lưu trong inode, còn mục thư mục liên kết tên với số inode. Inode chứa loại tệp, quyền truy cập, chủ sở hữu, kích thước, thông tin thời gian và dữ liệu dùng để tìm vị trí nội dung, nhưng thường không chứa chính tên tệp.

Khả năng tạo liên kết cứng, tức liên kết nhiều tên thư mục với cùng một tệp, cũng xuất phát từ việc tên tệp và đối tượng tệp được tách riêng. Không gian lưu trữ của tệp được thu hồi khi tất cả liên kết cứng đã bị xóa và không còn tiến trình nào mở tệp. Ngược lại, liên kết tượng trưng là một đối tượng tệp riêng chứa một đường dẫn khác làm nội dung và dẫn đến đường dẫn đích trong quá trình phân giải đường dẫn.

Việc xóa tệp cũng không giống với việc lập tức vô hiệu hóa bộ mô tả tệp đang mở. Ngay cả khi tên bị xóa khỏi thư mục, nếu một tiến trình vẫn đang mở tệp thì nhân tiếp tục duy trì đối tượng tệp đã mở. Không gian lưu trữ chỉ có thể được giải phóng sau khi tham chiếu cuối cùng được đóng. Nguyên nhân là bộ mô tả tệp tham chiếu đến trạng thái tệp đang mở chứ không phải chính tên đường dẫn.[36]

Các loại tệp

Trong UNIX, tệp thông thường được xem là một chuỗi byte không bị bắt buộc phải có cấu trúc bản ghi nội bộ đặc biệt. Ý nghĩa của tệp văn bản, tệp thực thi, ảnh và tệp cơ sở dữ liệu được chương trình đọc dữ liệu diễn giải thay vì hệ thống tệp. Cấu trúc này cho phép cùng giao diện readwrite được sử dụng với nhiều định dạng dữ liệu khác nhau.

Thư mục cũng là một loại đối tượng hệ thống tệp, nhưng vì phải quản lý quan hệ tương ứng giữa tên và đối tượng tệp nên chương trình thông thường không thể tùy ý sửa đổi nó như một mảng byte. Việc tạo thư mục và thay đổi mục được thực hiện thông qua các giao diện chuyên dụng như mkdir, link, unlinkrename.

Ngoài ra, không gian tên hệ thống tệp có thể chứa tệp thiết bị ký tự và khối đại diện cho thiết bị, FIFO dùng cho giao tiếp liên tiến trình, socket đại diện cho điểm cuối liên lạc và liên kết tượng trưng. Tùy theo loại tệp, các thao tác có thể thực hiện cùng ý nghĩa của read, write và di chuyển vị trí sẽ khác nhau.

Cụm từ “mọi thứ đều là tệp” không có nghĩa UNIX lưu mọi đối tượng dưới dạng một tệp thông thường hoàn toàn giống nhau. Chính xác hơn, nó có nghĩa nhiều loại tài nguyên nhập xuất được thiết kế để có thể xử lý thông qua bộ mô tả tệp và các giao diện chung như read, writeclose. Tệp thông thường, thiết bị đầu cuối, đường ống và socket là những đối tượng khác nhau, nhưng có thể được kết nối bằng phương thức nhập xuất chung trong chương trình.

Bộ mô tả tệp

Bộ mô tả tệp là một số nguyên nhỏ biểu thị tài nguyên nhập xuất mà tiến trình đang mở. Khi tiến trình mở tệp bằng open hoặc tạo đối tượng liên lạc bằng pipesocket, nhân trả về một bộ mô tả tệp khả dụng. Sau đó, chương trình sử dụng số này trong các lời gọi như read, writeclose thay vì liên tục truyền lại đường dẫn.

Bộ mô tả tệp không phải là nội dung tệp hay mã định danh tệp toàn cục, mà là một mục trong bảng bộ mô tả tệp của một tiến trình cụ thể. Mỗi mục tham chiếu đến trạng thái tệp đang mở do nhân quản lý. Trạng thái này liên kết với vị trí tệp hiện tại, chế độ truy cập và các cờ trạng thái. Nhiều bộ mô tả tệp cũng có thể tham chiếu đến cùng một trạng thái tệp đang mở.

dup và các giao diện liên quan tạo một bộ mô tả tệp mới trỏ đến cùng trạng thái tệp đang mở với bộ mô tả hiện có. Vì vậy, hai bộ mô tả chia sẻ vị trí tệp và một số trạng thái. Tiến trình con được tạo bằng fork cũng nhận bản sao các bộ mô tả tệp của tiến trình cha, và các bộ mô tả tương ứng tham chiếu đến cùng trạng thái tệp đang mở.[37][38]

Nhờ cấu trúc gián tiếp này, shell chỉ cần thay đổi kết nối của bộ mô tả tệp trước khi lệnh được thực thi. Chương trình đang chạy có thể ghi dữ liệu vào bộ mô tả đầu ra chuẩn mà không nhất thiết phải biết đầu ra của mình là thiết bị đầu cuối, tệp thông thường hay đường ống.

Bộ mô tả tệp được dùng không chỉ với tệp thông thường mà còn với thiết bị đầu cuối, đường ống, FIFO, thiết bị và socket. Giao diện socket của POSIX cũng trả về điểm cuối liên lạc được tạo dưới dạng bộ mô tả tệp, sau đó nhiều hàm socket và hàm nhập xuất sử dụng bộ mô tả này.[39]

Đầu vào chuẩn và đầu ra chuẩn

Khi chương trình bắt đầu, theo quy ước có ba bộ mô tả tệp được cung cấp làm kênh nhập xuất cơ bản. 0 biểu thị đầu vào chuẩn, 1 biểu thị đầu ra chuẩn, còn 2 biểu thị lỗi chuẩn. POSIX định nghĩa chúng lần lượt là STDIN_FILENO, STDOUT_FILENOSTDERR_FILENO.[40]

Khi chạy lệnh trong shell tương tác, ba bộ mô tả này thường được kết nối với thiết bị đầu cuối. Chương trình đọc đầu vào của người dùng từ đầu vào chuẩn và hiển thị đầu ra chuẩn cùng lỗi chuẩn trên thiết bị đầu cuối. Tuy nhiên, nếu shell đổi các bộ mô tả sang tệp hoặc đường ống khác trước khi thực thi, đích nhập và xuất của cùng chương trình có thể được thay đổi.

Việc tách đầu ra chuẩn và lỗi chuẩn cho phép gửi dữ liệu bình thường và thông báo chẩn đoán đến các đích khác nhau. Có thể truyền kết quả của chương trình sang chương trình khác trong khi vẫn để thông báo lỗi trên thiết bị đầu cuối, hoặc ghi hai luồng đầu ra vào các tệp riêng.

stdin, stdoutstderr là các đối tượng luồng do thư viện nhập xuất chuẩn C cung cấp, còn bộ mô tả tệp 0, 12 là mã định danh nhập xuất ở cấp hệ điều hành. Hai lớp này thường được kết nối nhưng không phải là cùng một đối tượng. Luồng của thư viện C bổ sung khả năng đệm và chuyển đổi định dạng, đồng thời sử dụng bộ mô tả tệp tương ứng khi cần thực hiện nhập xuất thực tế.

Shell và thực thi lệnh

Shell là chương trình không gian người dùng diễn giải lệnh do người dùng nhập và thực thi chương trình. Shell không phải là chính nhân và cũng không phải chương trình trực tiếp thực hiện mọi chức năng của hệ điều hành. Những tác vụ như sao chép hoặc tìm kiếm tệp thường do tiện ích bên ngoài thực hiện. Shell phân tích cú pháp lệnh, tạo tiến trình và thiết lập kết nối nhập xuất giữa các chương trình.

Khi xử lý dòng lệnh, shell diễn giải cú pháp như dấu ngoặc kép, ký tự thoát, thay thế biến và lệnh, mẫu tên tệp, chuyển hướng nhập xuất và đường ống. Sau đó, nó xác định lệnh là lệnh nội bộ của shell, hàm hay tệp thực thi và xây dựng môi trường thực thi cần thiết. Ngôn ngữ lệnh shell của POSIX định nghĩa hoạt động của quá trình xử lý lệnh, mở rộng từ, chuyển hướng, pipeline và cấu trúc điều khiển này.[41]

Những chức năng như cd, thiết lập biến và thay đổi tùy chọn shell phải thay đổi trạng thái của chính tiến trình shell hiện tại nên được xử lý dưới dạng lệnh nội bộ của shell. Nếu cd được thực thi trong một tiến trình con riêng biệt, chỉ thư mục hiện tại của tiến trình con thay đổi và tiến trình shell cha không bị ảnh hưởng.

Ngược lại, các lệnh như ls, grepcat thường là tệp thực thi riêng biệt. Shell tìm tệp thực thi rồi chạy chương trình đó trong tiến trình con. Script shell kết hợp khả năng thực thi lệnh này với biến, câu điều kiện, vòng lặp, hàm và kiểm tra trạng thái kết thúc để tự động hóa tác vụ.

Chuyển hướng nhập xuất

Chuyển hướng nhập xuất là chức năng kết nối bộ mô tả tệp mà lệnh sử dụng với một tệp hoặc tài nguyên khác. command > file kết nối đầu ra chuẩn của lệnh với một tệp, còn command < file kết nối tệp với đầu vào chuẩn của lệnh. Lỗi chuẩn cũng có thể được gửi đến một đích khác bằng số bộ mô tả tệp riêng.

Chuyển hướng không hoạt động bằng cách để chương trình diễn giải ký hiệu dòng lệnh sau khi bắt đầu thực thi. Shell trước tiên xử lý cú pháp chuyển hướng, mở các tệp cần thiết rồi sao chép hoặc đóng bộ mô tả tệp để xây dựng kết nối mong muốn. Chương trình sau đó mới được thực thi, vì vậy nó kế thừa đầu vào và đầu ra chuẩn đã được thay đổi.[42]

Trong chuyển hướng đầu ra, việc cắt ngắn tệp hiện có hay nối thêm vào cuối cũng được quyết định bởi các tùy chọn mà shell sử dụng khi mở tệp. Bản thân lệnh thường chỉ ghi dữ liệu vào đầu ra chuẩn và không cần phân biệt đầu ra đó là tệp mới, tệp hiện có hay thiết bị đầu cuối.

Chuyển hướng có thể được áp dụng không chỉ cho lệnh bên ngoài mà còn cho lệnh nội bộ của shell và chính môi trường thực thi của shell. Nếu chỉ thực hiện chuyển hướng mà không chỉ định lệnh mới, như tiện ích exec của POSIX, nó cũng có thể được dùng để thay đổi cấu hình bộ mô tả tệp của shell hiện tại.[43]

Đường ống và pipeline

Đường ống là một kênh liên lạc một chiều do nhân cung cấp, cho phép một tiến trình đọc dữ liệu do tiến trình khác ghi. Lời gọi hệ thống pipe trả về hai bộ mô tả tệp biểu thị đầu đọc và đầu ghi. Dữ liệu được ghi vào đầu ghi được lưu tạm thời trong nhân rồi truyền theo thứ tự qua đầu đọc.[44]

Khi thực thi một pipeline như command1 | command2 trong shell, shell tạo đường ống và kết nối đầu ra chuẩn của lệnh thứ nhất với đầu ghi của đường ống, còn đầu vào chuẩn của lệnh thứ hai với đầu đọc. Sau đó, hai chương trình được thực thi riêng biệt. Chương trình thứ nhất chỉ ghi dữ liệu vào đầu ra chuẩn, còn chương trình thứ hai chỉ đọc từ đầu vào chuẩn, vì vậy hai chương trình không cần nhận biết đặc biệt về nhau.

Dung lượng dữ liệu có thể lưu trong đường ống bị giới hạn. Nếu một tiến trình cố ghi khi đường ống đã đầy, tiến trình ghi có thể phải chờ đến khi phía đọc tiêu thụ dữ liệu. Nếu đọc từ đường ống không có dữ liệu, phía đọc có thể chờ đến khi phía ghi gửi dữ liệu hoặc tất cả các đầu ghi được đóng. Khi tất cả đầu ghi đã đóng và không còn dữ liệu, phía đọc nhận trạng thái tương tự cuối tệp.

Mỗi chương trình trong pipeline thường chạy đồng thời. Vì vậy, đường ống khác với phương thức lưu toàn bộ kết quả của lệnh thứ nhất vào một tệp tạm rồi mới bắt đầu lệnh thứ hai. Chương trình tiếp theo có thể xử lý dữ liệu ngay trong khi dữ liệu đang được tạo, đồng thời dữ liệu lớn có thể được truyền tuần tự mà không cần lưu toàn bộ trong bộ nhớ hoặc tệp tạm.

Tín hiệu

Tín hiệu là phương thức để nhân hoặc một tiến trình khác thông báo một sự kiện bất đồng bộ cho tiến trình. Thao tác ngắt của người dùng, truy cập bộ nhớ không hợp lệ, thay đổi trạng thái của tiến trình con, hết thời gian bộ định thời và việc gửi tín hiệu tường minh đều có thể phát sinh tín hiệu.

Mỗi tín hiệu có một hành động mặc định, có thể là kết thúc tiến trình, tạo core dump, dừng thực thi, tiếp tục thực thi hoặc bỏ qua. Chương trình có thể đăng ký hàm xử lý riêng cho một số tín hiệu hoặc tạm thời chặn việc phân phối tín hiệu. Tuy nhiên, cũng có những tín hiệu được định nghĩa để chương trình không thể xử lý hoặc bỏ qua, chẳng hạn tín hiệu buộc kết thúc hoặc buộc dừng thực thi.

Không thể giả định tín hiệu được truyền đồng bộ tại một vị trí thực thi chính xác như lời gọi hàm thông thường. Chương trình có thể chuyển sang trình xử lý tín hiệu tại một thời điểm được cho phép trong khi đang thực thi, vì vậy các thao tác có thể thực hiện bên trong trình xử lý tín hiệu bị hạn chế. POSIX định nghĩa riêng phạm vi các hàm an toàn với tín hiệu bất đồng bộ có thể được gọi trong ngữ cảnh xử lý tín hiệu.

Tiến trình con được tạo bằng fork kế thừa một phần cấu hình xử lý tín hiệu của tiến trình cha. Tuy nhiên, khi chạy chương trình mới bằng exec, trình xử lý tín hiệu do người dùng định nghĩa thường được đặt lại về hành động mặc định. Tín hiệu được cấu hình để bỏ qua và cách xử lý mặt nạ chặn tuân theo những quy tắc riêng.[45]

Người dùng và quyền hạn

UNIX ngay từ đầu đã được thiết kế xoay quanh môi trường nhiều người dùng cùng sử dụng một hệ thống. Mỗi tài khoản người dùng được cấp một mã định danh người dùng, và người dùng có thể thuộc một hoặc nhiều nhóm. Nhân kiểm tra quyền truy cập tệp và tài nguyên hệ thống dựa trên mã định danh người dùng và nhóm được liên kết với tiến trình.

Quyền tệp UNIX truyền thống chỉ định riêng quyền đọc, ghi và thực thi cho chủ sở hữu tệp, nhóm sở hữu và những người dùng khác. Đối với thư mục, quyền đọc liên quan đến việc xem danh sách các mục, quyền ghi liên quan đến việc tạo và xóa mục, còn quyền thực thi liên quan đến khả năng đi qua thư mục như một phần của đường dẫn.

Quyền thực thi của tệp thông thường cho biết tệp đó có thể được chạy dưới dạng chương trình hoặc script hay không. Nếu định dạng tệp thực thi là nhị phân mà nhân nhận biết, ảnh chương trình sẽ được nạp. Nếu dòng đầu tiên của script chỉ định trình thông dịch, tệp có thể được thực thi thông qua trình thông dịch đó.

Các bit quyền đặc biệt set-user-ID và set-group-ID có thể khiến chương trình được thực thi hoạt động với quyền hiệu lực của chủ sở hữu hoặc nhóm của tệp. Chức năng này được sử dụng để cho phép người dùng thông thường thực hiện một số tác vụ hệ thống bị hạn chế. Tuy nhiên, do lỗi triển khai trong chương trình chạy với đặc quyền cao có thể dẫn đến leo thang đặc quyền, chương trình cần được kiểm tra nghiêm ngặt.

Ngoài mô hình quyền truyền thống, các hệ điều hành thuộc họ UNIX hiện đại có thể bổ sung danh sách kiểm soát truy cập, kiểm soát truy cập bắt buộc, quyền dựa trên vai trò, phân tách đặc quyền theo chức năng và sandbox. Những chức năng mở rộng này khác nhau giữa các cách triển khai và bổ sung cho mô hình cơ bản gồm chủ sở hữu, nhóm và bit quyền của UNIX.

Thiết bị và tệp đặc biệt

Trong UNIX truyền thống, nhiều thiết bị phần cứng được biểu diễn dưới dạng tệp đặc biệt trong hệ thống tệp. Tệp thiết bị thường tồn tại bên dưới /dev. Khi chương trình mở, đọc hoặc ghi tệp thiết bị, trình điều khiển thiết bị tương ứng trong nhân xử lý yêu cầu.

Thiết bị ký tự đại diện cho các thiết bị xử lý dữ liệu dưới dạng luồng byte liên tục, như thiết bị đầu cuối và cổng nối tiếp. Thiết bị khối đại diện cho các thiết bị hỗ trợ truy cập theo khối có kích thước nhất định, như thiết bị lưu trữ. Tuy nhiên, lớp nhập xuất nội bộ thực tế của hệ điều hành có thể được tổ chức phức tạp hơn tùy loại thiết bị và cách triển khai.

Tệp thiết bị không chứa dữ liệu thực tế của thiết bị lưu trữ giống như tệp thông thường. Siêu dữ liệu của tệp thiết bị chứa thông tin định danh cho biết yêu cầu phải được chuyển đến trình điều khiển và phiên bản thiết bị nào. Nhân sử dụng thông tin này để gọi thao tác thiết bị thích hợp.

Vì thiết bị cũng có thể được truy cập thông qua bộ mô tả tệp, chúng chia sẻ giao diện đọc và ghi cơ bản với tệp thông thường. Tuy nhiên, những thao tác đặc thù của thiết bị khó biểu diễn bằng nhập xuất byte đơn giản, như thay đổi chế độ màn hình hoặc cấu hình giao diện mạng, có thể sử dụng giao diện điều khiển như ioctl.

Giao tiếp liên tiến trình

UNIX cung cấp nhiều phương thức giao tiếp liên tiến trình để các tiến trình được cô lập có thể trao đổi dữ liệu và phối hợp hoạt động. Những phương thức tiêu biểu bao gồm đường ống, đường ống có tên, tín hiệu, socket, bộ nhớ dùng chung, hàng đợi thông điệp và semaphore.

Đường ống ẩn danh thường được dùng giữa những tiến trình có thể kế thừa bộ mô tả tệp, như tiến trình cha và tiến trình con. Đường ống có tên, còn được gọi là FIFO, có tên trong hệ thống tệp nên cả các tiến trình không có quan hệ cha con trực tiếp cũng có thể mở cùng một đường dẫn để liên lạc.

Socket cung cấp giao diện cho phép liên lạc không chỉ giữa các tiến trình trên cùng hệ thống mà còn với tiến trình trên hệ thống khác được kết nối qua mạng. Socket miền cục bộ được dùng cho liên lạc bên trong một hệ điều hành, còn socket miền Internet có thể được liên kết với các giao thức mạng như TCP và UDP.

Bộ nhớ dùng chung cho phép nhiều tiến trình ánh xạ cùng một vùng bộ nhớ vật lý vào không gian địa chỉ riêng và trực tiếp chia sẻ dữ liệu. Cơ chế này có thể giảm việc sao chép dữ liệu, nhưng cần sử dụng mutex, semaphore hoặc thao tác nguyên tử để đồng bộ hóa, tránh việc nhiều tiến trình đồng thời thay đổi cùng một dữ liệu.

Hàng đợi thông điệp và semaphore có các giao diện phát triển từ System V cùng các giao diện do POSIX định nghĩa. Chúng có lịch sử và API khác nhau, vì vậy phương thức sử dụng cụ thể và quản lý vòng đời đối tượng có thể khác nhau ngay cả đối với các chức năng mang cùng tên.

Thiết bị đầu cuối và điều khiển công việc

Người dùng UNIX thời kỳ đầu kết nối vào máy tính trung tâm qua thiết bị đầu cuối vật lý. Trong các hệ thống hiện đại, trình giả lập thiết bị đầu cuối và thiết bị đầu cuối giả tái tạo cấu trúc này. Shell cùng chương trình tương tác liên lạc với người dùng thông qua đầu vào và đầu ra chuẩn được kết nối với thiết bị đầu cuối.

Trình điều khiển thiết bị đầu cuối có thể thực hiện chỉnh sửa theo dòng và xử lý ký tự đặc biệt trước khi truyền phím nhập đến chương trình. Trong chế độ chuẩn, đầu vào được truyền theo từng dòng. Trong chế độ không chuẩn, chương trình có thể nhận đầu vào theo từng ký tự. Trình soạn thảo văn bản, shell và chương trình toàn màn hình điều chỉnh chế độ thiết bị đầu cuối theo hành vi cần thiết.

Điều khiển công việc của shell quản lý nhiều nhóm tiến trình trên một thiết bị đầu cuối. Nhóm tiến trình tiền cảnh có thể nhận đầu vào từ thiết bị đầu cuối, trong khi nhóm tiến trình nền chạy độc lập với việc nhập lệnh của người dùng. Người dùng có thể dùng phím đặc biệt hoặc lệnh shell để dừng công việc tiền cảnh, đưa nó xuống nền hoặc đưa trở lại tiền cảnh.

Nhiều tiến trình cấu thành một pipeline được đặt trong cùng một nhóm tiến trình để có thể được điều khiển như một công việc duy nhất. Shell thay đổi kết nối giữa nhóm tiến trình tiền cảnh và thiết bị đầu cuối, đồng thời sử dụng tín hiệu cùng họ giao diện wait để theo dõi trạng thái dừng, tiếp tục và kết thúc của công việc.

Khởi động hệ thống và dịch vụ

Khi một hệ thống thuộc họ UNIX khởi động, firmware và bộ nạp khởi động nạp nhân vào bộ nhớ rồi thực thi nó. Nhân khởi tạo bộ xử lý, bộ nhớ, thiết bị và cấu trúc dữ liệu nội bộ, chuẩn bị để hệ thống tệp gốc có thể sử dụng, sau đó bắt đầu tiến trình không gian người dùng đầu tiên.

Tiến trình không gian người dùng đầu tiên khởi động và quản lý các dịch vụ còn lại của hệ thống. Trong UNIX truyền thống, init đảm nhiệm vai trò này. Tùy theo tệp cấu hình và giai đoạn thực thi, nó khởi động kiểm tra hệ thống tệp, chuẩn bị thiết bị, cấu hình mạng, dịch vụ đăng nhập và nhiều daemon. Trong các hệ điều hành thuộc họ UNIX hiện đại, nhiều hệ thống quản lý dịch vụ khác nhau có thể được sử dụng, như launchd, systemd, OpenRC và hệ thống init của từng BSD.

Daemon là tiến trình dịch vụ thường chạy liên tục trong nền mà không trực tiếp tương tác với người dùng. Việc xử lý yêu cầu mạng, ghi nhật ký, lập lịch tác vụ, đồng bộ hóa thời gian và quản lý thiết bị có thể được triển khai dưới dạng daemon. Giống các chương trình khác, daemon cũng là tiến trình không gian người dùng và yêu cầu chức năng cần thiết từ nhân thông qua lời gọi hệ thống.

Phương thức khởi động hệ thống và hệ thống quản lý dịch vụ khác nhau đáng kể giữa các cách triển khai UNIX và bản phân phối. Vì vậy, không thể coi một trình quản lý dịch vụ hoặc cấu trúc thư mục cụ thể là cấu trúc bắt buộc của chính UNIX. Điểm cốt lõi chung là sau khi nhân khởi tạo, tiến trình đầu tiên trong không gian người dùng thiết lập các dịch vụ hệ thống.

Toàn bộ luồng thực thi

Khi người dùng nhập lệnh trong shell, shell phân tích chuỗi thành token và toán tử, sau đó thực hiện mở rộng biến, xử lý trích dẫn, mở rộng tên tệp và chuyển hướng. Nếu có đường ống, shell tạo các kênh liên lạc cần thiết và chuẩn bị tiến trình con cho từng chương trình cần thực thi.

Trong tiến trình con, các bộ mô tả tệp được thay đổi cho phù hợp với lệnh. Tệp đầu vào được kết nối với đầu vào chuẩn, còn tệp đầu ra hoặc đầu ghi của đường ống được kết nối với đầu ra chuẩn. Các đầu đường ống và bộ mô tả tệp không sử dụng được đóng. Sau đó, exec được gọi để thay thế ảnh chương trình của tiến trình con bằng lệnh thực tế.

Chương trình được thực thi đọc dữ liệu từ đầu vào chuẩn hoặc bộ mô tả tệp khác, thực hiện phép tính cần thiết rồi ghi kết quả. Khi cần truy cập tệp, liên lạc hoặc mở rộng bộ nhớ, chương trình yêu cầu lời gọi hệ thống đến nhân thông qua thư viện hệ thống. Nhân kiểm tra quyền và tính hợp lệ của đối số, rồi xử lý yêu cầu thông qua hệ thống tệp, trình điều khiển thiết bị, mạng hoặc lớp quản lý bộ nhớ.

Khi chương trình chờ nhập xuất, nhân đặt tiến trình vào trạng thái chờ và chạy tiến trình khác. Khi dữ liệu sẵn sàng, tiến trình trở lại trạng thái có thể chạy và tiếp tục công việc bị gián đoạn khi bộ lập lịch cấp cơ hội thực thi.

Khi chương trình kết thúc, nhân giải phóng tài nguyên đã sử dụng và thông báo trạng thái kết thúc cho tiến trình cha. Shell cha thu hồi trạng thái kết thúc rồi hiển thị lại dấu nhắc hoặc thực thi lệnh tiếp theo theo điều kiện của script shell. Việc thực thi lệnh trong UNIX không phải là cấu trúc trong đó shell trực tiếp làm mọi công việc, mà là một luồng kết hợp giữa tạo tiến trình, thay thế chương trình, kết nối bộ mô tả tệp và quản lý tài nguyên của nhân.

Triết lý UNIX

Triết lý UNIX là một phương pháp thiết kế phần mềm tập trung vào việc xây dựng các chương trình nhỏ và rõ ràng, đồng thời cung cấp giao diện nhập xuất chung giữa các chương trình để có thể kết hợp nhiều công cụ với nhau. Thay vì để một chương trình chứa toàn bộ chức năng bên trong, các chương trình được phát triển độc lập được tổ chức để hợp tác thông qua tệp, nhập xuất chuẩn và đường ống. Người dùng có thể kết nối các công cụ hiện có trong shell để tạo ra những luồng công việc mới mà nhà phát triển ban đầu không dự đoán trước.

Triết lý UNIX không tồn tại ngay từ khi UNIX bắt đầu được phát triển dưới dạng một tuyên ngôn duy nhất đã được văn bản hóa hay một đặc tả chính thức. Các nhà phát triển UNIX thời kỳ đầu trực tiếp xây dựng hệ điều hành và công cụ phát triển trên phần cứng hạn chế, đồng thời coi trọng giao diện đơn giản, chương trình nhỏ, tự động hóa có thể lặp lại và khả năng tái sử dụng công cụ. Sau khi UNIX được phổ biến, những thực hành phát triển này được nhìn nhận như một nền văn hóa thiết kế. Các nhà phát triển và tác giả như Douglas McIlroy, Brian Kernighan và Rob Pike đã hệ thống hóa chúng dưới nhiều hình thức khác nhau.

Douglas McIlroy mô tả phương thức lập trình đặc trưng của UNIX là xây dựng mỗi chương trình để thực hiện tốt một công việc, dự đoán rằng đầu ra của chương trình có thể trở thành đầu vào của một chương trình khác thậm chí chưa được tạo ra, đồng thời tránh ép buộc không cần thiết việc nhập tương tác hoặc định dạng đầu ra cố định. Ông cũng nhấn mạnh việc chạy phần mềm từ sớm thay vì thiết kế toàn bộ một hệ thống lớn hoàn chỉnh ngay từ đầu, làm lại những phần không phù hợp và chủ động xây dựng công cụ để giảm công việc lặp lại.[46]

Về sau, quan điểm này thường được tóm tắt thành ba nguyên tắc. Chương trình phải thực hiện tốt một công việc, phải có khả năng hoạt động cùng các chương trình khác và phải xử lý các luồng dữ liệu dễ truyền giữa những chương trình. Tuy nhiên, bản tóm tắt này không phải là một quy tắc tuyệt đối giải thích mọi quyết định thiết kế trong UNIX lịch sử, mà là cách trình bày ngắn gọn những nguyên tắc được nhiều nhà phát triển UNIX diễn đạt.

Kết hợp các chương trình nhỏ

Triết lý UNIX ưu tiên việc tổ chức để mỗi chương trình thực hiện một tác vụ có phạm vi hạn chế và rõ ràng, thay vì bổ sung mọi chức năng có thể vào một chương trình khổng lồ. cat dùng để xuất nội dung tệp, grep tìm kiếm chuỗi, sort sắp xếp dữ liệu, uniq xử lý các dòng trùng lặp hoặc liên tiếp, còn cut trích xuất trường dữ liệu; mỗi công cụ đảm nhiệm một vai trò khác nhau.

Vì phạm vi chức năng và quy tắc nhập xuất của chương trình nhỏ tương đối rõ ràng, chúng dễ được hiểu và kiểm thử riêng biệt. Khi cần một chức năng cụ thể, có thể thêm một chương trình mới hoặc kết hợp các công cụ hiện có thay vì sửa đổi toàn bộ chương trình cũ. Ngay cả khi thay thế cách triển khai của một chương trình, kết nối với các công cụ khác vẫn có thể tiếp tục được sử dụng nếu giao diện được giữ nguyên.

Ở đây, “một công việc” không nhất thiết có nghĩa chương trình chỉ được thực hiện một hàm hoặc một phép toán cực kỳ nhỏ. Ý nghĩa gần hơn là trách nhiệm và ranh giới trừu tượng mà chương trình giải quyết phải rõ ràng. Chẳng hạn, awk cung cấp nhiều chức năng hơn rất nhiều so với một phép toán đơn giản, nhưng vẫn có mục đích nhất quán là một môi trường xử lý văn bản tìm mẫu trong các bản ghi đầu vào và thực hiện thao tác tương ứng.[47]

Ngược lại, chỉ chia nhỏ chức năng không có nghĩa là tuân theo triết lý UNIX. Nếu chương trình bị phân chia quá mức đến mức từng phần không thể thực hiện một công việc có ý nghĩa độc lập, hoặc nếu việc kết nối công cụ đòi hỏi trạng thái nội bộ phức tạp và giao thức chuyên dụng, khả năng kết hợp có thể bị giảm đi. Điều quan trọng không phải là kích thước của chương trình mà là trách nhiệm rõ ràng và giao diện có thể kết nối với các thành phần khác.

Kết hợp giữa các chương trình

Các công cụ UNIX coi trọng không chỉ chức năng khi được sử dụng độc lập mà cả hành vi khi kết nối với chương trình khác. Nếu đầu vào và đầu ra của chương trình được tách thành các luồng chuẩn, shell có thể kết nối chương trình với tệp, thiết bị đầu cuối hoặc chương trình khác mà không cần thay đổi cách triển khai bên trong.

Ví dụ, công việc tìm các dòng chứa lỗi trong một nhật ký cụ thể, trích xuất trường cần thiết, sắp xếp kết quả và tính số lần xuất hiện có thể được cấu thành bằng cách kết nối nhiều công cụ qua đường ống.

grep 'ERROR' application.log |
awk '{ print $5 }' |
sort |
uniq -c |
sort -nr

Mỗi chương trình không biết mục đích của toàn bộ tác vụ. grep xuất các dòng phù hợp với điều kiện, awk chọn trường được chỉ định, còn sortuniq sắp xếp và tổng hợp dữ liệu nhận được. Toàn bộ luồng công việc được shell cấu thành, và cùng một chương trình có thể được tái sử dụng trong pipeline khác.

Shell POSIX định nghĩa pipeline là một cấu trúc trong đó một hoặc nhiều lệnh được kết nối bằng toán tử |. Đầu ra chuẩn của mỗi lệnh, ngoại trừ lệnh cuối cùng, được kết nối với đầu vào chuẩn của lệnh tiếp theo. Phương thức kết nối được tiêu chuẩn hóa này tạo nền tảng để xây dựng luồng dữ liệu mà không tạo quan hệ phụ thuộc trực tiếp giữa các chương trình cụ thể.[48]

Chương trình có khả năng kết hợp không nên chỉ phụ thuộc vào một thiết bị đầu cuối hoặc thao tác người dùng cụ thể để nhận dữ liệu, mà phải có thể nhận đầu vào từ tệp hoặc đường ống. Đầu ra cũng không nên chỉ giả định một hình thức đẹp mắt để hiển thị trên màn hình, mà cần cung cấp cấu trúc có thể được chương trình khác xử lý tiếp. Khi cần, có thể tách đầu ra mặc định dành cho con người và định dạng hoặc tùy chọn đầu ra ổn định dành cho xử lý bằng máy.

Giao diện dựa trên luồng

Trong UNIX, luồng byte được sử dụng làm hình thức cơ bản để truyền dữ liệu giữa các chương trình. Chương trình có thể đọc và ghi dữ liệu thông qua bộ mô tả tệp mà không phải luôn phân biệt dữ liệu đầu vào đến từ tệp thông thường, thiết bị đầu cuối, đường ống hay socket. Giao diện chung này cho phép xử lý các loại tài nguyên khác nhau trong cùng một cấu trúc chương trình.

Đường ống tạo hai bộ mô tả tệp tương ứng với đầu đọc và đầu ghi, cho phép một tiến trình đọc ở đầu đọc các byte mà tiến trình khác đã ghi vào đầu ghi. Các chương trình có thể sử dụng giao diện đọc và ghi thông thường thay vì một API chuyên dụng riêng dành cho đường ống.[49]

Luồng tách lỏng lẻo bên sản xuất và bên tiêu thụ dữ liệu. Bên sản xuất không cần biết ai sẽ đọc dữ liệu, còn bên tiêu thụ không cần biết ai đã tạo ra dữ liệu. Nếu hai phía thống nhất về định dạng dữ liệu và hành vi của luồng, chương trình mới cũng có thể tham gia pipeline hiện có.

Tuy nhiên, giao diện luồng không phải lúc nào cũng thích hợp nhất với mọi loại dữ liệu. Trong các môi trường cần truy cập ngẫu nhiên vào dữ liệu lớn, quan hệ đối tượng phức tạp, giao dịch, thông tin kiểu không mất mát hoặc hiệu năng xử lý cao, định dạng nhị phân có cấu trúc, cơ sở dữ liệu, bộ nhớ dùng chung hoặc giao thức chuyên dụng có thể phù hợp hơn. Cốt lõi của triết lý UNIX không phải là bắt buộc chuyển mọi dữ liệu thành văn bản đơn giản, mà là biểu diễn kết nối giữa các chương trình bằng giao diện đơn giản và có thể dự đoán.

Xử lý dữ liệu tập trung vào văn bản

Các công cụ UNIX thường sử dụng văn bản mà con người có thể đọc và viết làm định dạng nhập xuất. Văn bản theo dòng có thể được kiểm tra trực tiếp trong trình soạn thảo, xử lý bằng các công cụ hiện có như grep, sed, awk, sortdiff, đồng thời được thao tác trong script shell mà không cần chương trình chuyên dụng riêng.

Định dạng văn bản cũng giúp giảm sự liên kết giữa chương trình và hệ điều hành. Nếu dữ liệu không được lưu nguyên dạng biểu diễn bộ nhớ hoặc cấu trúc nội bộ của một bộ xử lý cụ thể, nó sẽ dễ được diễn giải hơn trên những chương trình và hệ thống khác nhau. Ngoài ra, con người có thể trực tiếp kiểm tra và sửa đổi một phần dữ liệu, điều này có lợi cho việc gỡ lỗi và quản trị hệ thống.

Nhiều tiện ích UNIX phân biệt rõ đầu vào chuẩn, tệp đầu vào và đầu ra chuẩn, đồng thời xử lý dữ liệu dựa trên dòng và trường. POSIX cung cấp một môi trường chung có thể kết hợp bằng cách định nghĩa hành vi nhập xuất không chỉ của shell mà còn của các tiện ích xử lý văn bản như grep, sed, awksort.[50]

Tuy nhiên, diễn giải triết lý UNIX thành quy tắc “mọi dữ liệu đều phải là văn bản” không phù hợp với cấu trúc thực tế của UNIX. Tệp thực thi, tệp đối tượng, dữ liệu hệ thống tệp, ảnh, tệp nén và gói mạng sử dụng định dạng nhị phân. Văn bản là định dạng thường được lựa chọn tại giao diện giữa các chương trình khi tính phổ dụng và khả năng kiểm tra là quan trọng, chứ không phải một yêu cầu tuyệt đối thay thế mọi định dạng lưu trữ.

Định dạng văn bản cũng khó kết hợp nếu không có cú pháp ổn định. Nếu khoảng cách giữa các cột hoặc câu trang trí liên tục thay đổi để tạo đầu ra dễ nhìn cho con người, chương trình khác sẽ khó diễn giải chính xác. Vì vậy, khi yêu cầu đầu ra cho con người và đầu ra để máy xử lý xung đột, có thể cung cấp riêng định dạng dựa trên dấu phân cách, tùy chọn chọn trường rõ ràng hoặc định dạng văn bản có cấu trúc như JSON.

Cấu trúc không tạo đầu ra không cần thiết

Chương trình được sử dụng trong pipeline thường truyền kết quả bình thường qua đầu ra chuẩn và tách thông báo chẩn đoán sang lỗi chuẩn. Nếu dữ liệu kết quả, trạng thái tiến trình, cảnh báo và câu trang trí bị trộn trong cùng một luồng, chương trình tiếp theo sẽ khó phân biệt dữ liệu thực tế.

Phương thức không xuất thông báo riêng khi chương trình thành công mà chỉ trả về trạng thái kết thúc cũng được sử dụng rộng rãi trong các công cụ UNIX. Shell có thể dùng trạng thái kết thúc để xác định thành công hoặc thất bại, còn người dùng chỉ cần kiểm tra thông báo chẩn đoán khi xảy ra lỗi.

Bản thân sự im lặng không phải là mục tiêu tuyệt đối của triết lý UNIX. Chương trình tương tác hoặc tác vụ kéo dài có thể cần hiển thị tiến độ và giải thích. Điều quan trọng là phân biệt kết quả cốt lõi của chương trình với thông báo bổ sung, đồng thời cho phép người dùng tắt đầu ra không cần thiết hoặc lựa chọn mức độ chi tiết mong muốn.

Việc sử dụng lỗi chuẩn riêng biệt cho phép truyền kết quả qua đường ống hoặc tệp trong khi vẫn hiển thị thông báo lỗi trên thiết bị đầu cuối. Đây là một ví dụ về thiết kế giao diện có xét đến khả năng chương trình được kết hợp với các công cụ khác.

Tách cơ chế và chính sách

Thiết kế UNIX có xu hướng tách, trong phạm vi có thể, cơ chế cơ bản thực hiện chức năng khỏi chính sách quyết định khi nào và theo cách nào cơ chế đó được sử dụng. Nhân cung cấp các chức năng cơ bản như tiến trình, bộ mô tả tệp, đường ống và kiểm tra quyền, còn shell và chương trình không gian người dùng kết hợp chúng để xây dựng luồng công việc cụ thể.

Chẳng hạn, đường ống của nhân chỉ cung cấp cơ chế kết nối hai luồng dữ liệu. Shell và người dùng quyết định chương trình nào được kết nối, bao nhiêu lệnh được nối với nhau và đầu ra có được lưu vào tệp hay không. Nhân không biết ý nghĩa của các lệnh như grep hoặc sort, còn shell cũng không cần biết thuật toán xử lý dữ liệu bên trong từng chương trình.

Trong việc tạo tiến trình, nhân cung cấp các cơ chế cơ bản như fork, exec, sao chép bộ mô tả tệp và chờ. Shell sử dụng chúng để xây dựng các chính sách thực thi như công việc tiền cảnh, công việc nền, pipeline và chuyển hướng nhập xuất.

Sự phân tách này cho phép tái sử dụng một cơ chế trong nhiều chính sách. Tuy nhiên, việc tách hoàn toàn cơ chế và chính sách không phải lúc nào cũng khả thi hoặc thích hợp. Một số chính sách như bảo mật, xử lý thời gian thực và kiểm soát tài nguyên phải được nhân cưỡng chế, còn các cách triển khai UNIX thực tế đưa nhiều chính sách vào bên trong nhân để bảo đảm hiệu năng và tính nhất quán.

Giao diện đơn giản và che giấu cách triển khai nội bộ

Nhiều giao diện UNIX biểu diễn cách triển khai nội bộ phức tạp bằng một số lượng thao tác tương đối nhỏ. Chương trình có thể sử dụng open, read, writeclose mà không cần biết cách bố trí trên đĩa của hệ thống tệp hoặc cấu trúc nội bộ của trình điều khiển thiết bị. Tiến trình cũng hoạt động thông qua các giao diện hệ thống được tiêu chuẩn hóa mà không trực tiếp điều khiển thuật toán chi tiết của bộ lập lịch và quản lý bộ nhớ.

Giao diện đơn giản không có nghĩa chức năng phải ít hoặc cách triển khai nội bộ phải đơn giản. Hệ thống tệp và ngăn xếp mạng của các hệ điều hành thuộc họ UNIX hiện đại rất phức tạp, nhưng ứng dụng vẫn có thể tiếp tục sử dụng các giao diện bộ mô tả tệp và lời gọi hệ thống tương đối ổn định.

Nếu giao diện ổn định, cách triển khai bên trong có thể được cải tiến trong khi vẫn duy trì khả năng tương thích với chương trình hiện có. Ngay cả khi chính sách bộ nhớ đệm của hệ thống tệp hoặc bộ lập lịch tiến trình thay đổi, nhu cầu thiết kế lại ứng dụng sẽ giảm nếu giao diện cơ bản mà chương trình sử dụng vẫn được duy trì.

Ngược lại, nếu che giấu những ý nghĩa cần thiết chỉ để đạt hình thức đơn giản, việc hiểu xử lý lỗi và đặc tính hiệu năng có thể trở nên khó khăn. Tính đơn giản của giao diện kiểu UNIX gần với việc hợp nhất các chức năng có thể xử lý chung và cung cấp sự khác biệt cần thiết giữa các đối tượng thông qua thao tác và trạng thái riêng, thay vì xóa bỏ mọi khác biệt.

Công cụ tạo ra công cụ

Môi trường UNIX coi trọng không chỉ ứng dụng cuối cùng mà cả những công cụ dùng để xây dựng, sửa đổi và khảo sát chương trình. Trình biên dịch, trình liên kết, trình hợp dịch, trình soạn thảo văn bản, trình gỡ lỗi, công cụ xây dựng, shell và chương trình xử lý tài liệu được sử dụng cùng nhau trong một môi trường.

Khi xuất hiện công việc lặp lại, có thể tự động hóa nó bằng script shell hoặc chương trình riêng thay vì tiếp tục thực hiện thủ công. Nếu công cụ tự động hóa cũng sử dụng đầu vào và đầu ra chuẩn, hệ thống tệp cùng trạng thái kết thúc, nó có thể tiếp tục được kết nối với các công cụ phát triển khác.

UNIX thời kỳ đầu phát triển thành một môi trường tự hỗ trợ, trong đó chính UNIX có thể được dùng để phát triển nhân và tiện ích cũng như viết tài liệu. Khi hệ điều hành, trình biên dịch C và công cụ phát triển cùng phát triển, UNIX trở thành không chỉ mục tiêu để chạy chương trình mà còn là môi trường làm việc để tạo ra phần mềm mới.[51]

Việc sử dụng công cụ không giới hạn ở những chương trình đã tồn tại. Nếu một tác vụ cụ thể phải được lặp lại, có thể viết một công cụ chuyên dụng nhỏ, sau đó tái sử dụng hoặc loại bỏ khi không còn cần thiết. Nếu hiệu quả giảm công việc lặp lại và lỗi lớn hơn chi phí tạo công cụ, việc đầu tư vào chính công cụ phát triển được xem là một phần của văn hóa phát triển kiểu UNIX.

Thực thi sớm và cải tiến lặp lại

Triết lý UNIX bao gồm phương thức triển khai hệ thống ở dạng nhỏ nhất có thể từ sớm và cải thiện cấu trúc thông qua việc sử dụng thực tế, thay vì thiết kế một hệ thống hoàn chỉnh trong thời gian dài rồi mới chạy lần đầu. Chính UNIX thời kỳ đầu cũng phát triển thành hệ điều hành khi hệ thống tệp, shell, trình soạn thảo và các lệnh được bổ sung theo từng giai đoạn.

Việc chạy chương trình từ sớm cho phép xác nhận giao diện có phù hợp với công việc thực tế hay không, đồng thời phát hiện những vấn đề về khả năng sử dụng và kết hợp khó nhận ra chỉ từ tài liệu thiết kế. Nếu thiết kế hiện có phức tạp hoặc không phù hợp, có thể xây dựng lại theo cấu trúc đơn giản hơn thay vì liên tục bổ sung chức năng chỉ để giữ lại phần đã viết.

Nguyên tắc này không có nghĩa phải bỏ qua thiết kế hoặc tài liệu. Nó có nghĩa thông tin thu được từ triển khai và sử dụng được phản ánh vào thiết kế tiếp theo, đồng thời tránh phụ thuộc quá mức vào cấu trúc phức tạp chưa được kiểm chứng. Đối với những thành phần có chi phí thay đổi lớn về sau như hệ điều hành hoặc định dạng dữ liệu, cần có chính sách tương thích rõ ràng cùng với thử nghiệm ban đầu.

Tự động hóa thông qua shell

Shell UNIX vừa là giao diện tương tác để chạy từng lệnh, vừa là một ngôn ngữ lệnh có thể lập trình. Người dùng có thể lưu các lệnh và pipeline đã thử trong thiết bị đầu cuối vào tệp, rồi bổ sung biến, câu điều kiện, vòng lặp và hàm để phát triển chúng thành script shell có thể lặp lại.

Nếu công việc tương tác và tự động hóa sử dụng cùng ngôn ngữ và công cụ, nhu cầu triển khai lại bằng một hệ thống riêng những quy trình đã được kiểm tra thủ công sẽ giảm. Xử lý tệp, thực thi chương trình, chuyển hướng nhập xuất và kiểm tra trạng thái kết thúc được kết hợp trong ngôn ngữ shell, còn chương trình thông thường tham gia với vai trò công cụ có thể được shell gọi.

Shell POSIX định nghĩa việc thực thi lệnh, pipeline, danh sách, câu điều kiện, vòng lặp, hàm, mở rộng tham số và chuyển hướng nhập xuất. Nhờ đó, script sử dụng giao diện tiêu chuẩn có thể được chuyển giữa các môi trường thuộc họ UNIX khác nhau.[52]

Shell không phải là ngôn ngữ triển khai đa dụng thay thế mọi chương trình. Khi cần cấu trúc dữ liệu phức tạp, hiệu năng tính toán cao, xử lý lỗi tinh vi và kiến trúc phần mềm quy mô lớn, C, Python, Perl hoặc ngôn ngữ khác có thể phù hợp hơn. Môi trường UNIX có thể sử dụng cấu trúc trong đó shell kết nối luồng công việc, còn từng thành phần được triển khai bằng ngôn ngữ phù hợp với mục đích, thay vì cố chấp sử dụng một ngôn ngữ duy nhất.

Tệp và trừu tượng nhập xuất chung

Triết lý UNIX thường được diễn đạt bằng câu “mọi thứ đều là tệp”. Tuy nhiên, câu này không phải là một quy tắc chính thức và tuyệt đối của UNIX, mà là cách diễn đạt một thiết kế áp dụng giao diện nhập xuất chung tương tự tệp cho nhiều loại tài nguyên.

Tệp thông thường, thư mục, thiết bị đầu cuối, thiết bị, đường ống và socket có những đặc tính khác nhau. Không phải mọi đối tượng đều giống tệp thông thường trên thiết bị lưu trữ, và cũng không phải mọi đối tượng nhất thiết phải có đường dẫn trong hệ thống tệp. Chẳng hạn, đường ống ẩn danh và socket mạng có thể được xử lý bằng bộ mô tả tệp nhưng không thể tìm kiếm vị trí tùy ý giống tệp thông thường.

Điểm chung nằm ở việc nhiều tài nguyên có thể được tham chiếu bằng bộ mô tả tệp và sử dụng các thao tác chung như read, writeclose. Nhờ vậy, ngay cả khi đích đầu ra của chương trình thay đổi từ thiết bị đầu cuối sang tệp hoặc đường ống, mã nhập xuất cơ bản không cần thay đổi đáng kể.

Những chức năng khó biểu diễn chỉ bằng đọc và ghi thông thường, như điều khiển riêng cho thiết bị, kết nối socket và ánh xạ bộ nhớ, sử dụng lời gọi hệ thống riêng. Vì vậy, sự trừu tượng hóa của UNIX không xóa bỏ khác biệt giữa mọi đối tượng mà hợp nhất các phần chung và phơi bày những khác biệt cần thiết qua giao diện bổ sung.

Tính khả chuyển và độc lập với cách triển khai

Triết lý UNIX ưu tiên những chương trình không phụ thuộc không cần thiết vào một phần cứng cụ thể hoặc một cách triển khai hệ điều hành duy nhất. Nếu sử dụng giao diện hệ thống, shell và tiện ích tiêu chuẩn, cùng mã nguồn và script có thể được dùng trên nhiều hệ thống thuộc họ UNIX.

Để tăng tính khả chuyển, chương trình không nên trực tiếp phụ thuộc vào thứ tự byte của bộ xử lý, kích thước kiểu dữ liệu, bố trí nội bộ của hệ thống tệp, cấu trúc dữ liệu riêng của một nhân cụ thể hoặc lệnh chỉ có trong một cách triển khai. Dữ liệu giữa các chương trình cũng nên sử dụng biểu diễn độc lập với nền tảng và cú pháp rõ ràng khi có thể.

POSIX và Single UNIX Specification không quy định chính triết lý UNIX, nhưng tiêu chuẩn hóa hành vi của giao diện hệ thống, shell và tiện ích được hình thành trong môi trường UNIX. Nhờ đó, chúng cung cấp một môi trường thực thi chung mà ứng dụng có thể sử dụng dù cách triển khai nội bộ khác nhau.[53]

Việc sử dụng chức năng riêng của một hệ điều hành không phải lúc nào cũng không thích hợp. Có thể sử dụng phần mở rộng riêng theo cách triển khai để đạt hiệu năng, bảo mật hoặc tích hợp nền tảng, đồng thời tách mã chung và mã riêng theo nền tảng để bảo đảm cả tính khả chuyển lẫn chức năng.

Tài liệu và khả năng khám phá

Trong môi trường UNIX hình thành truyền thống cung cấp cách sử dụng và giao diện chương trình dưới dạng tài liệu trực tuyến. Lệnh, lời gọi hệ thống, hàm thư viện và tệp cấu hình được lập tài liệu dưới dạng trang hướng dẫn, cho phép người dùng tra cứu thông tin cần thiết ngay trên hệ thống đang chạy.

Ngay cả khi chương trình được chia thành các công cụ nhỏ, chúng vẫn khó kết hợp nếu đầu vào, đầu ra, tùy chọn, trạng thái kết thúc và hành vi lỗi của từng công cụ không rõ ràng. Tài liệu mô tả hợp đồng kết nối chương trình với công cụ khác, đồng thời giải thích định dạng đầu vào và tác dụng phụ bằng các ví dụ.

Tính nhất quán của tên lệnh và tùy chọn cũng ảnh hưởng đến khả năng khám phá công cụ. Các lệnh UNIX lịch sử thường có tên rất ngắn và quy tắc tùy chọn khác nhau nên không phải lúc nào cũng nhất quán. Tuy nhiên, khi chương trình được dùng trong đường ống và script, tính ổn định của giao diện và chất lượng tài liệu càng trở nên quan trọng.

Phạm vi của triết lý UNIX

Triết lý UNIX không chỉ giải thích cấu trúc nội bộ của hệ điều hành. Đây là một quan điểm kỹ nghệ phần mềm xác định trách nhiệm của thành phần và phương thức kết nối khi thiết kế công cụ dòng lệnh, thư viện, môi trường phát triển và ứng dụng. Ngay cả trên hệ điều hành không phải UNIX, những nguyên tắc này vẫn có thể được áp dụng khi thiết kế dịch vụ nhỏ, bộ lọc, xử lý luồng và công cụ tự động hóa.

Đồng thời, không phải mọi chương trình chạy trên UNIX đều tuân theo triết lý UNIX. Cơ sở dữ liệu, trình duyệt web, môi trường phát triển tích hợp và máy chủ quy mô lớn có thể chứa nhiều chức năng trong một tiến trình hoặc sản phẩm duy nhất. Những chương trình này cũng có thể cung cấp khả năng kết hợp thông qua mô-đun nội bộ và giao diện bên ngoài, nhưng không nhất thiết phải mang hình thức giống bộ lọc dòng lệnh truyền thống.

Triết lý UNIX cũng không phải là quy tắc bắt buộc phải chia phần mềm phức tạp thành các tệp thực thi nhỏ. Ranh giới tiến trình phát sinh chi phí tuần tự hóa dữ liệu, chuyển đổi ngữ cảnh, triển khai và xử lý lỗi, còn việc phân chia quá mức có thể khiến toàn bộ hệ thống khó hiểu và khó vận hành. Việc tách thành hàm và mô-đun nội bộ hay thành chương trình và dịch vụ độc lập có thể được quyết định dựa trên luồng dữ liệu, hiệu năng, cô lập lỗi và phương thức vận hành.

Vì vậy, cốt lõi của triết lý UNIX không nằm ở kích thước chương trình hay ngôn ngữ được sử dụng, mà ở trách nhiệm rõ ràng, giao diện đơn giản và ổn định, khả năng tái sử dụng cùng khả năng kết hợp của các thành phần độc lập. UNIX đã triển khai những nguyên tắc này thành một môi trường vận hành có thể sử dụng trong thực tế thông qua bộ mô tả tệp, nhập xuất chuẩn, shell, đường ống và nhiều tiện ích nhỏ.

Môi trường lập trình

Môi trường lập trình của UNIX không phải là một chương trình phát triển tích hợp duy nhất tách biệt khỏi hệ điều hành, mà là một hệ thống phát triển sử dụng kết hợp trình soạn thảo, trình biên dịch, trình hợp dịch, trình liên kết, thư viện, shell, công cụ xây dựng, trình gỡ lỗi và nhiều công cụ phân tích. Nhà phát triển viết tệp nguồn và chạy lệnh trong shell, sau đó chuyển các tệp và chương trình được tạo ở từng giai đoạn thành đầu vào cho những công cụ khác.

Trong UNIX thời kỳ đầu, bản thân hệ điều hành, các tiện ích dòng lệnh, trình biên dịch và công cụ soạn thảo tài liệu đều được phát triển trong cùng một hệ thống. UNIX không chỉ là môi trường chạy chương trình đã hoàn thiện, mà còn phát triển thành một môi trường phát triển tự hỗ trợ, trong đó có thể sửa đổi chính UNIX và viết phần mềm mới. C cũng phát triển thành ngôn ngữ triển khai hệ thống của UNIX thời kỳ đầu, và sự phát triển của UNIX cùng C diễn ra với ảnh hưởng qua lại trong giai đoạn từ năm 1969 đến năm 1973.

Trong các hệ thống thuộc họ UNIX, việc viết, xây dựng, chạy, kiểm thử và phân phối chương trình được tổ chức xoay quanh tệp và tiến trình. Mã nguồn được lưu dưới dạng tệp thông thường, trình biên dịch chuyển chúng thành tệp đối tượng, còn trình liên kết kết hợp nhiều đối tượng và thư viện để tạo tệp thực thi hoặc thư viện dùng chung. Shell và các công cụ như make tự động hóa quá trình này, trong khi trình gỡ lỗi cùng công cụ theo dõi khảo sát tiến trình đang chạy và các tệp được tạo ra.

Môi trường lập trình UNIX hiện đại không giới hạn ở C. Có thể sử dụng C++, Fortran, Ada, Objective-C, Rust, Go, Java, Python, Perl, Ruby, shell và nhiều ngôn ngữ khác. Tuy nhiên, giao diện hệ thống tiêu chuẩn của hệ điều hành và các công cụ phát triển truyền thống thường được biểu diễn xoay quanh hàm và tệp tiêu đề C, còn các ngôn ngữ khác truy cập những chức năng này thông qua runtime riêng hoặc giao diện hàm ngoại.

Ngôn ngữ C và UNIX

C không phải là một ngôn ngữ đã hoàn thiện trước UNIX, và cũng không phải ngôn ngữ dùng để triển khai UNIX đầu tiên. UNIX đầu tiên trên PDP-7 và UNIX thời kỳ đầu trên PDP-11 được viết bằng hợp ngữ. Sau đó, Dennis Ritchie phát triển B thành C, và khi phần lớn nhân UNIX được viết lại bằng C vào năm 1973, mối quan hệ chặt chẽ giữa UNIX và C được hình thành.

C cung cấp khả năng truy cập bộ nhớ mức thấp, phép toán bit, con trỏ và cấu trúc, đồng thời vẫn là một ngôn ngữ bậc cao không ánh xạ trực tiếp từng lệnh máy. Nhờ đó, nó có thể biểu diễn cấu trúc dữ liệu nội bộ của hệ điều hành và điều khiển thiết bị, trong khi giảm phạm vi mã hợp ngữ phụ thuộc phần cứng. C được tạo ra như một ngôn ngữ triển khai hệ thống cho UNIX thời kỳ đầu, và trong quá trình tính khả chuyển của UNIX được chứng minh, nó lan rộng sang nhiều kiến trúc máy tính.

Trong UNIX, chương trình C thường bao gồm các tệp tiêu đề hệ thống và gọi hàm thư viện để sử dụng chức năng của hệ điều hành. Các chức năng liên quan đến tệp và thư mục, tiến trình, tín hiệu, thời gian, thiết bị đầu cuối, bộ nhớ và mạng được cung cấp thông qua các tệp tiêu đề cùng giao diện hàm tương ứng.

#include <fcntl.h>
#include <unistd.h>

int main(void)
{
    int fd = open("message.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);

    if (fd == -1) {
        return 1;
    }

    const char message[] = "Hello, UNIX\n";

    if (write(fd, message, sizeof(message) - 1) == -1) {
        close(fd);
        return 1;
    }

    if (close(fd) == -1) {
        return 1;
    }

    return 0;
}

Chương trình này sử dụng giao diện dựa trên bộ mô tả tệp của POSIX thay vì luồng nhập xuất chuẩn của C. open mở tệp và trả về một bộ mô tả tệp, còn write ghi các byte vào bộ mô tả đó. close giải phóng bộ mô tả tệp mà tiến trình đang giữ.

Tiêu chuẩn C và POSIX không phải là cùng một đặc tả. ISO C định nghĩa cú pháp ngôn ngữ và thư viện chuẩn, còn POSIX định nghĩa bổ sung các giao diện tiến trình, tệp, tín hiệu, luồng, shell và tiện ích được sử dụng trong môi trường thuộc họ UNIX. Chương trình chỉ sử dụng ISO C có thể được chuyển sang phạm vi môi trường rộng hơn, nhưng các chức năng như fork, unistd.h, bộ mô tả tệp và luồng POSIX thuộc môi trường POSIX chứ không phải ISO C.

Tệp tiêu đề hệ thống và thư viện

Chương trình C và C++ lấy khai báo hàm, kiểu dữ liệu, hằng số và macro thông qua tệp tiêu đề. Các tệp tiêu đề thường được sử dụng trong lập trình hệ thống UNIX bao gồm những tệp sau.

  • <unistd.h> khai báo nhiều hàm và hằng số thuộc giao diện hệ điều hành POSIX.
  • <fcntl.h> định nghĩa các cờ dùng để mở tệp và giao diện điều khiển tệp.
  • <sys/types.h> cung cấp nhiều kiểu dữ liệu được sử dụng trong giao diện hệ thống.
  • <sys/stat.h> định nghĩa giao diện liên quan đến thông tin tệp, quyền và loại tệp.
  • <dirent.h> cung cấp giao diện để duyệt các mục thư mục.
  • <signal.h> định nghĩa tín hiệu và giao diện xử lý tín hiệu.
  • <pthread.h> cung cấp giao diện luồng POSIX.
  • <sys/mman.h> cung cấp chức năng liên quan đến ánh xạ bộ nhớ và bộ nhớ dùng chung.
  • <sys/socket.h> khai báo giao diện liên lạc socket.

Tệp tiêu đề được phân biệt với thư viện chứa phần triển khai thực tế của hàm. Tệp tiêu đề chủ yếu cung cấp các khai báo cần thiết để trình biên dịch kiểm tra mã nguồn và thiết lập quy ước gọi, trong khi mã hàm thực tế nằm trong thư viện tĩnh, thư viện động hoặc thành phần runtime của hệ điều hành.

Không phải mọi hàm mà ứng dụng gọi đều là lời gọi hệ thống. Có những hàm thư viện hoàn thành hoàn toàn trong không gian người dùng, như xử lý chuỗi, sắp xếp hoặc phép toán toán học, và cũng có những hàm cuối cùng sử dụng lời gọi hệ thống của nhân, như đọc tệp hoặc tạo tiến trình.

Các hàm như fopen, freadfprintf trong thư viện chuẩn C cung cấp luồng FILE và cơ chế đệm nội bộ. Bên dưới, chúng thường sử dụng bộ mô tả tệp và giao diện nhập xuất của hệ điều hành. Chương trình có thể lựa chọn luồng nhập xuất chuẩn hoặc giao diện bộ mô tả tệp mức thấp tùy theo mức độ kiểm soát cần thiết.

Mã nguồn và đơn vị dịch

Các tệp nguồn C và C++ được biên dịch thành những đơn vị dịch độc lập sau khi trải qua quá trình tiền xử lý. Chỉ thị #include lấy nội dung của tệp tiêu đề, còn #define và các chỉ thị biên dịch có điều kiện quyết định hình dạng của mã nguồn trước khi biên dịch thực tế.

#include "database.h"
#include <stdio.h>

int main(void)
{
    struct database *db = database_open("data.db");

    if (db == NULL) {
        fprintf(stderr, "database_open failed\n");
        return 1;
    }

    database_close(db);
    return 0;
}

#include "database.h" lấy giao diện được định nghĩa bên trong chương trình, còn #include <stdio.h> lấy tệp tiêu đề chuẩn do cách triển khai cung cấp. Các kiểu dữ liệu và khai báo hàm cần công khai ra ngoài có thể được đặt trong tệp tiêu đề, còn phần triển khai được đặt trong tệp nguồn riêng.

Vì mỗi tệp nguồn được biên dịch riêng, không cần dịch toàn bộ chương trình lớn cùng một lúc sau mỗi thay đổi. Chỉ các tệp nguồn đã thay đổi mới cần được biên dịch lại thành tệp đối tượng rồi liên kết với các tệp đối tượng hiện có. Việc xây dựng gia tăng này được tự động hóa bằng các công cụ như make.

Tiền xử lý, biên dịch và hợp dịch

Quá trình xây dựng C truyền thống có thể được chia về mặt khái niệm thành các giai đoạn tiền xử lý, biên dịch, hợp dịch và liên kết.

Luồng biên dịch
  1. source.c
  2. ↓ tiền xử lý
  3. Mã nguồn C đã tiền xử lý
  4. ↓ biên dịch
  5. Mã hợp ngữ
  6. ↓ hợp dịch
  7. Tệp đối tượng
  8. ↓ liên kết
  9. Tệp thực thi hoặc thư viện

Trình điều khiển biên dịch thực tế có thể thực hiện các giai đoạn này bằng một lệnh duy nhất.

cc main.c -o application

cc là tên lệnh truyền thống dùng để gọi hệ thống biên dịch C trong UNIX. Cách triển khai thực tế có thể là những trình biên dịch khác nhau tùy hệ thống và thời kỳ. Trong môi trường hiện đại, trình điều khiển như Clang hoặc GCC có thể được cung cấp dưới tên cc. POSIX định nghĩa môi trường biên dịch chương trình ISO C thông qua tiện ích c99, nhưng trình biên dịch mặc định và phiên bản ngôn ngữ được hỗ trợ có thể khác nhau giữa các hệ điều hành.

Để chỉ thực hiện đến bước biên dịch và tạo tệp đối tượng, thông thường sử dụng tùy chọn -c.

cc -c main.c -o main.o
cc -c database.c -o database.o

Tệp đối tượng chưa phải là tệp thực thi hoàn chỉnh. Nó có thể chứa mã máy và dữ liệu, ký hiệu, thông tin tái định vị và thông tin gỡ lỗi, trong khi địa chỉ thực tế của các hàm bên ngoài và biến toàn cục có thể chưa được xác định.

Cũng có thể trực tiếp viết mã nguồn hợp ngữ hoặc khảo sát đầu ra hợp ngữ do trình biên dịch tạo ra.

cc -S main.c -o main.s
cc -c main.s -o main.o

Cách trình biên dịch gọi nội bộ bộ tiền xử lý và trình hợp dịch có thể khác nhau tùy cách triển khai, và cấu trúc mã nguồn ban đầu cũng có thể bị biến đổi đáng kể trong quá trình tối ưu hóa.

Tệp đối tượng

Tệp đối tượng là kết quả trung gian lưu mã và dữ liệu đã biên dịch, ký hiệu cùng thông tin tái định vị. Định dạng đối tượng cụ thể được sử dụng trong các hệ thống thuộc họ UNIX đã thay đổi tùy theo thời kỳ và hệ điều hành.

Các hệ thống UNIX thời kỳ đầu sử dụng định dạng a.out, còn System V cùng nhiều hệ thống UNIX và kiểu Unix hiện đại sử dụng rộng rãi ELF. macOS và họ Darwin sử dụng Mach-O. Vì vậy, không tồn tại một định dạng nhị phân cố định duy nhất dành cho “tệp thực thi UNIX”.

Bảng ký hiệu của tệp đối tượng có thể ghi tên hàm và đối tượng toàn cục, trạng thái đã được định nghĩa hay chưa cùng thông tin liên kết. Trình liên kết so sánh các ký hiệu trong nhiều tệp đối tượng để nối tham chiếu với định nghĩa.

nm main.o

nm là công cụ truyền thống dùng để khảo sát thông tin ký hiệu trong tệp đối tượng, tệp thực thi hoặc thư viện. Nó có thể được dùng để kiểm tra các ký hiệu bên ngoài chưa được định nghĩa, hàm toàn cục và ký hiệu dữ liệu nhằm tìm nguyên nhân lỗi liên kết.

Tệp đối tượng cũng có thể chứa thông tin gỡ lỗi. Khi biên dịch với tùy chọn tạo thông tin gỡ lỗi, các dữ liệu như tệp nguồn, số dòng, biến và kiểu dữ liệu được bổ sung. Trình gỡ lỗi sử dụng chúng để hiển thị trạng thái thực thi mã máy ở mức mã nguồn.

Trình liên kết

Trình liên kết kết hợp một hoặc nhiều tệp đối tượng cùng thư viện để tạo tệp thực thi hoặc thư viện mới. Sau khi trình biên dịch tạo mã riêng cho từng đơn vị dịch, trình liên kết giải quyết lời gọi hàm và tham chiếu đối tượng toàn cục giữa các tệp khác nhau.

cc main.o database.o -o application

Lệnh này chạy trình liên kết thông qua trình điều khiển biên dịch. Nhà phát triển cũng có thể trực tiếp gọi ld, nhưng đối với chương trình thông thường, sử dụng trình điều khiển biên dịch thường phù hợp hơn. Nguyên nhân là trình điều khiển truyền kèm mã khởi động, thư viện chuẩn, ABI của nền tảng đích và các tùy chọn liên kết cần thiết.

Trình liên kết nối tham chiếu database_open trong main.o với định nghĩa trong database.o, đồng thời bố trí địa chỉ cuối cùng của từng vùng mã và dữ liệu. Nếu không tìm thấy định nghĩa của ký hiệu được tham chiếu, lỗi ký hiệu chưa định nghĩa xảy ra. Nếu cùng một ký hiệu toàn cục được định nghĩa nhiều lần theo cách không được phép, lỗi định nghĩa trùng lặp có thể phát sinh.

Liên kết có thể được chia thành liên kết tĩnh và liên kết động. Trong liên kết tĩnh, một phần mã thư viện cần thiết được đưa vào tệp thực thi. Trong liên kết động, tệp thực thi ghi lại quan hệ phụ thuộc với thư viện dùng chung, và khi chương trình bắt đầu, trình nạp động kết nối các thư viện cần thiết vào không gian địa chỉ.

Thư viện tĩnh

Thư viện tĩnh là dạng gộp nhiều tệp đối tượng thành một tệp lưu trữ. UNIX truyền thống sử dụng tiện ích ar và phần mở rộng .a.

cc -c vector.c -o vector.o
cc -c matrix.c -o matrix.o
ar rcs libmathutil.a vector.o matrix.o

Thư viện đã tạo có thể được sử dụng khi liên kết chương trình.

cc main.o -L. -lmathutil -o application

-L. thêm thư mục hiện tại vào đường dẫn tìm kiếm thư viện, còn -lmathutil thường yêu cầu tìm libmathutil.a hoặc thư viện dùng chung cùng tên.

Thư viện tĩnh không giống một tệp đối tượng khổng lồ duy nhất. Trình liên kết có thể tìm các thành viên trong kho lưu trữ định nghĩa những ký hiệu hiện chưa được giải quyết và chỉ chọn các đối tượng cần thiết. Vì vậy, trong một số cách triển khai, thứ tự chỉ định thư viện có thể ảnh hưởng đến kết quả liên kết.

Liên kết tĩnh có thể đưa mã cần thiết của chương trình vào trong tệp thực thi, nhờ đó giảm phụ thuộc khi phân phối. Ngược lại, nếu nhiều chương trình đều chứa riêng cùng mã thư viện, mức sử dụng không gian lưu trữ và bộ nhớ có thể tăng. Ngoài ra, để phản ánh sửa đổi của thư viện, chương trình có thể phải được liên kết lại.

Thư viện dùng chung và liên kết động

Thư viện dùng chung là thành phần nhị phân được thiết kế để nhiều chương trình có thể sử dụng một cách triển khai thư viện. Các hệ thống dựa trên ELF thường sử dụng phần mở rộng .so, còn macOS sử dụng .dylib, nhưng cách đặt tên và quản lý phiên bản khác nhau tùy nền tảng.

Tệp thực thi sử dụng thư viện dùng chung không trực tiếp sao chép toàn bộ mã thư viện, mà ghi thông tin về thư viện và ký hiệu cần thiết. Khi chương trình khởi động, trình nạp động tìm thư viện, ánh xạ nó vào không gian địa chỉ rồi thực hiện các thao tác tái định vị và giải quyết ký hiệu cần thiết.

Liên kết động cho phép nhiều chương trình chia sẻ các trang mã chỉ đọc, giảm kích thước tệp thực thi và cập nhật thư viện độc lập. Tuy nhiên, nếu phiên bản thư viện hoặc ABI không tương thích, hoặc không tìm thấy thư viện cần thiết, chương trình có thể không khởi động được.

Cũng tồn tại các giao diện cho phép nạp thư viện một cách tường minh khi chương trình đang chạy. Trong các hệ thống thuộc họ UNIX, các giao diện như dlopen, dlsymdlclose được sử dụng rộng rãi để triển khai plugin và chức năng tùy chọn. Tuy nhiên, chi tiết giao diện của trình nạp động và tùy chọn liên kết có thể khác nhau giữa các hệ điều hành.

ABI

Giao diện nhị phân ứng dụng định nghĩa cách mã đã biên dịch tương tác với hệ điều hành, thư viện và mã đối tượng khác. ABI có thể bao gồm quy ước gọi hàm, cách sử dụng thanh ghi, bố trí ngăn xếp, kích thước và căn chỉnh kiểu dữ liệu, quy ước lời gọi hệ thống, định dạng tệp đối tượng và cách biểu diễn ký hiệu.

Nếu API là giao diện ở mức mã nguồn thì ABI là giao diện ở mức nhị phân. Ngay cả khi mã nguồn sử dụng cùng một khai báo hàm, các tệp đối tượng được biên dịch cho ABI khác nhau vẫn có thể không kết hợp trực tiếp được.

Hệ điều hành thuộc họ UNIX cung cấp ABI phù hợp với kiến trúc bộ xử lý và hệ điều hành. Ngay cả trên cùng một bộ xử lý, định dạng đối tượng, số hiệu lời gọi hệ thống, trình liên kết động và một phần quy ước gọi có thể khác nhau tùy hệ điều hành và môi trường thực thi.

Cũng cần phân biệt tính khả chuyển của mã nguồn với khả năng tương thích nhị phân. Chương trình sử dụng giao diện POSIX có thể được biên dịch lại trên nhiều hệ thống, nhưng điều đó không có nghĩa tệp thực thi được tạo trên một hệ thống có thể chạy nguyên trạng trên một hệ điều hành thuộc họ UNIX khác.

Tệp thực thi và khởi động chương trình

Khi một tệp thực thi được bắt đầu trong hệ thống thuộc họ UNIX, nhân kiểm tra định dạng tệp rồi bố trí mã và dữ liệu chương trình vào không gian địa chỉ của tiến trình mới. Nếu chương trình được liên kết động, trình nạp động được chỉ định sẽ kết nối thư viện dùng chung và thực hiện các thao tác khởi tạo.

Hàm main của chương trình C không phải là lệnh máy đầu tiên được nhân gọi trực tiếp. Thông thường, mã khởi động runtime được thực thi trước để sắp xếp đối số và môi trường, thực hiện khởi tạo thư viện rồi mới gọi main.

int main(int argc, char **argv)
{
    return 0;
}

argc là số lượng đối số dòng lệnh, còn argv là mảng con trỏ trỏ đến từng chuỗi đối số. Tiến trình cũng nhận các biến môi trường, và trong môi trường C cùng POSIX, có thể truy cập chúng thông qua getenv hoặc mảng môi trường bên ngoài.

Khi main trả về hoặc exit được gọi, runtime C thực hiện các xử lý kết thúc đã đăng ký và dọn dẹp luồng, sau đó truyền trạng thái kết thúc cho hệ điều hành. _exit là giao diện mức thấp kết thúc trực tiếp tiến trình, bỏ qua những xử lý kết thúc thông thường trong không gian người dùng.

Lập trình shell

Shell vừa là trình thông dịch lệnh thực thi chương trình, vừa là môi trường lập trình có thể biểu diễn luồng công việc. Nhà phát triển UNIX có thể sử dụng shell để kết nối trình biên dịch, trình liên kết, công cụ chuyển đổi tệp và chương trình kiểm thử.

#!/bin/sh

set -eu

cc -c main.c -o main.o
cc -c database.c -o database.o
cc main.o database.o -o application

./application

Script shell có thể kết hợp thực thi lệnh, biến, câu điều kiện, vòng lặp, hàm, pipeline, chuyển hướng nhập xuất và trạng thái kết thúc. POSIX định nghĩa ngôn ngữ lệnh shell cùng nhiều tiện ích chung, tạo nền tảng để script chỉ sử dụng chức năng tiêu chuẩn có thể hoạt động trên những môi trường thuộc họ UNIX khác nhau.

Shell được sử dụng rộng rãi trong xây dựng, phân phối, kiểm thử, phân tích nhật ký, tạo mã nguồn và quản trị hệ thống. Vì các lệnh được nhập tương tác có thể được chuyển vào script, công việc thủ công có thể dễ dàng được tự động hóa từng bước.

Script shell mạnh trong xử lý văn bản và kết hợp tiến trình, nhưng có thể không phù hợp với cấu trúc dữ liệu phức tạp và quản lý trạng thái quy mô lớn. Trong trường hợp đó, shell có thể điều phối toàn bộ công việc, còn phép tính hoặc xử lý dữ liệu được đảm nhiệm bởi chương trình viết bằng C, Python, Perl, Awk hoặc ngôn ngữ khác.

Tự động hóa xây dựng và make

Khi chương trình gồm nhiều tệp nguồn, cần theo dõi việc từng tệp đã thay đổi hay chưa cùng quan hệ phụ thuộc giữa chúng. make là công cụ tự động hóa xây dựng đọc makefile mô tả tệp đích, điều kiện tiên quyết của đích và các lệnh tạo ra nó, rồi thực hiện những công việc cần thiết.

CC = cc
CFLAGS = -Wall -Wextra -O2

application: main.o database.o
	$(CC) main.o database.o -o application

main.o: main.c database.h
	$(CC) $(CFLAGS) -c main.c -o main.o

database.o: database.c database.h
	$(CC) $(CFLAGS) -c database.c -o database.o

clean:
	rm -f application main.o database.o

application phụ thuộc vào main.odatabase.o. Khi database.h thay đổi, các tệp đối tượng sử dụng nó được biên dịch lại, và khi tệp đối tượng được cập nhật, tệp thực thi được liên kết lại.

Các quy tắc của make khác với một script chỉ đơn giản chạy mọi lệnh từ trên xuống dưới. Nó xây dựng quan hệ giữa đích và điều kiện tiên quyết thành một đồ thị, rồi chạy lệnh cần thiết khi đích không tồn tại hoặc cũ hơn điều kiện tiên quyết.

make không phải công cụ phụ thuộc vào một trình biên dịch cụ thể và có thể tự động hóa nhiều công việc biểu diễn được bằng tệp cùng lệnh. Việc tạo mã, xây dựng tài liệu, chạy kiểm thử và tạo gói có thể được đưa vào cùng một quan hệ phụ thuộc.

POSIX định nghĩa tiện ích make và cú pháp makefile cơ bản, nhưng các cách triển khai thực tế có thể cung cấp nhiều phần mở rộng như câu điều kiện, hàm, quy tắc mẫu và xây dựng song song. Sử dụng cú pháp mở rộng của một cách triển khai cụ thể làm tăng chức năng nhưng có thể giảm tính khả chuyển sang những triển khai make khác.

Công cụ tạo mã nguồn

Trong môi trường lập trình UNIX, các công cụ tạo mã nguồn từ quy tắc đầu vào đã phát triển nhằm tránh viết thủ công mã lặp lại. Những ví dụ tiêu biểu là lexyacc.

lex tạo mã bộ phân tích từ vựng dựa trên đầu vào định nghĩa mẫu ký tự và hành động. Bộ phân tích được tạo có thể được dùng để phân loại luồng đầu vào thành các token.

%%
[0-9]+      return NUMBER;
[ \t\n]+    ;
.           return yytext[0];
%%

yacc nhận quy tắc ngữ pháp và hành động làm đầu vào rồi tạo mã bộ phân tích cú pháp.

%%
expression:
      NUMBER
    | expression '+' expression
    | expression '*' expression
    ;
%%

Hai công cụ này có thể được sử dụng không chỉ cho trình biên dịch mà còn để viết chương trình xử lý tệp cấu hình, ngôn ngữ lệnh, giao thức và văn bản có cấu trúc. POSIX định nghĩa hành vi cơ bản của các tiện ích lexyacc.

Trong môi trường hiện đại, các cách triển khai như Flex và Bison, trình tạo parser của những ngôn ngữ khác hoặc parser viết thủ công cũng được sử dụng. Tuy nhiên, phương thức khai báo ngữ pháp và mẫu rồi tạo mã chương trình là một ví dụ tiêu biểu cho văn hóa phát triển “công cụ tạo ra công cụ” của UNIX.

Trình soạn thảo

UNIX thời kỳ đầu sử dụng các trình soạn thảo theo dòng như ed, sau đó phát triển ex, vi, Emacs và nhiều trình soạn thảo dựa trên màn hình. Trình soạn thảo không phải thành phần cố định của nhân mà là chương trình không gian người dùng có thể thay thế.

Môi trường lập trình UNIX không yêu cầu một trình soạn thảo cụ thể. Nhà phát triển có thể sử dụng trình soạn thảo đầu cuối, trình soạn thảo đồ họa, môi trường phát triển tích hợp hoặc công cụ chỉnh sửa từ xa. Điều quan trọng là mã nguồn được lưu dưới dạng tệp thông thường và trình biên dịch cùng các công cụ khác có thể xử lý cùng những tệp đó.

Trình soạn thảo theo dòng và công cụ chỉnh sửa luồng có thể được sử dụng không chỉ để chỉnh sửa tương tác mà còn để thay đổi tệp trong script. sed, awk, perl và các công cụ patch cho phép tự động hóa những thay đổi lặp lại hoặc chuyển đổi mã nguồn.

Gỡ lỗi

Trình gỡ lỗi là công cụ điều khiển chương trình đang chạy và khảo sát điểm dừng, ngăn xếp lời gọi, thanh ghi, biến cùng trạng thái bộ nhớ. UNIX lịch sử sử dụng những trình gỡ lỗi như adb, sdbdbx, còn trong các hệ thống thuộc họ UNIX hiện đại, GDB, LLDB và các trình gỡ lỗi riêng của hệ điều hành được sử dụng rộng rãi.

Để biên dịch kèm thông tin gỡ lỗi, thông thường sử dụng tùy chọn -g.

cc -g -O0 main.c database.c -o application

Tắt hoặc giảm mức tối ưu hóa có thể làm cho quan hệ giữa mã nguồn và lệnh thực thi dễ theo dõi hơn. Ở mức tối ưu hóa cao, biến có thể bị loại bỏ hoặc di chuyển giữa thanh ghi và bộ nhớ, hàm có thể được nội tuyến hóa, còn thứ tự thực thi trong mã nguồn có thể bị sắp xếp lại.

Trong trình gỡ lỗi, những thao tác sau thường được thực hiện.

- Đặt điểm dừng tại một hàm hoặc dòng mã nguồn cụ thể
- Thực thi từng lệnh hoặc từng dòng mã nguồn
- Kiểm tra ngăn xếp lời gọi hàm
- Khảo sát biến cục bộ và biến toàn cục
- Kiểm tra nội dung bộ nhớ và thanh ghi
- Gắn vào một tiến trình đang chạy
- Phân tích core dump

Khi chương trình kết thúc bất thường, core dump có thể được tạo tùy theo cấu hình hệ điều hành. Core dump ghi lại bộ nhớ và trạng thái thực thi của tiến trình tại thời điểm kết thúc, cho phép phân tích nguyên nhân sự cố sau đó bằng trình gỡ lỗi.

Theo dõi lời gọi hệ thống và lời gọi thư viện

Ngoài trình gỡ lỗi ở mức mã nguồn, các công cụ theo dõi còn được sử dụng để khảo sát hoạt động giữa chương trình và hệ điều hành. Tùy cách triển khai, những công cụ như strace, truss, ktracedtruss ghi lại lời gọi hệ thống cùng tín hiệu.

Theo dõi lời gọi hệ thống hữu ích để xác định chương trình đã cố mở tệp nào, thất bại tại đường dẫn nào, đã tạo tiến trình nào và kết nối mạng thất bại ở đâu.

Cũng có những công cụ theo dõi lời gọi thư viện hoặc quá trình liên kết động. Có thể khảo sát tệp thực thi yêu cầu những thư viện dùng chung nào, ký hiệu nào được giải quyết trong lúc chạy và đường dẫn tìm kiếm thư viện được áp dụng như thế nào.

Tên và định dạng đầu ra của các công cụ này khác nhau giữa các hệ thống thuộc họ UNIX. Ngay cả khi giao diện mã nguồn của chương trình POSIX là chung, công cụ gỡ lỗi và quan sát thường phụ thuộc vào chức năng riêng của từng hệ điều hành.

Phân tích tĩnh và phân tích động

Phân tích tĩnh kiểm tra mã nguồn hoặc biểu diễn trung gian mà không chạy chương trình. Cảnh báo của trình biên dịch là chức năng phân tích tĩnh cơ bản nhất.

cc -Wall -Wextra -Wpedantic main.c -o application

Các tùy chọn cảnh báo cụ thể khác nhau tùy trình biên dịch, nhưng có thể phát hiện biến không được sử dụng, chuyển kiểu đáng ngờ, sử dụng hàm không đúng và vấn đề luồng điều khiển.

Công cụ phân tích tĩnh chuyên dụng hơn có thể phát hiện khả năng sử dụng con trỏ null, rò rỉ tài nguyên, hành vi không xác định, vấn đề đồng thời và sử dụng sai API. Kết quả phân tích không phải lúc nào cũng biểu thị lỗi thực tế, vì vậy cần xem xét cả ngữ cảnh mã và phạm vi phân tích của công cụ.

Phân tích động quan sát truy cập bộ nhớ, cấp phát và giải phóng, đồng bộ hóa luồng, hiệu năng cùng lời gọi hệ thống trong khi chương trình thực sự chạy. Các công cụ như AddressSanitizer, UndefinedBehaviorSanitizer, ThreadSanitizer và công cụ kiểm tra bộ nhớ có thể được sử dụng.

Công cụ dựa trên chèn mã của trình biên dịch có thể yêu cầu xây dựng chương trình cùng runtime đặc biệt, đồng thời làm tăng thời gian chạy và mức sử dụng bộ nhớ. Đổi lại, chúng có thể hiển thị truy cập bộ nhớ sai và tranh chấp dữ liệu khó phát hiện trong lần chạy thông thường, kèm theo vị trí lời gọi cụ thể.

Lập hồ sơ và đo hiệu năng

Trình lập hồ sơ đo chương trình tiêu tốn thời gian ở hàm và đường dẫn mã nào, được gọi bao nhiêu lần và sử dụng tài nguyên hệ thống ra sao. Các hệ thống thuộc họ UNIX sử dụng nhiều phương thức như lấy mẫu, chèn mã, bộ đếm hiệu năng phần cứng và theo dõi toàn hệ thống.

Trình lập hồ sơ lấy mẫu ghi lại vị trí thực thi theo khoảng thời gian nhất định để ước tính tỷ lệ thời gian chạy tổng thể mà từng hàm chiếm. Trình lập hồ sơ dựa trên chèn mã ghi lại thời điểm vào và ra khỏi hàm hoặc sự kiện cụ thể để thu được thông tin lời gọi chi tiết hơn, nhưng có thể làm tăng chi phí thực thi.

Trong phân tích hiệu năng, cần phân biệt thời gian CPU người dùng, thời gian CPU nhân, thời gian thực trôi qua, mức sử dụng bộ nhớ, lỗi trang, nhập xuất tệp và thời gian chờ mạng. Chỉ từ việc thời gian chạy dài không thể xác định phép tính bản thân chậm, chương trình đang chờ nhập xuất hay xảy ra tranh chấp khóa.

Thông thường, tối ưu hóa được thực hiện dựa trên phép đo thực tế. Chỉ tăng mức tối ưu hóa của trình biên dịch có thể không đủ; cần phân tích đồng thời thuật toán, bố trí bộ nhớ, số lần gọi hệ thống, đồng bộ hóa và đơn vị nhập xuất.

Lập trình tiến trình

Chương trình hệ thống UNIX có thể sử dụng các giao diện thuộc họ fork, execwait để chạy và quản lý chương trình khác.

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void)
{
    pid_t child = fork();

    if (child == -1) {
        return 1;
    }

    if (child == 0) {
        execlp("ls", "ls", "-l", (char *)0);
        _exit(127);
    }

    int status = 0;

    if (waitpid(child, &status, 0) == -1) {
        return 1;
    }

    return WIFEXITED(status) ? WEXITSTATUS(status) : 1;
}

Sau fork, tiến trình cha và tiến trình con chạy như những tiến trình khác nhau. Tiến trình con thay thế ảnh chương trình hiện tại bằng ls thông qua execlp, còn tiến trình cha thu hồi trạng thái kết thúc của tiến trình con bằng waitpid.

Nếu exec thành công, nó không quay lại hàm đã gọi. Nó chỉ trả về khi thất bại, vì vậy tiến trình con phải xử lý lỗi rồi gọi _exit. Nếu gọi exit thông thường trong tiến trình con sau fork, có thể xảy ra vấn đề như bộ đệm nhập xuất không gian người dùng được sao chép từ tiến trình cha bị xử lý lại.

Ngoài forkexec, POSIX còn định nghĩa posix_spawn. Tùy cách triển khai, giao diện này có thể kết hợp hiệu quả việc tạo tiến trình và thực thi chương trình, đồng thời thiết lập bộ mô tả tệp cùng thuộc tính tiến trình trước khi thực thi.

Lập trình đường ống

Chương trình có thể sử dụng pipe để tạo một luồng byte một chiều giữa hai tiến trình.

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void)
{
    int channel[2];

    if (pipe(channel) == -1) {
        return 1;
    }

    pid_t child = fork();

    if (child == -1) {
        return 1;
    }

    if (child == 0) {
        close(channel[1]);

        char buffer[64];
        ssize_t size = read(channel[0], buffer, sizeof(buffer));

        close(channel[0]);
        _exit(size < 0 ? 1 : 0);
    }

    close(channel[0]);

    const char message[] = "data";
    write(channel[1], message, sizeof(message) - 1);
    close(channel[1]);

    waitpid(child, NULL, 0);
    return 0;
}

channel[0] là đầu đọc và channel[1] là đầu ghi. Mỗi tiến trình phải đóng đầu mà mình không sử dụng. Để tiến trình đọc nhận biết cuối tệp, mọi đầu ghi phải được đóng. Vì vậy, nếu còn bộ mô tả ghi không cần thiết, thao tác đọc có thể tiếp tục chờ.

Pipeline của shell cũng có thể được triển khai nội bộ bằng cách kết hợp đường ống, tạo tiến trình và sao chép bộ mô tả tệp. Đầu vào chuẩn và đầu ra chuẩn của từng lệnh được kết nối với các đầu của đường ống, sau đó chương trình được thực thi bằng exec.

Lập trình tín hiệu

Tín hiệu truyền sự kiện bất đồng bộ đến tiến trình. Chương trình có thể sử dụng sigaction để chỉ định cách xử lý một số tín hiệu.

#include <signal.h>
#include <unistd.h>

static volatile sig_atomic_t interrupted = 0;

static void handle_interrupt(int signal_number)
{
    (void)signal_number;
    interrupted = 1;
}

int main(void)
{
    struct sigaction action = {0};
    action.sa_handler = handle_interrupt;
    sigemptyset(&action.sa_mask);

    if (sigaction(SIGINT, &action, NULL) == -1) {
        return 1;
    }

    while (!interrupted) {
        pause();
    }

    return 0;
}

Trình xử lý tín hiệu có thể bất đồng bộ ngắt luồng thực thi thông thường của chương trình, vì vậy những hàm có thể gọi bên trong bị giới hạn. POSIX định nghĩa riêng các hàm an toàn với tín hiệu bất đồng bộ có thể được gọi trong ngữ cảnh xử lý tín hiệu.

Thay vì trực tiếp thực hiện xử lý phức tạp trong trình xử lý tín hiệu, có thể ghi nhận sự kiện bằng biến sig_atomic_t, đường ống hoặc phương tiện khác rồi thực hiện xử lý thực tế trong luồng thực thi thông thường.

Trong chương trình đa luồng, cần phân biệt nguyên nhân tạo tín hiệu, đối tượng nhận tín hiệu, cấu hình xử lý tín hiệu của toàn tiến trình và mặt nạ chặn riêng của từng luồng.

Luồng POSIX

Luồng POSIX là giao diện tạo nhiều luồng thực thi trong không gian địa chỉ của một tiến trình. pthread_create tạo luồng mới và chạy hàm bắt đầu được chỉ định.

#include <pthread.h>
#include <stdio.h>

static void *worker(void *argument)
{
    const char *message = argument;
    puts(message);
    return NULL;
}

int main(void)
{
    pthread_t thread;

    if (pthread_create(&thread, NULL, worker, "worker started") != 0) {
        return 1;
    }

    if (pthread_join(thread, NULL) != 0) {
        return 1;
    }

    return 0;
}

Các luồng trong một tiến trình chia sẻ nhiều tài nguyên như không gian địa chỉ, dữ liệu toàn cục và bộ mô tả tệp đang mở. Mỗi luồng có ngăn xếp và trạng thái thực thi riêng, nhưng nếu truy cập đồng thời vào dữ liệu dùng chung, tranh chấp dữ liệu có thể xảy ra.

Luồng POSIX cung cấp các giao diện đồng bộ hóa như mutex, biến điều kiện, khóa đọc–ghi, spinlock, hàng rào và bộ nhớ riêng theo luồng. Các chức năng khả dụng có thể khác nhau tùy tùy chọn POSIX và cách triển khai.

Mutex cung cấp loại trừ lẫn nhau đối với trạng thái dùng chung, còn biến điều kiện cho phép luồng chờ đến khi một trạng thái cụ thể thay đổi. Biến điều kiện phải được sử dụng cùng mutex và vị từ biểu thị trạng thái được bảo vệ, và thông thường điều kiện được kiểm tra lại sau khi luồng thức dậy.

Ánh xạ bộ nhớ

mmap kết nối một tệp hoặc đối tượng bộ nhớ ẩn danh với không gian địa chỉ ảo của tiến trình. Chương trình có thể đọc và ghi vùng đã ánh xạ như bộ nhớ thông thường.

Ánh xạ tệp được sử dụng để truy cập một phần của tệp lớn trong không gian địa chỉ hoặc tận dụng bộ nhớ đệm trang và chức năng bộ nhớ ảo của hệ điều hành. Ánh xạ ẩn danh có thể được dùng để tạo vùng bộ nhớ tách khỏi heap hoặc bộ nhớ dùng chung giữa các tiến trình.

Việc thay đổi trên vùng ánh xạ có được chia sẻ với tệp hoặc tiến trình khác hay chỉ áp dụng cho một tiến trình phụ thuộc vào các cờ ánh xạ. Xử lý sai kích thước tệp, ranh giới trang hoặc quyền truy cập có thể gây lỗi bus hoặc truy cập bộ nhớ không hợp lệ.

mmap không phải lúc nào cũng nhanh hơn readwrite. Cần lựa chọn phương thức phù hợp dựa trên mẫu truy cập, kích thước tệp, lỗi trang, yêu cầu đồng bộ hóa và xử lý lỗi.

Lập trình mạng

Giao diện socket của UNIX cung cấp một mô hình lập trình chung cho liên lạc mạng và giao tiếp giữa các tiến trình cục bộ. Máy chủ thường sử dụng socket, bind, listenaccept, còn máy khách sử dụng socketconnect.

Socket đã kết nối được biểu diễn bằng bộ mô tả tệp, và dữ liệu có thể được trao đổi bằng readwrite hoặc các hàm thuộc họ sendrecv. Tuy nhiên, socket có tính chất khác tệp thông thường nên cần xử lý riêng trạng thái kết nối, ranh giới thông điệp, truyền một phần, thứ tự byte mạng và lỗi.

TCP cung cấp luồng byte, vì vậy không thể giả định một lần gọi send tương ứng với một lần gọi recv có cùng kích thước. Ứng dụng phải định nghĩa độ dài thông điệp, dấu phân cách hoặc cấu trúc giao thức cố định để khôi phục thông điệp từ các byte đã nhận.

UDP và một số loại socket khác duy trì ranh giới datagram, nhưng mức bảo đảm về truyền, thứ tự và tránh trùng lặp khác nhau tùy giao thức. Chương trình mạng phải thiết kế đồng thời ý nghĩa của phương thức truyền được sử dụng và giao thức ứng dụng.

Xử lý nhiều luồng nhập xuất

Máy chủ và chương trình tương tác có thể phải chờ đồng thời các sự kiện xảy ra trên nhiều bộ mô tả tệp. POSIX định nghĩa các giao diện ghép kênh nhập xuất như selectpoll.

Chương trình có thể chờ các bộ mô tả sẵn sàng để đọc hoặc ghi rồi chỉ thực hiện nhập xuất đối với những bộ mô tả đã sẵn sàng. Nhờ đó, nhiều kết nối có thể được xử lý trong một vòng lặp sự kiện mà không cần tạo tiến trình hoặc luồng riêng cho từng kết nối.

Các hệ thống thuộc họ UNIX hiện đại còn cung cấp những giao diện mở rộng riêng theo cách triển khai như epoll, kqueue và event ports. Chúng cung cấp cấu trúc được tối ưu hóa cho tập hợp lớn bộ mô tả tệp và thông báo sự kiện, nhưng API khác nhau giữa các hệ điều hành.

Chương trình ưu tiên tính khả chuyển có thể xây dựng một lớp trừu tượng chung hoặc sử dụng thư viện, rồi lựa chọn giao diện xử lý sự kiện của từng hệ điều hành ở bên trong.

Xử lý lỗi

Các hàm hệ thống UNIX thường sử dụng giá trị trả về đặc biệt và mã lỗi để biểu thị lỗi. Chẳng hạn, hàm trả về bộ mô tả tệp có thể trả -1 khi thất bại và đặt errno.

#include <errno.h>
#include <stdio.h>
#include <string.h>

if (operation() == -1) {
    fprintf(stderr, "operation failed: %s\n", strerror(errno));
}

errno phải được kiểm tra ngay sau lời gọi hàm thất bại. Không thể giả định một hàm thành công sẽ đặt lại errno, và một hàm khác cũng có thể thay đổi giá trị trước khi lỗi được báo cáo.

Không phải mọi hàm POSIX đều sử dụng errno-1. Nhiều hàm luồng POSIX trực tiếp trả về số hiệu lỗi và không sử dụng errno. Cần kiểm tra điều kiện thành công và thất bại được tài liệu hóa cho từng hàm.

Lời gọi hệ thống bị tín hiệu ngắt có thể trả về EINTR. Việc thử lại lời gọi, phản ánh dữ liệu đã được xử lý một phần hay hủy tác vụ phải được quyết định tùy theo hàm và chính sách của chương trình.

Trang hướng dẫn

Trong môi trường lập trình UNIX, lệnh, lời gọi hệ thống, hàm thư viện, định dạng tệp và giao diện quản trị được tài liệu hóa bằng các trang hướng dẫn.

man open
man 2 open
man 3 printf
man 1 make

Số phần của trang hướng dẫn có thể khác nhau về chi tiết tùy cách triển khai, nhưng thường được dùng để phân biệt lệnh người dùng, lời gọi hệ thống, hàm thư viện, định dạng tệp và lệnh quản trị hệ thống.

Cùng một tên có thể tồn tại trong nhiều lĩnh vực, vì vậy chỉ định số phần cho phép chọn tài liệu mong muốn. Chẳng hạn, lệnh printf của shell và hàm printf của thư viện C có thể nằm trong các tài liệu khác nhau.

Trang hướng dẫn ghi nguyên mẫu hàm, tệp tiêu đề cần thiết, đối số và giá trị trả về, lỗi, mức tuân thủ tiêu chuẩn cùng các giao diện liên quan. Trong lập trình hệ thống, việc kiểm tra quy ước cụ thể trong tài liệu của môi trường đang chạy quan trọng hơn chỉ ghi nhớ tên hàm.

Biến môi trường và môi trường phát triển

Biến môi trường là thiết lập dựa trên chuỗi được truyền từ tiến trình cha sang tiến trình con. Công cụ phát triển có thể sử dụng biến môi trường cho đường dẫn thực thi, locale, tùy chọn biên dịch và tìm kiếm thư viện.

PATH cung cấp danh sách thư mục mà shell dùng để tìm chương trình cần thực thi. Những tên như CC, CFLAGSLDFLAGS được sử dụng theo quy ước trong hệ thống xây dựng, nhưng không phải là các biến môi trường tiêu chuẩn mà mọi chương trình bắt buộc phải diễn giải cùng một nghĩa.

Các biến LANGLC_* có thể ảnh hưởng đến hành vi locale như phân loại ký tự, sắp xếp, ngày tháng, số và ngôn ngữ thông báo. Vì đầu ra và kiểm thử của chương trình có thể thay đổi theo locale, trong xử lý bằng máy và xây dựng có thể tái tạo, locale đôi khi được chỉ định tường minh.

Biến môi trường liên quan đến tìm kiếm thư viện động khác nhau tùy hệ điều hành và có thể bị bỏ qua hoặc hạn chế đối với chương trình chạy với đặc quyền cao vì lý do bảo mật. Việc luôn dùng những biến này để thay thế cấu hình toàn hệ thống có thể tạo kết quả khó dự đoán trong môi trường phân phối.

Chương trình có tính khả chuyển

Chương trình UNIX có tính khả chuyển không phụ thuộc một cách không cần thiết vào cấu trúc nội bộ của một nhân cụ thể hoặc hàm chỉ được cung cấp trên một hệ thống. Chương trình có thể được viết xoay quanh các giao diện do POSIX và ISO C định nghĩa, còn những phần cần chức năng riêng theo cách triển khai có thể được tách thành lớp riêng.

Kiểm tra chức năng khi biên dịch và biên dịch có điều kiện có thể được sử dụng để xử lý khác biệt giữa các môi trường.

#if defined(__APPLE__)
    /* Darwin-specific implementation */
#elif defined(__FreeBSD__)
    /* FreeBSD-specific implementation */
#elif defined(__linux__)
    /* Linux-specific implementation */
#endif

So với việc suy đoán sự tồn tại của chức năng chỉ từ macro tên hệ điều hành, việc kiểm tra thực tế tệp tiêu đề, hàm, kiểu dữ liệu và hành vi trong giai đoạn xây dựng có thể chính xác hơn. Nguyên nhân là ngay cả trên cùng một hệ điều hành, chức năng được cung cấp có thể khác nhau tùy phiên bản và tùy chọn xây dựng.

Macro kiểm tra chức năng của POSIX được sử dụng để lựa chọn phạm vi giao diện mà tệp tiêu đề công khai. Chương trình yêu cầu một phiên bản tiêu chuẩn cụ thể có thể định nghĩa macro thích hợp trước khi bao gồm tệp tiêu đề trong mã nguồn.

Tính khả chuyển không có nghĩa sử dụng cùng một cách triển khai nội bộ trên mọi nền tảng. Có thể duy trì giao diện bên ngoài và ý nghĩa của chương trình trong khi cung cấp cách triển khai riêng theo hệ điều hành cho những chức năng như giám sát tệp, xử lý sự kiện, tên luồng và nạp động.

Cấu thành môi trường phát triển

Một luồng phát triển chương trình UNIX điển hình có thể được tổ chức như sau.

1. Viết mã nguồn và tệp tiêu đề bằng trình soạn thảo.
2. Chạy cảnh báo trình biên dịch và phân tích tĩnh.
3. Biên dịch từng tệp nguồn thành tệp đối tượng.
4. Liên kết các tệp đối tượng và thư viện.
5. Kiểm thử chương trình và kiểm tra trạng thái kết thúc.
6. Khảo sát lỗi bằng trình gỡ lỗi và công cụ theo dõi.
7. Đo hiệu năng bằng trình lập hồ sơ và công cụ chèn mã.
8. Tự động hóa quá trình bằng makefile hoặc hệ thống xây dựng khác.
9. Kết nối kiểm thử, cài đặt và đóng gói bằng script shell.
10. Quản lý tính khả chuyển bằng cách tách giao diện tiêu chuẩn và cách triển khai riêng theo nền tảng.

Mỗi giai đoạn trong quá trình này có thể được thực hiện bằng công cụ độc lập và được kết nối thông qua tệp cùng giao diện dòng lệnh. Tệp đối tượng do trình biên dịch tạo trở thành đầu vào của trình liên kết, còn tệp thực thi do trình liên kết tạo trở thành đầu vào của trình gỡ lỗi hoặc công cụ kiểm thử. Kết quả kiểm thử và nhật ký có thể tiếp tục được phân tích bằng công cụ xử lý văn bản.

Trong các hệ thống thuộc họ UNIX hiện đại, cũng có thể sử dụng IDE, máy chủ ngôn ngữ, trình quản lý gói, CMake, Meson, Ninja và hệ thống xây dựng riêng theo ngôn ngữ. Ngay cả khi sử dụng những công cụ này, chúng thường vẫn gọi trình biên dịch, trình liên kết, tiến trình, hệ thống tệp và lệnh shell ở bên trong.

Cốt lõi của môi trường lập trình UNIX không nằm ở một công cụ cụ thể. Nó nằm ở việc nhiều công cụ phát triển hoạt động độc lập trên các giao diện tiến trình và tệp do hệ điều hành cung cấp, đồng thời nhà phát triển có thể kết hợp chúng theo nhu cầu.

Tiêu chuẩn và khả năng tương thích

UNIX phân hóa thành nhiều cách triển khai khi được các doanh nghiệp và viện nghiên cứu phát triển cho những phần cứng và mục đích khác nhau. Mỗi cách triển khai kế thừa cấu trúc chung gồm tiến trình, hệ thống tệp, shell và môi trường dòng lệnh, nhưng xuất hiện khác biệt trong lời gọi hệ thống, hàm thư viện, tùy chọn lệnh, định dạng tệp và phương thức quản trị. Ngay cả chương trình được viết cho cùng họ UNIX cũng có thể không biên dịch hoặc chạy nguyên trạng trên hệ thống khác nếu phụ thuộc vào giao diện của một cách triển khai cụ thể.

Để giảm những khác biệt này, công việc tiêu chuẩn hóa tập trung vào giao diện bên ngoài và môi trường thực thi mà ứng dụng sử dụng, thay vì cách triển khai nội bộ của hệ điều hành. Những tiêu chuẩn tiêu biểu gồm POSIXSingle UNIX Specification, và hiện nay các đặc tả cốt lõi của chúng được tích hợp trong The Open Group Base Specifications do IEEE cùng The Open Group đồng quản lý. POSIX.1-2024 và The Open Group Base Specifications Issue 8, được phê chuẩn năm 2024, định nghĩa giao diện hệ thống, shell, các tiện ích chung và môi trường vận hành.[54]

Tiêu chuẩn không quy định mã nguồn hay cấu trúc nội bộ của một nhân cụ thể. Việc hệ điều hành sử dụng nhân nguyên khối hay không, dùng bộ lập lịch hoặc hệ thống tệp nào, và cấu trúc tiến trình nội bộ được tổ chức ra sao đều có thể do cách triển khai quyết định. Trọng tâm của tiêu chuẩn là định nghĩa ứng dụng có thể sử dụng những tệp tiêu đề và hàm nào, lệnh phải nhận đầu vào và tùy chọn nào để tạo ra kết quả gì, cũng như shell phải diễn giải câu lệnh như thế nào.

Vì vậy, các hệ thống khác nhau tuân thủ tiêu chuẩn có thể sử dụng chung mã nguồn và script dù cách triển khai nội bộ khác nhau. Tuy nhiên, việc tuân thủ tiêu chuẩn không bảo đảm khả năng tương thích nhị phân của mọi chương trình hoặc hành vi hoàn toàn giống nhau. Khả năng tương thích của UNIX cần được hiểu bằng cách phân biệt giao diện mã nguồn, môi trường lệnh, định dạng nhị phân và các phần mở rộng riêng theo cách triển khai.

POSIX

POSIX là chữ viết tắt của Portable Operating System Interface, một họ tiêu chuẩn định nghĩa giao diện chung và môi trường thực thi mà ứng dụng có thể sử dụng trên các hệ điều hành khác nhau. POSIX dựa trên các giao diện tiến trình, tệp, tín hiệu, shell và tiện ích phát triển từ UNIX, nhưng không chỉ dành cho những hệ điều hành thuộc một dòng mã nguồn UNIX cụ thể.

Mục tiêu chính của POSIX là cung cấp tính khả chuyển ở mức mã nguồn cho ứng dụng. Nếu nhà phát triển chỉ sử dụng các tệp tiêu đề, hàm và lệnh được tiêu chuẩn định nghĩa, cùng mã nguồn có thể được biên dịch lại trong những môi trường POSIX khác nhau. ISO/IEC/IEEE 9945 do ISO phát hành cũng mô tả POSIX là tiêu chuẩn định nghĩa giao diện hệ điều hành, shell và các tiện ích chung nhằm hỗ trợ tính khả chuyển ở mức mã nguồn của ứng dụng.[55]

POSIX không tồn tại ngay từ đầu dưới dạng một tài liệu tích hợp duy nhất như hiện nay. Ban đầu, POSIX.1 tập trung vào lời gọi hệ thống và giao diện ngôn ngữ C, POSIX.2 xử lý shell cùng các tiện ích dòng lệnh, còn xử lý thời gian thực, luồng và nhiều đặc tả mở rộng khác được phát triển riêng. Sau đó, các đặc tả chính và chức năng mở rộng được hợp nhất, khiến POSIX.1 phát triển thành dạng bao gồm cả giao diện hệ thống, shell và tiện ích.

Đặc tả cốt lõi hiện nay, POSIX.1-2024, đồng thời là IEEE Std 1003.1-2024 và The Open Group Base Specifications Issue 8. Một tài liệu chung được sử dụng vừa làm tiêu chuẩn POSIX của IEEE vừa làm tiêu chuẩn của The Open Group, đồng thời cung cấp nền tảng cốt lõi của Single UNIX Specification cần thiết cho chứng nhận UNIX.[56]

POSIX không định nghĩa mọi chức năng của hệ điều hành. Môi trường đồ họa, API desktop cụ thể, trình quản lý gói, trình quản lý dịch vụ, cơ chế mô-đun nhân và nhiều chức năng quản lý phần cứng nằm ngoài đặc tả POSIX cốt lõi. Hệ thống POSIX có thể bổ sung tùy ý các chức năng riêng ngoài tiêu chuẩn, nhưng nếu thay đổi tên và hành vi được tiêu chuẩn định nghĩa theo cách không tương thích thì khó duy trì tính khả chuyển.

Cấu thành của đặc tả POSIX

The Open Group Base Specifications Issue 8 chủ yếu gồm bốn phần: Base Definitions, System Interfaces, Shell and Utilities và Rationale.

Base Definitions

Base Definitions định nghĩa các thuật ngữ, kiểu dữ liệu, tệp tiêu đề, tập ký tự, biến môi trường, locale, biểu thức chính quy, tên tệp và quy tắc tùy chọn lệnh được sử dụng chung trong những phần khác. Phần này cung cấp nền tảng chung cần thiết để diễn giải toàn bộ tiêu chuẩn, thay vì chỉ mô tả hành vi của một hàm cụ thể.

Phần này bao gồm yêu cầu đối với các tệp tiêu đề như <unistd.h>, <sys/types.h><signal.h>, các kiểu dữ liệu cùng hằng số tiêu chuẩn, cũng như phương thức kiểm tra những chức năng mà hệ thống hỗ trợ. Các quy tắc cú pháp cơ bản mà shell và tiện ích tuân theo khi xử lý tùy chọn dòng lệnh cũng được đề cập trong Base Definitions.[57]

System Interfaces

System Interfaces định nghĩa các hàm và giao diện hệ thống được chương trình C sử dụng. Phần này bao gồm giao diện nhập xuất tệp, thư mục, tạo và thực thi tiến trình, tín hiệu, thời gian, ánh xạ bộ nhớ, luồng, đồng bộ hóa và socket.

Tài liệu của từng giao diện thường mô tả tệp tiêu đề và nguyên mẫu hàm cần thiết, đối số, hành vi, giá trị trả về và điều kiện lỗi. Tuy nhiên, nó không quy định hàm phải sử dụng thuật toán và cấu trúc dữ liệu nào bên trong nhân. Chẳng hạn, ý nghĩa bên ngoài của fork được tiêu chuẩn hóa, nhưng cách không gian địa chỉ thực sự được sao chép và cách bộ lập lịch xử lý nội bộ được giao cho cách triển khai.

Không phải mọi hàm C có trong tiêu chuẩn đều nhất thiết là lời gọi hệ thống trực tiếp. Cách triển khai có thể xử lý một số chức năng trong thư viện không gian người dùng hoặc kết hợp nhiều lời gọi hệ thống nội bộ để cung cấp chúng. POSIX định nghĩa ý nghĩa của hàm mà ứng dụng quan sát được, chứ không tiêu chuẩn hóa bản thân phương thức đi vào nhân.

Shell and Utilities

Shell and Utilities định nghĩa ngôn ngữ lệnh shell POSIX và hành vi của các chương trình dòng lệnh chung. Nó bao gồm cú pháp shell như phân tích câu lệnh, mở rộng biến và tham số, trích dẫn, chuyển hướng nhập xuất, pipeline, câu điều kiện, vòng lặp và hàm.

Tùy chọn, đầu vào, đầu ra và trạng thái kết thúc của các tiện ích như awk, cat, grep, make, sedsort cũng được định nghĩa trong phần này. Nhờ đó, cùng một script shell và tổ hợp lệnh có thể được sử dụng trong nhiều môi trường POSIX.[58]

Tiêu chuẩn không chỉ yêu cầu tên lệnh, mà còn quy định tùy chọn và toán hạng, đầu vào và đầu ra chuẩn, hành vi lỗi cùng trạng thái kết thúc. Cách triển khai có thể cung cấp tùy chọn bổ sung, nhưng script có tính khả chuyển thường chỉ sử dụng các tùy chọn và cú pháp được tiêu chuẩn định nghĩa.

Rationale

Rationale không phải bản thân các yêu cầu mang tính quy phạm, mà giải thích lý do một thiết kế hoặc cách diễn đạt cụ thể được lựa chọn, khác biệt giữa những cách triển khai lịch sử, vấn đề tương thích và các phán đoán trong quá trình tiêu chuẩn hóa. Có thể tham khảo phần này khi tìm hiểu vì sao câu chữ tiêu chuẩn có dạng hiện tại hoặc khi khảo sát những trường hợp biên mơ hồ.

Giải thích trong Rationale không thay thế các yêu cầu chính thức của giao diện. Khi đánh giá tính phù hợp của cách triển khai hoặc hành vi của chương trình, phải dựa trên nội dung mang tính quy phạm trong Base Definitions, System Interfaces và Shell and Utilities.

Tính phù hợp POSIX

Tính phù hợp POSIX cho biết hệ thống hoặc ứng dụng có đáp ứng các yêu cầu được tiêu chuẩn định nghĩa hay không. Cách triển khai hệ điều hành phải cung cấp những giao diện và hành vi bắt buộc, còn ứng dụng phải sử dụng giao diện trong phạm vi tiêu chuẩn cho phép thì mới được coi là chương trình POSIX có tính khả chuyển.

Không thể đánh giá tính phù hợp chỉ bằng việc các tên như fork, shgrep có tồn tại hay không. Những hành vi có thể quan sát như giá trị trả về và lỗi của hàm, thứ tự mở rộng của shell, tùy chọn lệnh và định dạng đầu ra cũng phải phù hợp với yêu cầu tiêu chuẩn.

Tiêu chuẩn bao gồm cả chức năng cơ bản mà cách triển khai bắt buộc cung cấp và chức năng tùy chọn có thể được cung cấp. Vì vậy, hai hệ thống phù hợp POSIX vẫn có thể khác nhau về việc hỗ trợ các tùy chọn. Chương trình có thể sử dụng macro khi biên dịch hoặc giao diện truy vấn lúc chạy để kiểm tra chức năng cần thiết có thực sự được cung cấp hay không.

Cần phân biệt chứng nhận phù hợp chính thức với tuyên bố tương thích đơn thuần. Việc một hệ điều hành cung cấp giao diện giống POSIX hoặc có thể chạy phần lớn chương trình POSIX không nhất thiết có nghĩa nó đã trải qua kiểm thử và chứng nhận độc lập. Trong tài liệu, cần phân biệt “tương thích POSIX”, “phù hợp POSIX” và “được chứng nhận chính thức” tùy ngữ cảnh.

Single UNIX Specification

Single UNIX Specification là đặc tả của The Open Group định nghĩa những giao diện và hành vi mà một hệ điều hành phải cung cấp để trở thành môi trường UNIX chính thức. Điều kiện không phải là phải sử dụng một mã nguồn AT&T UNIX cụ thể, mà là có đáp ứng các giao diện tiêu chuẩn công khai hay không.

Hiện nay, POSIX và Single UNIX Specification không phải hai tài liệu hoàn toàn độc lập. Nền tảng chung của cả hai đã được tích hợp thành The Open Group Base Specifications, và môi trường phù hợp Single UNIX Specification được tạo thành bằng cách áp dụng các yêu cầu cùng tùy chọn bổ sung cần thiết cho hệ thống UNIX trên những yêu cầu bắt buộc của POSIX.

Một hệ thống phù hợp POSIX không tự động trở thành UNIX chính thức. Single UNIX Specification có phạm vi rộng hơn các yêu cầu bắt buộc của POSIX, và để nhận chứng nhận UNIX, sản phẩm phải đáp ứng các điều kiện gồm XSI cùng quy trình chứng nhận sản phẩm của The Open Group. The Open Group quy định chỉ những hệ thống hoàn toàn phù hợp Single UNIX Specification và đã được chứng nhận mới có thể sử dụng nhãn hiệu UNIX.[59]

Single UNIX Specification lấy tính phù hợp giao diện làm tiêu chí thay vì dòng dõi mã nguồn. Ngay cả hệ điều hành bắt nguồn từ UNIX lịch sử cũng không thể sử dụng nhãn hiệu UNIX chính thức nếu chưa được chứng nhận. Ngược lại, dù không trực tiếp sử dụng một dòng mã Research UNIX cụ thể, sản phẩm vẫn có thể được đăng ký là UNIX nếu đáp ứng đặc tả và điều kiện chứng nhận.

XSI

XSI là chữ viết tắt của X/Open System Interfaces, tập hợp giao diện mở rộng cốt lõi cấu thành Single UNIX Specification. Theo định nghĩa trong POSIX.1-2024, tùy chọn XSI là giao diện lập trình ứng dụng cốt lõi của hệ thống UNIX dành cho lập trình bằng C và sh, mở rộng các yêu cầu bắt buộc của POSIX thành một siêu tập.[60]

Tài liệu tiêu chuẩn phân biệt một giao diện hoặc yêu cầu cụ thể thuộc chức năng POSIX cơ bản hay được áp dụng bổ sung cho hệ thống hỗ trợ XSI. Hệ thống phù hợp POSIX có thể hỗ trợ XSI dưới dạng tùy chọn, nhưng môi trường UNIX theo Single UNIX Specification phải cung cấp những chức năng XSI mà tiêu chuẩn sản phẩm UNIX tương ứng yêu cầu.

XSI có thể bao gồm các giao diện và ý nghĩa nghiêm ngặt hơn từng được cung cấp phổ biến trong nhiều cách triển khai UNIX lịch sử nhưng không nằm trong môi trường POSIX tối thiểu. Nhờ đó, nó định nghĩa một môi trường ứng dụng UNIX rộng hơn và mang tính truyền thống hơn POSIX.

Vì vậy, chương trình đặt mục tiêu khả chuyển đến “mọi hệ thống POSIX” và chương trình đặt mục tiêu đến “hệ thống UNIX đáp ứng Single UNIX Specification” có phạm vi giao diện có thể sử dụng khác nhau. Chương trình sử dụng chức năng XSI phải tính đến khả năng những chức năng đó không tồn tại trên hệ thống chỉ cung cấp môi trường POSIX cơ bản.

Nhãn hiệu UNIX và chứng nhận

UNIX® viết hoa vừa là tên phân loại hệ điều hành thông thường, vừa là nhãn hiệu đã đăng ký do The Open Group quản lý. Để chính thức sử dụng tên sản phẩm UNIX, sản phẩm phải đáp ứng yêu cầu của Single UNIX Specification và vượt qua quy trình chứng nhận của The Open Group.

Chứng nhận UNIX không phải quy trình xác nhận mã nguồn hệ điều hành bắt đầu từ dòng nào, mà là quy trình kiểm chứng sản phẩm có cung cấp các giao diện và hành vi tiêu chuẩn được chỉ định hay không. Nhà cung cấp sản phẩm nộp kết quả kiểm thử phù hợp và tài liệu cần thiết, còn sản phẩm được chứng nhận sẽ được liệt kê trong sổ đăng ký của The Open Group.[61]

The Open Group đã vận hành những tiêu chuẩn sản phẩm như UNIX 95, UNIX 98, UNIX 03 và UNIX V7 theo từng thế hệ của Single UNIX Specification và tiêu chí chứng nhận. Con số trong mỗi tên không biểu thị năm phát hành của hệ điều hành hay phiên bản nhân, mà cho biết thế hệ tiêu chuẩn sản phẩm UNIX mà sản phẩm đã được chứng nhận.[62]

Chứng nhận có thể được cấp cho một sản phẩm, phiên bản và môi trường phần cứng cụ thể. Việc một số phiên bản trong một họ hệ điều hành được chứng nhận không có nghĩa mọi phiên bản và bản phân phối phái sinh của họ đó tự động nhận chứng nhận UNIX. Để xác nhận trạng thái chứng nhận chính thức, cần kiểm tra sổ đăng ký của The Open Group thay vì suy đoán chỉ từ tên sản phẩm.

Linux và nhiều hệ điều hành thuộc họ BSD cung cấp rộng rãi cấu trúc giống UNIX và giao diện POSIX, vì vậy thường được phân loại là hệ điều hành kiểu Unix. Tuy nhiên, phân loại kỹ thuật và lịch sử “kiểu Unix” là khái niệm riêng biệt với chứng nhận nhãn hiệu UNIX.

IEEE, The Open Group và Austin Group

Đặc tả cốt lõi hiện nay của POSIX được IEEE và The Open Group đồng phát hành. Cùng một Base Specifications được sử dụng làm IEEE Std 1003.1 và tiêu chuẩn của The Open Group, vì vậy hai tổ chức không định nghĩa trùng lặp các yêu cầu khác nhau cho cùng một giao diện.

Việc phát triển và duy trì kỹ thuật của đặc tả được thực hiện chủ yếu thông qua Austin Group. Austin Group điều phối các công việc liên quan của IEEE, The Open Group và ISO/IEC JTC 1 nhằm duy trì đặc tả chung của POSIX cùng Single UNIX Specification.

Trước khi được tích hợp, IEEE POSIX, các đặc tả X/Open và nhiều tiêu chuẩn công nghiệp đã phát triển riêng biệt. Năm 2002, các đặc tả IEEE POSIX và Single UNIX Specification được kết hợp thành ISO/IEC 9945:2002, hình thành một bản sửa đổi chung duy nhất.[63]

Hệ thống đặc tả chung làm giảm xung đột có thể phát sinh khi IEEE, ISO và The Open Group duy trì câu chữ khác nhau cho cùng một giao diện. Tuy nhiên, thời điểm phát hành, số phiên bản tại từng tổ chức và thời điểm cập nhật tiêu chuẩn sản phẩm chứng nhận vẫn có thể khác nhau.

ISO/IEC 9945

POSIX cũng được phát hành dưới dạng tiêu chuẩn quốc tế với số hiệu ISO/IEC 9945. ISO/IEC/IEEE 9945:2009, phát hành năm 2009, tương ứng với The Open Group Base Specifications Issue 7 và IEEE Std 1003.1-2008.

ISO/IEC 9945:2009 bao gồm bốn thành phần Base Definitions, System Interfaces, Shell and Utilities và Rationale, với mục đích hỗ trợ tính khả chuyển của ứng dụng ở mức mã nguồn thông qua giao diện hệ điều hành, shell và các tiện ích chung.[64]

Năm 2024, IEEE và The Open Group phê chuẩn POSIX.1-2024 cùng Base Specifications Issue 8. ISO tiến hành một phiên bản ISO/IEC/IEEE 9945 mới tương ứng theo quy trình tiêu chuẩn quốc tế riêng. Vì vậy, tại một thời điểm nhất định, năm phát hành của phiên bản IEEE·The Open Group và phiên bản ISO có thể không trùng nhau.

Trong tài liệu chương trình, việc chỉ viết “tiêu chuẩn POSIX” kém chính xác hơn so với chỉ rõ phiên bản được phụ thuộc. Chẳng hạn, giữa POSIX.1-2008, POSIX.1-2017 và POSIX.1-2024 có thể tồn tại các giao diện được thêm vào hoặc loại bỏ, cũng như những hành vi được làm rõ.

Các phiên bản tiêu chuẩn

POSIX và Single UNIX Specification đã bổ sung chức năng mới và sắp xếp lại các giao diện cũ trong khi vẫn cân nhắc khả năng tương thích với chương trình và cách triển khai hiện có. Các phiên bản chính thường được phân biệt như sau.

  • POSIX.1-1988 cung cấp tiêu chuẩn giao diện hệ thống ban đầu.
  • POSIX.2-1992 tiêu chuẩn hóa shell và các tiện ích chung.
  • IEEE Std 1003.1-2001 và Single UNIX Specification Version 3 tích hợp nhiều đặc tả POSIX cùng yêu cầu UNIX trước đó.
  • POSIX.1-2008 và Single UNIX Specification Version 4 hình thành thế hệ tiếp theo của đặc tả tích hợp.
  • POSIX.1-2017 là phiên bản phản ánh các bản đính chính kỹ thuật của bản năm 2008.
  • POSIX.1-2024 và Base Specifications Issue 8 là đặc tả chung hiện hành được phê chuẩn năm 2024.

Việc phiên bản tiêu chuẩn được cập nhật không có nghĩa mọi hệ điều hành lập tức triển khai toàn bộ phiên bản mới nhất. Hệ điều hành có thể bổ sung dần giao diện mới trong khi duy trì chứng nhận hoặc khả năng tương thích với phiên bản cũ, còn chương trình có thể chỉ sử dụng chức năng chung của phiên bản trước để hỗ trợ hệ thống cũ.

Một giao diện cũng có thể được đánh dấu là dự kiến loại bỏ hoặc bị xóa trong tiêu chuẩn mới. Điều này không có nghĩa chức năng đó lập tức biến mất khỏi các cách triển khai hiện có, nhưng cung cấp cơ sở để chương trình mới cân nhắc giao diện thay thế.

Chức năng bắt buộc và tùy chọn

POSIX phân loại nhiều chức năng thành tùy chọn để không yêu cầu mọi hệ thống cung cấp cùng quy mô tính năng. Tùy theo phiên bản tiêu chuẩn và tập chức năng, có thể cần kiểm tra việc hỗ trợ tùy chọn đối với tín hiệu thời gian thực, lập lịch ưu tiên, luồng, nhập xuất bất đồng bộ, bộ nhớ dùng chung và chức năng đồng bộ hóa.

Các hằng số được định nghĩa trong tệp tiêu đề có thể biểu thị việc hỗ trợ một tùy chọn cụ thể hoặc phiên bản tiêu chuẩn tại thời điểm biên dịch. Tuy nhiên, chức năng có thể không được cung cấp đồng nhất trên toàn hệ thống hoặc giá trị có thể thay đổi theo môi trường thực thi, vì vậy cũng có thể cần truy vấn lúc chạy.

sysconf truy vấn các giá trị liên quan đến toàn hệ thống hoặc môi trường thực thi tiến trình, như số lượng tệp có thể mở, kích thước trang, số bộ xử lý và tùy chọn hệ thống. pathconf cùng fpathconf truy vấn những giá trị có thể thay đổi theo đường dẫn hoặc đối tượng hệ thống tệp cụ thể, như độ dài tối đa của tên tệp và phạm vi ghi nguyên tử của đường ống.

Trong shell, có thể sử dụng tiện ích getconf để kiểm tra các giá trị cấu hình tiêu chuẩn.

getconf ARG_MAX
getconf OPEN_MAX
getconf PATH_MAX /

Ngay cả khi một hằng số được định nghĩa tại thời điểm biên dịch, giới hạn thực tế có thể không phải một con số cố định hoặc có thể thay đổi tùy đường dẫn. Thay vì giả định những con số truyền thống tùy ý, sử dụng giao diện truy vấn tiêu chuẩn và cấp phát bộ nhớ động sẽ có lợi hơn cho tính khả chuyển.

Macro kiểm tra tính năng

Tệp tiêu đề hệ thống trong môi trường POSIX có thể không luôn công khai mọi giao diện mà cách triển khai hỗ trợ theo cùng một cách. Tệp nguồn có thể định nghĩa macro kiểm tra tính năng để chỉ định tiêu chuẩn và phần mở rộng nào cần được khai báo.

Macro tiêu biểu _POSIX_C_SOURCE biểu thị phạm vi giao diện POSIX mà chương trình yêu cầu. Tùy giá trị, các khai báo của một phiên bản POSIX và tập chức năng cụ thể có thể được công khai. Chương trình cần giao diện XSI có thể sử dụng _XOPEN_SOURCE.

#define _POSIX_C_SOURCE 202405L

#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>

Macro kiểm tra tính năng phải được định nghĩa trước khi bao gồm các tệp tiêu đề hệ thống liên quan. Nếu định nghĩa macro sau khi đã bao gồm một số tệp tiêu đề, không thể thay đổi ổn định phạm vi khai báo của những tệp đã được xử lý.

Cần kiểm tra đồng thời tài liệu của phiên bản tiêu chuẩn và cách triển khai hệ điều hành để xác định giá trị cụ thể cùng các giao diện được cung cấp. Nếu sử dụng giá trị của tiêu chuẩn mới nhất, hệ điều hành hoặc thư viện C cũ có thể không nhận diện được, vì vậy cần chọn giá trị phù hợp với đối tượng hỗ trợ thực tế hoặc kiểm tra trong hệ thống xây dựng.

Kích hoạt macro mở rộng riêng theo cách triển khai cho phép sử dụng những chức năng bổ sung thuận tiện, nhưng có thể gây xung đột với tên tiêu chuẩn hoặc tạo phụ thuộc vào giao diện phi tiêu chuẩn. Trong mã chung, có thể chỉ rõ phạm vi tiêu chuẩn cần thiết và tách chức năng riêng theo cách triển khai thành tệp nguồn hoặc lớp trừu tượng riêng.

Khả năng tương thích mã nguồn

Khả năng tương thích mã nguồn có nghĩa cùng một mã nguồn chương trình có thể được biên dịch trong những môi trường khác nhau mà không cần sửa đổi hoặc chỉ cần sửa đổi hạn chế. Mục đích chính của POSIX là cung cấp tính khả chuyển ở mức mã nguồn như vậy.

Để có khả năng tương thích mã nguồn, không chỉ sự tồn tại của hàm và kiểu dữ liệu mà cả ý nghĩa, xử lý lỗi, tính an toàn luồng cùng hành vi của shell và tiện ích phải đủ nhất quán. Nếu chương trình phụ thuộc vào hành vi không được tiêu chuẩn định nghĩa hoặc đặc tính ngẫu nhiên của một cách triển khai, cùng mã nguồn vẫn có thể tạo ra kết quả khác nhau.

Việc là mã nguồn POSIX không có nghĩa mọi hệ thống sử dụng cùng lệnh biên dịch và tùy chọn thư viện. Một số hệ thống có thể yêu cầu liên kết riêng một thư viện cụ thể, còn đường dẫn tìm kiếm tệp tiêu đề, tên trình biên dịch và chế độ ngôn ngữ mặc định cũng có thể khác nhau. Các hệ thống xây dựng như Autoconf, CMake và Meson có thể kiểm tra những khác biệt môi trường này rồi tạo cấu hình xây dựng phù hợp.

Kích thước thực tế của kiểu dữ liệu cũng có thể khác nhau giữa các hệ thống. Không nên tùy ý giả định kích thước và cách biểu diễn của long, con trỏ, off_t, time_t và các kiểu khác, mà phải sử dụng kiểu dữ liệu cùng quy tắc chuyển đổi tiêu chuẩn. Khi lưu dữ liệu vào tệp hoặc mạng, sử dụng định dạng tuần tự hóa tường minh thay vì ghi trực tiếp cấu trúc trong bộ nhớ sẽ tăng tính khả chuyển.

Khả năng tương thích nhị phân

Khả năng tương thích nhị phân có nghĩa tệp thực thi hoặc thư viện đã được biên dịch trong một môi trường có thể được sử dụng trong môi trường khác mà không cần biên dịch lại. POSIX và Single UNIX Specification chủ yếu định nghĩa giao diện mã nguồn cùng môi trường thực thi, vì vậy không bảo đảm khả năng tương thích nhị phân chung giữa các hệ thống POSIX hoặc UNIX khác nhau.

Khả năng tương thích nhị phân đòi hỏi không chỉ tập lệnh bộ xử lý mà cả ABI, định dạng tệp đối tượng, quy ước gọi hàm, bố trí kiểu dữ liệu, trình liên kết động, ký hiệu của thư viện hệ thống và quy ước lời gọi hệ thống phải tương thích.

Chẳng hạn, dù Linux và FreeBSD đều chạy trên bộ xử lý x86-64 và cung cấp nhiều hàm POSIX, nhìn chung không thể cho rằng cùng một tệp nhị phân có thể chạy nguyên trạng vì quy ước chi tiết của định dạng thực thi, lời gọi hệ thống và ABI thư viện khác nhau. Nếu có một lớp tương thích riêng, có thể chạy tệp nhị phân của môi trường khác, nhưng đây không phải chức năng mà POSIX tự động cung cấp.

Ngay cả trong cùng một họ hệ điều hành, phiên bản ABI và thay đổi thư viện cũng có thể ảnh hưởng đến khả năng tương thích. Nhà cung cấp hệ điều hành có thể duy trì ổn định ABI hoặc cung cấp thư viện tương thích để tiếp tục chạy tệp nhị phân cũ, nhưng thời hạn và phạm vi bảo đảm cụ thể phụ thuộc vào chính sách sản phẩm.

API và ABI

API là hợp đồng gồm các hàm, kiểu dữ liệu, hằng số và hành vi mà mã nguồn sử dụng. Các giao diện như open, fork, pthread_create cùng các tiện ích shell được POSIX định nghĩa chủ yếu thuộc API và môi trường thực thi.

ABI là hợp đồng nhị phân giữa các đoạn mã đã biên dịch. ABI bao gồm việc đối số hàm được truyền qua thanh ghi và vị trí ngăn xếp nào, cấu trúc được bố trí trong bộ nhớ ra sao, tệp thực thi cùng thư viện dùng chung sử dụng định dạng nào.

Cùng một API có thể được cung cấp trên những ABI khác nhau. Trường hợp mã nguồn giống nhau nhưng phải được xây dựng lại bằng trình biên dịch của từng môi trường đích là một ví dụ. Ngược lại, ngay cả khi ABI tương thích ở mức đáng kể, chương trình vẫn có thể không hoạt động hoàn toàn giống nhau nếu ý nghĩa API và môi trường hệ thống tệp của hệ điều hành khác nhau.

Trong phát triển dựa trên tiêu chuẩn, tính khả chuyển API và khả năng tương thích ABI phải được quản lý riêng. Phân phối mã nguồn có thể sử dụng phương thức biên dịch lại trên hệ thống đích, còn phân phối tệp nhị phân có thể cung cấp các gói riêng cho từng hệ điều hành, kiến trúc bộ xử lý và ABI.

Khả năng tương thích của script shell

POSIX định nghĩa cú pháp và hành vi của ngôn ngữ lệnh sh, vì vậy script shell chỉ sử dụng chức năng tiêu chuẩn có thể chạy trong nhiều môi trường POSIX. Tuy nhiên, Bash, Zsh, KornShell và shell của từng hệ thống cung cấp ngoài POSIX những tính năng như mảng, biểu thức điều kiện mở rộng, thay thế tiến trình và các tùy chọn riêng.

Nếu script chỉ định /bin/sh làm trình thông dịch như dưới đây, thông thường nên sử dụng cú pháp shell POSIX.

#!/bin/sh

set -eu

for file in ./*.c
do
    printf '%s\n' "$file"
done

Việc /bin/sh thực tế trỏ đến cách triển khai shell nào có thể khác nhau theo hệ thống. Trên một hệ thống, nó có thể là Bash ở chế độ POSIX, còn trên hệ thống khác có thể là Dash, một shell thuộc họ KornShell hoặc shell riêng. Vì vậy, sử dụng cú pháp mở rộng của một cách triển khai trong script /bin/sh làm giảm tính khả chuyển.

Nếu cần chức năng dành riêng cho Bash, việc chỉ rõ Bash làm trình thông dịch và đặt Bash thành yêu cầu thực thi sẽ minh bạch hơn. Trong trường hợp đó, script không nhắm đến tính khả chuyển của shell POSIX, mà đã lựa chọn tường minh chức năng và môi trường đích cần thiết.

Tùy chọn của tiện ích cũng được mở rộng khác nhau theo cách triển khai. Các lệnh cùng tên của GNU, BSD và UNIX thương mại có thể cung cấp tùy chọn bổ sung khác nhau, vì vậy script có tính khả chuyển phải phụ thuộc vào tùy chọn cùng định dạng đầu ra được POSIX định nghĩa.

Khả năng tương thích của tiện ích dòng lệnh

Tiện ích POSIX cung cấp tên chung và hành vi cơ bản, nhưng các lệnh thực tế trong họ UNIX đã phát triển những tùy chọn và định dạng đầu ra khác nhau qua lịch sử lâu dài. Tiện ích GNU, tiện ích BSD và tiện ích UNIX thương mại thực hiện cùng một công việc có thể tương thích về chức năng tiêu chuẩn nhưng khác nhau về chức năng mở rộng.

Đầu ra mặc định dành cho con người đọc của lệnh có thể thay đổi tùy locale, chiều rộng thiết bị đầu cuối, thông tin hệ thống và phiên bản cách triển khai. Nếu script diễn giải đầu ra theo vị trí cột cố định, nó có thể hỏng trên hệ thống khác. Khi có thể, nên sử dụng tùy chọn dành cho xử lý máy hoặc dấu phân cách rõ ràng được tiêu chuẩn định nghĩa.

Tùy chọn lệnh sử dụng các quy tắc như tùy chọn một ký tự truyền thống, kết hợp nhiều tùy chọn và kết thúc phần tùy chọn bằng --. POSIX định nghĩa hướng dẫn cú pháp đối số cho tiện ích tiêu chuẩn, nhưng không phải mọi lệnh lịch sử đều hoàn toàn tuân theo cùng một cú pháp tùy chọn.[65]

Nếu tên tệp bắt đầu bằng -, nó có thể bị diễn giải thành tùy chọn. Với lệnh hỗ trợ --, có thể sử dụng dấu kết thúc tùy chọn hoặc truyền đường dẫn như ./filename. Tuy nhiên, không nên giả định mọi tiện ích lịch sử đều hỗ trợ -- theo cùng một cách, mà phải kiểm tra tiêu chuẩn và tài liệu của cách triển khai tương ứng.

Locale và xử lý ký tự

Môi trường POSIX quản lý việc phân loại ký tự, thứ tự sắp xếp, định dạng ngày giờ, biểu diễn số và thông báo theo ngôn ngữ cùng khu vực thông qua locale. Các biến môi trường như LANG, LC_ALL, LC_CTYPELC_COLLATE có thể ảnh hưởng đến hành vi của chương trình và tiện ích.

Chẳng hạn, thứ tự sắp xếp chuỗi của sort, phạm vi ký tự trong biểu thức chính quy và kết quả phân loại ký tự của awk cùng thư viện C có thể thay đổi theo locale. Ngay cả với cùng đầu vào, nếu locale của môi trường thực thi khác nhau, thứ tự đầu ra và kết quả khớp mẫu cũng có thể khác.

Khi cần xử lý máy có thể tái tạo, có thể chỉ định rõ LC_ALL=C hoặc locale cần thiết.

LC_ALL=C sort input.txt

Locale C hoặc POSIX cung cấp thứ tự byte và ký tự cơ bản, nhưng giao diện người dùng quốc tế hóa cần tôn trọng ngôn ngữ cùng môi trường ký tự của người dùng. Không phải lúc nào cố định mọi chương trình về locale C cũng phù hợp; có thể tách tính tái tạo của xử lý nội bộ khỏi phần hiển thị cho người dùng.

Mã hóa ký tự cũng phải được cân nhắc theo cách triển khai và locale. UTF-8 được sử dụng rộng rãi trong các hệ thống thuộc họ UNIX hiện đại, nhưng chương trình POSIX không nên giả định mọi byte tùy ý luôn là một ký tự hoặc mọi ký tự đều có độ rộng cố định.

Khác biệt của hệ thống tệp và đường dẫn

POSIX định nghĩa ý nghĩa chung của tên đường dẫn, thư mục và giao diện tệp, nhưng chức năng cùng giới hạn cụ thể của hệ thống tệp có thể khác nhau giữa các hệ thống. Độ dài tối đa của tên tệp, độ dài tối đa của đường dẫn, phân biệt chữ hoa chữ thường và đặc tính đồng bộ hóa của hệ thống tệp có thể thay đổi theo cách triển khai cùng hệ thống tệp được gắn kết.

Ngay cả khi có hằng số như PATH_MAX, không nên giả định luôn có thể xác định an toàn một bộ đệm kích thước cố định chứa mọi đường dẫn. Một số giới hạn không cố định tại thời điểm biên dịch hoặc có thể thay đổi theo đường dẫn cụ thể, vì vậy có thể sử dụng pathconf và bộ đệm động.

Tên tệp nói chung không thể chứa ký tự null, nhưng có thể chứa dấu xuống dòng, khoảng trắng, tab và dấu gạch ngang đầu tên, là những ký tự có ý nghĩa đặc biệt trong shell cùng công cụ văn bản. Chương trình và script có tính khả chuyển không nên đơn giản tách tên tệp theo khoảng trắng hoặc từng dòng.

Khóa tệp, tệp thưa, thuộc tính mở rộng, danh sách kiểm soát truy cập, thông báo thay đổi tệp và snapshot có thể được cung cấp dưới dạng phần mở rộng riêng của hệ thống hoặc hệ thống tệp. Chương trình sử dụng những chức năng này có thể chuẩn bị đường dẫn thay thế dựa trên tiêu chuẩn hoặc cách triển khai riêng theo nền tảng.

Khả năng tương thích của giao diện mạng

POSIX và XSI định nghĩa nhiều giao diện cần thiết cho lập trình mạng dựa trên socket. Tuy nhiên, việc cấu hình giao diện mạng, tường lửa, bảng định tuyến, xử lý sự kiện bất đồng bộ và nhập xuất gói hiệu năng cao thường phụ thuộc vào API riêng của hệ điều hành.

Có thể viết chương trình mạng chung bằng các giao diện cơ bản như socket, bind, connect, listen, accept, sendrecv. Đối với chuyển đổi địa chỉ và phân giải tên, sử dụng giao diện tiêu chuẩn có thể xử lý đồng thời IPv4 cùng IPv6 sẽ có lợi cho tính khả chuyển.

Ngược lại, các giao diện thông báo sự kiện dùng cho nhập xuất bất đồng bộ quy mô lớn như epoll của Linux, kqueue của BSD và macOS, hay event ports của Solaris khác nhau. Chương trình có thể xây dựng một lớp trừu tượng vòng lặp sự kiện chung hoặc cung cấp backend riêng cho từng nền tảng để xử lý khác biệt này.

Dù socket được biểu diễn bằng bộ mô tả tệp, nó không có mọi hành vi giống tệp thông thường. Phạm vi hỗ trợ của một số lời gọi hệ thống và cờ, mã lỗi cùng hành vi tín hiệu có thể khác nhau, vì vậy cần kiểm tra cả tiêu chuẩn lẫn tài liệu của hệ thống đích.

Khả năng tương thích của luồng và đồng thời

Giao diện luồng POSIX cung cấp API chung cho việc tạo và kết thúc luồng, mutex, biến điều kiện cùng bộ nhớ riêng theo luồng. Tuy nhiên, việc lập lịch luồng thực tế, kích thước ngăn xếp mặc định, phạm vi ưu tiên và chức năng mở rộng riêng theo cách triển khai có thể khác nhau giữa các hệ thống.

Nhiều hàm pthread_* trực tiếp trả về số hiệu lỗi thay vì đặt errno khi thất bại. Nhầm lẫn quy ước lỗi này với lời gọi hệ thống UNIX thông thường có thể khiến chương trình xử lý lỗi không đúng.

Những chức năng như loại mutex, đối tượng đồng bộ dùng chung giữa tiến trình, mutex bền vững và lập lịch thời gian thực có thể là tùy chọn hoặc chịu giới hạn của cách triển khai. Cần kiểm tra việc chức năng cần thiết có được cung cấp hay không thông qua hằng số lúc biên dịch và truy vấn lúc chạy.

Chương trình đồng thời không được bảo đảm hoạt động đúng chỉ nhờ khả năng tương thích API. Cần cân nhắc đồng thời mô hình bộ nhớ của ngôn ngữ C và C++, phép toán nguyên tử, tối ưu hóa trình biên dịch và ý nghĩa đồng bộ hóa POSIX.

Phần mở rộng riêng theo cách triển khai

Tiêu chuẩn cung cấp nền tảng chung nhưng không giới hạn mọi hệ thống chỉ được cung cấp cùng một tập chức năng. Hệ điều hành có thể bổ sung lời gọi hệ thống, hệ thống tệp, chức năng bảo mật, nhập xuất bất đồng bộ và công cụ phân tích hiệu năng ngoài giao diện tiêu chuẩn.

Linux có các giao diện riêng như epoll, inotify, signalfd, namespaces và nhiều chức năng khác. Họ BSD có các chức năng riêng theo hệ thống như kqueue, Capsicum và pledge. macOS cùng Darwin cung cấp Mach port, Grand Central Dispatch và nhiều framework nền tảng.

Sử dụng phần mở rộng riêng theo cách triển khai có thể mang lại hiệu năng và chức năng cao hơn trên nền tảng đó. Để duy trì tính khả chuyển, có thể tách lớp chung sử dụng giao diện tiêu chuẩn khỏi lớp riêng của hệ điều hành.

Ví dụ
  • src/
    • common/
      • process.c
      • event_loop.c
    • platform/
      • linux/
        • event_epoll.c
      • bsd/
        • event_kqueue.c
      • posix/
        • event_poll.c

Trong cấu trúc này, chương trình cấp cao sử dụng giao diện chung, còn quá trình xây dựng lựa chọn cách triển khai phù hợp với hệ điều hành đích. Trên nền tảng không được hỗ trợ riêng, có thể sử dụng cách triển khai dựa trên tiêu chuẩn như poll làm đường dẫn mặc định.

Chỉ sử dụng chức năng tiêu chuẩn không phải lúc nào cũng là lựa chọn tốt nhất. Nếu nền tảng đích được xác định rõ và chức năng riêng là yêu cầu cốt lõi của sản phẩm, có thể sử dụng trực tiếp chức năng đó. Điều quan trọng là phải tài liệu hóa ranh giới giữa chức năng tiêu chuẩn và mở rộng, đồng thời ngăn sự phụ thuộc không chủ ý vào một cách triển khai lan ra toàn bộ mã chung.

Tiêu chuẩn chính thức và tiêu chuẩn trên thực tế

Không phải mọi giao diện được sử dụng rộng rãi trong môi trường UNIX đều nằm trong POSIX hoặc Single UNIX Specification. Ngay cả khi một công cụ hoặc định dạng tệp được dùng chung trên nhiều hệ thống trên thực tế, nó vẫn có thể không phải thành phần bắt buộc của tiêu chuẩn chính thức.

SSH, Git, ELF, pkg-config, CMake, systemd và nhiều công cụ dòng lệnh được sử dụng rộng rãi trong môi trường phát triển UNIX hiện đại, nhưng mỗi công nghệ được quản lý bởi một đặc tả hoặc dự án riêng. Ngược lại, một giao diện có trong POSIX vẫn có thể ít được sử dụng trong chương trình hiện đại hoặc có giải pháp thay thế riêng theo cách triển khai tốt hơn.

Tiêu chuẩn trên thực tế có ưu điểm là được cài đặt rộng rãi, nhưng phiên bản, cách phân phối và tùy chọn lệnh có thể khác nhau theo hệ thống. Chương trình phải cân nhắc không chỉ trạng thái tiêu chuẩn chính thức mà cả khả năng cung cấp thực tế và chính sách phiên bản trong môi trường đích.

Khả năng tương thích ngược

Các hệ điều hành thuộc họ UNIX thường coi trọng khả năng tương thích ngược của API và ABI để tiếp tục chạy ứng dụng cùng script hiện có. Tuy nhiên, phạm vi và thời hạn tương thích ngược khác nhau tùy hệ điều hành và chính sách sản phẩm.

Ngay cả khi tiêu chuẩn đánh dấu một giao diện cũ là dự kiến loại bỏ, cách triển khai vẫn có thể tiếp tục cung cấp nó cho chương trình hiện có. Chương trình mới có thể sử dụng giao diện thay thế an toàn hoặc rõ ràng hơn, còn chương trình cũ có thể tiếp tục chạy thông qua lớp tương thích.

Việc sử dụng giao diện cũ có thể được thông báo bằng cảnh báo trình biên dịch hoặc macro kiểm tra tính năng trong khi vẫn duy trì khả năng tương thích mã nguồn. Khả năng tương thích nhị phân có thể được quản lý bằng ký hiệu thư viện dùng chung có phiên bản, thư viện tương thích và tính ổn định của lời gọi hệ thống.

Khả năng tương thích ngược không có nghĩa mọi lỗi và hành vi phi tiêu chuẩn phải được duy trì vĩnh viễn. Khi sửa vấn đề bảo mật, hành vi không xác định hoặc vi phạm tiêu chuẩn, sự phụ thuộc ngẫu nhiên của chương trình cũ có thể bị bộc lộ. Chương trình nên phụ thuộc vào hợp đồng đã được tài liệu hóa, còn hệ điều hành quản lý khả năng tương thích bằng cách cung cấp thông tin thay đổi và lộ trình chuyển đổi.

Kiểm thử khả năng tương thích

Để xác nhận tính phù hợp tiêu chuẩn, cần kiểm thử hành vi rộng hơn một bài kiểm tra xây dựng đơn giản chỉ xác nhận sự tồn tại của hàm và lệnh. Phải kiểm tra giá trị trả về, mã lỗi, tín hiệu và trạng thái tiến trình, thứ tự mở rộng shell, đầu ra của tiện ích cùng hành vi locale.

The Open Group vận hành hệ thống kiểm thử để xác minh nhiều thế hệ của Single UNIX Specification và tiêu chuẩn sản phẩm UNIX. Trong quá trình chứng nhận, tính phù hợp của sản phẩm được đánh giá bằng công cụ kiểm thử cùng kết quả được chỉ định.[66]

Dự án ứng dụng cũng có thể thiết lập tích hợp liên tục trên nhiều hệ thống thuộc họ UNIX. Thay vì cho rằng chỉ kiểm thử trên Linux đã hoàn toàn xác nhận tính khả chuyển POSIX, xây dựng và kiểm thử trên FreeBSD, macOS và khi cần trên môi trường UNIX thương mại có thể phát hiện sớm hơn sự phụ thuộc vào cách triển khai.

Thay đổi trình biên dịch cũng hữu ích cho việc kiểm tra tính khả chuyển. Sử dụng Clang và GCC, các thư viện C khác nhau cùng tùy chọn cảnh báo nghiêm ngặt có thể phát hiện mã chỉ tình cờ được một cách triển khai chấp nhận hoặc hành vi không xác định.

Cấu trúc của chương trình có tính khả chuyển

Chương trình có tính khả chuyển dành cho họ UNIX có thể lấy giao diện tiêu chuẩn làm nền tảng chung và xử lý chức năng riêng theo cách triển khai trong một lớp giới hạn.

Logic chương trình chung
  1. Logic chương trình
  2. API nội bộ chung
  3. Cách triển khai POSIX ── đường dẫn nhanh riêng theo cách triển khai
  4. Hệ điều hành và thư viện hệ thống

Logic chương trình chung sử dụng giao diện nội bộ của dự án cho tệp, tiến trình, luồng và mạng. Cách triển khai mặc định được viết bằng chức năng POSIX, còn khi cần hiệu năng cao hoặc tích hợp nền tảng, có thể bổ sung cách triển khai riêng của hệ điều hành.

Trong giai đoạn xây dựng, cần kiểm tra sự tồn tại thực tế của tệp tiêu đề và hàm, nguyên mẫu hàm cùng thư viện cần thiết. Thực hiện kiểm tra tính năng thay vì suy đoán chỉ từ tên hệ điều hành giúp xử lý cả khác biệt phiên bản và cấu hình tùy chọn trong cùng một hệ điều hành.

Trong giai đoạn thực thi, sử dụng sysconf, pathconf và các chức năng truy vấn liên quan để kiểm tra giới hạn hệ thống cùng tùy chọn. Không nên giả định việc biên dịch thành công có nghĩa nhân và hệ thống tệp đang chạy cung cấp mọi chức năng trong cùng một phạm vi.

Định dạng tệp và giao thức mạng có thể được thiết kế độc lập với ABI bằng cách sử dụng số nguyên độ rộng cố định, thứ tự byte tường minh và trường phiên bản. Nếu ghi trực tiếp nội dung bộ nhớ của cấu trúc vào tệp hoặc mạng, khác biệt về phần đệm, căn chỉnh và kích thước kiểu dữ liệu có thể phá vỡ khả năng tương thích.

Những điều tiêu chuẩn không bảo đảm

POSIX và Single UNIX Specification cung cấp nền tảng chung giữa nhiều môi trường UNIX, nhưng nhìn chung không bảo đảm đầy đủ những điều sau.

  • Khả năng tương thích nhị phân cho phép dùng nguyên trạng cùng một tệp thực thi trên các hệ thống khác nhau
  • Hiệu năng và mức sử dụng tài nguyên giống nhau
  • Cấu trúc nhân và thuật toán nội bộ giống nhau
  • Sự tồn tại của mọi chức năng mở rộng riêng theo cách triển khai
  • Sự thống nhất của môi trường đồ họa và API desktop
  • Sự thống nhất của trình quản lý dịch vụ và phương thức quản lý gói
  • Mọi chức năng cùng giới hạn của hệ thống tệp giống nhau
  • Câu chữ của thông báo chẩn đoán dành cho con người đọc hoàn toàn giống nhau
  • Chính sách bảo mật và công cụ quản trị giống nhau

Ngay cả khi sử dụng giao diện tiêu chuẩn, kết quả của chương trình vẫn có thể thay đổi theo giới hạn tài nguyên, locale, hệ thống tệp, mạng và cấu hình quyền của môi trường thực thi. Vì vậy, chương trình có tính khả chuyển phải cân nhắc xử lý lỗi, phát hiện tính năng và khác biệt môi trường bên cạnh việc tuân thủ tiêu chuẩn.

Quan hệ giữa tiêu chuẩn và UNIX

Dòng dõi lịch sử của UNIX và UNIX dựa trên tiêu chuẩn có liên quan với nhau nhưng không phải cùng một khái niệm. Theo nghĩa lịch sử, UNIX chỉ hệ điều hành được phát triển tại Bell Labs và các dòng phái sinh của nó. Theo nghĩa dựa trên tiêu chuẩn, UNIX chỉ sản phẩm đáp ứng Single UNIX Specification và đã được chứng nhận.

POSIX tiêu chuẩn hóa những giao diện hình thành từ UNIX, nhưng không đồng nhất với đặc tả cấp tên UNIX chính thức. Một hệ thống triển khai các yêu cầu bắt buộc của POSIX có thể cung cấp môi trường lập trình giống UNIX, nhưng để sử dụng nhãn hiệu UNIX phải đáp ứng phạm vi rộng hơn của Single UNIX Specification cùng điều kiện chứng nhận.

Hệ điều hành kiểu Unix là phân loại rộng chỉ các hệ điều hành kế thừa cấu trúc, giao diện và văn hóa sử dụng của UNIX. Phạm vi này bao gồm cả hệ thống được chứng nhận UNIX chính thức lẫn những hệ thống như Linux và họ BSD cung cấp môi trường theo phong cách UNIX bất kể trạng thái chứng nhận.

Vì vậy, khi giải thích khả năng tương thích liên quan đến UNIX, cần phân biệt những khái niệm sau.

Dòng dõi UNIX lịch sử
    └─ UNIX gốc và các hệ điều hành phái sinh từ mã nguồn của nó

Hệ điều hành kiểu Unix
    └─ Phân loại rộng cung cấp cấu trúc và giao diện giống UNIX

Môi trường phù hợp POSIX
    └─ Hệ thống cung cấp giao diện và môi trường thực thi do POSIX định nghĩa

UNIX chính thức
    └─ Sản phẩm đáp ứng Single UNIX Specification và đã được chứng nhận

Bốn phạm vi này chồng lấn đáng kể nhưng không hoàn toàn trùng nhau. Phân biệt riêng dòng dõi hệ điều hành, mức độ tương đồng kỹ thuật, tính phù hợp tiêu chuẩn và chứng nhận nhãn hiệu giúp giải thích chính xác hơn quan hệ giữa UNIX với Linux, BSD, macOS và UNIX thương mại.

Ý nghĩa thực tế của khả năng tương thích

Khả năng tương thích trong UNIX không có nghĩa mọi hệ thống trở nên giống hệt nhau. Mục đích của tiêu chuẩn hóa gần với việc cho phép tái sử dụng mã cốt lõi của chương trình thông qua giao diện chung, trong khi hệ điều hành và phần cứng vẫn có thể sở hữu cách triển khai nội bộ cùng chức năng bổ sung khác nhau.

POSIX và Single UNIX Specification cung cấp một ngôn ngữ chung cho tệp, tiến trình, shell, luồng và mạng. Nhà phát triển có thể sử dụng nền tảng này để viết chương trình và script có thể được biên dịch lại trên nhiều hệ điều hành.

Đồng thời, phần mềm thực tế có thể không đáp ứng được mọi yêu cầu chỉ bằng tiêu chuẩn. Trong những lĩnh vực cần chức năng riêng theo cách triển khai như nhập xuất bất đồng bộ hiệu năng cao, giám sát thay đổi tệp, sandbox và giao diện người dùng nền tảng, có thể sử dụng lớp tương thích riêng hoặc mã dành cho từng nền tảng.

Vì vậy, tính khả chuyển của chương trình UNIX không hoàn thiện chỉ bằng việc sử dụng API tiêu chuẩn. Cần chỉ rõ phiên bản tiêu chuẩn và tùy chọn được sử dụng, phát hiện chức năng, thiết kế kiểu dữ liệu cùng định dạng tệp theo hướng khả chuyển, đồng thời lặp lại việc xây dựng và kiểm thử trên nhiều cách triển khai. Tiêu chuẩn UNIX là nền tảng chung giúp những công việc này trở nên khả thi, chứ không phải một cách triển khai duy nhất tự động loại bỏ mọi khác biệt môi trường.

Họ UNIX

Họ UNIX là thuật ngữ chỉ theo nghĩa rộng các hệ điều hành trực tiếp phát sinh từ UNIX nguyên bản được phát triển tại Bell Labs, hoặc kế thừa giao diện hệ thống, mô hình thực thi, cấu trúc hệ thống tệp, môi trường dòng lệnh và văn hóa phát triển của UNIX. Trong tiếng Anh, chúng thường được gọi là Unix-like operating system hoặc Unix-like system.

Không phải mọi hệ điều hành thuộc họ UNIX đều phát sinh từ cùng một mã nguồn. Bên cạnh các nhánh BSD và System V tách ra về mặt lịch sử từ Research UNIX, còn có những hệ điều hành như Linux được triển khai độc lập để cung cấp môi trường tương tự UNIX mà không sử dụng mã nguồn UNIX nguyên bản. Ngoài ra, việc một hệ điều hành có thuộc phả hệ mã UNIX lịch sử hay không, có cung cấp giao diện POSIX hay không, và có được The Open Group chứng nhận UNIX chính thức hay không cũng là những tiêu chí khác nhau.

Vì vậy, họ UNIX có thể được hiểu là một phân loại kỹ thuật và lịch sử rộng, trong đó các hệ thống chia sẻ cấu trúc và giao diện chung, chứ không phải một dòng sản phẩm duy nhất hoặc một cấp chứng nhận được quy định nghiêm ngặt. Các hệ điều hành họ UNIX thường cung cấp tiến trình và bộ mô tả tệp, hệ thống tệp phân cấp, quyền dựa trên người dùng và nhóm, shell, pipe, lời gọi hệ thống và môi trường lập trình hệ thống tập trung vào C.

Các dòng phát triển chính của họ UNIX có thể được chia thành Research UNIX của Bell Labs, System V của AT&T, BSD của Đại học California tại Berkeley, các UNIX thương mại dựa trên những hệ thống này, các hệ điều hành tự do tiếp nối từ BSD, Darwin và macOS, cùng Linux, hệ thống triển khai độc lập giao diện UNIX. Các nhánh này vừa cạnh tranh vừa liên tục trao đổi công nghệ mạng, hệ thống tệp, quản lý tiến trình và công cụ không gian người dùng.

Tiêu chí phân loại

Có nhiều tiêu chí được sử dụng để xác định một hệ điều hành có thuộc họ UNIX hay không.

Tiêu chí đầu tiên là phả hệ mã nguồn lịch sử. Các nhánh System V và BSD, trực tiếp hoặc gián tiếp phát sinh từ Research UNIX, thuộc phả hệ lịch sử của UNIX. Solaris, AIX, HP-UX và các hệ điều hành BSD thời kỳ đầu đều có liên hệ với phả hệ này.

Tiêu chí thứ hai là giao diện lập trình và môi trường thực thi. Một hệ điều hành cung cấp các mô hình phát triển từ UNIX như fork, exec, bộ mô tả tệp, shell, pipe và hệ thống tệp phân cấp, đồng thời triển khai rộng rãi giao diện POSIX, thường có thể được phân loại là hệ UNIX. Theo tiêu chí này, Linux được xem là một hệ điều hành họ UNIX tiêu biểu.

Tiêu chí thứ ba là mức độ phù hợp tiêu chuẩn và chứng nhận. Một hệ thống phù hợp POSIX cung cấp các giao diện chung do POSIX định nghĩa, nhưng chỉ riêng điều đó không khiến nó trở thành UNIX chính thức. Để chính thức sử dụng nhãn hiệu UNIX, sản phẩm phải đáp ứng Single UNIX Specification và được The Open Group chứng nhận.

Tiêu chí thứ tư là không gian người dùng và văn hóa phát triển. Môi trường được cấu thành quanh shell POSIX, các tiện ích dòng lệnh truyền thống, thư viện C, make, trình biên dịch và công cụ xử lý văn bản cũng là một đặc điểm phân biệt họ UNIX. Tuy nhiên, vì công cụ không gian người dùng có thể được thay thế độc lập với kernel của hệ điều hành, không thể xác định phả hệ kernel chỉ dựa vào hình thức của các lệnh.

Những tiêu chí này phần lớn chồng lấn, nhưng không hoàn toàn trùng khớp.

Lịch sử UNIX
  • Phả hệ UNIX lịch sử
    • Research UNIX
      • Nhánh System V
      • Nhánh BSD
  • Họ UNIX được triển khai độc lập
    • Linux và các triển khai tương thích UNIX khác
  • Hệ thống phù hợp tiêu chuẩn
    • Hệ thống cung cấp giao diện POSIX
    • Hệ thống phù hợp Single UNIX Specification
  • UNIX chính thức
    • Sản phẩm được The Open Group chứng nhận

UNIX chính thức thường được bao gồm trong họ UNIX, nhưng không phải mọi hệ điều hành họ UNIX đều là UNIX chính thức. Ngoài ra, ngay cả khi phát sinh từ mã UNIX nguyên bản, một sản phẩm hiện tại không được chứng nhận cũng không thể sử dụng nhãn hiệu UNIX chính thức.

Research UNIX

Research UNIX chỉ các phiên bản UNIX nguyên bản được phát triển tại Computing Science Research Center của Bell Labs. Các phiên bản từ Ấn bản thứ nhất đến Ấn bản thứ mười chủ yếu được phân biệt theo số phiên bản của tài liệu 《UNIX Programmer’s Manual》 được phát hành cùng.

Research UNIX thời kỳ đầu được phát triển cho PDP-7 và PDP-11. Ấn bản thứ nhất bao gồm hệ thống tệp, tiến trình, shell và các công cụ xử lý tài liệu, còn Ấn bản thứ sáu được phân phối rộng rãi cho các trường đại học và viện nghiên cứu cùng mã nguồn, trở thành nền tảng quan trọng cho sự phát triển UNIX bên ngoài Bell Labs.

UNIX Ấn bản thứ bảy, công bố năm 1979, là một phiên bản có ảnh hưởng lớn, trong đó các chức năng chính của UNIX thời kỳ đầu được hoàn thiện. Ấn bản thứ bảy và 32V phát sinh từ nó sau đó trở thành tổ tiên chung của System III, System V, BSD và nhiều UNIX thương mại. 32V dành cho VAX là nhánh chuyển Ấn bản thứ bảy sang môi trường 32 bit, và Berkeley đã dựa trên đó để phát triển 3BSD, bổ sung bộ nhớ ảo cùng nhiều chức năng khác.

Research UNIX tiếp tục được phát triển như một nhánh nghiên cứu tách biệt với dòng UNIX thương mại chính thức của AT&T. Từ Ấn bản thứ tám đến Ấn bản thứ mười, nó được sử dụng để thử nghiệm các công nghệ mới bên trong Bell Labs như nhập/xuất luồng, hệ thống tệp mạng, thiết bị đầu cuối đồ họa và nghiên cứu hệ thống phân tán.

Nghiên cứu được thực hiện trong Research UNIX không chỉ ảnh hưởng đến các sản phẩm UNIX sau này mà còn đến những hệ điều hành kế nhiệm như Plan 9. Tuy nhiên, bản thân Research UNIX không phải một dòng sản phẩm tiếp tục được bán như hệ điều hành thương mại đa dụng hiện đại, mà là một nhánh lịch sử thể hiện nguyên mẫu và quá trình phát triển công nghệ ban đầu của UNIX.

Nhánh System V

System V là dòng UNIX tiêu biểu được AT&T thương mại hóa bằng cách hợp nhất nhiều nhánh phát triển UNIX nội bộ. Trước System V, bên cạnh Research UNIX còn có các sản phẩm riêng của Programmer’s Workbench và UNIX Support Group, và AT&T bắt đầu hợp nhất chúng trong System III.

UNIX System V, công bố năm 1983, trở thành dòng trung tâm của UNIX thương mại được AT&T chính thức hỗ trợ. Sau đó, System V Release 2, Release 3 và Release 4 lần lượt được phát hành, mở rộng khả năng giao tiếp liên tiến trình, hệ thống tệp, mạng và nhập/xuất thiết bị.

System V cung cấp System V IPC, bao gồm hàng đợi thông điệp, bộ nhớ dùng chung và semaphore. Các giao diện này sau đó được triển khai trên nhiều hệ UNIX riêng biệt với POSIX IPC, và vẫn có thể được cung cấp trong Linux và BSD hiện đại nhằm mục đích tương thích.

Trong System V Release 3, STREAMS được sử dụng như một cơ chế chính để cấu hình nhập/xuất và mạng. STREAMS được thiết kế như một framework có thể kết nối thiết bị ký tự và các giai đoạn xử lý giao thức dưới dạng mô-đun, nhưng không phải mọi hệ UNIX đều áp dụng nó ở cùng mức độ.

System V Release 4, công bố năm 1989, hợp nhất các chức năng chính của System V, BSD, SunOS và Xenix thông qua sự hợp tác giữa AT&T và Sun Microsystems. SVR4 kết hợp socket và chức năng mạng của BSD, khái niệm hệ thống tệp ảo của SunOS, IPC và STREAMS của System V. Tài liệu lịch sử UNIX của The Open Group cũng mô tả SVR4 là một phiên bản tích hợp nhiều nhánh, bao gồm System V và BSD.[67]

SVR4 về sau trở thành nền tảng của Solaris, UnixWare và nhiều UNIX thương mại. Ngoài ra, việc định dạng tệp thực thi ELF, System V ABI và nhiều giao diện quản trị hệ thống được phổ biến rộng rãi cũng ảnh hưởng đến các hệ UNIX khác, bao gồm Linux.

Nhánh System V không phát triển thành một sản phẩm duy nhất, mà được nhiều nhà sản xuất phần cứng và công ty phần mềm cấp phép rồi điều chỉnh theo hệ thống của họ. Vì vậy, ngay cả giữa các hệ thống cùng thuộc System V cũng tồn tại khác biệt đáng kể về không gian người dùng, công cụ quản trị và hỗ trợ phần cứng.

Nhánh BSD

BSD là viết tắt của Berkeley Software Distribution, chỉ phần mềm mở rộng UNIX và dòng hệ điều hành được phân phối bởi Đại học California tại Berkeley. Ban đầu BSD là tập hợp chương trình và sửa đổi cài đặt trên AT&T Research UNIX, nhưng về sau phát triển thành một dòng UNIX độc lập bao gồm toàn bộ kernel và không gian người dùng.

Dự án FreeBSD mô tả BSD là tên gọi cho mã nguồn được phân phối từ Berkeley, đồng thời nêu rõ BSD thời kỳ đầu là một nhánh mở rộng AT&T Research UNIX. Các hệ điều hành BSD tự do chủ yếu hiện đại lấy 4.4BSD-Lite, trong đó mã AT&T đã được loại bỏ, làm nền tảng chính.[68]

1BSD và 2BSD thời kỳ đầu cung cấp trình soạn thảo, môi trường Pascal và nhiều tiện ích dùng trên UNIX Ấn bản thứ sáu và Ấn bản thứ bảy. Các công cụ như ex, vi và C shell do Bill Joy phát triển cũng được phổ biến thông qua BSD.

Từ 3BSD, bộ nhớ ảo được bổ sung trên nền 32V dành cho VAX, khiến hệ thống tiến gần hơn đến một hệ điều hành hoàn chỉnh. Nhánh 4BSD đưa vào các cải tiến hiệu năng, điều khiển công việc, Fast File System và nhiều giao diện hệ thống.

4.2BSD có ảnh hưởng đặc biệt lớn vì bao gồm giao diện socket và ngăn xếp mạng TCP/IP. BSD socket về sau được áp dụng trong System V, môi trường POSIX, Linux và các hệ điều hành khác, trở thành giao diện tiêu biểu cho lập trình mạng.

Trong 4.3BSD và 4.4BSD, mạng, bộ nhớ ảo, hệ thống tệp và cấu trúc hệ thống tiếp tục được cải tiến. Berkeley thay thế mã có nguồn gốc từ AT&T bằng mã riêng để tạo Networking Release có thể phân phối tự do, và sau khi tranh chấp pháp lý được giải quyết, đã phát hành 4.4BSD-Lite cùng 4.4BSD-Lite Release 2.

FreeBSD, NetBSD và OpenBSD hiện đại thường được phân loại là các hệ điều hành BSD tự do tiếp nối từ nhánh 4.4BSD-Lite. Chúng có tổ tiên chung, nhưng không chỉ là các bản phân phối của nhau mà là những dự án hệ điều hành độc lập, mỗi dự án cùng phát triển kernel, không gian người dùng, hệ thống xây dựng và cơ chế phân phối riêng.

FreeBSD

FreeBSD là một hệ điều hành BSD tự do phát triển từ 386BSD và nhánh 4.4BSD-Lite. Nó không chỉ cung cấp kernel mà còn phát triển chung không gian người dùng cơ sở, thư viện C, shell, công cụ hệ thống và tài liệu trong cùng một dự án.

Dự án FreeBSD quản lý toàn bộ hệ điều hành như hệ thống cơ sở, đồng thời cho phép cài đặt ứng dụng bên ngoài thông qua Ports Collection và hệ thống gói. Đây là một đặc điểm khác với cấu trúc phân phối Linux phổ biến, trong đó kernel Linux được kết hợp với không gian người dùng từ nhiều dự án độc lập để tạo thành bản phân phối.

FreeBSD được sử dụng trong máy chủ, thiết bị mạng, hệ thống lưu trữ và hệ thống nhúng. Các chức năng như ZFS, Capsicum, jails, hỗ trợ DTrace và ngăn xếp mạng đã được phát triển thành những thành phần chính.

FreeBSD jail là chức năng ảo hóa cấp hệ điều hành tách biệt tiến trình, hệ thống tệp, người dùng và môi trường mạng. Nó cung cấp mức cô lập mạnh hơn chroot truyền thống và thường được so sánh với các công nghệ container trong những hệ điều hành khác.

Nhiều phần mã FreeBSD được phân phối theo giấy phép BSD mang tính dễ dãi, nên đã được sử dụng trong hệ điều hành thương mại, thiết bị mạng, máy chơi game và nhiều sản phẩm khác. Tuy nhiên, toàn bộ FreeBSD không chỉ sử dụng một loại giấy phép duy nhất; các giấy phép khác nhau có thể áp dụng tùy theo thành phần được bao gồm.

NetBSD

NetBSD là một hệ điều hành tự do bắt đầu từ 386BSD và dòng BSD, phát triển với tính khả chuyển trên nhiều kiến trúc máy tính và nền tảng phần cứng làm mục tiêu chính. Nó giữ mã kernel chung độc lập với nền tảng trong phạm vi có thể, đồng thời tách mã phụ thuộc máy vào các tầng theo từng kiến trúc.

NetBSD hỗ trợ không chỉ máy chủ và máy tính để bàn mà còn các workstation cũ, thiết bị nhúng và nhiều kiến trúc bộ xử lý khác nhau. Tính khả chuyển này cũng được sử dụng làm nền tảng để chuyển hệ điều hành sang kiến trúc máy tính mới hoặc nghiên cứu cấu trúc hệ điều hành.

pkgsrc, được phát triển trong dự án NetBSD, là một framework quản lý gói có thể sử dụng không chỉ trên NetBSD mà còn trên các hệ điều hành họ UNIX khác. Nhờ đó, phần mềm bên ngoài có thể được xây dựng và cài đặt theo một phương pháp chung trên nhiều hệ điều hành.

NetBSD bắt đầu từ cùng một nhánh với FreeBSD nhưng không phải chỉ là một biến thể của FreeBSD. Đây là một hệ điều hành riêng biệt, quản lý độc lập cấu trúc kernel, hỗ trợ thiết bị, quy trình phát hành và mục tiêu dự án.

OpenBSD

OpenBSD là một hệ điều hành BSD tự do tách ra từ NetBSD năm 1995, phát triển tập trung vào tính chính xác của mã, bảo mật, khả năng kiểm tra và cấu hình mặc định an toàn.

Dự án OpenBSD liên tục thực hiện kiểm tra mã nguồn, cải thiện các giao diện dễ phát sinh lỗi và cung cấp các chức năng ở trạng thái bị giới hạn theo mặc định khi có thể. Hệ điều hành đã áp dụng bảo vệ bộ nhớ, phân tách đặc quyền, giới hạn lời gọi hệ thống và các chức năng bảo mật trên toàn hệ thống.

Các phần mềm được phát triển hoặc có sự phát triển quan trọng trong OpenBSD bao gồm OpenSSH, OpenBGPD, OpenSMTPD, bộ lọc gói pf và LibreSSL. Trong số đó, OpenSSH được sử dụng rộng rãi trên nhiều hệ UNIX và các hệ điều hành khác ngoài OpenBSD.

pledgeunveil là các giao diện OpenBSD giới hạn chức năng hệ thống và đường dẫn hệ thống tệp mà chương trình có thể sử dụng. Ngay cả khi chương trình bị xâm nhập, chúng có thể hạn chế phạm vi thiệt hại bằng cách giảm số tài nguyên mà chương trình có thể truy cập.

OpenBSD cũng không phải là một bản phân phối của FreeBSD hoặc NetBSD mà là một hệ điều hành phát triển kernel và hệ thống cơ sở độc lập. Ba dự án có thể lấy mã từ nhau hoặc sử dụng phần mềm chung, nhưng có chính sách phát triển và mức độ ưu tiên khác nhau.

DragonFly BSD

DragonFly BSD là một hệ điều hành BSD tách ra từ nhánh FreeBSD 4 vào năm 2003. Nó được khởi động nhằm phát triển xử lý đa bộ xử lý đối xứng, tính đồng thời của kernel, phân cụm và cấu trúc hệ thống tệp theo hướng khác.

DragonFly BSD phát triển cấu trúc kernel dựa trên thông điệp cùng các hệ thống tệp HAMMER và HAMMER2. Dòng hệ thống tệp HAMMER hướng đến việc cung cấp snapshot, lưu giữ lịch sử và chức năng toàn vẹn dữ liệu.

DragonFly BSD bắt đầu từ FreeBSD nhưng sau đó phát triển kernel, hệ thống tệp và không gian người dùng riêng, và được phân loại là một trong các hệ BSD tự do hiện đại.

SunOS và Solaris

SunOS là hệ điều hành UNIX do Sun Microsystems phát triển cho workstation và máy chủ của hãng. SunOS 1 đến SunOS 4 ban đầu chủ yếu dựa trên BSD, kết hợp môi trường mạng BSD với công nghệ workstation của Sun.

Sun Microsystems tham gia phát triển System V Release 4 cùng AT&T, sau đó cung cấp hệ điều hành mới dựa trên SVR4 dưới tên sản phẩm Solaris. Nhìn chung, kernel từ Solaris 2 trở đi sử dụng số phiên bản nội bộ thuộc dòng SunOS 5.

Solaris phát triển bộ nhớ ảo, xử lý đa bộ xử lý đối xứng, mạng và chức năng máy chủ doanh nghiệp cùng môi trường người dùng dựa trên SVR4. Về sau, nó đưa vào các chức năng như ZFS, DTrace, Zones và Service Management Facility.

ZFS kết hợp quản lý thiết bị lưu trữ với hệ thống tệp, cung cấp checksum, snapshot, sao chép và storage pool. DTrace là framework quan sát động có thể theo dõi hoạt động của kernel và chương trình người dùng trong khi chạy. Solaris Zones cung cấp các môi trường không gian người dùng được cô lập trên cùng một kernel.

Sun đã công bố phần lớn Solaris dưới dạng OpenSolaris, nhưng mô hình phát triển công khai bị chấm dứt sau khi Oracle mua lại Sun. Sau đó, illumos tách ra từ mã OpenSolaris, và các hệ điều hành như OmniOS cùng SmartOS được phát triển dựa trên illumos.

Solaris và illumos thuộc nhánh SVR4, kết hợp công nghệ System V và BSD. Chúng bao gồm BSD socket và nhiều chức năng BSD, nhưng toàn bộ phả hệ hệ điều hành thường được phân loại vào dòng System V.

Nhánh illumos

illumos là một dự án lõi hệ điều hành tự do bắt đầu dựa trên mã OS/Net của OpenSolaris. Nó duy trì kernel, thư viện C, lệnh hệ thống và nhiều thành phần cốt lõi, đồng thời cung cấp nền tảng chung cho nhiều bản phân phối thay vì là một bản phân phối người dùng cuối hoàn chỉnh.

illumos kế thừa ZFS, DTrace, Zones, SMF và các chức năng ảo hóa mạng được phát triển trong Solaris. Dự án thay thế những thành phần đóng bằng phần mềm tự do và tiếp tục phát triển công nghệ thuộc dòng SVR4 và OpenSolaris.

OmniOS là một bản phân phối illumos tập trung vào môi trường máy chủ và lưu trữ, còn SmartOS là hệ điều hành illumos chuyên biệt cho ảo hóa và môi trường máy chủ đám mây. OpenIndiana được phát triển như một bản phân phối bao gồm môi trường máy tính để bàn và sử dụng đa dụng.

Nhánh illumos được phân biệt với dòng BSD tự do trực tiếp tiếp nối từ BSD nguyên bản. Dù chứa một số mã và giao diện BSD, về mặt lịch sử nó thuộc dòng System V Release 4 và Solaris.

AIX

AIX là hệ điều hành UNIX thương mại do IBM phát triển. AIX thời kỳ đầu sử dụng cả chức năng System V và BSD, về sau phát triển thành một hệ điều hành doanh nghiệp gắn chặt với phần cứng dòng POWER và PowerPC của IBM.

AIX hiện đại chủ yếu chạy trên máy chủ IBM Power và hướng đến môi trường trọng yếu như cơ sở dữ liệu, tài chính và xử lý nghiệp vụ. IBM mô tả AIX là hệ điều hành UNIX độc quyền dành cho máy chủ Power.[69]

AIX cung cấp phân vùng logic, tích hợp với PowerVM, quản lý tài nguyên động, cập nhật trực tiếp và chức năng tính sẵn sàng cao. SMIT cùng nhiều công cụ dòng lệnh được sử dụng để quản trị hệ thống.

Dòng hệ thống tệp của AIX bao gồm JFS và JFS2. JFS được phát triển nhằm giảm thời gian khôi phục tính nhất quán của hệ thống tệp sau khi dừng bất thường bằng cách sử dụng journaling.

Bên cạnh phân loại chung là hệ UNIX, các sản phẩm và phiên bản AIX được chứng nhận có thể được đăng ký như sản phẩm UNIX chính thức của The Open Group. Tuy nhiên, chứng nhận phải được kiểm tra theo từng sản phẩm và phiên bản; một trạng thái chứng nhận duy nhất không tự động áp dụng cho mọi phiên bản lịch sử mang tên AIX.

HP-UX

HP-UX là hệ điều hành UNIX thương mại do Hewlett-Packard phát triển. Ban đầu nó chịu ảnh hưởng của System III và System V, sau đó kết hợp mạng cùng nhiều chức năng của BSD để phát triển thành hệ điều hành cho workstation và máy chủ của HP.

HP-UX được sử dụng trên PA-RISC của HP 9000 và sau đó là các máy chủ Integrity dựa trên Itanium. Cơ sở dữ liệu doanh nghiệp, xử lý nghiệp vụ và môi trường máy chủ tính sẵn sàng cao là những lĩnh vực sử dụng chính.

Quản lý khối logic, hệ thống tệp dựa trên VxFS, cụm tính sẵn sàng cao Serviceguard và các công cụ quản trị hệ thống được sử dụng trong môi trường HP-UX.

HP-UX được phân loại là UNIX thương mại thuộc dòng System V, và một số phiên bản sản phẩm đã được chứng nhận dựa trên Single UNIX Specification. Hiện nay, nó tập trung vào vận hành và duy trì các hệ thống doanh nghiệp hiện có hơn là máy tính để bàn đa dụng hoặc nền tảng tiêu dùng mới.

IRIX

IRIX là hệ điều hành UNIX thuộc dòng System V do Silicon Graphics phát triển cho các workstation đồ họa và máy chủ dựa trên MIPS của hãng. Nó được sử dụng rộng rãi trong đồ họa ba chiều, xử lý hình ảnh, trực quan hóa khoa học và sản xuất nội dung số.

IRIX kết hợp chức năng BSD trên nền System V và cung cấp môi trường workstation tích hợp OpenGL với phần cứng đồ họa hiệu năng cao. Hệ thống tệp XFS cũng được phát triển cho IRIX, sau đó được chuyển sang Linux và sử dụng trong môi trường tệp dung lượng lớn cùng nhập/xuất song song.

Khi hoạt động kinh doanh workstation MIPS của Silicon Graphics thu hẹp, quá trình phát triển và hỗ trợ IRIX đã kết thúc. Tuy nhiên, OpenGL, XFS cùng nhiều công nghệ đồ họa và hệ thống vẫn tiếp tục tồn tại trong các hệ điều hành và phần mềm khác.

Tru64 UNIX

Tru64 UNIX là UNIX thương mại thuộc dòng OSF/1 do DEC phát triển. Ban đầu nó có tên DEC OSF/1, sau đó là Digital UNIX, rồi đổi thành Tru64 UNIX sau khi Compaq mua lại.

Tru64 UNIX bắt đầu từ OSF/1, kết hợp các thành phần dựa trên Mach với giao diện BSD và UNIX, đồng thời được phát triển cho bộ xử lý DEC Alpha. Hệ thống tệp AdvFS, cụm và môi trường 64 bit là những đặc điểm chính.

Sau khi HP mua lại Compaq, nhiều công nghệ của Tru64 UNIX được chuyển sang các sản phẩm của HP và hệ điều hành khác, nhưng bản thân hệ điều hành đã ngừng phát triển.

Tru64 UNIX được phân loại là dòng OSF/1 do Open Software Foundation phát triển trong thời kỳ chiến tranh UNIX, thay vì là sản phẩm trực tiếp tách ra từ System V. Tuy nhiên, nó cung cấp POSIX, giao diện UNIX cùng nhiều chức năng của BSD và System V.

UnixWare và OpenServer

UnixWare là hệ điều hành UNIX thương mại do UNIX System Laboratories và Novell phát triển dựa trên System V Release 4. Sau đó, quyền sở hữu và chủ thể phát triển được chuyển sang các công ty thuộc dòng SCO.

UnixWare cung cấp môi trường SVR4 trên hệ thống Intel x86 và hướng đến máy chủ doanh nghiệp cùng môi trường mạng. Nó kế thừa không gian người dùng và cơ chế quản trị của System V, đồng thời bổ sung nhiều chức năng mạng và đa bộ xử lý.

OpenServer là UNIX thương mại dành cho x86 phát triển từ SCO Xenix và SCO UNIX. Xenix là hệ UNIX do Microsoft và SCO phát triển cho các máy vi tính thời kỳ đầu, sau đó tiếp nối thành SCO UNIX và OpenServer.

UnixWare và OpenServer đều từng được sử dụng trong thị trường UNIX thương mại x86, nhưng phả hệ của chúng không hoàn toàn giống nhau. UnixWare thuộc dòng SVR4, còn OpenServer phát triển từ Xenix và SCO UNIX rồi tích hợp nhiều công nghệ khác.

Xenix

Xenix là hệ điều hành họ UNIX do Microsoft phát triển cho máy vi tính sau khi nhận giấy phép UNIX từ AT&T. Microsoft sử dụng mô hình cấp phép cho nhiều nhà sản xuất phần cứng thay vì trực tiếp bán trên thị trường người dùng cuối, và về sau SCO phụ trách phần lớn việc phát triển cùng kinh doanh.

Xenix đóng vai trò mở rộng UNIX, vốn tập trung vào PDP và workstation lớn, sang môi trường vi xử lý như Intel 8086 và 80286. Nó được điều chỉnh cho môi trường bộ nhớ và phần cứng hạn chế, đồng thời được sử dụng trên hệ thống của nhiều nhà sản xuất máy tính.

Microsoft sau đó tập trung vào OS/2 và Windows, rút khỏi hoạt động Xenix, còn SCO Xenix trở thành một trong những nền tảng của SCO UNIX và OpenServer.

NeXTSTEP và OPENSTEP

NeXTSTEP là hệ điều hành workstation hướng đối tượng do NeXT phát triển. Nó dựa trên kernel Mach và môi trường người dùng BSD, đồng thời tích hợp Objective-C, framework ứng dụng hướng đối tượng và giao diện đồ họa.

Kernel NeXTSTEP không giống hoàn toàn một kernel BSD truyền thống thuần túy. Nó sử dụng Mach để xử lý một phần tiến trình và bộ nhớ ảo, đồng thời cung cấp mô hình tiến trình UNIX, hệ thống tệp, mạng và giao diện POSIX thông qua tầng BSD.

OPENSTEP vừa là môi trường tiêu chuẩn hóa API hướng đối tượng của NeXT để có thể triển khai trên các hệ điều hành khác, vừa được sử dụng làm tên cho sản phẩm hệ điều hành NeXT về sau.

Apple mua lại NeXT năm 1996, và công nghệ NeXTSTEP cùng OPENSTEP trở thành nền tảng của Darwin, Mac OS X và macOS hiện đại. Framework Cocoa và môi trường phát triển tập trung vào Objective-C cũng tiếp nối từ dòng này.

Darwin

Darwin là dòng mã nguồn mở cấu thành nền tảng hệ điều hành cốt lõi của các nền tảng Apple. Nó bao gồm kernel XNU, các thành phần không gian người dùng BSD cùng nhiều thư viện và công cụ hệ thống.

XNU là kernel kết hợp các thành phần Mach và BSD. Tầng Mach cung cấp nền tảng cho bộ nhớ ảo, lập lịch và giao tiếp liên tiến trình, còn tầng BSD cung cấp mô hình tiến trình UNIX, người dùng và quyền, hệ thống tệp, mạng, tín hiệu và lời gọi hệ thống POSIX.

Tài liệu kernel của Apple giải thích rằng tầng BSD trong Darwin và OS X chủ yếu dựa trên FreeBSD, cung cấp hệ thống tệp, mạng, mô hình bảo mật UNIX, lời gọi hệ thống, tiến trình và tín hiệu cùng API POSIX.[70]

Darwin không phải là một hệ điều hành sử dụng nguyên vẹn chính FreeBSD. Đây là một nền tảng hệ điều hành riêng, kết hợp mã và giao diện từ FreeBSD cùng các dòng BSD khác vào kernel XNU dựa trên Mach, đồng thời bổ sung các thành phần hệ thống độc quyền của Apple.

Toàn bộ macOS cũng không chỉ được cấu thành từ các thành phần mã nguồn mở của Darwin. Giao diện đồ họa, framework Cocoa, nhiều ứng dụng và thành phần độc quyền của macOS được bổ sung trên Darwin.

macOS

macOS là hệ điều hành UNIX do Apple phát triển cho máy tính Mac. Nó dựa trên Darwin và XNU, kết hợp hệ thống đồ họa, framework ứng dụng và môi trường máy tính để bàn của Apple trên môi trường BSD và POSIX.

macOS cung cấp môi trường lập trình UNIX truyền thống như terminal và shell, bộ mô tả tệp, tiến trình, luồng POSIX và socket. Đồng thời, nó cũng cung cấp các framework riêng của Apple như Cocoa, Metal, Core Foundation và Grand Central Dispatch.

Nhiều phiên bản sản phẩm macOS đã được chứng nhận UNIX chính thức dựa trên Single UNIX Specification. Tuy nhiên, chứng nhận áp dụng cho từng phiên bản và sản phẩm cụ thể, vì vậy không phải mọi hệ điều hành Apple hoặc môi trường phát sinh từ Darwin đều tự động có cùng chứng nhận.

macOS chịu ảnh hưởng mạnh từ BSD nhưng không được phân loại đơn giản là một bản phân phối BSD. Nó là một hệ điều hành UNIX riêng với kernel XNU, cấu trúc dựa trên Mach, không gian người dùng và hệ thống sản phẩm độc quyền của Apple.

iOS và các hệ điều hành phái sinh của Apple

iOS, iPadOS, watchOS, tvOS và visionOS cũng dựa trên Darwin và XNU. Vì vậy, chúng chia sẻ nền tảng họ UNIX chung với macOS trong kernel cùng nhiều thành phần hệ thống cấp thấp.

Các hệ điều hành này sử dụng nội bộ tiến trình, hệ thống tệp, socket và nhiều giao diện POSIX, nhưng môi trường mà người dùng thông thường có thể truy cập khác với macOS. Việc thực thi tùy ý chương trình shell, truy cập tệp trên toàn hệ thống và vận hành tiến trình nền bị hạn chế bởi sandbox cùng chính sách nền tảng.

Việc dựa trên Darwin cũng phải được phân biệt với chứng nhận sản phẩm UNIX chính thức. Trạng thái chứng nhận của macOS không tự động áp dụng cho iOS và các hệ điều hành Apple khác.

Do đó, các hệ điều hành di động của Apple có thể được xem là họ UNIX về mặt phả hệ kỹ thuật, nhưng không thể được coi là hoàn toàn giống môi trường người dùng UNIX đa dụng truyền thống hoặc sản phẩm UNIX chính thức.

Linux

Linux là kernel tự do được Linus Torvalds bắt đầu phát triển năm 1991. Linux không phải kernel trực tiếp phát sinh từ mã nguồn UNIX nguyên bản của AT&T hoặc mã BSD, mà được viết mới từ đầu với mục tiêu tạo một hệ thống tương tự UNIX.

Tài liệu chính thức của kernel Linux mô tả Linux là một triển khai sao chép UNIX được Linus Torvalds và các nhà phát triển trên Internet viết từ đầu.[71]

Linux thời kỳ đầu được phát triển trong môi trường MINIX và ban đầu có cân nhắc một phần khả năng tương thích với MINIX, nhưng sau đó phát triển cấu trúc kernel và lời gọi hệ thống độc lập. Linux kế thừa mô hình tiến trình, hệ thống tệp, quyền, thiết bị và mạng của UNIX, trong khi cách triển khai bên trong được phát triển độc lập.

Nói chính xác, Linux là tên của kernel. Hệ điều hành mà người dùng thông thường cài đặt là một Bản phân phối Linux, kết hợp kernel Linux với GNU C Library, shell, Coreutils, hệ thống init, trình quản lý gói và nhiều ứng dụng.

Dự án GNU đã phát triển trình biên dịch, thư viện C, shell và tiện ích với mục tiêu tạo hệ điều hành tự do tương thích UNIX từ trước Linux. Khi kernel Linux được kết hợp với không gian người dùng GNU, môi trường vận hành họ UNIX tự do hoàn chỉnh được phổ biến rộng rãi.

Bản phân phối Linux khác với cấu trúc BSD, nơi một dự án trung tâm thường cùng phát triển kernel và toàn bộ không gian người dùng cơ sở. Linux là dự án kernel, còn bản phân phối tích hợp phần mềm từ nhiều dự án độc lập như công cụ GNU, systemd, ngăn xếp đồ họa và hệ thống quản lý gói.

Linux được sử dụng trong máy chủ, siêu máy tính, máy tính để bàn, thiết bị di động, thiết bị mạng và hệ thống nhúng. Android cũng sử dụng kernel Linux, nhưng không gian người dùng và môi trường ứng dụng được cấu thành khác với bản phân phối GNU/Linux thông thường.

Linux triển khai rộng rãi giao diện POSIX, nhưng toàn bộ một bản phân phối Linux thông thường không tự động được chứng nhận UNIX chính thức. Một sản phẩm cụ thể dựa trên Linux có thể được chứng nhận, nhưng chứng nhận không được áp dụng hàng loạt cho tên kernel Linux hoặc mọi bản phân phối.

GNU và GNU/Linux

GNU là dự án hệ điều hành phần mềm tự do do Richard Stallman khởi xướng năm 1983. Mục tiêu là tạo một hệ điều hành hoàn chỉnh tương thích với UNIX nhưng cho phép người dùng tự do chạy, sửa đổi và phân phối.

Dự án GNU đã phát triển GCC, GNU C Library, Bash, Coreutils, Binutils, GDB, Make cùng nhiều công cụ hệ thống. Các thành phần này được sử dụng rộng rãi trong không gian người dùng và môi trường phát triển của các bản phân phối Linux.

Kernel riêng của GNU, GNU Hurd, được phát triển theo cấu trúc nhiều máy chủ cung cấp chức năng hệ điều hành trên Mach. Trong thời gian Hurd chưa nhanh chóng trở thành một hệ điều hành đa dụng hoàn chỉnh, kernel Linux đã bắt đầu được kết hợp với không gian người dùng GNU và được sử dụng rộng rãi.

Dự án GNU và Free Software Foundation gọi hệ điều hành kết hợp không gian người dùng GNU với kernel Linux là GNU/Linux. Trong cách dùng thông thường, toàn bộ hệ điều hành cũng thường được gọi là Linux, và cách đặt tên thay đổi tùy theo ngữ cảnh cùng quan điểm.

Kernel Linux và công cụ GNU là các dự án khác nhau, và không phải mọi hệ điều hành dựa trên Linux đều sử dụng không gian người dùng GNU. Android sử dụng thư viện C Bionic cùng không gian người dùng riêng, còn Alpine Linux thường được cấu thành quanh musl và BusyBox.

Android

Android là hệ điều hành di động được phát triển chủ yếu bởi Google, dựa trên kernel Linux. Nó sử dụng chức năng tiến trình, quản lý bộ nhớ, trình điều khiển thiết bị và mạng của kernel, nhưng cung cấp không gian người dùng và môi trường ứng dụng khác với bản phân phối Linux máy tính để bàn thông thường.

Android sử dụng Bionic thay cho GNU C Library, đồng thời cung cấp API dựa trên Java và Kotlin cùng Android Runtime làm môi trường ứng dụng chính. Dịch vụ hệ thống, quyền, vòng đời ứng dụng và mô hình gói cũng khác với môi trường máy tính để bàn UNIX thông thường.

Ứng dụng Android mặc định chạy trong sandbox với mã định danh người dùng được gán riêng cho từng ứng dụng. Hệ thống tận dụng nội bộ mô hình cô lập người dùng và tiến trình của UNIX, nhưng không được cấu trúc để người dùng thông thường trực tiếp sử dụng môi trường shell UNIX đa người dùng truyền thống.

Vì Android sử dụng kernel Linux, nó có thể được bao gồm trong họ UNIX theo nghĩa rộng. Tuy nhiên, không nên phân loại nó giống một UNIX đa dụng hoặc bản phân phối GNU/Linux cung cấp shell POSIX và không gian người dùng GNU truyền thống làm môi trường ứng dụng mặc định.

ChromeOS

ChromeOS là hệ điều hành dựa trên Linux do Google phát triển. Nó cấu thành môi trường người dùng tập trung vào trình duyệt Chrome cùng hệ thống bảo mật, cập nhật tự động và cơ chế thực thi ứng dụng trên kernel Linux.

ChromeOS sử dụng nội bộ các dịch vụ hệ thống Linux, nhưng ban đầu không xem việc người dùng thông thường truy cập trực tiếp môi trường Linux máy tính để bàn truyền thống là phương thức sử dụng chính. Sau đó, môi trường phát triển Linux, hỗ trợ ứng dụng Android và các chức năng dựa trên ảo hóa đã được bổ sung.

ChromeOS cũng dựa trên kernel Linux nên về kỹ thuật thuộc họ UNIX, nhưng cấu trúc không gian người dùng và mục đích sản phẩm khác với bản phân phối Linux thông thường.

MINIX

MINIX là hệ điều hành họ UNIX do Andrew Tanenbaum phát triển để giảng dạy hệ điều hành. MINIX thời kỳ đầu cung cấp môi trường người dùng tương tự UNIX Ấn bản thứ bảy, đồng thời sử dụng cấu trúc microkernel nhỏ để mã nguồn dễ học trong giáo dục.

MINIX được phát triển độc lập, không trực tiếp sử dụng mã nguồn UNIX nguyên bản. Phần lớn quản lý tiến trình, hệ thống tệp và trình điều khiển thiết bị được tách thành các máy chủ không gian người dùng, qua đó được sử dụng để giải thích thiết kế microkernel.

Linus Torvalds phát triển Linux thời kỳ đầu trong môi trường MINIX, nhưng Linux không phát sinh từ kernel MINIX. Ban đầu Linux sử dụng hệ thống tệp và môi trường phát triển MINIX, sau đó phát triển kernel cùng hệ thống tệp độc lập.

MINIX 3 được phát triển không chỉ cho giáo dục mà còn hướng đến độ tin cậy và cô lập lỗi, sử dụng cấu trúc chạy trình điều khiển thiết bị cùng nhiều dịch vụ hệ điều hành trong không gian người dùng.

QNX

QNX là hệ điều hành họ UNIX thương mại phát triển tập trung vào tính thời gian thực và độ tin cậy. Nó sử dụng cấu trúc microkernel, chỉ đặt những chức năng cốt lõi như lập lịch tiến trình và truyền thông điệp trong kernel, còn hệ thống tệp, trình điều khiển thiết bị và dịch vụ mạng chạy dưới dạng tiến trình không gian người dùng.

QNX được sử dụng trong những môi trường cần thời gian đáp ứng có thể dự đoán và tính sẵn sàng cao như ô tô, điều khiển công nghiệp, thiết bị y tế và hệ thống nhúng.

Tiến trình, hệ thống tệp, shell và môi trường phát triển của QNX hỗ trợ rộng rãi giao diện POSIX và UNIX. Tuy nhiên, cấu trúc bên trong khác đáng kể với kernel UNIX nguyên khối truyền thống, và các dịch vụ hệ thống được tổ chức quanh cơ chế truyền thông điệp.

QNX là một ví dụ cho thấy mô hình lập trình bên ngoài của họ UNIX có thể được duy trì trong khi cấu trúc nội bộ kernel được thiết kế độc lập.

Haiku và dòng BeOS

Haiku là hệ điều hành tự do được phát triển với mục tiêu tương thích mã nguồn và nhị phân với BeOS. BeOS không trực tiếp phát sinh từ UNIX truyền thống, nhưng cung cấp giao diện POSIX, shell và nhiều công cụ UNIX.

Haiku phát triển kernel, môi trường đồ họa và API ứng dụng riêng, đồng thời cung cấp tầng tương thích POSIX cùng môi trường dòng lệnh UNIX. Vì vậy, nó có thể được xem là một hệ điều hành độc lập kế thừa một phần POSIX và môi trường phát triển kiểu UNIX hơn là thuộc phả hệ lịch sử UNIX điển hình.

Không nhất thiết mọi hệ điều hành cung cấp giao diện POSIX đều phải được phân loại là họ UNIX. Những hệ thống như Haiku có mô hình ứng dụng cơ bản khác UNIX nhưng đồng thời cung cấp chức năng tương thích UNIX, nên cách phân loại có thể thay đổi tùy theo ngữ cảnh.

Khác biệt giữa BSD và Linux

BSD và Linux đều là những hệ UNIX tiêu biểu có thể sử dụng tự do, nhưng có lịch sử và cấu trúc phát triển khác nhau.

Nhánh BSD tiếp nối về mặt lịch sử từ Research UNIX và BSD của Berkeley. FreeBSD, NetBSD và OpenBSD hiện đại có 4.4BSD-Lite, trong đó mã AT&T đã được loại bỏ, làm một tổ tiên chung quan trọng.

Kernel Linux không phát sinh từ kernel UNIX nguyên bản hoặc BSD mà được viết độc lập. Tuy nhiên, bằng cách triển khai giao diện bên ngoài của UNIX và POSIX, đồng thời sử dụng GNU cùng các công cụ họ UNIX khác trong không gian người dùng, nó đã tạo thành môi trường hệ điều hành họ UNIX.

Các dự án BSD thường cùng phát triển kernel và không gian người dùng cơ sở trong một dự án hệ điều hành. Linux là dự án kernel, còn hệ điều hành hoàn chỉnh được bản phân phối tạo ra bằng cách tích hợp thành phần từ nhiều dự án độc lập.

Văn hóa giấy phép cũng khác nhau. Mã cốt lõi của nhánh BSD chủ yếu sử dụng giấy phép BSD, không yêu cầu bắt buộc phải công khai mã nguồn đã sửa đổi. Kernel Linux sử dụng GPLv2, và khi phân phối tác phẩm phái sinh của kernel, các điều kiện công khai mã nguồn của giấy phép đó có thể được áp dụng.

Bất chấp những khác biệt này, BSD và Linux chia sẻ giao diện POSIX, shell, lập trình mạng cùng nhiều công cụ không gian người dùng. Chương trình và công nghệ được phát triển trong một nhánh cũng thường được chuyển sang nhánh khác.

Khác biệt và sự hợp nhất giữa System V và BSD

System V và BSD phát triển thành hai nhánh UNIX chính trong thập niên 1980. System V là dòng thương mại chính thức của AT&T, còn BSD phát triển chủ yếu quanh nghiên cứu của Berkeley cùng môi trường đại học và workstation.

Hai phía khác nhau về tùy chọn lệnh, khởi tạo hệ thống, xử lý terminal, giao tiếp liên tiến trình và nhiều giao diện hệ thống. System V phát triển System V IPC và STREAMS, trong khi BSD cung cấp socket, TCP/IP, điều khiển công việc và Fast File System.

Tuy nhiên, hai nhánh không duy trì trạng thái hoàn toàn tách biệt. Các nhà sản xuất UNIX thương mại đưa chức năng mạng BSD vào sản phẩm System V, còn nhánh BSD cũng triển khai System V IPC cùng nhiều giao diện tương thích.

System V Release 4 là phiên bản tiêu biểu cố ý hợp nhất các chức năng chính của cả hai phía. Sau đó, POSIX và Single UNIX Specification cũng giảm khác biệt bằng cách chuẩn hóa các giao diện chung giữa nhiều triển khai UNIX.

Trong các hệ UNIX hiện đại, nơi một chức năng xuất hiện lần đầu và những hệ thống hiện cung cấp nó có thể không trùng nhau. BSD socket được sử dụng trong gần như mọi hệ UNIX hiện đại, còn System V IPC cũng được hỗ trợ trong Linux và BSD.

Sự giao thoa giữa phả hệ và công nghệ

Phả hệ họ UNIX khó có thể được biểu diễn hoàn toàn bằng một cấu trúc cây đơn giản. Các hệ điều hành tiếp tục đưa mã từ nhánh khác vào và tái triển khai giao diện ngay cả sau khi tách khỏi một tổ tiên nhất định.

Solaris thuộc dòng SVR4 nhưng bao gồm BSD socket và công nghệ phát triển từ SunOS. macOS kết hợp tầng BSD chủ yếu từ FreeBSD trên phả hệ Mach và NeXTSTEP. Linux được viết độc lập nhưng triển khai System V ABI và ELF, BSD socket, luồng POSIX cùng nhiều giao diện UNIX.

FreeBSD và các hệ điều hành BSD khác cũng có thể cung cấp System V IPC, ELF cùng nhiều giao diện tương thích Linux. Ngược lại, một số công cụ và hệ thống tệp của Linux cũng được chuyển sang BSD hoặc UNIX thương mại.

Vì vậy, không thể xác định toàn bộ phả hệ của một hệ điều hành chỉ vì nó chứa một chức năng cụ thể. Phả hệ giải thích hệ điều hành đã phát triển từ mã và dự án nào, còn khả năng tương thích kỹ thuật giải thích hiện tại nó cung cấp những giao diện cùng chức năng nào.

UNIX chính thức và họ UNIX

UNIX chính thức là sản phẩm đáp ứng Single UNIX Specification do The Open Group quản lý và đã được chứng nhận. Chứng nhận phải được kiểm tra dựa trên sản phẩm, phiên bản và môi trường áp dụng đã đăng ký, chứ không phải toàn bộ một tên hệ điều hành.

Một số sản phẩm macOS, AIX, HP-UX và Solaris đã được chứng nhận theo các tiêu chuẩn sản phẩm UNIX của từng thời kỳ. Trạng thái chứng nhận và tình trạng đăng ký hiện tại có thể được kiểm tra trong danh bạ sản phẩm chính thức của The Open Group.[72]

Linux và FreeBSD thường được gọi là họ UNIX, nhưng từng kernel hoặc mọi bản phân phối không tự động nhận chứng nhận UNIX. Cần phân biệt khả năng một hệ thống cụ thể dựa trên Linux hoặc BSD tiến hành chứng nhận riêng với phân loại chung của toàn bộ dòng hệ điều hành.

Việc không có chứng nhận chính thức không có nghĩa hệ thống không liên quan về mặt kỹ thuật với UNIX hoặc không thể chạy chương trình POSIX. Chứng nhận biểu thị nhãn hiệu và mức độ phù hợp đặc tả, còn họ UNIX là một phạm trù kỹ thuật và lịch sử rộng hơn.

Các yếu tố chung của họ UNIX

Dù có khác biệt trong cách triển khai, các hệ điều hành họ UNIX thường chia sẻ những yếu tố sau.

  • Sử dụng tiến trình làm đơn vị cô lập cơ bản cho việc thực thi chương trình.
  • Tham chiếu tệp và nhiều tài nguyên nhập/xuất thông qua bộ mô tả tệp.
  • Cung cấp hệ thống tệp phân cấp bắt đầu từ /.
  • Quản lý quyền truy cập dựa trên mã định danh người dùng và nhóm.
  • Cấu hình việc thực thi chương trình và kết nối nhập/xuất thông qua shell.
  • Kết hợp chương trình bằng pipe và chuyển hướng.
  • Cung cấp giao diện hệ thống bằng C hoặc tương thích với C.
  • Hỗ trợ API thuộc họ POSIX để xử lý tiến trình, tệp, tín hiệu và socket.
  • Cung cấp môi trường tự động hóa thông qua tiện ích dòng lệnh và script.
  • Xem thực thi đa người dùng và đa nhiệm là giả định cơ bản.

Những yếu tố này không được triển khai hoàn toàn giống nhau trong mọi hệ thống. Có hệ thống sử dụng fork làm trung tâm cho việc tạo tiến trình, trong khi môi trường di động hoặc nhúng có thể hạn chế giao diện đó hoặc bổ sung mô hình thực thi khác.

Bố cục hệ thống tệp, trình quản lý dịch vụ, trình quản lý gói, môi trường đồ họa và cấu trúc kernel cũng khác nhau giữa các nhánh. Điểm chung xuất hiện nhiều hơn ở mô hình lập trình bên ngoài và môi trường sử dụng chứ không phải cách triển khai nội bộ.

Khác biệt giữa các hệ UNIX

Các hệ điều hành họ UNIX khác nhau về cấu trúc kernel, giấy phép, hỗ trợ phần cứng và phương thức phân phối.

Phần lớn UNIX truyền thống, Linux và BSD sử dụng kernel nguyên khối hoặc nguyên khối mô-đun, trong khi QNX và MINIX sử dụng cấu trúc microkernel. XNU của macOS được mô tả là cấu trúc lai kết hợp các thành phần Mach và BSD.

Định dạng tệp thực thi cũng không giống nhau. Linux, FreeBSD và Solaris sử dụng ELF, còn macOS và Darwin sử dụng Mach-O. Việc sử dụng cùng bộ xử lý và API POSIX không có nghĩa tệp thực thi có thể được trao đổi trực tiếp.

Khởi tạo hệ thống và quản lý dịch vụ sử dụng nhiều cơ chế như init truyền thống, BSD rc, System V init, SMF, launchd và systemd. Quản lý gói cùng phân cấp hệ thống tệp cũng khác nhau theo hệ điều hành và bản phân phối.

Giấy phép được chia thành giấy phép BSD, GPL, CDDL và giấy phép độc quyền. Khác biệt giấy phép ảnh hưởng đến cách đưa mã hệ điều hành vào sản phẩm thương mại và các điều kiện khi phân phối sửa đổi.

Quan hệ phả hệ hiện đại

Các hệ UNIX hiện đại có thể được khái quát như sau.

Lịch sử UNIX
  • Research UNIX
    • Dòng thương mại AT&T
      • System III
      • System V
        • SVR4
          • Solaris
            • OpenSolaris
              • illumos
          • UnixWare
        • AIX
        • HP-UX
        • IRIX
    • Nhánh BSD
      • 1BSD·2BSD
      • 3BSD·4BSD
      • 4.4BSD-Lite
        • FreeBSD
          • DragonFly BSD
        • NetBSD
          • OpenBSD
        • NeXTSTEP·OPENSTEP
          • Darwin
            • macOS
            • iOS
            • Các hệ điều hành Apple khác
    • Nhiều dòng nghiên cứu và thương mại phái sinh
      • SunOS
      • Xenix
      • OSF/1
        • Tru64 UNIX
      • Các UNIX khác
  • Họ UNIX được triển khai độc lập
    • Linux
      • Các bản phân phối GNU/Linux
      • Android
      • ChromeOS
    • MINIX
    • QNX
    • Các hệ điều hành tương thích POSIX·UNIX khác

Sơ đồ này đã đơn giản hóa các dòng phát triển chính. Trong phả hệ thực tế, tồn tại việc đưa mã và chức năng ngược trở lại giữa các nhánh, hoạt động phát triển chung cùng nhiều phiên bản trung gian. Các sản phẩm như AIX và HP-UX cũng không chỉ kế thừa nguyên vẹn một phiên bản System V duy nhất mà còn bao gồm chức năng từ BSD và các dòng UNIX khác.

NeXTSTEP và Darwin cũng không phải hậu duệ trực hệ đơn giản chỉ của 4.4BSD-Lite, mà là nhánh kết hợp Mach, BSD và công nghệ riêng của NeXT. Linux được triển khai độc lập, nhưng không gian người dùng và ABI hiện đại của nó cùng chịu ảnh hưởng từ System V, BSD, POSIX và GNU.

Ý nghĩa hiện đại

Ngày nay, Linux đã trở thành hệ điều hành họ UNIX được tiếp xúc rộng rãi nhất trong máy chủ đa dụng, đám mây và môi trường container. Trên máy tính để bàn và thiết bị di động, macOS cùng iOS dựa trên Darwin, Android và ChromeOS dựa trên Linux được sử dụng rộng rãi.

UNIX thương mại truyền thống từng là trung tâm của thị trường workstation và máy chủ, nhưng hiện chủ yếu được duy trì trong các hệ thống doanh nghiệp hiện có cùng môi trường trọng yếu được tối ưu hóa cho phần cứng cụ thể. AIX, HP-UX và dòng Solaris thuộc nhóm này.

FreeBSD và các nhánh BSD khác tiếp tục được sử dụng trong máy chủ, thiết bị mạng, hệ thống lưu trữ, bảo mật và nghiên cứu hệ điều hành. Mã BSD không chỉ được đưa vào hệ điều hành hoàn chỉnh mà còn xuất hiện trong ngăn xếp mạng, công cụ không gian người dùng và thành phần hệ thống của các sản phẩm khác.

Ảnh hưởng của họ UNIX khó có thể được đánh giá chỉ bằng thị phần của từng hệ điều hành. Tiến trình và bộ mô tả tệp, socket, giao diện hệ thống C, shell và pipe cùng tiêu chuẩn POSIX tiếp tục được sử dụng làm nền tảng chung cho máy chủ hiện đại, nền tảng di động và công cụ phát triển.

Họ UNIX không phải kết quả của việc một hệ điều hành duy nhất được sao chép đơn giản thành nhiều sản phẩm. Đây là một hệ sinh thái hệ điều hành được hình thành khi các nhánh trực tiếp phát sinh từ UNIX nguyên bản, những triển khai độc lập và các hệ thống tương thích dựa trên tiêu chuẩn liên tục trao đổi công nghệ với nhau.

Lĩnh vực ứng dụng

UNIX và các hệ điều hành họ UNIX được sử dụng trong nhiều lĩnh vực khác nhau, từ máy chủ và hạ tầng mạng, phát triển phần mềm, tính toán khoa học, hệ thống thông tin doanh nghiệp, máy tính cá nhân cho đến thiết bị di động và thiết bị nhúng. Không phải mọi hệ điều hành họ UNIX đều hướng đến cùng một thị trường và mục đích; lĩnh vực ứng dụng chính thay đổi tùy theo cấu trúc kernel, khả năng hỗ trợ phần cứng, giấy phép, hệ thống quản trị và hệ sinh thái ứng dụng của từng nhánh.

UNIX thời kỳ đầu được tạo ra như một hệ thống chia sẻ thời gian dành cho nghiên cứu và phát triển, trong đó nhiều người dùng cùng chia sẻ một máy tính. Sau đó, khi mã nguồn và môi trường lập trình được phổ biến đến các trường đại học và cơ sở nghiên cứu, UNIX được sử dụng cho nghiên cứu hệ điều hành, phát triển trình biên dịch, xử lý tài liệu và thử nghiệm mạng. Sau khi phần triển khai TCP/IP và giao diện socket của BSD được phổ biến rộng rãi, họ UNIX cũng trở thành nền tảng quan trọng cho máy chủ Internet và thiết bị mạng.

Ngày nay, Linux được sử dụng rộng rãi trong máy chủ đa dụng, đám mây, container, siêu máy tính và hệ thống nhúng, còn FreeBSD cùng các nhánh BSD khác được dùng trong thiết bị mạng, thiết bị lưu trữ, máy chủ và hệ thống bảo mật. macOS cung cấp môi trường máy tính để bàn cá nhân và phát triển phần mềm dựa trên UNIX, còn các hệ điều hành di động như iOS và Android cũng lần lượt sử dụng nền tảng họ UNIX là Darwin và Linux. Các UNIX thương mại như AIX, HP-UX và dòng Solaris tiếp tục được vận hành trong những hệ thống nghiệp vụ cốt lõi hiện có của doanh nghiệp và môi trường được tối ưu hóa cho phần cứng cụ thể.

Việc họ UNIX được sử dụng trong nhiều lĩnh vực không thể được giải thích bằng một đặc tính duy nhất. Môi trường đa người dùng dựa trên tiến trình và quyền người dùng, nhập/xuất thông qua bộ mô tả tệp và socket, tự động hóa dựa trên shell và script, chức năng mạng, quản trị từ xa, giao diện lập trình tập trung vào POSIX cùng hệ sinh thái phần mềm lâu đời đều cùng đóng góp.

Máy chủ

Máy chủ là một trong những lĩnh vực mà các hệ UNIX hiện đại được sử dụng rộng rãi nhất. Máy chủ web, máy chủ cơ sở dữ liệu, máy chủ tệp, máy chủ thư điện tử, máy chủ xác thực, máy chủ trò chơi và máy chủ ứng dụng có thể được vận hành trên Linux, BSD hoặc UNIX thương mại.

Họ UNIX cung cấp môi trường có thể tách biệt tiến trình của nhiều người dùng, quản lý socket mạng và bộ mô tả tệp theo phương thức chung, đồng thời chạy lâu dài các dịch vụ nền gọi là daemon. Quản trị từ xa và tự động hóa thông qua shell cùng tiện ích hệ thống cũng phù hợp với hoạt động vận hành máy chủ.

Chương trình máy chủ thường không phụ thuộc trực tiếp vào terminal hoặc màn hình đồ họa mà tiếp nhận và xử lý yêu cầu mạng. Các chương trình này được khởi chạy thông qua trình quản lý dịch vụ khi hệ thống khởi động và được quản lý bằng log, trạng thái kết thúc, tín hiệu cùng giao diện điều khiển tiến trình.

Linux được sử dụng rộng rãi trong môi trường máy chủ đa dụng nhờ hỗ trợ nhiều loại phần cứng, bản phân phối, gói phần mềm, container và nền tảng đám mây. FreeBSD cũng được sử dụng trong máy chủ kết nối Internet và hạ tầng tải cao, tập trung vào hiệu năng mạng cùng tính ổn định; dự án FreeBSD mô tả FreeBSD là một hệ điều hành máy chủ hiệu năng cao và là nền tảng cho router mạng, tường lửa cùng sản phẩm lưu trữ.[73][74]

UNIX thương mại được sử dụng trên các máy chủ yêu cầu phần cứng doanh nghiệp và hệ thống hỗ trợ cụ thể. IBM cung cấp AIX như một UNIX doanh nghiệp chạy trên máy chủ Power, đồng thời nêu bảo mật, khả năng mở rộng và tính sẵn sàng cho ngành có quy định cùng nghiệp vụ cốt lõi là những mục đích chính.[75]

Dịch vụ web và Internet

UNIX đóng vai trò quan trọng trong quá trình nghiên cứu và phát triển ban đầu của Internet. Ngăn xếp TCP/IP và giao diện socket có trong BSD được phân phối rộng rãi đến các trường đại học và cơ sở nghiên cứu, sau đó trở thành nền tảng chung để viết chương trình mạng trên nhiều hệ UNIX.

Dịch vụ web hiện đại bao gồm nhiều thành phần như máy chủ web xử lý yêu cầu HTTP, môi trường thực thi ứng dụng, cơ sở dữ liệu, bộ nhớ đệm, message broker, proxy và bộ cân bằng tải. Phần lớn các thành phần này hỗ trợ Linux và BSD như những môi trường thực thi chính.

Trong họ UNIX, mỗi dịch vụ có thể được chạy dưới dạng tiến trình hoặc container riêng biệt, rồi kết nối qua socket, tệp và giao tiếp liên tiến trình. Cũng có thể đặt quyền người dùng và phạm vi truy cập tệp khác nhau cho từng dịch vụ nhằm giới hạn ảnh hưởng đến các dịch vụ khác khi một dịch vụ bị xâm nhập.

Máy chủ web có thể sử dụng cấu trúc trong đó một tiến trình xử lý bất đồng bộ nhiều kết nối hoặc tạo nhiều tiến trình worker và luồng. Các giao diện socket, tiến trình, luồng và thông báo sự kiện của họ UNIX cung cấp nền tảng cho những mô hình thực thi máy chủ này.

Có thể cấu hình để các chương trình khác nhau phụ trách cung cấp tệp tĩnh, thực thi ứng dụng động, kết thúc TLS và chuyển tiếp yêu cầu, còn quản trị viên sử dụng tệp cấu hình cùng công cụ quản lý dịch vụ để tự động hóa toàn bộ môi trường máy chủ.

Điện toán đám mây

Linux được sử dụng rộng rãi trong môi trường Điện toán đám mây hiện đại như hệ điều hành khách và hệ điều hành máy chủ của máy ảo, cũng như môi trường thực thi container. Nhà cung cấp đám mây cung cấp CPU ảo, bộ nhớ, thiết bị lưu trữ và mạng, còn người dùng cài đặt Linux hoặc hệ điều hành họ UNIX khác lên đó để chạy dịch vụ.

Phương thức vận hành không tương tác và môi trường quản trị từ xa của họ UNIX phù hợp với các máy chủ đám mây không có màn hình hay bàn phím vật lý. Hệ thống có thể được tạo, thiết lập, cập nhật và xóa thông qua SSH, API quản trị, công cụ quản lý cấu hình và script tự động hóa.

Trong đám mây, thay vì quản lý thủ công một máy chủ trong thời gian dài, người ta thường định nghĩa image hệ điều hành và cấu hình dưới dạng mã, rồi tạo phiên bản mới khi cần. Shell, công cụ dòng lệnh và cấu hình dựa trên văn bản của họ UNIX dễ kết hợp với môi trường tự động hóa này.

UNIX thương mại truyền thống cũng đang được mở rộng sang môi trường đám mây. IBM cung cấp hạ tầng Power cho AIX và Linux dưới dạng dịch vụ thông qua Power Virtual Server, cho phép triển khai nghiệp vụ doanh nghiệp hiện có trong cả môi trường tại chỗ và đám mây.[76]

Việc là môi trường đám mây không có nghĩa mọi hệ UNIX đều được sử dụng theo cùng một cách. Linux được hỗ trợ rộng rãi trong đám mây đa dụng quy mô lớn, còn UNIX thương mại như AIX chủ yếu được sử dụng trong các dịch vụ chuyên biệt cung cấp kiến trúc bộ xử lý và nền tảng ảo hóa mà hệ điều hành đó hỗ trợ.

Container

Container là phương thức ảo hóa cấp hệ điều hành, trong đó các tiến trình, hệ thống tệp, mạng và việc sử dụng tài nguyên được cô lập trong khi cùng chia sẻ một kernel. Container Linux kết hợp namespaces, cgroups, hệ thống tệp và các chức năng bảo mật để tạo môi trường thực thi cô lập.

Chương trình bên trong container có thể sử dụng hệ thống tệp, danh sách tiến trình và giao diện mạng trông như thuộc một hệ điều hành độc lập, nhưng chia sẻ cùng kernel Linux với host. Vì vậy, container khởi động và sao chép nhanh hơn máy ảo hoàn chỉnh, đồng thời cho phép chạy nhiều môi trường ứng dụng trên một hệ thống.

Image container được sử dụng làm đơn vị phân phối, gói ứng dụng cùng các thư viện và tệp cấu hình cần thiết. Việc triển khai cùng một image trong môi trường phát triển và vận hành có thể làm giảm khác biệt giữa các môi trường thực thi.

Công nghệ container không chỉ tồn tại trên Linux. FreeBSD cô lập tiến trình, hệ thống tệp, người dùng và môi trường mạng thông qua jail, còn dòng Solaris cung cấp Zones. Dù cách triển khai và giao diện quản trị khác nhau, chúng đều chạy không gian người dùng bị cô lập trên một kernel họ UNIX duy nhất.

Container khác với máy ảo tách biệt hoàn toàn cả kernel. Khi cần kernel khác nhau hoặc một dòng hệ điều hành khác, có thể sử dụng ảo hóa phần cứng và máy ảo.

Hệ thống thông tin doanh nghiệp

UNIX thương mại đã được sử dụng trong các hệ thống nghiệp vụ cốt lõi của ngân hàng, bảo hiểm, y tế, viễn thông, cơ quan chính phủ và ngành sản xuất quy mô lớn. Trong những môi trường này, cơ sở dữ liệu và ứng dụng nghiệp vụ chạy lâu dài, chính sách bảo trì có thể dự đoán, hỗ trợ kỹ thuật từ nhà cung cấp cùng cấu hình phần cứng cụ thể đều được coi trọng.

AIX được kết hợp với máy chủ IBM Power để chạy cơ sở dữ liệu doanh nghiệp, xử lý giao dịch và nghiệp vụ cốt lõi. IBM mô tả AIX là nền tảng dành cho workload trọng yếu trong môi trường có quy định và đưa ngân hàng, y tế, bảo hiểm cùng khu vực công làm những đối tượng tiêu biểu.[77]

HP-UX được sử dụng trong môi trường máy chủ doanh nghiệp của HP, còn Solaris được sử dụng trong môi trường máy chủ Sun và Oracle. Những hệ điều hành này cung cấp phân vùng logic, cụm tính sẵn sàng cao, quản lý volume, hệ thống tệp và công cụ chẩn đoán kết hợp với phần cứng cùng hệ thống hỗ trợ cụ thể.

Trong hệ thống thông tin doanh nghiệp, tính liên tục của ứng dụng và dữ liệu đã được kiểm chứng đôi khi quan trọng hơn việc nhanh chóng áp dụng chức năng mới. Vì vậy, những hệ thống UNIX cũ không được thay thế ngay bằng hệ điều hành khác mà có thể được duy trì lâu dài cùng ảo hóa hoặc tầng tương thích.

Tuy nhiên, không thể giới hạn việc sử dụng UNIX doanh nghiệp chỉ vào bảo trì chương trình cũ. Chúng cũng tiếp tục được mở rộng để kết nối đám mây lai, tự động hóa, phân tích dữ liệu và ứng dụng mới với dữ liệu cùng hệ thống nghiệp vụ cốt lõi hiện có.

Cơ sở dữ liệu

Họ UNIX là môi trường thực thi chính của cơ sở dữ liệu quan hệ, kho khóa–giá trị, cơ sở dữ liệu chuỗi thời gian và hệ thống lưu trữ dữ liệu phân tán. Máy chủ cơ sở dữ liệu phải quản lý ổn định các tiến trình chạy lâu dài, bộ nhớ lớn, nhập/xuất đồng thời và kết nối mạng.

Hệ thống tệp, bộ nhớ ảo, nhập/xuất bất đồng bộ, bộ nhớ dùng chung cùng chức năng đồng bộ tiến trình và luồng của UNIX được sử dụng trong việc triển khai cơ sở dữ liệu. Cơ sở dữ liệu có thể dùng page cache của hệ điều hành hoặc sử dụng bộ nhớ đệm riêng cùng nhập/xuất trực tiếp để kiểm soát truy cập thiết bị lưu trữ.

Cơ sở dữ liệu doanh nghiệp đã hỗ trợ AIX, HP-UX, Solaris và Linux, còn cơ sở dữ liệu mã nguồn mở hiện đại chủ yếu được phát triển và phân phối trong môi trường POSIX, bao gồm Linux và BSD.

Độ ổn định của cơ sở dữ liệu không chỉ được bảo đảm bởi hệ điều hành. Cần thiết kế đồng thời ngữ nghĩa đồng bộ của hệ thống tệp, bộ nhớ đệm thiết bị lưu trữ, khả năng ứng phó mất điện, log giao dịch và cấu trúc sao chép. Họ UNIX là nền tảng cung cấp các giao diện hệ thống để triển khai những chức năng này.

Máy chủ tệp và hệ thống lưu trữ

Họ UNIX được sử dụng trong máy chủ tệp quản lý thiết bị lưu trữ cục bộ, thiết bị lưu trữ kết nối mạng, hệ thống sao lưu và thiết bị lưu trữ quy mô lớn. Chúng có thể cung cấp tệp và thiết bị khối cho hệ thống khác thông qua NFS, SMB, FTP, SFTP cùng nhiều giao thức lưu trữ.

FreeBSD được sử dụng làm nền tảng cho máy chủ lưu trữ và sản phẩm storage tận dụng ZFS cùng ngăn xếp mạng. Dự án FreeBSD giải thích rằng mã FreeBSD được dùng làm thành phần cốt lõi của thiết bị lưu trữ, router, tường lửa và nhiều sản phẩm thương mại.[78]

ZFS, được phát triển trong Solaris, kết hợp hệ thống tệp với quản lý volume và cung cấp checksum, storage pool, snapshot cùng sao chép. Sau đó, thông qua OpenZFS, nó được phổ biến sang FreeBSD, Linux và các hệ điều hành khác.

Linux hỗ trợ ext4, XFS, Btrfs cùng nhiều hệ thống tệp cục bộ và được sử dụng làm nền tảng cho hệ thống tệp phân tán cùng hệ thống lưu trữ đối tượng. XFS ban đầu được phát triển trong IRIX nhưng sau đó được chuyển sang Linux và sử dụng trong môi trường máy chủ cùng tệp dung lượng lớn.

Trong hệ thống lưu trữ, không chỉ tốc độ xử lý mà cả tính toàn vẹn dữ liệu, phục hồi sau lỗi, snapshot, sao chép và sao lưu từ xa đều quan trọng. Họ UNIX có thể cấu hình các dịch vụ lưu trữ này bằng cách kết hợp hệ thống tệp, thiết bị khối, mạng và công cụ tự động hóa.

Hạ tầng mạng

Họ UNIX được sử dụng làm nền tảng cho router, tường lửa, cổng VPN, máy chủ DNS, proxy, bộ cân bằng tải và thiết bị giám sát mạng. Lý do là giao diện mạng, định tuyến, bộ lọc gói, socket và ngăn xếp giao thức có thể được điều khiển ở cấp hệ điều hành.

Nhánh BSD đóng vai trò quan trọng trong quá trình phát triển TCP/IP và giao diện socket, và đến nay vẫn xem hiệu năng mạng cùng tính ổn định là lĩnh vực sử dụng chính. FreeBSD được sử dụng làm hệ điều hành hoặc thành phần sản phẩm trong hạ tầng kết nối Internet và thiết bị mạng.[79]

OpenBSD đã phát triển phần mềm mạng và bảo mật như bộ lọc gói pf, OpenBGPD và OpenSSH. Một số chương trình trong số này cũng được sử dụng trong BSD khác, Linux và UNIX thương mại.

Linux sử dụng chức năng định tuyến, bridge, mạng ảo, lọc gói và điều khiển lưu lượng của kernel để cấu hình router phần mềm và mạng đám mây. Mạng ảo của container và máy ảo cũng có thể được xây dựng trên những chức năng này.

Thiết bị mạng thương mại có thể không trực tiếp để lộ một hệ điều hành họ UNIX đa dụng mà bổ sung giao diện quản trị và phần mềm điều khiển riêng trên nền BSD hoặc Linux. Người dùng sử dụng lệnh dành riêng cho sản phẩm, nhưng bên trong vẫn vận hành các tiến trình và ngăn xếp mạng của họ UNIX.

Hệ thống viễn thông

Họ UNIX đã được sử dụng trong hệ thống chuyển mạch của nhà mạng, máy chủ quản lý mạng, hệ thống thông tin thuê bao và nền tảng dịch vụ. Nghiệp vụ viễn thông phải chạy lâu dài mà không bị gián đoạn, vì vậy yêu cầu hỗ trợ đa bộ xử lý, phát hiện lỗi, log và quản trị từ xa.

Theo truyền thống, máy chủ UNIX thương mại được sử dụng trong môi trường xử lý nghiệp vụ và điều khiển mạng quy mô lớn của nhà mạng, còn hiện nay nhiều chức năng đang được chuyển sang máy chủ tiêu chuẩn dựa trên Linux cùng môi trường ảo hóa và container.

Trong mạng định nghĩa bằng phần mềm và ảo hóa chức năng mạng, router, tường lửa, xử lý gói cùng một phần chức năng của mạng di động có thể được chạy trên máy chủ Linux đa dụng thay vì thiết bị chuyên dụng.

Bên trong thiết bị viễn thông, Linux, QNX và nhiều hệ điều hành thời gian thực có thể được sử dụng cùng nhau. Cũng có thể sử dụng cấu trúc trong đó tầng quản trị và dịch vụ chạy trên Linux, còn tầng điều khiển thấp hơn cần phản hồi thời gian thực nghiêm ngặt được xử lý bởi hệ điều hành thời gian thực riêng.

Phát triển phần mềm

Ngay từ đầu, UNIX đã phát triển như một môi trường vận hành để phát triển phần mềm. Trình biên dịch C, assembler, linker, shell, trình soạn thảo, debugger và công cụ phát triển như make được cung cấp trên cùng một hệ thống, và bản thân UNIX cũng được phát triển trong môi trường này.

Linux, BSD và macOS hiện đại được sử dụng làm môi trường phát triển cho C, C++, Rust, Go, Java, Python, JavaScript, Swift cùng nhiều ngôn ngữ khác. Trình biên dịch, hệ thống xây dựng, công cụ quản lý phiên bản và trình quản lý gói có thể được kết hợp trên dòng lệnh, đồng thời có thể sử dụng IDE đồ họa và language server.

Họ UNIX đặc biệt được sử dụng nhiều khi phát triển ứng dụng máy chủ, công cụ dòng lệnh, hệ điều hành, trình biên dịch, cơ sở dữ liệu và chương trình mạng. Khi môi trường phát triển và máy chủ triển khai thực tế cùng cung cấp giao diện thuộc họ POSIX, có thể giảm khác biệt khi chương trình chạy.

macOS cung cấp đồng thời môi trường dòng lệnh UNIX và framework ứng dụng của Apple. Trong tài liệu dành cho nhà phát triển macOS, Apple cung cấp lệnh UNIX, API hệ thống và định dạng tệp dưới dạng trang hướng dẫn, đồng thời cũng đã cung cấp tài liệu để chuyển các chương trình UNIX và Linux hiện có sang macOS.[80][81]

Môi trường phát triển họ UNIX không nhất thiết chỉ có nghĩa là dòng lệnh. Visual Studio Code, Xcode, Qt Creator, CLion, Eclipse cùng nhiều môi trường phát triển tích hợp chạy trên Linux hoặc macOS và có thể gọi trình biên dịch, linker, debugger cùng công cụ xây dựng ở bên trong.

Phát triển hệ điều hành và phần mềm hệ thống

Họ UNIX cũng được sử dụng rộng rãi để phát triển phần mềm hệ thống như hệ điều hành, trình điều khiển thiết bị, hypervisor, trình biên dịch và runtime. Lý do là mã nguồn kernel, công cụ xây dựng, trình biên dịch chéo và debugger có thể được sử dụng trong cùng một môi trường phát triển.

Linux và BSD có mã nguồn công khai nên có thể nghiên cứu và sửa đổi cấu trúc kernel, hệ thống tệp, ngăn xếp mạng cùng trình điều khiển thiết bị. Chúng cũng được sử dụng làm nền tảng để chuyển hệ điều hành sang kiến trúc bộ xử lý và bo mạch mới hoặc thử nghiệm chức năng kernel riêng.

Trong phát triển Linux nhúng, kernel và không gian người dùng cho thiết bị đích được biên dịch chéo trên hệ thống họ UNIX dành cho máy tính để bàn hoặc máy chủ. Boot loader, kernel và image hệ thống tệp gốc được tạo ra sau đó chạy trên thiết bị thật hoặc trình giả lập.

Trình biên dịch và runtime ngôn ngữ cũng hỗ trợ tiến trình, bộ nhớ, dynamic linker cùng định dạng tệp đối tượng của họ UNIX như những mục tiêu chính. Hạ tầng trình biên dịch như GCC và LLVM được tự xây dựng trên nhiều hệ UNIX và cũng được sử dụng để biên dịch chéo cho hệ điều hành khác cùng thiết bị nhúng.

DevOps và tự động hóa hệ thống

Trong môi trường DevOps, việc cài đặt, cấu hình, triển khai, giám sát và phục hồi máy chủ phải được tự động hóa. Họ UNIX cung cấp shell, truy cập từ xa, cấu hình dựa trên văn bản và API dòng lệnh, nên được sử dụng làm nền tảng cho những công việc tự động hóa này.

Script shell có thể kết hợp thao tác tệp và tiến trình, thực thi chương trình cùng pipeline. Python, Ruby, Go cùng nhiều công cụ tự động hóa cũng sử dụng giao diện tiến trình và mạng của UNIX để quản lý máy chủ.

Công cụ quản lý cấu hình chỉ định theo kiểu khai báo các gói, người dùng, tệp cấu hình và dịch vụ cần thiết trên nhiều máy chủ, rồi điều chỉnh trạng thái thực tế cho phù hợp. Hệ thống CI/CD lấy mã nguồn, biên dịch, kiểm thử và đóng gói, sau đó triển khai lên máy chủ hoặc môi trường container.

Trạng thái kết thúc, đầu ra chuẩn và lỗi chuẩn của họ UNIX trở thành giao diện chung để công cụ tự động hóa xử lý kết quả và xác định lệnh thành công hay không. Ngoài log dành cho con người đọc, việc cung cấp đầu ra có cấu trúc như JSON cho phép kết nối ổn định với công cụ khác.

Tự động hóa không chỉ giới hạn ở Linux. BSD, macOS và UNIX thương mại như AIX cũng có thể được tự động hóa thông qua SSH, shell và API quản trị hệ thống. Tuy nhiên, vì trình quản lý gói, hệ thống quản lý dịch vụ và tùy chọn lệnh khác nhau theo từng hệ thống, cần phân biệt tầng chung với công việc dành riêng cho từng nền tảng.

Tính toán khoa học

Họ UNIX được sử dụng trong Tính toán khoa học như vật lý, hóa học, tin sinh học, dự báo thời tiết, thiên văn học và mô phỏng kỹ thuật. Trong những lĩnh vực này, cần chạy phép tính quy mô lớn trong thời gian dài, sử dụng song song nhiều máy tính và bộ xử lý, đồng thời tự động xử lý dữ liệu kết quả.

Các workstation UNIX thời kỳ đầu cung cấp cho nhà nghiên cứu môi trường lập trình tương tác và tính toán số. Trình biên dịch C và Fortran, shell, công cụ đồ họa và xử lý tài liệu có thể được sử dụng trên cùng một hệ thống, còn phần mềm cùng dữ liệu có thể được chia sẻ qua mạng của trường đại học và viện nghiên cứu.

Trong môi trường nghiên cứu hiện đại, Linux được sử dụng làm nền tảng chính cho node tính toán, bộ lập lịch công việc, hệ thống tệp song song và phần mềm khoa học. Nhà nghiên cứu chuẩn bị chương trình trên workstation cục bộ hoặc node đăng nhập rồi gửi nó lên cụm tính toán thông qua bộ lập lịch công việc.

Chương trình tính toán khoa học trao đổi dữ liệu giữa nhiều node thông qua MPI và có thể sử dụng nhiều thiết bị tính toán trong một node thông qua OpenMP, luồng hoặc lập trình GPU. Tiến trình, mạng và hệ thống tệp của họ UNIX tạo nền tảng cho môi trường thực thi song song này.

Các môi trường tính toán bậc cao như Python, R, Julia và MATLAB cũng được sử dụng trên họ UNIX và có thể kết nối với thư viện số được viết bằng C, C++ và Fortran ở bên trong.

Siêu máy tính

Trong Siêu máy tính hiện đại, hệ điều hành thuộc dòng Linux được sử dụng gần như áp đảo. Mỗi hệ thống có thể không dùng nguyên vẹn một bản phân phối đa dụng mà sử dụng kernel Linux, không gian người dùng, bộ lập lịch công việc và thư viện truyền thông đã được sửa đổi cho quy mô node tính toán cùng phần cứng cụ thể.

TOP500 định kỳ thống kê các hệ thống điện toán hiệu năng cao trên thế giới và cung cấp số liệu theo họ hệ điều hành. Trong các danh sách gần đây, Linux vẫn được phân loại là dòng hệ điều hành trung tâm của siêu máy tính.[82]

Những lý do Linux được sử dụng trong siêu máy tính bao gồm khả năng sửa đổi mã nguồn, hỗ trợ nhiều bộ xử lý và bộ tăng tốc, hệ sinh thái mạng cùng hệ thống tệp, môi trường chạy tác vụ hàng loạt và tự động hóa. Nhà sản xuất hệ thống và cơ sở nghiên cứu có thể loại bỏ chức năng không cần thiết, đồng thời bổ sung hỗ trợ cho interconnect và phần cứng chuyên dụng.

Node tính toán của siêu máy tính có thể không được sử dụng như máy tính để bàn đa người dùng thông thường. Người dùng xây dựng chương trình và gửi công việc trên node đăng nhập, sau đó bộ lập lịch phân bổ tài nguyên tính toán và chạy chương trình trên nhiều node.

Hệ điều hành chỉ là một thành phần của hiệu năng tính toán; hiệu năng thực tế đồng thời chịu ảnh hưởng của bộ xử lý và GPU, phân cấp bộ nhớ, truyền thông giữa các node, trình biên dịch, thư viện số và thuật toán ứng dụng.

Trí tuệ nhân tạo và xử lý dữ liệu

Linux được sử dụng làm hệ điều hành chính trong môi trường huấn luyện Trí tuệ nhân tạo hiện đại và xử lý dữ liệu quy mô lớn. Lý do là trình điều khiển GPU và bộ tăng tốc AI, framework huấn luyện phân tán, container cùng dịch vụ đám mây thường được cung cấp tập trung quanh Linux.

Nhà phát triển máy học sử dụng Python cùng nhiều framework, nhưng phép tính thực tế có thể được thực hiện trong C++, CUDA, HIP và thư viện chuyên dụng cho bộ tăng tốc. Tiến trình, bộ nhớ dùng chung, hệ thống tệp và chức năng mạng của họ UNIX là nền tảng cho tải dữ liệu, huấn luyện phân tán và lưu mô hình.

Tác vụ huấn luyện quy mô lớn có thể chạy trên nhiều GPU và nhiều máy chủ. Bộ lập lịch công việc cùng hệ thống điều phối container phân bổ tài nguyên tính toán cần thiết, chạy lại công việc bị lỗi và lưu log cùng kết quả.

Linux và macOS cũng được sử dụng trong phát triển AI cá nhân. macOS cung cấp đồng thời GPU, framework máy học của Apple và môi trường phát triển UNIX, còn workstation Linux hỗ trợ nhiều hệ sinh thái GPU và bộ tăng tốc khác nhau.

Trong UNIX doanh nghiệp, có thể có ứng dụng kết nối dữ liệu nghiệp vụ hiện có với dịch vụ AI. IBM cũng tiếp tục cung cấp AIX và môi trường Power như một nền tảng để hiện đại hóa nghiệp vụ cốt lõi hiện có và tích hợp AI.[83]

Workstation

Workstation UNIX được sử dụng rộng rãi trong thập niên 1980 và 1990 cho kỹ thuật, khoa học, thiết kế bán dẫn, đồ họa ba chiều và phát triển phần mềm. Sun Microsystems, Silicon Graphics, Hewlett-Packard, IBM và DEC cung cấp workstation kết hợp phần cứng riêng với hệ điều hành UNIX.

Workstation vừa là máy tính đồ họa do cá nhân trực tiếp sử dụng, vừa cung cấp môi trường đa người dùng, mạng và công cụ phát triển. Người dùng có thể chạy chương trình đồ họa cục bộ trong khi truy cập máy chủ từ xa, đồng thời biên dịch chương trình hoặc thực hiện tác vụ tính toán trên cùng hệ thống.

Workstation IRIX của Silicon Graphics được sử dụng trong đồ họa ba chiều, sản xuất hình ảnh và trực quan hóa khoa học, còn workstation SunOS và Solaris được dùng rộng rãi trong phát triển phần mềm, thiết kế điện tử và môi trường nghiên cứu.

Khi hiệu năng và khả năng đồ họa của PC đa dụng, Linux, Windows và macOS được cải thiện, thị trường workstation UNIX chuyên dụng thu hẹp đáng kể. Tuy nhiên, workstation Linux hiệu năng cao và macOS tiếp tục đảm nhiệm vai trò của workstation họ UNIX trong phát triển phần mềm, tính toán khoa học, sản xuất hình ảnh–âm thanh và công việc kỹ thuật.

Đồ họa máy tính và sản xuất nội dung

Workstation UNIX là nền tảng chính của đồ họa máy tính thời kỳ đầu, CAD, hoạt hình, hiệu ứng điện ảnh và trực quan hóa khoa học. Nguyên nhân là chúng đồng thời cung cấp phần cứng đồ họa hiệu năng cao, mạng và khả năng xử lý tệp lớn.

IRIX và workstation Silicon Graphics có ảnh hưởng lớn đến sự phát triển của OpenGL cùng môi trường sản xuất đồ họa ba chiều. Nhiều chương trình sáng tạo 3D và hệ thống xử lý hình ảnh thời kỳ đầu chạy trên workstation UNIX.

Ngày nay, Linux được sử dụng trong render farm, máy chủ mô phỏng và một số workstation sản xuất nội dung. Tác vụ render có thể được phân phối đến nhiều máy chủ, còn shell cùng hệ thống quản lý công việc được dùng để tự động xử lý tệp cảnh và kết quả.

macOS được sử dụng như nền tảng cá nhân dựa trên UNIX dành cho chỉnh sửa video, sản xuất âm thanh, thiết kế đồ họa và phát triển phần mềm. Đặc điểm của nó là có thể sử dụng đồng thời framework đồ họa–truyền thông của Apple và môi trường phát triển UNIX.

Trong phát triển trò chơi và đồ họa thời gian thực, Linux và macOS cũng có thể được sử dụng làm môi trường phát triển và xây dựng. Tuy nhiên, tỷ trọng nền tảng trò chơi dành cho người dùng cuối, API đồ họa và khả năng hỗ trợ trình điều khiển khác nhau theo từng hệ điều hành.

Tự động hóa thiết kế điện tử

Thiết kế bán dẫn và hệ thống điện tử cần mô phỏng mạch, tổng hợp logic, bố trí–định tuyến, xác minh và xử lý dữ liệu quy mô lớn. Các công cụ Tự động hóa thiết kế điện tử này theo truyền thống chạy trên workstation và máy chủ UNIX, còn hiện nay Linux được sử dụng làm môi trường thực thi chính.

Công việc thiết kế có thể yêu cầu nhiều thời gian CPU, bộ nhớ và dung lượng lưu trữ, nên thường được thực hiện trên máy chủ trung tâm hoặc cụm tính toán. Người dùng cấu hình tác vụ thông qua giao diện đồ họa hoặc công cụ dòng lệnh rồi gửi lên hệ thống xử lý hàng loạt.

Shell và ngôn ngữ script được sử dụng để kết nối nhiều giai đoạn thiết kế, tự động tạo tệp đầu vào và xác minh kết quả. Do một thiết kế phải đi qua rất nhiều công cụ và tệp, môi trường xây dựng cùng thực thi có thể tái tạo là rất quan trọng.

Môi trường đồ họa từ xa và hệ thống tệp mạng của họ UNIX cũng được sử dụng để nhiều nhà phát triển chia sẻ cùng dữ liệu thiết kế và công cụ.

Máy tính để bàn và máy tính cá nhân

Họ UNIX không chỉ được sử dụng trên máy chủ mà còn trên máy tính để bàn và máy tính cá nhân. macOS là hệ điều hành UNIX chính thức dựa trên Darwin và XNU, kết hợp desktop đồ họa với dòng lệnh UNIX cùng môi trường phát triển.

Apple đã mô tả OS X là hệ thống kết hợp chức năng của hệ điều hành dựa trên UNIX với môi trường người dùng Macintosh.[84]

Desktop Linux có thể sử dụng GNOME, KDE Plasma cùng nhiều môi trường desktop khác và được dùng cho phát triển phần mềm, công việc thông thường, giáo dục, trò chơi và sản xuất nội dung. Trình quản lý gói, desktop mặc định và phương thức quản trị hệ thống khác nhau tùy theo bản phân phối.

FreeBSD và các BSD khác cũng có thể cài đặt môi trường desktop, nhưng phạm vi hỗ trợ ứng dụng dành cho người tiêu dùng và phần cứng có thể khác Linux cùng macOS.

Trong UNIX desktop, ứng dụng đồ họa và chương trình dòng lệnh truyền thống hoạt động cùng nhau. Người dùng có thể sử dụng trình quản lý tệp và chương trình thiết lập trong khi chạy shell cùng công cụ phát triển trong terminal.

Thiết bị di động

Các hệ điều hành chính của điện thoại thông minh và máy tính bảng hiện đại cũng sử dụng nền tảng họ UNIX. iOS và iPadOS dựa trên Darwin cùng XNU, còn Android sử dụng kernel Linux.

Hệ điều hành di động dùng tiến trình, bộ nhớ ảo, mã định danh người dùng, hệ thống tệp và chức năng mạng của UNIX làm nền tảng nội bộ. Tuy nhiên, khác với hệ thống shell đa người dùng truyền thống, chúng được tổ chức quanh sandbox ứng dụng, khai báo quyền, quản lý vòng đời và cơ chế phân phối qua cửa hàng ứng dụng.

Ứng dụng iOS sử dụng framework và công cụ phát triển của Apple, đồng thời bị giới hạn để không thể truy cập tệp toàn hệ thống hoặc tiến trình tùy ý. Android cũng gán mã định danh người dùng riêng cho từng ứng dụng và cô lập chúng thông qua quyền cùng sandbox.

Việc hệ điều hành di động dựa trên họ UNIX không có nghĩa người dùng có thể quản lý nó giống một máy chủ UNIX thông thường. Chức năng dựa trên UNIX được sử dụng trong phạm vi API ứng dụng và chính sách bảo mật mà nhà cung cấp nền tảng công bố.

Hệ thống nhúng

Trong Hệ thống nhúng, Linux, BSD, QNX cùng nhiều hệ điều hành họ UNIX được sử dụng trong thiết bị mạng, TV, camera, bộ điều khiển công nghiệp, robot, hệ thống thông tin ô tô và thiết bị gia dụng.

Linux nhúng có đặc điểm là hỗ trợ nhiều bộ xử lý và trình điều khiển thiết bị, đồng thời mã nguồn có thể được sửa đổi cho phù hợp với thiết bị đích. Chỉ những chức năng kernel và chương trình không gian người dùng cần thiết mới có thể được chọn để tạo một image nhỏ.

BusyBox cung cấp nhiều tiện ích UNIX cơ bản trong một tệp thực thi duy nhất và được sử dụng trong môi trường Linux nhúng có dung lượng lưu trữ hạn chế. Có thể tạo hệ thống tệp gốc nhỏ cùng thư viện C nhẹ như musl và hệ thống xây dựng chuyên dụng.

Mã FreeBSD cũng được sử dụng làm thành phần nền tảng trong router, tường lửa, thiết bị lưu trữ và nhiều sản phẩm khác.[85]

Trong hệ thống nhúng, không phải thiết bị nào cũng cần môi trường UNIX đa dụng. Thiết bị có bộ nhớ và dung lượng lưu trữ rất nhỏ hoặc cần phản hồi thời gian thực nghiêm ngặt có thể chạy hệ điều hành thời gian thực chuyên dụng hoặc không cần hệ điều hành. Linux hoặc BSD phù hợp với những hệ thống tương đối lớn cần mạng, ứng dụng phức tạp và hệ sinh thái trình điều khiển phong phú.

Ô tô

Ô tô chứa nhiều máy tính phục vụ bảng đồng hồ, infotainment, định vị, liên lạc, hỗ trợ người lái và điều khiển phương tiện. Trong số đó, Linux và hệ điều hành họ UNIX như QNX có thể được sử dụng trong khu vực xử lý giao diện người dùng, dịch vụ mạng và đa phương tiện.

QNX đã được sử dụng trong ô tô và môi trường nhúng công nghiệp dựa trên cấu trúc microkernel cùng truyền thông điệp. Nó cung cấp cấu trúc giới hạn tác động của lỗi trong một dịch vụ hoặc trình điều khiển lên toàn bộ hệ thống cùng khả năng xử lý thời gian thực.

Linux được sử dụng trong infotainment ô tô, cổng mạng và nền tảng phát triển. Những hệ thống như Android Automotive xây dựng môi trường ứng dụng dành cho phương tiện trên kernel Linux.

Các chức năng điều khiển có yêu cầu an toàn rất cao như phanh và lái có thể không sử dụng nguyên vẹn cùng hệ điều hành với infotainment mà chạy trên phần cứng và hệ thống thời gian thực riêng. Cấu trúc trong đó nhiều hệ điều hành giao tiếp với nhau bên trong xe là phổ biến.

Điều khiển công nghiệp và robot

Trong tự động hóa công nghiệp, thiết bị sản xuất và robot, cần điều khiển cảm biến cùng cơ cấu chấp hành, đồng thời cung cấp truyền thông mạng, ghi dữ liệu và giao diện người dùng. Linux và hệ điều hành họ UNIX thời gian thực được sử dụng trong hệ thống điều khiển cấp cao tích hợp những chức năng này.

Linux thông thường tập trung vào thông lượng và tính đa dụng, nhưng có thể tăng khả năng dự đoán độ trễ bằng cách áp dụng bản vá thời gian thực và lập lịch ưu tiên. Hệ điều hành thời gian thực như QNX được thiết kế ngay từ đầu với tính thời gian thực và cô lập lỗi làm mục tiêu chính.

Trong phát triển robot, Linux được sử dụng rộng rãi làm nền tảng cho trình điều khiển cảm biến, xử lý hình ảnh, lập kế hoạch đường đi, mô phỏng và công cụ phát triển. Mỗi chức năng có thể chạy như một tiến trình độc lập và kết nối qua middleware dựa trên thông điệp.

Tầng thấp hơn cần thời gian phản hồi rất ngắn và ổn định, như điều khiển động cơ, có thể do vi điều khiển và firmware thời gian thực đảm nhiệm, còn hệ thống Linux phụ trách nhận thức, lập kế hoạch, mạng cùng giao diện người dùng.

Thiết bị y tế

Họ UNIX có thể được sử dụng trong thiết bị hình ảnh y tế, hệ thống giám sát bệnh nhân, thiết bị xét nghiệm và hệ thống thông tin bệnh viện. Trong môi trường máy chủ, chúng vận hành dữ liệu bệnh nhân, lưu trữ hình ảnh, cơ sở dữ liệu và ứng dụng nghiệp vụ; bên trong thiết bị, Linux hoặc hệ điều hành thời gian thực điều khiển cảm biến cùng giao diện người dùng.

Trong lĩnh vực y tế, không chỉ chức năng mà cả an toàn, bảo mật, quản lý thay đổi và tuân thủ quy định đều quan trọng. Phiên bản hệ điều hành và ứng dụng, cập nhật cùng quy trình xác minh phải được kiểm soát, và có thể yêu cầu thời gian hỗ trợ dài hơn thiết bị tiêu dùng thông thường.

IBM nêu y tế là một trong những ngành có quy định nơi AIX được sử dụng.[86]

Chỉ riêng việc thiết bị y tế sử dụng họ UNIX không tự động bảo đảm an toàn. Toàn bộ hệ thống, bao gồm phần cứng, cấu hình hệ điều hành, ứng dụng, phân tích rủi ro và quy trình quản lý chất lượng, phải được xác minh.

Giáo dục

UNIX có ảnh hưởng lớn đến giáo dục hệ điều hành và lập trình vì được phân phối cho các trường đại học và cơ sở nghiên cứu cùng mã nguồn. Sinh viên có thể trực tiếp đọc và sửa đổi phần triển khai kernel, hệ thống tệp, tiến trình và shell để học lập trình hệ thống.

Trong môi trường giáo dục hiện đại, Linux, FreeBSD, MINIX cùng các hệ UNIX dành cho giảng dạy được sử dụng trong thực hành cấu trúc hệ điều hành, mạng, trình biên dịch, bảo mật và hệ thống phân tán.

Trường học và môi trường thực hành trực tuyến có thể cung cấp cho mỗi sinh viên một máy chủ Linux hoặc container. Sinh viên kết nối qua SSH để biên dịch chương trình C và thực hành shell, quyền tệp, tiến trình cùng lệnh mạng.

macOS cũng được sử dụng trong giáo dục lập trình vì cung cấp dòng lệnh UNIX và công cụ phát triển. Tuy nhiên, vì tồn tại khác biệt về tùy chọn lệnh và giao diện hệ thống giữa Linux, macOS và BSD, cần giảng dạy đồng thời chức năng chung POSIX và phần mở rộng riêng theo cách triển khai.

Lý do họ UNIX được sử dụng trong giáo dục hệ điều hành không chỉ là thị phần hiện tại mà còn vì cấu trúc cơ bản gồm tiến trình, tệp và lời gọi hệ thống tương đối rõ ràng, đồng thời có nguồn mã cùng tài liệu phong phú.

Nghiên cứu bảo mật và hệ thống bảo mật

Họ UNIX được sử dụng trong tường lửa, phát hiện xâm nhập, phân tích mạng, nghiên cứu lỗ hổng và phát triển công cụ bảo mật. Lý do là gói mạng, tiến trình, quyền tệp và lời gọi hệ thống có thể được quan sát và điều khiển ở mức thấp.

OpenBSD phát triển với bảo mật và kiểm tra mã làm mục tiêu trung tâm, đồng thời cung cấp phần mềm và giao diện bảo mật như OpenSSH, pf, pledgeunveil.

Capsicum của FreeBSD là chức năng thu hẹp tài nguyên mà tiến trình có thể sử dụng thành quyền hạn bị giới hạn tập trung quanh bộ mô tả tệp, còn jail được sử dụng để chạy dịch vụ trong môi trường tách biệt.

Linux có thể giới hạn quyền của tiến trình, lời gọi hệ thống và truy cập tài nguyên bằng namespaces, seccomp, capabilities cùng nhiều hệ thống kiểm soát truy cập bắt buộc. Container và sandbox cũng kết hợp những chức năng này.

Việc sử dụng họ UNIX trong lĩnh vực bảo mật không có nghĩa cấu hình mặc định có thể chống lại mọi cuộc tấn công. Cần kết hợp nguyên tắc đặc quyền tối thiểu, cập nhật, cô lập dịch vụ, giám sát log và bảo mật ứng dụng.

Quân sự, hàng không vũ trụ và hệ thống độ tin cậy cao

Trong quân sự, hàng không vũ trụ và hệ thống giao thông, cần hỗ trợ dài hạn, thực thi có thể dự đoán, cô lập lỗi và cấu hình có thể xác minh. UNIX thương mại, Linux và hệ điều hành họ UNIX thời gian thực có thể được sử dụng trong hệ thống mặt đất, mô phỏng, xử lý dữ liệu và điều khiển thiết bị.

Trong máy chủ mặt đất và môi trường nghiên cứu, Linux hoặc UNIX thương mại phụ trách tính toán quy mô lớn cùng phân tích dữ liệu, còn những phần của thiết bị thực tế có ràng buộc thời gian nghiêm ngặt có thể sử dụng QNX và các hệ điều hành thời gian thực khác.

Trong hệ thống độ tin cậy cao, người ta loại bỏ thành phần không cần thiết, cố định phần cứng và phiên bản hệ điều hành được sử dụng, đồng thời xác minh mọi thay đổi. Điều này đòi hỏi quản lý vòng đời khác với cách vận hành desktop thông thường, nơi bản phân phối đa dụng liên tục được cập nhật lên trạng thái mới nhất.

Giao diện lập trình mở và môi trường tự động hóa của họ UNIX cũng được dùng để xây dựng công cụ kiểm thử, trình mô phỏng và pipeline xử lý dữ liệu.

Trò chơi và máy chủ trò chơi

Máy khách trò chơi thường hướng chủ yếu đến Windows và máy chơi game, nhưng máy chủ trò chơi cùng dịch vụ backend được chạy rộng rãi trên Linux và các hệ UNIX khác. Máy chủ trò chơi xử lý kết nối mạng cùng trạng thái trò chơi mà không cần màn hình đồ họa, nên có đặc tính vận hành tương tự chương trình máy chủ thông thường.

Dịch vụ xác thực, ghép trận, trò chuyện, lưu dữ liệu và phân tích của trò chơi trực tuyến cũng có thể chạy trên máy chủ Linux và container trong đám mây. Môi trường tự động hóa và container của họ UNIX được sử dụng trong cấu trúc tự động thêm hoặc xóa phiên bản máy chủ theo nhu cầu.

macOS và Linux cũng có thể được sử dụng làm nền tảng phát triển game engine, renderer và công cụ phát triển. Có thể cấu hình máy chủ biên dịch chéo và xây dựng tự động để tạo binary trò chơi cho nhiều hệ điều hành cùng máy chơi game.

Công nghệ có nguồn gốc từ BSD hoặc các hệ UNIX khác cũng có thể được sử dụng trong máy chơi game và thiết bị chuyên dụng. Tuy nhiên, cấu trúc chi tiết và API của hệ điều hành máy chơi game thương mại thường là độc quyền và không cung cấp môi trường người dùng giống FreeBSD hoặc Linux đa dụng.

Xử lý tài liệu và xuất bản

Một trong những lĩnh vực đầu tiên UNIX được sử dụng thực tế trong Bell Labs là soạn thảo và dàn trang tài liệu bằng sáng chế. Những công cụ như ed, roff và sau đó là troff cho phép soạn bản thảo văn bản và dàn trang phù hợp với thiết bị in.

Phương thức xử lý tài liệu của UNIX lưu bản thảo và định dạng trong tệp văn bản rồi chuyển đổi chúng sang định dạng đầu ra bằng chương trình dòng lệnh. Cấu trúc này phù hợp với quản lý phiên bản tài liệu và tái tạo tự động.

Ngày nay, TeX, LaTeX, Groff, trình chuyển đổi Markdown và trình tạo trang tĩnh vẫn được sử dụng trên Linux, BSD cùng macOS. Tương tự việc xây dựng mã nguồn, tài liệu cũng có thể được tạo thành PDF, HTML và nhiều định dạng thông qua makefile hoặc hệ thống CI.

Không giống trình xử lý văn bản dựa trên GUI, đây không phải lúc nào cũng là phương thức mọi người dùng chỉnh sửa trong khi xem ngay kết quả cuối, nhưng có lợi cho việc tự động tạo và theo dõi thay đổi của tài liệu kỹ thuật quy mô lớn, luận văn và tài liệu API.

Xử lý truyền thông và hệ thống phát sóng

Họ UNIX được sử dụng trong mã hóa, chuyển đổi, phát trực tuyến và máy chủ lưu trữ hình ảnh cùng âm thanh. Chương trình xử lý media có thể nhận tệp đầu vào và tùy chọn từ dòng lệnh, nên phù hợp với tác vụ hàng loạt và tự động hóa máy chủ.

Trong hệ thống phát sóng và streaming, nhiều nguồn video đầu vào được chuyển đổi, truyền qua mạng, rồi lưu lại hoặc phân phối đến mạng phân phối nội dung. Máy chủ Linux và bộ tăng tốc GPU có thể được dùng để xử lý song song những tác vụ này.

macOS được sử dụng làm môi trường desktop cho sản xuất âm thanh–hình ảnh, còn Linux có thể được dùng trong máy chủ render, mã hóa và pipeline media.

Công việc media có thể yêu cầu tính thời gian thực và băng thông nhập/xuất cao, nên ngoài hệ điều hành còn cần cấu hình codec, trình điều khiển bộ tăng tốc, thiết bị lưu trữ và mạng phù hợp.

Công việc dòng lệnh và tự động hóa cá nhân

Họ UNIX cũng được sử dụng để sắp xếp tệp, chuyển đổi dữ liệu, sao lưu, thiết lập môi trường phát triển và tự động hóa công việc lặp lại của người dùng cá nhân. Người dùng có thể kết hợp lệnh shell và script để biến thao tác thủ công thành quy trình có thể tái tạo.

Ví dụ, có thể viết một script để đổi tên nhiều tệp, nén chúng rồi truyền lên máy chủ từ xa. Bằng cách kết nối các công cụ như find, grep, awk, sed, tarssh, có thể xây dựng luồng công việc mà không cần một ứng dụng lớn riêng biệt.

Công việc định kỳ có thể được chạy qua bộ lập lịch, còn trạng thái thành công và lỗi được truyền bằng log hoặc thông báo. Cùng một script cũng có thể được tái sử dụng trên máy chủ, máy phát triển và môi trường xây dựng tự động.

Có những tác vụ phù hợp hơn với chương trình GUI, nhưng tự động hóa dòng lệnh có lợi khi tính lặp lại và khả năng ghi lại là quan trọng. Họ UNIX có đặc điểm là sử dụng cùng một hệ thống lệnh cho cả thao tác tương tác và thực thi script.

Lựa chọn hệ điều hành theo lĩnh vực

Việc cùng được phân loại là họ UNIX không có nghĩa một hệ điều hành cụ thể phù hợp như nhau với mọi lĩnh vực. Trong lựa chọn thực tế, cần đồng thời cân nhắc phần cứng được hỗ trợ, ứng dụng cần thiết, hiệu năng, giấy phép, thời gian bảo trì và kinh nghiệm của nhân sự vận hành.

Trong dịch vụ web đa dụng, đám mây và môi trường container, hệ sinh thái phần cứng–phần mềm của Linux là lựa chọn chính. Khi tích hợp toàn bộ hệ điều hành vào sản phẩm mạng hoặc storage, FreeBSD và các BSD khác có thể được lựa chọn.

macOS được sử dụng cho ứng dụng dành cho nền tảng Apple và môi trường desktop UNIX cá nhân. macOS cung cấp dòng lệnh UNIX và môi trường POSIX, đồng thời có GUI cùng framework media chuyên dụng của Apple.

AIX có thể được sử dụng cho nghiệp vụ cốt lõi và cơ sở dữ liệu doanh nghiệp hiện có chạy trên IBM Power, còn nghiệp vụ xây dựng trên Solaris hoặc HP-UX có thể tiếp tục vận hành trên hệ điều hành cùng phần cứng được hỗ trợ tương ứng.

Thiết bị nhúng cần xử lý thời gian thực nghiêm ngặt và cô lập lỗi có thể sử dụng hệ UNIX thời gian thực như QNX hoặc một hệ điều hành thời gian thực riêng. Với vi điều khiển rất nhỏ, firmware chuyên dụng có thể phù hợp hơn họ UNIX đa dụng.

Do đó, khi xem xét lĩnh vực ứng dụng, không chỉ cần phân biệt “UNIX có được sử dụng hay không” mà còn phải xác định “nhánh UNIX nào và môi trường thực thi nào được sử dụng”.

Sự thay đổi của phạm vi ứng dụng

Lĩnh vực sử dụng UNIX đã thay đổi theo thời gian. Ban đầu, trọng tâm là cơ sở nghiên cứu và trường đại học, xử lý tài liệu nội bộ Bell Labs cùng môi trường lập trình; sau đó mở rộng sang workstation thương mại, máy chủ doanh nghiệp và hạ tầng Internet.

Sau thập niên 1990, khi Linux và BSD tự do được phổ biến, họ UNIX không còn bị ràng buộc vào phần cứng chuyên dụng của một công ty cụ thể mà có thể được sử dụng trên PC và máy chủ đa dụng. Sự phát triển của dịch vụ Internet và phần mềm mã nguồn mở cũng thúc đẩy quá trình phổ biến này.

Từ thập niên 2000, Linux mở rộng thành nền tảng cho đám mây, siêu máy tính, hệ thống nhúng và thiết bị di động. Apple sử dụng công nghệ họ UNIX trong máy tính cá nhân và sản phẩm di động thông qua macOS cùng iOS dựa trên Darwin.

Trong khi đó, thị trường UNIX thương mại truyền thống và workstation chuyên dụng đã thu hẹp, nhưng chúng vẫn tiếp tục được sử dụng trong các hệ thống doanh nghiệp hiện có và môi trường công nghiệp cụ thể. Nguyên nhân là việc thay thế hệ điều hành đòi hỏi phải di chuyển toàn bộ ứng dụng, dữ liệu, phần cứng và quy trình xác minh.

Họ UNIX hiện đại tồn tại như công nghệ nền tảng của nhiều nền tảng hơn là một thị trường sản phẩm duy nhất. Ngay cả trên điện thoại thông minh, thiết bị mạng và đồ gia dụng nơi người dùng không trực tiếp tiếp xúc với UNIX shell, kernel và thành phần hệ thống thuộc Linux, Darwin hoặc dòng BSD vẫn có thể đang hoạt động.

Ảnh hưởng

UNIX đã tạo ảnh hưởng rộng lớn đến cấu trúc của các hệ điều hành hiện đại, môi trường lập trình hệ thống, công nghệ Internet, công cụ phát triển phần mềm và quá trình tiêu chuẩn hóa. Không phải mọi công nghệ xuất hiện lần đầu trong UNIX đều là phát minh độc đáo chỉ riêng UNIX có, nhưng UNIX có ý nghĩa quan trọng ở chỗ đã kết hợp các khái niệm như chia sẻ thời gian, hệ thống tệp phân cấp và tiến trình vốn đã được nghiên cứu trước đó thành một hệ thống tương đối đơn giản, nhất quán, rồi phổ biến chúng dưới dạng một môi trường phát triển có thể sử dụng trong thực tế.

Ảnh hưởng của UNIX không chỉ giới hạn ở các nhánh System V và BSD trực tiếp phát sinh từ UNIX nguyên bản. Những hệ điều hành được phát triển độc lập mà không sử dụng mã nguồn UNIX nguyên bản, như Linux, cũng kế thừa rộng rãi tiến trình, bộ mô tả tệp, shell, pipe và giao diện lập trình hệ thống của UNIX. macOS và iOS tiếp nối phả hệ kỹ thuật của UNIX thông qua Darwin và dòng BSD, còn Android cùng ChromeOS dựa trên kernel Linux.

UNIX bắt đầu từ một sản phẩm hệ điều hành duy nhất, nhưng về sau phát triển thành một mô hình chung quy định cách hệ điều hành và chương trình tương tác với nhau. Những khái niệm cơ bản như tệp và tiến trình, công cụ dòng lệnh và nhập/xuất chuẩn vẫn tiếp tục được sử dụng trong máy chủ, đám mây, thiết bị di động, môi trường phát triển và thiết bị mạng hiện đại.

Ảnh hưởng đến cấu trúc hệ điều hành

UNIX phổ biến rộng rãi cấu trúc phân chia hệ điều hành thành kernel và không gian người dùng, đồng thời chạy các chương trình thông thường dưới dạng tiến trình độc lập bên ngoài kernel. Kernel quản lý tiến trình, bộ nhớ, hệ thống tệp và thiết bị, còn shell, lệnh quản lý tệp, trình biên dịch và trình soạn thảo được cấu thành dưới dạng chương trình không gian người dùng.

Cấu trúc này cho phép xây dựng những môi trường người dùng khác nhau trên cùng một kernel, thay vì đưa mọi chức năng của hệ điều hành vào một giao diện người dùng cố định. Ngay trên cùng một kernel, người dùng có thể chọn nhiều shell, desktop và công cụ hệ thống khác nhau, còn ứng dụng sử dụng chức năng kernel thông qua lời gọi hệ thống và thư viện.

Các hệ điều hành hiện đại sử dụng kernel và môi trường đồ họa phức tạp hơn UNIX rất nhiều, nhưng cấu trúc cơ bản gồm sự tách biệt giữa không gian kernel được bảo vệ và không gian người dùng, thực thi dựa trên tiến trình cùng truy cập tài nguyên qua lời gọi hệ thống vẫn tiếp tục trong Linux, BSD, macOS và nhiều hệ điều hành khác.

UNIX không phải nguồn gốc trực tiếp của mọi cấu trúc hệ điều hành hiện đại. Các hệ thống trước đó như Multics cũng phát triển vùng bảo vệ, hệ thống tệp phân cấp và môi trường đa người dùng, còn VMS, Mach cùng nhiều hệ điều hành nghiên cứu khác cũng có ảnh hưởng độc lập. Sức ảnh hưởng của UNIX nằm ở việc triển khai các khái niệm này thành một hệ điều hành và môi trường phát triển tương đối nhỏ, có tính khả chuyển rồi phân phối rộng rãi.

Mô hình tiến trình

UNIX thiết lập mô hình biểu diễn chương trình đang chạy dưới dạng tiến trình và thực thi công việc mới bằng cách kết hợp fork, execwait. Cấu trúc trong đó tiến trình cha tạo tiến trình con, tiến trình con thay thế ảnh thực thi của mình bằng một chương trình khác, còn tiến trình cha thu nhận trạng thái kết thúc đã trở thành phương thức thực thi cơ bản của họ UNIX.

Mô hình này trở thành nền tảng để shell chạy lệnh và cấu thành pipeline. Shell tạo tiến trình con, kết nối các bộ mô tả tệp rồi thực thi lệnh thực tế trong tiến trình đó. Việc chạy lệnh, chuyển hướng nhập/xuất và điều khiển tiến trình đều được cấu thành trên cùng một mô hình tiến trình.

Linux, BSD và macOS kế thừa các giao diện tiến trình này, còn POSIX cũng định nghĩa việc tạo tiến trình, thực thi chương trình và trạng thái kết thúc như các giao diện chung. Những hệ điều hành và runtime khác cũng có thể cung cấp tầng tương thích POSIX hoặc API tiến trình tương tự.

Trong hệ thống hiện đại, nhiều đơn vị thực thi đa dạng hơn được sử dụng, chẳng hạn như luồng, tác vụ bất đồng bộ, container và trình quản lý dịch vụ. Tuy nhiên, tiến trình vẫn là đơn vị cơ bản để cô lập không gian địa chỉ, quyền và tài nguyên, còn mô hình tiến trình UNIX vẫn là cấu trúc cốt lõi của môi trường máy chủ và dòng lệnh.

Hệ thống tệp phân cấp

UNIX cấu thành mọi tệp và thư mục trong một không gian tên phân cấp bắt đầu từ một root duy nhất là /. Thay vì để lộ mỗi thiết bị lưu trữ dưới một ký tự ổ đĩa riêng hoặc không gian tên hoàn toàn độc lập, UNIX phát triển phương thức gắn chúng vào một thư mục cụ thể để kết nối thành một cây hệ thống tệp duy nhất.

Cấu trúc này tách cấu hình vật lý của thiết bị lưu trữ khỏi tên đường dẫn mà chương trình sử dụng. Chương trình có thể dùng các đường dẫn như /usr/home mà không nhất thiết phải biết tệp nằm trên đĩa nào hoặc thiết bị lưu trữ mạng nào.

Việc tách mục thư mục khỏi đối tượng tệp cùng khả năng cung cấp hard link và symbolic link cũng trở thành những đặc điểm quan trọng của hệ thống tệp UNIX. Hành vi dữ liệu vẫn tồn tại trong khi tiến trình còn mở tệp dù tên tệp đã bị xóa là khả thi vì bộ mô tả tệp và đối tượng hệ thống tệp được tách khỏi tên đường dẫn.

Hệ thống tệp phân cấp không chỉ ảnh hưởng đến họ UNIX mà còn đến các hệ điều hành khác. Dù cách triển khai và cú pháp đường dẫn có khác nhau, cấu trúc cây trong đó thư mục chứa thư mục và tệp khác đã trở thành phương thức quản lý tệp phổ biến của các hệ điều hành đa dụng hiện đại.

Bộ mô tả tệp và nhập/xuất chung

UNIX xử lý nhiều tài nguyên nhập/xuất như tệp thông thường, terminal, pipe và thiết bị thông qua một phương thức tham chiếu chung gọi là bộ mô tả tệp. Chương trình tham chiếu tài nguyên bằng một số nguyên nhỏ và có thể sử dụng các giao diện chung như read, writeclose.

Thiết kế này giúp chương trình không cố định nguồn nhập và đích xuất ngay trong mã. Cùng một chương trình có thể nhận dữ liệu từ terminal hoặc đọc từ tệp và pipe, còn đầu ra có thể được gửi đến terminal, tệp, pipe hoặc socket.

Socket được đưa vào trong BSD cũng được biểu diễn bằng bộ mô tả tệp. Socket mạng đã kết nối không phải đối tượng hoàn toàn giống tệp, nhưng được tích hợp vào cấu trúc nhập/xuất chung tập trung vào thao tác đọc và ghi. Socket của 4.2BSD được đưa vào như một phương thức giao tiếp liên tiến trình rộng hơn pipe và sử dụng cấu trúc tham chiếu điểm cuối giao tiếp bằng descriptor.[87]

Cách diễn đạt “mọi thứ đều là tệp” cũng xuất phát từ ảnh hưởng này. Trên thực tế, không phải mọi đối tượng hệ thống đều là tệp thông thường, nhưng cách áp dụng một phương thức tham chiếu và giao diện nhập/xuất chung cho nhiều loại tài nguyên khác nhau đã ảnh hưởng mạnh đến API hệ điều hành và thiết kế trừu tượng hóa phần mềm.

Nhập chuẩn và pipeline

UNIX cung cấp cho chương trình các kênh cơ bản là đầu vào chuẩn, đầu ra chuẩn và lỗi chuẩn, đồng thời cho phép shell thay đổi các kết nối này trước khi thực thi. Chương trình có thể kết nối với công cụ khác thông qua luồng mặc định mà không trực tiếp quản lý nguồn nhập và đích xuất.

Pipe truyền trực tiếp đầu ra của một chương trình thành đầu vào của chương trình khác. Cấu trúc này cho phép các chương trình hợp tác chỉ thông qua định dạng dữ liệu mà không cần biết tên hay cách triển khai của nhau.

journal |
filter |
sort |
summarize

Pipeline như vậy cấu thành luồng dữ liệu bằng câu lệnh shell thay vì mã chương trình. Người dùng có thể kết hợp các công cụ đã tồn tại theo một thứ tự mới để thực hiện những công việc mà nhà phát triển không dự đoán trước.

Ảnh hưởng của pipe và nhập/xuất chuẩn không chỉ giới hạn ở lệnh shell. Trong thư viện xử lý luồng, pipeline xử lý dữ liệu, hệ thống xây dựng, CI/CD và xử lý dữ liệu phân tán, người ta cũng tạo từng bước dưới dạng thành phần độc lập rồi truyền đầu ra của bước trước làm đầu vào cho bước sau.

Không phải mọi pipeline hiện đại đều trực tiếp phát sinh từ UNIX pipe, nhưng phương thức kết nối các đơn vị xử lý nhỏ để tạo nên toàn bộ công việc đã trở thành một mô hình cấu thành phần mềm đại diện cho triết lý UNIX.

Giao diện dòng lệnh

UNIX phát triển shell không phải như một menu đơn giản để chạy chương trình mà như một môi trường lập trình có thể kết hợp và tự động hóa các lệnh. Người dùng có thể điều khiển hệ thống bằng cách kết hợp tên tệp, tùy chọn lệnh, pipe, chuyển hướng và câu lệnh điều khiển.

Giao diện dòng lệnh đã tồn tại trước giao diện đồ họa, nhưng UNIX kết hợp nhiều lệnh độc lập cùng ngôn ngữ shell vào một môi trường thực thi nhất quán. Lệnh có thể được chạy tương tác hoặc lưu trong script để thực thi lặp lại.

Không chỉ Linux, BSD và macOS hiện đại mà cả Windows PowerShell cùng nhiều công cụ quản trị đám mây cũng sử dụng phương thức kết nối lệnh bằng pipeline đối tượng hoặc văn bản và tự động hóa bằng script. Mô hình dữ liệu cụ thể khác nhau, nhưng ý tưởng kết nối lệnh tương tác với ngôn ngữ tự động hóa tương tự UNIX shell.

Trong môi trường máy chủ và đám mây, dòng lệnh là phương tiện chính để quản lý hệ thống từ xa mà không cần màn hình vật lý. Shell từ xa qua SSH, script triển khai, quản lý cấu hình và lệnh container đều chịu ảnh hưởng của môi trường dòng lệnh kiểu UNIX.

Shell script và tự động hóa

UNIX shell cho phép mở rộng trực tiếp các lệnh nhập trong terminal thành script. Việc thao tác tệp, thực thi chương trình, vòng lặp, câu điều kiện và kiểm tra trạng thái kết thúc trong một ngôn ngữ giúp tự động hóa quản trị hệ thống cùng xây dựng phần mềm dễ dàng hơn.

Shell script được sử dụng để tự động hóa các công việc như biên dịch và kiểm thử, cài đặt, phân tích log, sao lưu và khởi động dịch vụ. Việc lưu các lệnh giống nhau dưới dạng tài liệu có thể thực thi thay vì để con người lặp lại thủ công làm tăng khả năng tái tạo của công việc.

DevOps và CI/CD hiện đại có thể được xem là sự mở rộng của phương thức này. Máy chủ tự động hóa lấy mã nguồn từ kho lưu trữ, thực thi lệnh rồi quyết định bước tiếp theo dựa trên trạng thái kết thúc và các tệp được tạo ra.

Không phải mọi hệ thống tự động hóa hiện đại đều được cấu thành chỉ bằng shell script. Python, Ruby, Go, workflow dựa trên YAML cùng nhiều công cụ khai báo được sử dụng, nhưng chúng cũng thường chạy tiến trình hệ điều hành và xử lý đầu ra chuẩn, lỗi chuẩn cùng mã kết thúc.

POSIX tiêu chuẩn hóa ngôn ngữ lệnh shell và các tiện ích chung, cung cấp nền tảng để chuyển script giữa những hệ UNIX khác nhau.[88]

Tính mô-đun của phần mềm

Cấu trúc dựa trên lệnh nhỏ và pipe của UNIX đã ảnh hưởng đến phương thức phát triển trong đó phần mềm được chia thành các thành phần độc lập và kết nối bằng giao diện rõ ràng. Mỗi chương trình đảm nhận một trách nhiệm, xử lý đầu vào rồi xuất kết quả.

Cấu trúc này cho phép phát triển, kiểm thử và thay thế từng chương trình riêng biệt. Ngay cả khi một triển khai được thay bằng triển khai khác, toàn bộ pipeline vẫn có thể tiếp tục sử dụng nếu quy ước nhập/xuất được duy trì.

Mô-đun, thư viện, dịch vụ và cấu trúc plugin trong kỹ nghệ phần mềm hiện đại không hoàn toàn giống các lệnh UNIX, nhưng chia sẻ nguyên tắc tách biệt cách triển khai rồi kết hợp thông qua giao diện ổn định.

Kiến trúc microservice cũng thường được so sánh với triết lý UNIX. Nó có điểm tương đồng ở việc kết nối các dịch vụ nhỏ bằng API mạng và triển khai từng dịch vụ độc lập. Tuy nhiên, hệ thống phân tán qua mạng có thêm độ trễ, lỗi từng phần, tính nhất quán dữ liệu và chi phí triển khai, nên không thể xem đơn giản là phiên bản mở rộng của pipe dòng lệnh.

Sự phổ biến của ngôn ngữ C

UNIX đóng vai trò quan trọng trong việc phổ biến C (ngôn ngữ lập trình) như một ngôn ngữ dành cho lập trình hệ thống và phát triển phần mềm đa dụng. C phát triển trong quá trình triển khai kernel và tiện ích UNIX, còn khi UNIX được phân phối đến trường đại học và doanh nghiệp, trình biên dịch C cùng công cụ phát triển cũng được phổ biến theo.

Quá trình chuyển UNIX sang nhiều loại phần cứng chứng minh rằng phần lớn hệ điều hành có thể được viết bằng ngôn ngữ bậc cao. Bằng cách giảm phạm vi mã assembly phụ thuộc phần cứng và biên dịch lại mã C dùng chung, hệ điều hành có thể được chuyển sang hệ thống mới.

C về sau được sử dụng làm ngôn ngữ triển khai cho nhiều hệ điều hành, trình biên dịch, cơ sở dữ liệu, chương trình mạng và phần mềm nhúng. C cũng được áp dụng rộng rãi trên các hệ điều hành và nền tảng không phải UNIX, còn phần lớn API hệ thống hiện đại được cung cấp dựa trên quy ước gọi và kiểu dữ liệu của C.

C++ và Objective-C mở rộng cú pháp cùng mô hình thực thi của C, còn Java, C#, JavaScript, Go, Rust cùng nhiều ngôn ngữ khác cũng chịu ảnh hưởng trực tiếp hoặc gián tiếp từ toán tử, câu lệnh điều khiển hoặc cú pháp dấu ngoặc nhọn của C. Tuy nhiên, mỗi ngôn ngữ còn chịu ảnh hưởng từ những ngôn ngữ khác về hệ thống kiểu, quản lý bộ nhớ và mô hình đối tượng.

Không nên hiểu mối quan hệ giữa C và UNIX theo nghĩa UNIX ngay từ đầu đã được viết bằng C. UNIX đầu tiên được viết bằng assembly, còn sau khi UNIX đã hoạt động, C mới phát triển và phần lớn kernel được viết lại bằng C vào năm 1973.

Giao diện lập trình hệ thống

Các giao diện tệp, tiến trình, tín hiệu và socket của UNIX đã trở thành mô hình chung để viết chương trình hệ thống. Chương trình sử dụng các hàm thuộc nhóm open, read, write, fork, exec, wait, mmapsocket để truy cập chức năng hệ điều hành.

Những API này được tiêu chuẩn hóa trong POSIX và được cung cấp chung trên Linux, BSD, macOS cùng UNIX thương mại. Dù cấu trúc kernel nội bộ và số hiệu lời gọi hệ thống khác nhau, cách lập trình tương tự vẫn có thể được sử dụng ở mức mã nguồn.

Các ngôn ngữ lập trình khác cũng sử dụng những giao diện này trực tiếp hoặc gián tiếp. Mô-đun tệp và tiến trình của Python, thư viện chuẩn cùng các crate hệ thống của Rust, các gói hệ điều hành và mạng của Go cung cấp trừu tượng hóa phù hợp với từng ngôn ngữ nhưng có thể kết nối nội bộ với API họ UNIX.

Khi API họ UNIX được sử dụng rộng rãi, các hệ điều hành mới cũng bắt đầu cung cấp tầng tương thích POSIX. Điều này cho thấy mô hình lập trình UNIX đã trở thành ngôn ngữ chung giữa các hệ điều hành, độc lập với việc kế thừa trực tiếp mã nguồn UNIX.

Trình biên dịch và công cụ phát triển

UNIX phát triển môi trường trong đó trình biên dịch, assembler, linker, trình soạn thảo, debugger và công cụ xây dựng được cung cấp dưới dạng chương trình độc lập rồi kết nối trong shell.

Tệp nguồn được trình biên dịch chuyển thành tệp đối tượng, sau đó linker kết hợp nhiều tệp đối tượng và thư viện để tạo tệp thực thi. Kết quả của từng giai đoạn có thể được lưu và kiểm tra riêng, khiến quá trình xây dựng được biểu diễn như một chuỗi công cụ rõ ràng.

make phổ biến phương thức mô tả tệp đích và quan hệ phụ thuộc rồi chỉ xây dựng lại những phần đã thay đổi. Dù cú pháp cụ thể của Makefile và các hệ thống xây dựng hiện đại đã phát triển, cách phân tích quan hệ phụ thuộc giữa các tệp để chỉ thực thi công việc cần thiết vẫn tiếp nối trong Ninja, CMake, Meson và các công cụ xây dựng theo ngôn ngữ.

lexyacc là những công cụ tạo mã nguồn bộ phân tích từ quy tắc từ vựng và ngữ pháp, có ảnh hưởng đến việc phát triển trình biên dịch cùng bộ xử lý ngôn ngữ. Các công cụ kế nhiệm như GNU Flex và Bison cùng nhiều trình tạo parser hiện đại tiếp tục dòng phát triển này.

Môi trường phát triển UNIX cho phép thay thế hoặc kết hợp công cụ theo nhu cầu thay vì để một IDE khổng lồ độc quyền mọi chức năng. IDE hiện đại cũng thường gọi bên trong những thành phần độc lập như trình biên dịch, linker, hệ thống xây dựng và debugger.

Văn hóa phát triển dựa trên mã nguồn

UNIX được phân phối đến các trường đại học và cơ sở nghiên cứu cùng mã nguồn, qua đó ảnh hưởng đến việc hình thành văn hóa phát triển trong đó phần mềm được đọc, sửa đổi và phân phối lại. Nhà nghiên cứu và sinh viên có thể phân tích cách triển khai kernel cùng các lệnh rồi bổ sung chức năng mới và hỗ trợ phần cứng.

Phương thức phân phối này dẫn đến sự hình thành BSD và hoạt động trao đổi phần mềm giữa các trường đại học. Khi trình soạn thảo, shell, ngăn xếp mạng và tiện ích hệ thống được sửa đổi tại nhiều cơ sở rồi phân phối lại, một hệ sinh thái phát triển cộng tác được hình thành.

Giấy phép UNIX thời kỳ đầu không giống giấy phép phần mềm tự do hiện đại. Mã UNIX của AT&T được cung cấp theo thỏa thuận cấp phép và có hạn chế đối với việc sử dụng cùng phân phối lại. Tuy nhiên, khả năng sử dụng mã nguồn cho giáo dục và nghiên cứu đã cung cấp nền tảng kinh nghiệm quan trọng cho sự phát triển hệ điều hành phần mềm tự do và mã nguồn mở sau này.

Sau khi loại bỏ mã có nguồn gốc từ AT&T, dòng BSD được phân phối theo giấy phép BSD, còn dự án GNU và Linux lần lượt phát triển môi trường tương thích UNIX độc lập dựa trên nguyên tắc phần mềm tự do và GPL.

Phần mềm tự do và mã nguồn mở

Cấu trúc cùng công cụ của UNIX trở thành nền tảng kỹ thuật chính cho các hệ điều hành Phần mềm tự doMã nguồn mở. Dự án GNU phát triển shell, trình biên dịch, thư viện C và nhiều tiện ích với mục tiêu tạo một hệ điều hành tự do tương thích UNIX.

Kernel Linux không trực tiếp phát sinh từ mã UNIX nhưng triển khai độc lập giao diện kernel tương tự UNIX. Khi công cụ GNU và kernel Linux được kết hợp, một môi trường họ UNIX đa dụng có thể được tự do sửa đổi và phân phối đã phổ biến rộng rãi.

FreeBSD, NetBSD và OpenBSD phát triển độc lập từ dòng 4.4BSD-Lite, đồng thời phát triển toàn bộ kernel cùng không gian người dùng cơ sở dưới dạng mã nguồn mở. Dự án FreeBSD giải thích rằng sau bản phân phối BSD tự do cuối cùng của Berkeley, FreeBSD, NetBSD, OpenBSD, Darwin và DragonFly BSD cùng các hệ thống khác đã tiếp tục quá trình phát triển độc lập.[89]

Phát triển mã nguồn mở không phải văn hóa chỉ tồn tại trong UNIX, nhưng việc chia sẻ mã nguồn, chuyển sang nền tảng khác, phân phối bản vá và môi trường phát triển tập trung vào công cụ của họ UNIX đã ảnh hưởng mạnh đến phương thức làm việc của các dự án mã nguồn mở hiện đại.

Internet và TCP/IP

BSD UNIX đóng vai trò quan trọng trong việc phổ biến TCP/IP đến mạng nghiên cứu và môi trường Internet. Nhóm nghiên cứu Berkeley được DARPA hỗ trợ đã triển khai ngăn xếp mạng TCP/IP và giao diện socket trong BSD.

Socket được cung cấp trong 4.2BSD cho phép tiến trình xử lý điểm cuối giao tiếp cục bộ hoặc mạng như bộ mô tả tệp. Tài liệu TCP của FreeBSD cũng ghi lại rằng giao thức TCP xuất hiện trong 4.2BSD.[90]

Phần triển khai TCP/IP của BSD được phân phối cùng mã nguồn đến trường đại học, cơ sở nghiên cứu và nhà sản xuất máy tính. Khi nhiều hệ thống sử dụng cùng giao thức mạng và giao diện lập trình, việc liên lạc giữa những phần cứng và hệ điều hành khác nhau trở nên dễ dàng hơn.

API BSD socket về sau được áp dụng trong System V, Linux, macOS và các hệ điều hành khác. Windows cũng cung cấp giao diện lập trình tương tự gọi là Winsock, qua đó kế thừa ảnh hưởng của mô hình BSD socket.

Bản thân Internet không được tạo nên chỉ bằng UNIX. TCP/IP được triển khai trong nhiều cơ sở nghiên cứu và hệ điều hành, còn ARPANET cùng các nghiên cứu liên quan diễn ra trong phạm vi rộng hơn UNIX. Tuy nhiên, BSD UNIX thúc đẩy việc phát triển và phổ biến phần mềm Internet bằng cách cung cấp rộng rãi một triển khai TCP/IP có thể tiếp cận và API socket.

Máy chủ mạng và văn hóa Internet

Họ UNIX trở thành môi trường thực thi chính cho thư điện tử, đăng nhập từ xa, truyền tệp, dịch vụ tên miền, web và dịch vụ tin tức. Phương thức chạy máy chủ dưới dạng daemon nền rồi quản lý bằng tệp cấu hình, log và tín hiệu trở nên phổ biến.

Môi trường UNIX vốn lấy đa người dùng và truy cập từ xa làm nền tảng phù hợp với hợp tác qua mạng và vận hành máy chủ. Người dùng có thể đăng nhập vào hệ thống từ xa từ terminal, truyền tệp và chia sẻ chương trình cùng dữ liệu với người dùng khác.

Nhiều nhà phát triển và người vận hành Internet thời kỳ đầu sử dụng hệ thống UNIX tại trường đại học và cơ sở nghiên cứu, còn nhiều triển khai tham chiếu của giao thức Internet cùng chương trình máy chủ được phát triển trên UNIX.

Trong máy chủ web và đám mây hiện đại, Linux và BSD vẫn được sử dụng rộng rãi. Mô hình tiến trình, socket, tệp và quyền vẫn là nền tảng của máy chủ HTTP, cơ sở dữ liệu, container và dịch vụ phân tán.

POSIX và tiêu chuẩn hóa hệ điều hành

Khi UNIX phân tách thành nhiều phần triển khai của các công ty và cơ sở nghiên cứu khác nhau, khác biệt về lời gọi hệ thống, shell và lệnh ngày càng lớn. Những khác biệt này gây khó khăn cho việc chuyển phần mềm và tương tác giữa các hệ thống, dẫn đến hoạt động tiêu chuẩn hóa để định nghĩa giao diện chung.

POSIX tiêu chuẩn hóa các giao diện tiến trình, tệp, tín hiệu, shell và tiện ích phát triển từ UNIX. The Open Group giải thích rằng khi hệ điều hành kiểu UNIX thành công, nhiều hệ thống tương tự nhưng không tương thích với nhau đã xuất hiện, và từ thập niên 1980 POSIX cùng Single UNIX Specification được tạo ra để giải quyết vấn đề này.[91]

POSIX không yêu cầu triển khai một mã nguồn UNIX cụ thể. Hệ điều hành có thể tự do thiết kế cấu trúc nội bộ nhưng vẫn cung cấp API tiêu chuẩn và môi trường lệnh. Nhờ đó, Linux, hệ điều hành thời gian thực và tầng tương thích cũng có thể triển khai giao diện POSIX.

Single UNIX Specification định nghĩa một môi trường thực thi rộng hơn mà sản phẩm UNIX chính thức phải cung cấp và được kết hợp với chương trình chứng nhận của The Open Group. Ý nghĩa của UNIX được mở rộng từ tên một sản phẩm mã nguồn cụ thể sang tiêu chuẩn giao diện công khai và thương hiệu chứng nhận.

Ảnh hưởng của POSIX không chỉ giới hạn ở họ UNIX. Hệ điều hành, runtime, công cụ xây dựng và ngôn ngữ lập trình có thể hỗ trợ môi trường POSIX như một mục tiêu chính hoặc cung cấp tầng tương thích POSIX.

Phần mềm có tính khả chuyển

UNIX và POSIX phát triển phương thức khả chuyển trong đó cùng một mã nguồn được biên dịch lại trên những máy tính và hệ điều hành khác nhau. Khi sử dụng C cùng giao diện hệ thống tiêu chuẩn, có thể giới hạn phạm vi mã phụ thuộc phần cứng và tăng tỷ lệ mã nguồn dùng chung.

Chương trình không trực tiếp phụ thuộc vào cấu trúc dữ liệu kernel hoặc thiết bị cụ thể mà sử dụng API tệp, tiến trình và socket. Ngay cả khi cách triển khai hệ điều hành khác nhau, mã cốt lõi của chương trình vẫn có thể được tái sử dụng nếu giao diện bên ngoài giống nhau.

Tính khả chuyển cũng ảnh hưởng đến cấu trúc thư viện và chương trình đa nền tảng hiện đại. Phương thức tách logic chương trình chung khỏi backend dành riêng cho từng hệ điều hành và kiểm tra chức năng của nền tảng đích trong giai đoạn xây dựng được sử dụng rộng rãi.

POSIX không bảo đảm khả năng tương thích nhị phân. Dù cùng một mã nguồn có thể được biên dịch trên Linux, FreeBSD và macOS, định dạng tệp thực thi cùng ABI vẫn khác nhau. Hiệu quả chính của việc tiêu chuẩn hóa UNIX nằm ở tái sử dụng mã nguồn và kiến thức lập trình hơn là chạy một binary duy nhất trên mọi hệ thống.

Công cụ xử lý văn bản

UNIX phát triển nhiều công cụ đa dụng để xử lý tệp văn bản và dữ liệu theo dòng. grep, sed, awk, sort, diff, wc cùng biểu thức chính quy được sử dụng để xử lý mã nguồn, log, cấu hình và tài liệu.

Việc sử dụng văn bản làm định dạng trao đổi chung cho phép công cụ khác kiểm tra và biến đổi dữ liệu mà không cần biết cấu trúc dữ liệu nội bộ của một chương trình cụ thể. Người dùng có thể trực tiếp xem nội dung trong trình soạn thảo và trích xuất phần cần thiết bằng lệnh shell.

Biểu thức chính quy phát triển từ lý thuyết ngôn ngữ hình thức và nghiên cứu trình soạn thảo đã tồn tại trước UNIX, nhưng được phổ biến rộng rãi như công cụ lập trình và quản trị hệ thống thông thường thông qua ed, grep, sedawk.

Ngôn ngữ lập trình, trình soạn thảo, chương trình tìm kiếm và hệ thống phân tích log hiện đại cũng cung cấp biểu thức chính quy cùng khái niệm bộ lọc văn bản. Cú pháp cụ thể được chia thành biểu thức chính quy cơ bản và mở rộng POSIX, biểu thức chính quy tương thích Perl cùng triển khai theo từng ngôn ngữ, nhưng ảnh hưởng của công cụ UNIX đối với việc phổ biến chúng là rất lớn.

Tệp cấu hình và quản trị hệ thống

Trong họ UNIX, phương thức lưu cấu hình hệ thống và chương trình trong tệp văn bản được sử dụng rộng rãi. Người dùng có thể dùng trình soạn thảo, script và công cụ quản lý phiên bản để kiểm tra và thay đổi cấu hình.

Cấu hình dựa trên văn bản có thể được sử dụng ngay trong terminal từ xa và dễ kiểm tra khác biệt trước và sau khi thay đổi. Cùng một cấu hình cũng có thể được sao chép đến nhiều hệ thống hoặc tạo ra từ template.

Phương thức này ảnh hưởng đến quản lý cấu hình hiện đại và Infrastructure as Code. Cấu hình hệ thống, bố trí dịch vụ và tài nguyên đám mây được lưu dưới dạng mã hoặc văn bản khai báo, quản lý phiên bản rồi tự động áp dụng.

Không phải mọi cấu hình của họ UNIX đều là tệp văn bản đơn giản. Nhiều cấu trúc khác nhau được sử dụng, chẳng hạn như property list của macOS, kho cấu hình dạng cơ sở dữ liệu, nhiều tệp cấu hình của systemd và hệ thống thiết lập của desktop. Tuy nhiên, quan điểm tự động hóa cấu hình thông qua tệp và lệnh vẫn được duy trì.

Văn hóa tài liệu

UNIX phát triển văn hóa trang hướng dẫn, cho phép tra cứu tài liệu về lệnh, lời gọi hệ thống và thư viện ngay trên chính hệ thống. 《UNIX Programmer’s Manual》 thời kỳ đầu sắp xếp lệnh và giao diện theo từng mục, và tài liệu Ấn bản đầu tiên năm 1971 hiện vẫn được lưu giữ.[92]

Trang hướng dẫn cung cấp tên lệnh, cách sử dụng, tùy chọn, tệp, lỗi và mục liên quan theo một định dạng nhất quán. Nhà phát triển và quản trị viên hệ thống có thể trực tiếp kiểm tra mô tả của giao diện đang được cài đặt trên hệ thống họ sử dụng.

Phương thức tài liệu này ảnh hưởng đến tài liệu tham chiếu API, trợ giúp dòng lệnh và tài liệu nhà phát triển trực tuyến. Chương trình hiện đại cũng có thể cùng cung cấp --help, trang hướng dẫn và tài liệu API được tạo tự động.

Công cụ xử lý tài liệu UNIX cũng phát triển phương thức tạo tài liệu từ tệp nguồn. Dòng rofftroff dàn trang manual cùng tài liệu kỹ thuật từ bản thảo văn bản, qua đó xử lý tài liệu như một sản phẩm có thể xây dựng.

Nghiên cứu và giáo dục

UNIX được phân phối đến trường đại học cùng mã nguồn và được sử dụng như một đối tượng học tập tiêu biểu trong giáo dục hệ điều hành và lập trình hệ thống. Sinh viên có thể phân tích phần triển khai tiến trình, hệ thống tệp, shell và nhập/xuất thiết bị ngay trong mã thực tế.

Những thế hệ sinh viên và nhà nghiên cứu sử dụng UNIX về sau chuyển sang trường đại học, công ty máy tính và ngành phần mềm, qua đó phổ biến mô hình lập trình và văn hóa phát triển UNIX.

BSD phát triển công nghệ bộ nhớ ảo, mạng và hệ thống tệp thông qua nghiên cứu đại học rồi truyền chúng đến nhiều hệ điều hành và sản phẩm thương mại. Phương thức sửa đổi và phân phối mã hệ điều hành tại trường đại học cung cấp môi trường để thử nghiệm kết quả nghiên cứu trên hệ thống thực tế.

Ngày nay, Linux, BSD, MINIX và các hệ UNIX dành cho giáo dục vẫn được sử dụng trong môn học hệ điều hành. Cấu trúc UNIX có ưu điểm là có thể được nghiên cứu theo từng giai đoạn, từ các phiên bản đầu tương đối đơn giản đến những triển khai hiện đại phức tạp.

Mô hình bảo mật

UNIX cung cấp mã định danh người dùng, nhóm, quyền sở hữu tệp cùng quyền đọc, ghi và thực thi cho hệ thống đa người dùng. Kernel so sánh thông tin xác thực của tiến trình với quyền tệp để kiểm soát truy cập tài nguyên.

Mô hình này trở thành nền tảng để tách tài khoản người dùng và tài khoản dịch vụ trong máy chủ cùng hệ thống mạng, đồng thời áp dụng nguyên tắc đặc quyền tối thiểu. Khi mỗi daemon chạy dưới một người dùng khác nhau, phạm vi có thể truy cập tệp và tiến trình khác sẽ giảm nếu một dịch vụ bị xâm nhập.

Các chức năng như set-user-ID cho phép cấp thêm quyền đối với một tác vụ hạn chế, nhưng cũng tạo ra vấn đề trong đó lỗ hổng của chương trình chạy với quyền cao có thể dẫn đến leo thang đặc quyền trên toàn hệ thống.

Các hệ UNIX hiện đại bổ sung danh sách kiểm soát truy cập, capabilities, sandbox, kiểm soát truy cập bắt buộc và giới hạn lời gọi hệ thống vào quyền người dùng–nhóm truyền thống. Linux namespaces và seccomp, FreeBSD Capsicum, pledge cùng unveil của OpenBSD, Solaris Zones và sandbox của macOS phân chia chi tiết quyền cùng phạm vi truy cập của tiến trình theo những phương thức khác nhau.

Những chức năng hiện đại này không tồn tại trong UNIX thời kỳ đầu, nhưng được phát triển trên mô hình cơ bản phân chia quyền theo tiến trình và người dùng.

Cô lập và container

Mô hình tiến trình, thư mục root và quyền của UNIX trở thành nền tảng cho công nghệ cô lập cấp hệ điều hành. chroot thay đổi vị trí root của hệ thống tệp mà tiến trình nhìn thấy, qua đó giới hạn những đường dẫn có thể truy cập.

FreeBSD jail cô lập tiến trình, người dùng và môi trường mạng rộng hơn việc tách hệ thống tệp bằng chroot. Solaris Zones cũng cung cấp nhiều môi trường không gian người dùng cô lập trên cùng một kernel.

Linux kết hợp namespaces, cgroups, capabilities và chức năng hệ thống tệp để cấu thành môi trường container hiện đại. Docker và Kubernetes bổ sung image, triển khai cùng công cụ điều phối trên những chức năng kernel này.

Container không phải chức năng trực tiếp của UNIX thời kỳ đầu, nhưng là công nghệ mở rộng cấu trúc họ UNIX vốn biểu diễn tiến trình, hệ thống tệp và quyền người dùng như những tài nguyên độc lập.

Điện toán đám mây

Linux được sử dụng rộng rãi làm hệ điều hành máy chủ và host container trong đám mây hiện đại, còn môi trường tự động hóa và quản trị từ xa kiểu UNIX đã ảnh hưởng đến phương thức vận hành đám mây.

Máy chủ đám mây có thể khởi động mà không cần màn hình đồ họa và được cấu hình qua mạng. Shell, SSH, tệp cấu hình và công cụ dòng lệnh là nền tảng để tự động tạo image hệ thống và triển khai dịch vụ.

Trạng thái kết thúc của tiến trình, log cùng đầu ra văn bản hoặc có cấu trúc được sử dụng như giao diện để hệ thống tự động hóa đánh giá kết quả thực thi. Phương thức tạo lặp lại máy chủ bằng script và cấu hình khai báo thay vì quản lý thủ công từng máy cũng có liên hệ với văn hóa tự động hóa kiểu UNIX.

Đám mây không phải kết quả chỉ của UNIX mà được hình thành từ sự phát triển tổng hợp của ảo hóa, hệ thống phân tán, web API và công nghệ trung tâm dữ liệu. Tuy nhiên, phần lớn hệ điều hành cùng công cụ phát triển chạy trong đám mây sử dụng giao diện và văn hóa họ UNIX.

Hệ điều hành di động

Ảnh hưởng của UNIX tiếp tục vượt ra ngoài máy tính cá nhân và máy chủ để đến điện thoại thông minh cùng máy tính bảng. iOS và iPadOS dựa trên Darwin cùng XNU, còn tầng BSD của XNU cung cấp tiến trình UNIX, hệ thống tệp, mạng và giao diện POSIX.

Android dựa trên kernel Linux để quản lý tiến trình, bộ nhớ ảo, mạng và trình điều khiển thiết bị. Phương thức gán mã định danh người dùng riêng cho từng ứng dụng nhằm cô lập cũng tận dụng mô hình người dùng–tiến trình của UNIX.

Hệ điều hành di động không cung cấp nguyên vẹn môi trường shell UNIX truyền thống cho người dùng thông thường. Chúng cấu thành mô hình ứng dụng riêng tập trung vào sandbox ứng dụng, vòng đời, khai báo quyền và API nền tảng.

Vì vậy, ảnh hưởng của UNIX thể hiện rõ hơn trong nền tảng nội bộ của hệ điều hành so với giao diện người dùng. Người dùng hiện đại có thể sử dụng hằng ngày thiết bị chạy trên kernel họ UNIX mà không trực tiếp dùng lệnh UNIX.

Ảnh hưởng đến các hệ điều hành khác

Những hệ điều hành không có phả hệ trực tiếp với UNIX cũng đã cung cấp giao diện tương thích UNIX và môi trường lệnh. Mục đích là chuyển các chương trình cùng công cụ phát triển UNIX hiện có và tái sử dụng kiến thức của nhà phát triển.

Microsoft tham gia thị trường UNIX thời kỳ đầu thông qua Xenix, sau đó cũng cung cấp môi trường tương thích như POSIX subsystem và Services for UNIX trên Windows. Windows Subsystem for Linux hiện đại cho phép chạy không gian người dùng cùng công cụ phát triển Linux trong môi trường Windows.

Winsock, giao diện lập trình mạng của Windows, cũng sử dụng các khái niệm và hệ thống hàm tương tự BSD socket. PowerShell truyền đối tượng thay vì văn bản qua pipeline, nhưng có thể được so sánh với UNIX shell ở khả năng kết hợp lệnh để cấu thành công việc mới.

OS/2 của IBM, OpenVMS cùng nhiều hệ điều hành độc lập khác từng cung cấp POSIX và môi trường C trong khi cạnh tranh với UNIX hoặc duy trì truyền thống thiết kế khác. Điều này cho thấy UNIX đã trở thành một giao diện chung cho khả năng chuyển phần mềm, vượt ra ngoài một sản phẩm duy nhất.

Ảnh hưởng đến giao diện người dùng

UNIX chủ yếu được biết đến với dòng lệnh và lập trình hệ thống, nhưng cũng ảnh hưởng đến môi trường người dùng đồ họa. X Window System phát triển trên workstation UNIX như một hệ thống đồ họa có tính minh bạch mạng và trở thành nền tảng của nhiều desktop UNIX cùng Linux.

X tách máy chủ phụ trách hiển thị khỏi ứng dụng, cho phép ứng dụng được hiển thị trên màn hình của một máy tính khác thông qua mạng. Hình dạng cửa sổ và chính sách giao diện người dùng có thể do trình quản lý cửa sổ riêng phụ trách.

Cấu trúc này liên hệ với thiết kế kiểu UNIX trong đó cơ chế hiển thị đồ họa được tách khỏi chính sách desktop. GNOME, KDE Plasma cùng nhiều môi trường desktop cung cấp trình quản lý tệp, panel, thiết lập và môi trường ứng dụng trên X11 hoặc Wayland.

NeXTSTEP xây dựng framework đồ họa hướng đối tượng cùng desktop tích hợp trên nền UNIX và Mach. Công nghệ này về sau tiếp nối thành Cocoa của macOS và môi trường phát triển trên các nền tảng Apple.

Workstation và điện toán cá nhân

Workstation UNIX ảnh hưởng lớn đến môi trường phát triển phần mềm, thiết kế bán dẫn, tính toán khoa học và đồ họa ba chiều trong thập niên 1980 và 1990.

Workstation của Sun, Silicon Graphics, DEC, HP và IBM cung cấp mạng, đồ họa, đa nhiệm và công cụ phát triển cho từng nhà nghiên cứu cùng kỹ sư. Những khả năng vốn thuộc máy tính lớn được nhiều người chia sẻ đã chuyển sang hệ thống hiệu năng cao dành cho cá nhân.

SunOS và Solaris, IRIX, HP-UX cùng AIX kết hợp với phần cứng riêng để hình thành thị trường workstation và máy chủ doanh nghiệp. Nhiều công nghệ như NFS, OpenGL, XFS, DTrace và ZFS cũng phát triển hoặc được phổ biến trong các môi trường UNIX này.

Khi PC đa dụng, Linux, Windows và macOS phát triển, thị trường workstation UNIX chuyên dụng thu hẹp. Tuy nhiên, workstation Linux hiện đại và macOS dành cho phát triển phần mềm, tính toán khoa học cùng sản xuất nội dung đã kế thừa một phần vai trò của workstation UNIX.

Hệ thống tệp và công nghệ lưu trữ

Nhiều công nghệ hệ thống tệp được phát triển trong UNIX, BSD và UNIX thương mại. Fast File System của BSD cải thiện bố trí đĩa và cấp phát block, còn XFS của IRIX được phát triển hướng đến tệp quy mô lớn và nhập/xuất song song.

ZFS của Solaris kết hợp hệ thống tệp với quản lý volume, cung cấp checksum, storage pool, snapshot và sao chép. ZFS về sau được phổ biến sang FreeBSD, Linux cùng các hệ thống khác thông qua OpenZFS.

Những công nghệ như FreeBSD jail, Solaris Zones, ZFS và DTrace không chỉ tồn tại trong hệ điều hành ban đầu mà còn ảnh hưởng đến thiết kế container, khả năng quan sát và chức năng lưu trữ của các hệ thống khác.

Hệ thống tệp hiện đại phức tạp hơn rất nhiều so với hệ thống tệp UNIX thời kỳ đầu, nhưng những khái niệm cơ bản như cây thư mục, inode hoặc đối tượng tệp tương tự, link, bộ mô tả tệp và mount vẫn tiếp tục được sử dụng.

Khả năng quan sát và gỡ lỗi

Môi trường UNIX phát triển văn hóa kiểm tra hoạt động của chương trình và hệ thống bằng những công cụ nhỏ. ps, top, vmstat, netstat, debugger và trình theo dõi lời gọi hệ thống quan sát trạng thái tiến trình cùng tài nguyên từ bên ngoài.

Phương thức xử lý đầu ra của một chương trình bằng grep, awk và công cụ khác để trích xuất thông tin cần thiết đã trở thành quy trình cơ bản trong quan sát hệ điều hành và phân tích sự cố.

DTrace, được phát triển trong Solaris, phát triển kỹ thuật đặt động các điểm quan sát trong kernel và chương trình người dùng đang chạy. DTrace được chuyển sang FreeBSD, macOS và các hệ thống khác hoặc ảnh hưởng đến những công cụ truy vết tương tự.

perf, eBPF cùng nhiều framework truy vết của Linux cũng quan sát và phân tích sự kiện trong kernel cùng ứng dụng. Chúng không có cấu trúc nội bộ giống DTrace, nhưng chia sẻ mục tiêu chung là khảo sát động trạng thái thực thi mà không cần dừng hệ thống.

Giấy phép phần mềm

Họ UNIX cũng để lại những ảnh hưởng khác nhau đối với văn hóa giấy phép phần mềm hiện đại. Giấy phép BSD phát triển từ BSD cho phép sửa đổi và phân phối lại rộng rãi với điều kiện duy trì mã nguồn cùng thông báo bản quyền.

Mã theo giấy phép BSD có thể được đưa vào hệ điều hành thương mại, thiết bị mạng, máy chơi game và nhiều sản phẩm độc quyền. Vì nhìn chung không yêu cầu công khai toàn bộ mã nguồn đã sửa đổi, doanh nghiệp tương đối dễ tích hợp các thành phần hệ điều hành vào sản phẩm.

Dự án GNU và kernel Linux phổ biến phương thức copyleft thông qua GPL, vừa cung cấp quyền sửa đổi và phân phối chương trình vừa yêu cầu mã nguồn của tác phẩm phái sinh phải được cung cấp theo cùng điều kiện.

Một số mã tiếp nối từ Solaris sử dụng CDDL, còn macOS và UNIX thương mại kết hợp thành phần mã nguồn mở với thành phần độc quyền. Họ UNIX không thống nhất theo một mô hình giấy phép duy nhất mà hình thành hệ sinh thái nơi giấy phép dễ dãi, copyleft và giấy phép thương mại cùng tồn tại.

Văn hóa nhà phát triển

UNIX phổ biến văn hóa phát triển trong đó hoạt động của chương trình được biểu diễn rõ ràng bằng lệnh và tệp, còn khi phát hiện vấn đề thì tạo một công cụ nhỏ để giải quyết.

Việc lập tài liệu cho đầu vào và đầu ra của chương trình để công cụ khác có thể sử dụng, chuyển công việc lặp lại thành script và phụ thuộc vào giao diện ổn định thay vì chi tiết nội bộ của phần mềm được xem là quan trọng.

Phương thức đặt mã nguồn gần với tài liệu và hiểu hệ thống thông qua ví dụ có thể thực thi cùng công cụ cũng trở thành một phần của văn hóa UNIX. Trang hướng dẫn, cây mã nguồn, Makefile và shell script cùng ghi lại cách sử dụng chương trình và quá trình xây dựng.

Cụm từ văn hóa hacker cũng được dùng liên hệ với cộng đồng UNIX thời kỳ đầu tại trường đại học và cơ sở nghiên cứu. Trong ngữ cảnh này, hacker chỉ lập trình viên khám phá và cải tiến hệ thống một cách sáng tạo, rồi về sau ảnh hưởng đến văn hóa phát triển phần mềm tự do và Internet.

Văn hóa phát triển UNIX không phải lúc nào cũng hoàn hảo trong việc duy trì tính đơn giản và nhất quán. Trong lịch sử, tùy chọn lệnh cùng phương thức cấu hình khác nhau, còn chiến tranh UNIX và sự phân mảnh sản phẩm thương mại cũng đã xảy ra. Tuy nhiên, chính những vấn đề này làm nổi bật nhu cầu đối với POSIX, phong trào hệ thống mở và phát triển phần mềm có tính khả chuyển.

Kiến trúc phần mềm

Các công cụ có thể kết hợp cùng giao diện luồng của UNIX đã ảnh hưởng đến phương thức kết nối thành phần trong kiến trúc phần mềm hiện đại.

Pipeline trình biên dịch chia thành các bước tiền xử lý, biên dịch, tối ưu hóa, assembly và liên kết, trong đó mỗi bước truyền biểu diễn trung gian hoặc tệp. Pipeline xây dựng và triển khai cũng cấu thành các bước độc lập như lấy mã nguồn, biên dịch, kiểm thử, đóng gói và triển khai.

Hệ thống xử lý dữ liệu đưa đầu vào qua nhiều bước biến đổi rồi truyền kết quả sang bước tiếp theo. Hợp thành hàm trong lập trình hàm, xử lý luồng và hệ thống dataflow có nền tảng lý thuyết khác nhau, nhưng được so sánh với pipeline UNIX ở điểm kết nối những phép biến đổi nhỏ.

Client và server, plugin cùng microservice cũng kết nối các thành phần độc lập thông qua giao diện rõ ràng. Ảnh hưởng của UNIX không nằm ở việc chia mọi chương trình thành tiến trình riêng mà ở quan điểm mỗi thành phần nên có một hợp đồng đơn giản cho phép kết nối với những cách triển khai khác.

UNIX còn lại trong hệ điều hành hiện đại

Linux, FreeBSD, OpenBSD, NetBSD, macOS và UNIX thương mại trực tiếp kế thừa mô hình tiến trình, hệ thống tệp, shell cùng lập trình hệ thống của UNIX.

Android và ChromeOS sử dụng kernel Linux, còn iOS cùng nhiều hệ điều hành Apple dựa trên Darwin và XNU. Ngay cả khi người dùng không trực tiếp nhìn thấy môi trường người dùng UNIX truyền thống, mô hình tiến trình, mạng và hệ thống tệp của họ UNIX vẫn được sử dụng bên trong.

Trong máy chủ và đám mây, Linux đã trở thành người kế thừa chính của môi trường kiểu UNIX. Container, dịch vụ phân tán và công cụ tự động hóa cũng phát triển tập trung quanh Linux cùng giao diện POSIX.

Computer History Museum giải thích rằng UNIX và các hậu duệ của nó là Linux, Android, BSD, macOS cùng iOS đã trở thành nền tảng cấu thành máy chủ, đám mây và môi trường di động hiện đại.[93]

UNIX không thay thế mọi hệ điều hành hiện đại. Windows, hệ điều hành thời gian thực, hệ điều hành mainframe và nhiều kernel độc lập duy trì cấu trúc cùng hệ sinh thái khác nhau. Tuy nhiên, một phần đáng kể trong số đó cũng hỗ trợ C, POSIX, socket và công cụ dòng lệnh UNIX hoặc cung cấp môi trường tương thích.

Phạm vi và giới hạn của ảnh hưởng

Việc UNIX có ảnh hưởng lớn không có nghĩa mọi công nghệ điện toán hiện đại đều có thể được giải thích là bắt nguồn từ UNIX. Chia sẻ thời gian, bộ nhớ ảo, hệ thống tệp phân cấp và một số cấu trúc bảo vệ cũng được phát triển trong những hệ điều hành khác trước hoặc cùng thời với UNIX.

Giao diện đồ họa, lập trình hướng đối tượng, cơ sở dữ liệu quan hệ, giao thức Internet, ảo hóa và hệ thống phân tán cũng phát triển từ những dòng nghiên cứu và sản phẩm khác nhau. UNIX là một trong những nền tảng chính tiếp nhận và triển khai các công nghệ này, nhưng không phải nơi phát minh đầu tiên ra mọi khái niệm.

Tính đơn giản ban đầu của UNIX cũng là kết quả từ giới hạn phần cứng đương thời và một nhóm phát triển nhỏ. Hệ điều hành hiện đại có cấu trúc phức tạp hơn rất nhiều để đáp ứng bảo mật, quốc tế hóa, đa bộ xử lý, đồ họa, quản lý điện năng và tương thích phần cứng.

Cấu thành tập trung vào chương trình nhỏ và luồng văn bản cũng không phù hợp với mọi vấn đề. Dữ liệu có cấu trúc quy mô lớn, xử lý thời gian thực, giao dịch và trải nghiệm người dùng phức tạp có thể cần cơ sở dữ liệu, giao thức nhị phân, ứng dụng tích hợp cùng framework chuyên dụng.

Dù vậy, mô hình tiến trình, bộ mô tả tệp, shell, pipe, giao diện hệ thống C và tính khả chuyển ở mức mã nguồn do UNIX thiết lập vẫn là một trong những mô hình hệ điều hành tồn tại lâu dài nhất trong điện toán hiện đại. Ảnh hưởng lớn nhất của UNIX không nằm ở việc một sản phẩm duy nhất tiếp tục được sử dụng mà ở chỗ nó đã tạo ra cấu trúc và phương thức phát triển có thể được chia sẻ giữa những hệ điều hành cùng chương trình khác nhau.

Ưu điểm và hạn chế

Ưu điểm của UNIX và các hệ điều hành họ UNIX không thể được giải thích chỉ bằng một cấu trúc kernel duy nhất hoặc hiệu năng của một sản phẩm cụ thể. Mô hình hệ thống nhất quán tập trung vào tiến trình và bộ mô tả tệp, môi trường người dùng kết hợp các công cụ nhỏ, quản trị từ xa và tự động hóa, giao diện lập trình đã được tiêu chuẩn hóa cùng hệ sinh thái phần mềm tích lũy trong thời gian dài đều cùng tạo nên những ưu điểm này.

Đồng thời, họ UNIX không phải là một hệ điều hành thống nhất duy nhất. Các nhánh BSD và System V phát sinh từ Research UNIX, Linux được triển khai độc lập, macOS dựa trên Darwin cùng nhiều UNIX thương mại sử dụng kernel, không gian người dùng, tùy chọn lệnh, định dạng tệp và hệ thống quản trị khác nhau. POSIX và Single UNIX Specification cung cấp nền tảng chung, nhưng không thống nhất mọi khác biệt triển khai, khả năng tương thích nhị phân và trải nghiệm người dùng.

Vì vậy, ưu điểm và hạn chế của UNIX nên được đánh giá theo mục đích sử dụng, nhánh được lựa chọn và môi trường vận hành, thay vì xem như những đặc tính tuyệt đối. Cấu trúc tập trung vào dòng lệnh, vốn là thế mạnh trong máy chủ và môi trường phát triển, có thể trở thành rào cản gia nhập đối với người tiêu dùng thông thường; khả năng cấu hình tự do cũng có thể dẫn đến sự phức tạp và phân mảnh trong vận hành quy mô lớn.

Tính khả chuyển

Một ưu điểm tiêu biểu của UNIX là cung cấp nền tảng để chuyển chương trình sang phần cứng và hệ điều hành khác nhau. Khi phần lớn kernel UNIX được viết lại bằng C, phạm vi mã assembly phụ thuộc máy được giảm xuống, còn POSIX và Single UNIX Specification về sau tiêu chuẩn hóa giao diện bên ngoài của tệp, tiến trình, tín hiệu, shell và các tiện ích chung.

Chương trình C và shell script được viết dựa trên POSIX có thể tái sử dụng mã nguồn cốt lõi trên Linux, BSD, macOS và UNIX thương mại. Dù scheduler, hệ thống tệp và cách triển khai lời gọi hệ thống bên trong hệ điều hành khác nhau, cùng một mô hình lập trình vẫn có thể được duy trì nếu giao diện mà ứng dụng quan sát là giống nhau.

Tính khả chuyển làm giảm sự phụ thuộc vào một nhà cung cấp hoặc kiến trúc máy tính cụ thể. Nếu logic chung của chương trình được viết bằng giao diện POSIX và chỉ những chức năng cần thiết được tách thành mô-đun riêng cho từng nền tảng, chương trình có thể hỗ trợ đồng thời nhiều hệ UNIX.

Tuy nhiên, điều POSIX bảo đảm chủ yếu là tính khả chuyển ở mức mã nguồn. Điều đó có nghĩa cùng một mã nguồn có thể được biên dịch lại trên nhiều hệ thống, chứ không có nghĩa tệp thực thi được tạo trên một hệ thống có thể chạy nguyên vẹn trên hệ thống khác. Khi tập lệnh bộ xử lý, ABI, định dạng tệp thực thi, thư viện C và dynamic linker khác nhau, cần có binary riêng.

POSIX để lại một số hành vi dưới dạng do triển khai quyết định, không được chỉ định hoặc chức năng tùy chọn. Giới hạn tên tệp và đường dẫn, kích thước kiểu dữ liệu, luồng và chức năng thời gian thực, các tùy chọn mở rộng của lệnh cũng có thể khác nhau theo hệ thống. Vì vậy, chỉ riêng việc sử dụng API tiêu chuẩn không tự động tạo ra tính khả chuyển hoàn toàn.[94][95]

Mô hình hệ thống nhất quán

Họ UNIX biểu diễn tệp, tiến trình, người dùng, quyền và nhập/xuất bằng những khái niệm tương đối nhất quán. Chương trình tham chiếu tệp thông thường, terminal, pipe, thiết bị và socket thông qua bộ mô tả tệp, đồng thời có thể sử dụng các giao diện chung như read, writeclose.

Sự trừu tượng hóa này làm giảm mức độ gắn kết giữa chương trình và thiết bị nhập/xuất cụ thể. Khi chương trình ghi dữ liệu vào đầu ra chuẩn, shell có thể kết nối dữ liệu đó với terminal, tệp hoặc đầu vào của chương trình khác. Chương trình không cần triển khai một cấu trúc xử lý hoàn toàn khác cho từng đích xuất.

Việc tạo tiến trình và thực thi chương trình, trạng thái kết thúc, tín hiệu cùng kế thừa bộ mô tả tệp cũng được liên kết trong cùng một mô hình thực thi chung. Shell, trình quản lý dịch vụ, công cụ xây dựng và chương trình máy chủ có thể sử dụng cùng các giao diện cơ bản để chạy và quản lý chương trình khác.

Tuy nhiên, cách giải thích “mọi thứ đều là tệp” cần được hiểu có giới hạn. Tệp thông thường, socket, thư mục và thiết bị có đặc tính khác nhau, và không phải mọi đối tượng đều hỗ trợ cùng một tập thao tác. Những chức năng như kết nối socket hoặc điều khiển thiết bị không thể được biểu diễn chỉ bằng thao tác đọc và ghi thông thường nên cần giao diện riêng.

Nếu các trừu tượng hóa chung chỉ dừng ở mức quá thấp, ứng dụng phải tự xử lý thao tác đọc từng phần, sự kiện bất đồng bộ, tín hiệu và nhiều điều kiện lỗi. API dựa trên bộ mô tả tệp linh hoạt nhưng không tự động cung cấp quản lý vòng đời đối tượng bậc cao và an toàn kiểu dữ liệu mà ứng dụng hiện đại yêu cầu.

Các công cụ có thể kết hợp

Trong môi trường UNIX, thay vì đưa mọi chức năng vào một chương trình, có thể kết hợp nhiều công cụ có vai trò rõ ràng. Chương trình tuân theo đầu vào và đầu ra chuẩn, pipe cùng trạng thái kết thúc có thể tham gia một luồng công việc mà không cần biết trước sự tồn tại của công cụ khác.

Cấu trúc này làm giảm chi phí tái sử dụng chương trình hiện có. Có thể kết nối các tiện ích sẵn có trong shell để thực hiện tìm kiếm, sắp xếp, trích xuất trường, nén và truyền qua mạng mà không cần tự triển khai lại từng chức năng. Cũng có thể lưu những lệnh đã thử nghiệm tương tác thành script để chuyển thành công việc lặp lại.

Khả năng kiểm thử và thay thế từng công cụ độc lập cũng là một ưu điểm. Nếu quy ước đầu vào và đầu ra được duy trì, có thể thay đổi cách triển khai nội bộ hoặc thay bằng chương trình khác mà vẫn giữ nguyên toàn bộ pipeline.

Tuy nhiên, phương thức chia thành các công cụ nhỏ không phù hợp với mọi loại phần mềm. Khi dữ liệu có cấu trúc phức tạp đi qua nhiều bước văn bản, thông tin kiểu và metadata có thể bị mất, còn chi phí tuần tự hóa dữ liệu và tạo tiến trình có thể tăng.

Nếu định dạng đầu ra của công cụ, vốn dành để con người đọc, thường xuyên thay đổi thì script có thể dễ dàng bị hỏng. Locale, khoảng trắng, độ rộng cột và ký tự đặc biệt trong tên tệp cũng có thể làm giảm độ ổn định của pipeline văn bản. Khi mục đích là xử lý bằng máy, cần cung cấp định dạng đầu ra rõ ràng, phân tách bằng ký tự null, JSON hoặc giao thức chuyên dụng.

Việc chia chương trình quá nhỏ có thể khiến toàn bộ luồng khó hiểu hơn và khó truy tìm lỗi xảy ra ở giai đoạn nào. Khả năng kết hợp không phụ thuộc vào việc có nhiều chương trình, mà vào việc trách nhiệm và hợp đồng dữ liệu có rõ ràng hay không.

Tự động hóa và khả năng tái tạo

Họ UNIX phù hợp với tự động hóa vì có thể điều khiển hệ thống xoay quanh shell, công cụ dòng lệnh và tệp thông thường. Biên dịch, kiểm thử, triển khai, sao lưu, quản lý người dùng và phân tích log có thể được biểu diễn bằng script và công cụ xây dựng.

Lệnh truyền kết quả thực thi thông qua đầu ra chuẩn, lỗi chuẩn và trạng thái kết thúc. Chương trình tự động hóa có thể đánh giá thành công hay thất bại bằng trạng thái kết thúc, truyền dữ liệu đầu ra sang bước tiếp theo hoặc lưu làm log.

Nếu tệp cấu hình và script được quản lý phiên bản, có thể ghi lại lịch sử thay đổi của hệ thống và áp dụng cùng cấu hình cho môi trường khác. Điều này kết hợp tốt với những phương thức vận hành hiện đại như CI/CD, quản lý cấu hình và Infrastructure as Code.

Shell từ xa cho phép quản lý máy chủ và thiết bị mạng không có màn hình vật lý bằng cùng một hệ thống lệnh. Máy chủ tự động hóa có thể lặp lại cùng một công việc trên nhiều hệ thống thông qua SSH hoặc API quản trị.

Ngược lại, shell script đòi hỏi sự cẩn thận trong việc trích dẫn, tách từ, mở rộng glob, trạng thái kết thúc của pipeline và xử lý lỗi. Nếu tên tệp chứa khoảng trắng hoặc xuống dòng, hoặc đầu ra lệnh khác dự kiến, script có thể hoạt động sai.

Chương trình shell quy mô lớn có thể khó bảo trì do thiếu kiểu tĩnh, xử lý ngoại lệ có cấu trúc và hệ thống mô-đun. Dù shell có thể được sử dụng để kết nối luồng công việc, việc tách xử lý dữ liệu phức tạp và quản lý trạng thái sang Python, Go, Rust hoặc ngôn ngữ khác có thể phù hợp hơn.

Khả năng tự động hóa cũng không tự động bảo đảm khả năng tái tạo. Nếu phụ thuộc vào thay đổi của kho gói, thời gian và locale, dịch vụ mạng, thực thi song song và biến môi trường, cùng một script vẫn có thể tạo ra kết quả khác. Cần đồng thời cố định phiên bản chính xác, sử dụng môi trường xây dựng cô lập và quản lý đầu vào một cách rõ ràng.

Đa người dùng và quản lý quyền

UNIX phát triển với giả định nhiều người cùng sử dụng một máy tính đồng thời. Mã định danh người dùng và nhóm, quyền sở hữu tệp cùng quyền đọc, ghi và thực thi cho phép phân biệt tệp và tiến trình của từng người dùng.

Việc sử dụng tài khoản người dùng riêng cho từng dịch vụ có thể giảm phạm vi tệp và tiến trình có thể truy cập nếu một dịch vụ mạng bị xâm nhập. Có thể chạy công việc không cần quyền quản trị bằng người dùng thông thường và chỉ cho phép có chọn lọc những tài nguyên cần thiết theo nguyên tắc đặc quyền tối thiểu.

Việc tách tiến trình và không gian địa chỉ giảm khả năng lỗi trong một chương trình ảnh hưởng trực tiếp đến chương trình và dữ liệu của người dùng khác. Có thể kết hợp giới hạn tài nguyên, quyền hệ thống tệp và điều khiển tiến trình để cấu hình máy chủ dùng chung.

Tuy nhiên, chỉ quyền truyền thống dành cho chủ sở hữu, nhóm và người dùng khác khó biểu đạt chi tiết những yêu cầu bảo mật hiện đại phức tạp. Quyền được cấp cho một tài khoản có thể áp dụng cho mọi chương trình chạy bằng tài khoản đó, còn chỉ quyền tệp không thể giới hạn đầy đủ truy cập mạng, thiết bị và lời gọi hệ thống.

Cấu trúc tập trung quyền rộng lớn vào tài khoản root cũng là một yếu tố rủi ro. Lỗ hổng trong chương trình chạy với quyền cao có thể dẫn đến chiếm quyền toàn bộ hệ thống, còn chương trình set-user-ID cần được thiết kế đặc biệt nghiêm ngặt.

Các hệ UNIX hiện đại cung cấp danh sách kiểm soát truy cập, Linux capabilities và seccomp, SELinux và AppArmor, FreeBSD Capsicum, pledgeunveil của OpenBSD, App Sandbox của macOS cùng nhiều chức năng khác để bổ sung cho các hạn chế này. App Sandbox của Apple cũng giới hạn quyền truy cập của ứng dụng đối với tài nguyên hệ thống và dữ liệu người dùng tùy theo entitlement mà ứng dụng yêu cầu.[96]

Tuy nhiên, API và ngôn ngữ chính sách của các chức năng bảo mật mở rộng khác nhau theo từng hệ điều hành. Mô hình quyền POSIX tương đối phổ biến, nhưng chương trình sử dụng sandbox chi tiết và kiểm soát truy cập bắt buộc có thể cần cách triển khai riêng theo nền tảng.

Cô lập tiến trình và quản lý tài nguyên

Tiến trình tách không gian địa chỉ và trạng thái thực thi, qua đó giảm khả năng một chương trình bị lỗi trực tiếp phá hỏng bộ nhớ của tiến trình khác. Việc tách dịch vụ theo tiến trình cũng thuận lợi cho cô lập lỗi, phân tách quyền và khởi động lại độc lập.

Linux namespaces và cgroups, FreeBSD jail cùng Solaris Zones mở rộng mô hình tiến trình và hệ thống tệp của UNIX để cung cấp các môi trường thực thi cô lập trên cùng một kernel. FreeBSD jail có thể tách hệ thống tệp, tiến trình, người dùng và cấu hình mạng, đồng thời có thể ủy quyền một tập dữ liệu ZFS cho một jail cụ thể.[97][98]

Container khởi động nhanh hơn máy ảo hoàn chỉnh và có thể chạy nhiều môi trường ứng dụng với ít tài nguyên hơn. Phương thức đóng gói image hệ điều hành cùng phụ thuộc của ứng dụng để phân phối làm tăng hiệu quả vận hành máy chủ và đám mây.

Tuy nhiên, container chia sẻ cùng kernel với host. Lỗ hổng kernel hoặc cấu hình quyền sai có thể ảnh hưởng vượt qua ranh giới cô lập, còn muốn chạy các kernel hệ điều hành khác nhau thì cần máy ảo.

Bản thân namespace cũng không phải một hệ thống kiểm soát truy cập hoàn chỉnh. Tài liệu Linux Landlock giải thích rằng namespace có thể hỗ trợ xây dựng sandbox nhưng không được thiết kế để giới hạn truy cập chi tiết, còn cấu hình phức tạp có thể tạo ra vấn đề bảo mật.[99]

Khi số lượng công nghệ cô lập tăng lên, quan hệ giữa mount, mạng, mã định danh người dùng, giới hạn tài nguyên và quyền cũng trở nên phức tạp hơn. Nếu không hiểu chính xác giá trị mặc định và ranh giới, một tiến trình tưởng như đã được cô lập vẫn có thể truy cập tài nguyên quan trọng của host.

Giao diện không gian người dùng ổn định

Văn hóa duy trì khả năng tương thích của chương trình và lệnh UNIX cũ là một ưu điểm lớn trong môi trường vận hành dài hạn. Nếu lời gọi hệ thống và giao diện thư viện C mà ứng dụng sử dụng được duy trì ổn định, có thể tiếp tục chạy chương trình hiện có trong khi cập nhật hệ điều hành.

Linux không bảo đảm giao diện nhị phân ổn định cho API driver nội bộ của kernel, nhưng xem việc duy trì ổn định giao diện kernel–không gian người dùng mà ứng dụng sử dụng là một chính sách quan trọng. Tài liệu kernel cũng phân biệt rõ giao diện lời gọi hệ thống của không gian người dùng với giao diện nội bộ của kernel.[100]

BSD và UNIX thương mại cũng quản lý khả năng tương thích của thư viện hệ thống và môi trường thực thi, đồng thời có thể cung cấp thư viện tương thích hoặc chính sách ABI để vận hành chương trình nghiệp vụ cũ trong thời gian dài.

Tuy nhiên, không phải mọi tầng đều cung cấp mức ổn định giống nhau. Mô-đun kernel ngoài cây và driver Linux có thể phải được xây dựng lại hoặc sửa đổi theo thay đổi của phiên bản kernel. Chương trình phụ thuộc giao diện không công khai và cấu trúc dữ liệu nội bộ của từng hệ điều hành cũng có khả năng cao bị hỏng khi cập nhật.

Ngay cả khi ABI không gian người dùng ổn định, thư viện, runtime ngôn ngữ, ngăn xếp đồ họa và API desktop có chính sách tương thích riêng. Việc tệp thực thi có thể khởi động không có nghĩa mọi chức năng và hiệu năng của chương trình giống như trước.

Việc duy trì khả năng tương thích cũ trong thời gian dài có thể khiến mã legacy và xử lý đặc biệt tích lũy trong hệ điều hành cùng thư viện. Việc loại bỏ API cũ hoặc chuyển sang thiết kế an toàn hơn trở nên khó khăn, làm tăng chi phí bảo trì và phạm vi kiểm thử.

Chức năng mạng

Họ UNIX cung cấp môi trường lập trình mạng mạnh mẽ xoay quanh BSD socket và TCP/IP. Cùng một giao diện socket có thể cấu hình giao tiếp tiến trình cục bộ và giao tiếp mạng TCP·UDP, còn máy chủ và client có thể được chuyển sang nhiều hệ UNIX.

Các chức năng như định tuyến, lọc gói, giao diện mạng ảo và network namespace là nền tảng cho máy chủ, tường lửa, container và mạng đám mây. Hệ sinh thái máy chủ mạng và công cụ quản trị tích lũy trong thời gian dài cũng là một thế mạnh chính của họ UNIX.

Việc sử dụng bộ mô tả tệp và giao diện thông báo sự kiện cho phép một tiến trình xử lý số lượng lớn kết nối mạng. Chương trình có thể lựa chọn cấu trúc máy chủ phù hợp giữa tiến trình, luồng và xử lý sự kiện bất đồng bộ.

Tuy nhiên, giao diện nhập/xuất bất đồng bộ hiệu năng cao khác nhau theo từng hệ điều hành. Linux cung cấp epollio_uring, BSD cùng macOS cung cấp kqueue, còn dòng Solaris cung cấp chức năng riêng như event ports. pollselect của POSIX là nền tảng chung nhưng có thể không cung cấp hiệu năng tốt nhất với tập kết nối rất lớn hoặc tác vụ bất đồng bộ hiện đại.

Lệnh quản trị mạng và hệ thống tường lửa cũng được chia thành nftables của Linux, pf của BSD cùng công cụ của Solaris và các hệ thống khác. Mã socket cơ bản của chương trình mạng có thể khả chuyển, nhưng tự động hóa vận hành và tối ưu hóa hiệu năng vẫn yêu cầu công việc riêng theo nền tảng.

Vận hành từ xa

Họ UNIX phù hợp với việc vận hành hệ thống không được kết nối trực tiếp màn hình và bàn phím. Shell và chương trình dòng lệnh có thể được sử dụng ngay cả với băng thông thấp, còn SSH cho phép truy cập từ xa được mã hóa, thực thi lệnh và truyền tệp.

Vì trạng thái cùng cấu hình máy chủ được biểu diễn bằng tệp, tiến trình và lệnh, phần lớn công việc quản trị có thể được thực hiện mà không cần truyền từ xa màn hình đồ họa. Việc áp dụng cùng lệnh và script cho nhiều hệ thống cũng tương đối dễ dàng.

Log, tiến trình và trạng thái mạng có thể được thu thập dưới dạng văn bản hoặc đầu ra có cấu trúc rồi gửi đến hệ thống giám sát trung tâm. Ngay cả trên hệ thống gặp lỗi, công việc phục hồi có thể được thực hiện thông qua console nối tiếp hoặc shell tối thiểu.

Ngược lại, vận hành từ xa dựa trên dòng lệnh đòi hỏi kiến thức về lệnh, cấu trúc tệp và hệ thống quyền. Một lệnh sai có thể ảnh hưởng ngay lập tức đến nhiều tệp hoặc máy chủ, còn sử dụng quyền quản trị tự động có thể mở rộng đáng kể phạm vi thiệt hại.

Shell từ xa và cổng quản trị cũng là mục tiêu tấn công. Cần xác thực mạnh, quản lý khóa, hạn chế truy cập, log kiểm toán và cập nhật bảo mật; chỉ riêng việc sử dụng SSH không bảo đảm vận hành an toàn.

Môi trường phát triển và hệ sinh thái công cụ

Họ UNIX cung cấp trình biên dịch, debugger và công cụ xây dựng cho C, C++, Rust, Go, Python, Java cùng nhiều ngôn ngữ khác. Trình soạn thảo, quản lý phiên bản, phân tích tĩnh, profiling và công cụ đóng gói cần thiết cho phát triển phần mềm có thể được kết hợp trong cùng một môi trường.

Việc sử dụng trình biên dịch, linker, shell và make như những công cụ độc lập giúp dễ kiểm tra hoặc thay thế từng giai đoạn của quá trình xây dựng. IDE dựa trên GUI cũng có thể gọi nội bộ những công cụ dòng lệnh này.

Mã nguồn công khai của Linux và BSD thuận lợi cho việc nghiên cứu và sửa đổi hệ điều hành, trình biên dịch, hệ thống tệp và ngăn xếp mạng. Có thể trực tiếp xây dựng kernel cùng không gian người dùng hoặc chuyển chúng sang kiến trúc máy tính và thiết bị mới.

FreeBSD cung cấp Ports Collection cùng với gói nhị phân. Ports sử dụng Makefile, bản vá và tệp mô tả để xây dựng và cài đặt phần mềm bên ngoài phù hợp với môi trường FreeBSD.[101]

Tuy nhiên, quy mô hệ sinh thái phần mềm khác biệt lớn giữa các nhánh. Công cụ máy chủ, GPU và container được hỗ trợ trước trên Linux có thể được cung cấp chậm hơn hoặc không sử dụng được trên BSD và UNIX thương mại. Ngược lại, framework dành riêng cho macOS hoặc phần mềm doanh nghiệp dành cho AIX không thể sử dụng trên hệ thống khác.

Phiên bản của công cụ phát triển và gói cũng khác nhau giữa bản phân phối và hệ điều hành. Trình biên dịch và lệnh cùng tên có thể có tùy chọn mặc định và bản vá khác nhau, nên quá trình xây dựng có thể tái tạo cần quản lý phiên bản rõ ràng.

Mã nguồn mở và khả năng sửa đổi

Linux và dòng BSD công khai mã nguồn kernel cùng phần lớn không gian người dùng chính, cho phép người dùng kiểm tra và sửa đổi hoạt động. Nhiều tổ chức có thể cùng phát triển hỗ trợ phần cứng mới, hệ thống tệp, chức năng bảo mật và cải tiến hiệu năng.

Có thể lựa chọn chỉ những chức năng cần thiết cho một sản phẩm cụ thể và loại bỏ thành phần không cần thiết để tạo hệ điều hành phù hợp với máy chủ, thiết bị mạng hoặc hệ thống nhúng. Ngay cả khi nhà cung cấp ngừng phát triển, nếu mã nguồn và cộng đồng vẫn được duy trì thì vẫn có khả năng tiếp tục phát triển thành một nhánh riêng.

Phát triển công khai cho phép nhiều người kiểm tra vấn đề bảo mật và lỗi, nhưng chỉ riêng việc mã nguồn được công khai không bảo đảm chất lượng và bảo mật. Nhân lực đánh giá thực tế, tình trạng bảo trì, phạm vi kiểm thử và hệ thống phân phối bản sửa lỗi đều quan trọng.

Giấy phép cũng khác nhau theo từng dự án và thành phần. GPLv2 của kernel Linux, giấy phép BSD của dòng BSD, CDDL của dòng illumos cùng nhiều giấy phép không gian người dùng ảnh hưởng khác nhau đến điều kiện công khai mã sửa đổi và tích hợp sản phẩm.

UNIX thương mại và macOS cũng bao gồm một số thành phần mã nguồn mở, nhưng toàn bộ hệ thống không được công khai. Driver, framework đồ họa, công cụ quản trị và chức năng riêng của sản phẩm có thể là thành phần độc quyền của nhà cung cấp.

Hiệu năng và khả năng mở rộng

Họ UNIX đã mở rộng từ thiết bị nhúng nhỏ đến máy chủ đa bộ xử lý và siêu máy tính. Kernel và không gian người dùng có thể được cấu hình theo môi trường đích, đồng thời tận dụng tiến trình, luồng, nhập/xuất bất đồng bộ và bộ nhớ ảo.

Linux hỗ trợ nhiều kiến trúc bộ xử lý, máy chủ quy mô lớn, GPU và mạng tốc độ cao, còn FreeBSD và UNIX thương mại cũng cung cấp tối ưu hóa dành cho mạng, lưu trữ và máy chủ doanh nghiệp. UNIX thương mại, nơi phần cứng và hệ điều hành được cùng phát triển, có thể điều chỉnh toàn bộ hệ thống một cách tích hợp.

Sự phong phú của công cụ phân tích hiệu năng và giao diện trạng thái hệ thống cũng là một ưu điểm. Có thể quan sát hoạt động của tiến trình, bộ nhớ, hệ thống tệp, mạng và lời gọi hệ thống rồi đo điểm nghẽn.

Tuy nhiên, không thể khái quát rằng một hệ thống “nhanh vì thuộc họ UNIX”. Hiệu năng thay đổi theo phiên bản kernel, hệ thống tệp, driver, scheduler, thư viện C, ứng dụng và cấu hình phần cứng.

Cũng không có bảo đảm chức năng nổi trội trên một nhánh sẽ được cung cấp ở cùng mức trên nhánh khác. Driver GPU, mạng tốc độ cao, quản lý điện năng và hỗ trợ phần cứng tiêu dùng có thể tập trung vào một hệ điều hành nhất định.

Nếu sử dụng API riêng theo triển khai để đạt hiệu năng cao, tính khả chuyển có thể giảm. Có thể phải quản lý riêng một đường dẫn tốc độ cao sử dụng io_uring, kqueue, DTrace và chức năng hệ thống tệp riêng, cùng một đường dẫn dựa trên POSIX tiêu chuẩn.

Tính ổn định và vận hành dài hạn

Họ UNIX phát triển như một môi trường chạy dịch vụ lâu dài trên máy chủ và hệ thống doanh nghiệp. Có thể cấu hình hệ thống vận hành liên tục bằng cách sử dụng cô lập tiến trình, khởi động lại dịch vụ, log, quản trị từ xa và chức năng phục hồi hệ thống tệp.

UNIX thương mại như AIX, HP-UX và Solaris được sử dụng trong hệ thống nghiệp vụ cốt lõi bằng cách kết hợp phần cứng doanh nghiệp cụ thể, hỗ trợ kỹ thuật và chính sách bảo trì dài hạn. Linux và BSD cũng có thể lựa chọn bản phát hành hỗ trợ dài hạn cùng chính sách cập nhật thận trọng.

Phương thức BSD, trong đó hệ điều hành và hệ thống cơ sở được quản lý bởi một dự án, có thể thuận lợi cho việc duy trì tính nhất quán giữa kernel và không gian người dùng. Ngược lại, bản phân phối Linux tích hợp nhiều dự án độc lập để cung cấp lựa chọn rộng hơn và đưa chức năng mới vào nhanh hơn.

Tính ổn định không chỉ được tạo ra từ việc có ít thay đổi. Hệ thống không được cập nhật trong thời gian dài có thể bị phơi nhiễm với lỗ hổng đã biết, công nghệ mã hóa cũ và phần cứng hết hỗ trợ. Vận hành ổn định cần bản vá bảo mật, sao lưu, kiểm thử lỗi và kế hoạch nâng cấp.

Chu kỳ hỗ trợ dài của UNIX doanh nghiệp là một ưu điểm, nhưng có thể tạo ra sự phụ thuộc vào phần cứng và nhà cung cấp cụ thể. Giá sản phẩm, hợp đồng bảo trì và khả năng tuyển nhân lực chuyên môn ảnh hưởng đến tổng chi phí vận hành.

Hệ thống tệp và chức năng lưu trữ

Họ UNIX hỗ trợ nhiều hệ thống tệp cục bộ và mạng khác nhau dựa trên mô hình hệ thống tệp phân cấp và mount. Có thể lựa chọn ZFS, XFS, ext4, Btrfs, UFS cùng nhiều hệ thống tệp khác theo mục đích.

ZFS có thế mạnh trong máy chủ lưu trữ và môi trường sao lưu nhờ kết hợp storage pool, checksum, snapshot và sao chép. FreeBSD có thể tích hợp ZFS với hệ thống cơ sở và môi trường jail.

Ngữ nghĩa UNIX tách tiến trình đang mở tệp khỏi tên đường dẫn hữu ích cho việc xoay vòng log và xử lý tệp tạm thời. Ngay cả khi tên tệp bị xóa, dữ liệu vẫn có thể được truy cập thông qua bộ mô tả tệp đang mở.

Ngược lại, việc có nhiều loại hệ thống tệp cũng có nghĩa chức năng, công cụ phục hồi và đặc tính hiệu năng khác nhau. Nếu sử dụng snapshot hoặc nén riêng của một hệ thống tệp, việc trực tiếp chuyển thiết bị lưu trữ sang một hệ UNIX khác có thể khó khăn.

Ngữ nghĩa tệp POSIX cung cấp tính nhất quán mạnh và giao diện tệp thông thường, nhưng trong môi trường lưu trữ phân tán có thể phát sinh chi phí hiệu năng và khả năng mở rộng. Kho đối tượng và một số hệ thống tệp phân tán nới lỏng một phần ngữ nghĩa POSIX hoặc cung cấp API riêng.

Phân biệt chữ hoa–chữ thường, mã hóa tên tệp, thuộc tính mở rộng và danh sách kiểm soát truy cập cũng khác nhau theo hệ thống và hệ thống tệp. Cùng một chương trình có thể gặp những điều kiện biên khác nhau trên ext4 của Linux, APFS của macOS và hệ thống tệp mạng.

Lợi ích của tiêu chuẩn hóa

POSIX và Single UNIX Specification giảm khả năng các hệ UNIX khác nhau phân tách thành những hệ sinh thái hoàn toàn biệt lập, đồng thời cho phép nhà phát triển sử dụng kiến thức lập trình chung.

Việc giao diện tệp, tiến trình, shell, luồng và mạng được tiêu chuẩn hóa cho phép sử dụng giáo trình, thư viện và công cụ phát triển trên nhiều hệ thống. Nhà cung cấp hệ điều hành cũng dễ chuyển phần mềm POSIX hiện có sang hệ thống của mình.

Tiêu chuẩn không ép buộc cách triển khai nội bộ, nên hệ điều hành có thể phát triển scheduler, hệ thống tệp và chức năng bảo mật mới trong khi duy trì khả năng tương thích bên ngoài. Điều này đồng thời cho phép cạnh tranh giữa các triển khai và khả năng chuyển ứng dụng.

Tuy nhiên, tiêu chuẩn không bao quát toàn bộ môi trường vận hành thực tế. API đồ họa, trình quản lý gói, trình quản lý dịch vụ, container, giám sát tệp và nhập/xuất bất đồng bộ hiệu năng cao có khác biệt lớn giữa các hệ điều hành.

Ngay cả chức năng được định nghĩa trong tiêu chuẩn cũng bao gồm tùy chọn lựa chọn và giá trị do triển khai quyết định. Sự phù hợp POSIX không có nghĩa hành vi và giới hạn của mọi hệ thống hoàn toàn giống nhau; có thể cần tài liệu phù hợp tiêu chuẩn và truy vấn chức năng khi chạy.[102]

Chứng nhận UNIX chính thức đòi hỏi chi phí và quy trình kiểm thử. Một hệ điều hành có thể cung cấp rộng rãi giao diện POSIX về mặt kỹ thuật nhưng không được chứng nhận, nên cần đánh giá riêng trạng thái chứng nhận và khả năng tương thích phần mềm thực tế.

Sự phân mảnh

Một trong những hạn chế dai dẳng nhất của họ UNIX là sự phân mảnh thành nhiều nhánh và cách triển khai. Linux, FreeBSD, OpenBSD, NetBSD, macOS, AIX, HP-UX và dòng Solaris chia sẻ truyền thống chung nhưng không phải hoàn toàn cùng một hệ điều hành.

Cùng một lệnh có thể có tùy chọn mở rộng và định dạng đầu ra khác nhau giữa GNU, BSD và triển khai UNIX thương mại. Những khác biệt này thường xuất hiện trong sed, date, find, stat và các lệnh quản trị mạng.

Shell cũng được chia thành POSIX sh, Bash, Zsh, KornShell cùng nhiều triển khai khác. Script sử dụng mảng, biểu thức điều kiện hoặc process substitution riêng của một shell có thể không hoạt động trên shell khác.

Khởi tạo hệ thống và quản lý dịch vụ sử dụng BSD rc, System V init, systemd, launchd và SMF cùng nhiều cơ chế khác. Quản lý gói, vị trí tệp cấu hình và phương thức cấu hình mạng cũng khác nhau theo hệ điều hành và bản phân phối.

Ngay trong Linux, định dạng gói, chu kỳ phát hành, thư viện mặc định và chính sách hệ thống cũng khác nhau theo bản phân phối. Chỉ từ cách diễn đạt “hỗ trợ Linux” khó bảo đảm cùng một hành vi trên mọi bản phân phối và phiên bản.

Sự phân mảnh cũng cung cấp quyền lựa chọn và khả năng thử nghiệm. Tuy nhiên, đối với nhà cung cấp phần mềm, nó làm tăng chi phí của các tổ hợp xây dựng, kiểm thử, đóng gói và hỗ trợ. Kết quả là một số phần mềm thương mại chỉ có thể hỗ trợ một số bản phân phối có thị trường lớn hoặc macOS.

Thiếu khả năng tương thích nhị phân

POSIX tiêu chuẩn hóa giao diện nguồn nhưng không thống nhất môi trường thực thi nhị phân giữa các hệ UNIX. Tệp thực thi ELF của Linux, Mach-O của macOS cùng ABI của từng hệ thống khác nhau.

Ngay cả khi cùng sử dụng bộ xử lý x86-64, nếu quy ước lời gọi hệ thống, thư viện C, dynamic linker và môi trường hệ thống tệp khác nhau thì không thể sử dụng cùng một tệp thực thi. Cần xây dựng riêng theo hệ điều hành đích và kiến trúc bộ xử lý.

Ngay trong Linux, glibc và musl, các phiên bản thư viện khác nhau cùng chính sách bản phân phối có thể ảnh hưởng đến phân phối binary. Tệp thực thi được xây dựng trên hệ thống quá mới có thể không khởi động trong môi trường sử dụng thư viện cũ.

Liên kết tĩnh có thể giảm một số phụ thuộc bên ngoài nhưng không hoàn toàn tách mọi thư viện và chức năng hệ thống. Phân giải tên, locale, chính sách bảo mật, lời gọi hệ thống kernel và plugin động vẫn có thể phụ thuộc vào môi trường thực thi.

Container và định dạng gói hỗ trợ đóng gói phụ thuộc không gian người dùng để phân phối nhưng không loại bỏ cấu trúc kernel và ABI bộ xử lý. Không thể chạy nguyên vẹn binary macOS hoặc FreeBSD trong container Linux.

Đường cong học tập của dòng lệnh

Dòng lệnh UNIX chính xác và dễ tự động hóa, nhưng có thể đòi hỏi chi phí học tập cao đối với người mới. Người dùng phải học tên lệnh ngắn, tùy chọn cô đọng cùng quy tắc trích dẫn và mở rộng của shell.

Những chức năng có thể được khám phá qua menu và nút bấm trong GUI có thể không hiện ra trong dòng lệnh nếu không có tài liệu hoặc kiến thức từ trước. Vì kết quả lệnh có thể ngay lập tức thay đổi tệp và cấu hình hệ thống, ảnh hưởng của sai sót cũng lớn.

Các lệnh được phát triển trong lịch sử không phải lúc nào cũng tuân theo quy tắc tùy chọn nhất quán. Cùng một ý nghĩa có thể sử dụng ký tự tùy chọn khác nhau theo chương trình, còn một số lệnh truyền thống không hỗ trợ tùy chọn dài kiểu GNU.

Shell gán ý nghĩa đặc biệt cho khoảng trắng, dấu ngoặc kép, ký hiệu đô la, dấu hoa thị và dấu chấm phẩy. Nếu không xử lý an toàn dữ liệu đầu vào của người dùng hoặc tên tệp, có thể xảy ra chèn lệnh, tách từ sai và mất dữ liệu.

Ngược lại, những vấn đề này không chỉ là khuyết điểm của dòng lệnh mà còn là chi phí của khả năng lập trình mạnh và tính tương thích lịch sử. Họ UNIX hiện đại có thể giảm rào cản gia nhập bằng công cụ quản trị đồ họa, tự động hoàn thành, tìm kiếm lệnh và tài liệu.

Ứng dụng desktop và hỗ trợ phần cứng

Thế mạnh trong máy chủ và môi trường phát triển không tự động trở thành thế mạnh trong thị trường desktop tiêu dùng. Một số ứng dụng thương mại, trò chơi và công cụ quản lý thiết bị ngoại vi chỉ có thể hỗ trợ chính thức Windows hoặc macOS.

Desktop Linux được chia thành nhiều bản phân phối, ngăn xếp đồ họa và định dạng gói nên nhà cung cấp phần mềm khó kiểm thử mọi môi trường. Sự khác biệt giữa Wayland và X11, nhiều môi trường desktop cùng hệ thống âm thanh cũng ảnh hưởng đến tích hợp ứng dụng.

Dòng BSD có thể được cấu hình thành desktop đa dụng, nhưng hỗ trợ GPU tiêu dùng mới nhất, thiết bị không dây và quản lý điện năng có thể hạn chế hơn Linux hoặc macOS. Nếu nhà cung cấp phần cứng không công bố tài liệu hoặc driver, dự án mã nguồn mở khó triển khai hỗ trợ.

macOS cung cấp trải nghiệm người dùng và tích hợp driver nhất quán vì Apple cùng cung cấp phần cứng lẫn hệ điều hành. Đổi lại, phần cứng được hỗ trợ bị giới hạn trong sản phẩm Apple, còn API hệ thống và chính sách phân phối phụ thuộc mạnh vào quyết định của Apple.

Chỉ các công cụ dòng lệnh UNIX truyền thống và API POSIX không đủ để tạo ứng dụng desktop hiện đại. Đồ họa, khả năng tiếp cận, âm thanh, quản lý điện năng và phân phối ứng dụng yêu cầu framework riêng theo nền tảng.

Giao diện legacy

UNIX đã duy trì khả năng tương thích của chương trình và script hiện có trong nhiều thập kỷ. Sự liên tục dài hạn này là một ưu điểm nhưng cũng tạo ra gánh nặng phải tiếp tục duy trì giao diện cũ và các giới hạn lịch sử.

Chuỗi C kết thúc bằng ký tự null, mã lỗi, trạng thái tiến trình toàn cục, xử lý tín hiệu và API tập trung vào bộ mô tả tệp hiệu quả và đa dụng, nhưng không tự động cung cấp an toàn bộ nhớ và an toàn kiểu dữ liệu.

fork là thành phần cốt lõi của mô hình tiến trình UNIX truyền thống, nhưng có thể phức tạp trong chương trình hiện đại có không gian địa chỉ lớn và nhiều luồng. Những thao tác có thể thực hiện an toàn trong tiến trình con sau fork và trước exec bị giới hạn, còn posix_spawn có thể phù hợp hơn trong một số môi trường.

Tín hiệu hữu ích để truyền sự kiện bất đồng bộ nhưng có nhiều giới hạn về những hàm có thể gọi và quản lý trạng thái. Chương trình hiện đại có thể chuyển tín hiệu sang event loop hoặc giao diện thông báo chuyên dụng thay vì sử dụng trực tiếp cho logic phức tạp.

Lệnh và định dạng tệp lịch sử quen thuộc khi con người trực tiếp sử dụng nhưng có thể không rõ ràng cho giao tiếp có cấu trúc giữa các chương trình. Xuất hiện vấn đề phải bổ sung giao diện mới rõ ràng hơn trong khi vẫn duy trì khả năng tương thích với script cũ.

An toàn bộ nhớ

Giao diện hệ thống UNIX chủ yếu phát triển dựa trên C. C cho phép điều khiển chính xác hệ điều hành và phần cứng nhưng không hoàn toàn ngăn chặn lỗi con trỏ, vượt giới hạn bộ đệm, truy cập bộ nhớ đã giải phóng và tràn số nguyên ở cấp ngôn ngữ.

Lỗi an toàn bộ nhớ trong kernel, thư viện C và chương trình hệ thống có quyền cao có thể dẫn đến vấn đề bảo mật trên toàn hệ thống. Họ UNIX cung cấp bảo vệ bộ nhớ và cô lập tiến trình nhưng không tự động sửa lỗi truy cập bộ nhớ sai của C bên trong một tiến trình.

Ngẫu nhiên hóa bố trí không gian địa chỉ, bộ nhớ không thể thực thi, bảo vệ stack, bảo vệ luồng điều khiển và sandbox có thể làm tăng độ khó tấn công và giảm phạm vi thiệt hại. Cảnh báo trình biên dịch, AddressSanitizer và phân tích tĩnh cũng được sử dụng để phát hiện lỗi.

Các nỗ lực đưa Rust và ngôn ngữ an toàn bộ nhớ vào kernel cùng thành phần hệ thống cũng nhằm bổ sung cho hạn chế này. Tuy nhiên, vì hệ sinh thái mã C, ABI, driver và thư viện hiện có rất lớn, quá trình chuyển đổi diễn ra dần dần.

Vấn đề an toàn bộ nhớ không chỉ tồn tại trong UNIX mà còn áp dụng cho các hệ điều hành khác sử dụng C và C++. Tuy nhiên, đây là một hạn chế quan trọng vì giao diện cốt lõi và cách triển khai lịch sử của UNIX tập trung vào C.

Sự phức tạp của cấu hình bảo mật

Họ UNIX cung cấp chức năng quyền và cô lập mạnh, nhưng cấu hình an toàn không tự động được tạo ra. Người dùng và nhóm, mode tệp, ACL, capabilities, namespace và chính sách kiểm soát truy cập bắt buộc kết hợp với nhau.

Nếu không định nghĩa chính xác một dịch vụ cần truy cập tệp, socket và lời gọi hệ thống nào, rất dễ cấp quyền nhiều hơn cần thiết. Ngược lại, nếu giới hạn quá mức, chức năng bình thường có thể thất bại và người vận hành có thể tắt hoàn toàn cơ chế bảo mật.

Trong sandbox của macOS, ngay cả khi gọi một chức năng không được cho phép thông qua API đúng, thao tác vẫn thất bại nếu không có entitlement. Điều này có ưu điểm hạn chế thiệt hại khi bị xâm nhập, nhưng có thể buộc phải thiết kế lại quyền truy cập tệp và cấu hình tiến trình trợ giúp khi chuyển ứng dụng cũ sang cấu trúc sandbox.[103]

Cũng không thể khẳng định container luôn cung cấp ranh giới mặc định an toàn. Container đặc quyền, mount thư mục host, capabilities quá mức và socket quản trị được công khai có thể gần như vô hiệu hóa sự cô lập.

Vì chức năng bảo mật và phương thức quản lý khác nhau theo hệ điều hành, chương trình hỗ trợ nhiều hệ UNIX khó tái sử dụng nguyên vẹn cùng một chính sách sandbox. Cần cùng quản lý thiết kế đặc quyền tối thiểu chung và chính sách tăng cường riêng cho từng nền tảng.

Hạn chế trong xử lý thời gian thực

UNIX thông thường và Linux là hệ điều hành đa dụng được thiết kế tập trung vào thông lượng, phân phối tài nguyên công bằng và khả năng phản hồi tương tác. Chúng phù hợp với phần lớn công việc máy chủ và desktop nhưng không bảo đảm độ trễ tồi nhất nghiêm ngặt trong mọi tình huống.

Page fault, interrupt, khóa kernel, driver thiết bị và công việc nền có thể trì hoãn thời điểm thực thi của tiến trình. Ngay cả khi thời gian phản hồi trung bình ngắn, hệ thống vẫn có thể không đủ cho hệ thời gian thực cứng, nơi công việc bắt buộc phải hoàn thành trong một thời hạn nhất định.

POSIX định nghĩa lập lịch thời gian thực, khóa bộ nhớ, timer và giao diện đồng bộ, nhưng phạm vi bảo đảm độ trễ thực tế phụ thuộc vào cách triển khai hệ điều hành và phần cứng. PREEMPT_RT cùng cấu hình thời gian thực của Linux có thể giảm độ trễ, nhưng toàn bộ hệ thống và driver phải phù hợp với yêu cầu thời gian thực.

Trong môi trường nơi việc trễ thời hạn có thể gây hậu quả nghiêm trọng, như điều khiển ô tô, an toàn công nghiệp và thiết bị y tế, có thể lựa chọn hệ điều hành thời gian thực như QNX hoặc hệ thống chuyên dụng đã được kiểm chứng. Cũng có thể sử dụng cấu trúc Linux hoặc BSD phụ trách điều khiển cấp cao, mạng và giao diện người dùng, còn điều khiển thời gian thực cấp thấp do bộ xử lý riêng đảm nhiệm.

Điều này không có nghĩa họ UNIX không thể được sử dụng trong lĩnh vực thời gian thực. Nó có nghĩa cần đánh giá cụ thể giới hạn độ trễ được yêu cầu, chứng nhận cùng kernel và phần cứng có thể sử dụng.

Sử dụng tài nguyên và độ phức tạp của hệ thống

UNIX thời kỳ đầu là một hệ điều hành nhỏ chạy trên phần cứng hạn chế, nhưng các hệ UNIX hiện đại đã phát triển thành hệ thống rất lớn. Khi bao gồm kernel, môi trường đồ họa, mạng, container và chức năng bảo mật, quy mô mã cùng cấu hình tăng lên.

Bản phân phối Linux đa dụng hoặc macOS hỗ trợ nhiều loại phần cứng và ứng dụng nên có thể quá lớn để sử dụng nguyên vẹn trên thiết bị nhúng nhỏ. Cần tạo riêng image Linux nhúng hoặc BSD chỉ lựa chọn những thành phần cần thiết.

Khi thư viện động, dịch vụ và phụ thuộc gói trở nên phức tạp, có thể cần nhiều thành phần để chạy một chương trình duy nhất. Khi xảy ra vấn đề, có thể phải kiểm tra đồng thời kernel, thư viện C, runtime, trình quản lý dịch vụ và trạng thái gói.

Container đóng gói phụ thuộc ứng dụng nhưng cùng một thư viện và không gian người dùng có thể bị lặp lại trong nhiều image. Số lượng image đang vận hành và bản vá bảo mật tăng lên cũng có thể làm tăng gánh nặng quản lý.

Triết lý UNIX nhấn mạnh công cụ nhỏ và tính mô-đun không có nghĩa toàn bộ UNIX hiện đại có quy mô mã nhỏ. Khi từng thành phần trở nên phức tạp và số tầng tăng lên, việc hiểu hoàn toàn toàn bộ hệ thống đòi hỏi chuyên môn đáng kể.

Chi phí và sự phụ thuộc của UNIX thương mại

UNIX thương mại như AIX, HP-UX và Solaris truyền thống kết hợp phần cứng cụ thể với hỗ trợ doanh nghiệp và bảo trì dài hạn. Trong nghiệp vụ cốt lõi, sự tích hợp cùng hợp đồng hỗ trợ này có thể là ưu điểm.

Ngược lại, nếu phần cứng, hệ điều hành và công cụ quản trị bị gắn với một nhà cung cấp, chi phí triển khai và duy trì có thể tăng cao. Cần nhân lực chuyên môn, linh kiện được chứng nhận và hợp đồng hỗ trợ, còn khi chuyển sang nền tảng khác phải thay đổi đồng thời ứng dụng, dữ liệu và quy trình vận hành.

Nếu phần mềm viết cho UNIX thương mại phụ thuộc trình biên dịch, thư viện và chức năng phần cứng cụ thể, việc chuyển sang Linux hoặc hệ UNIX khác có thể khó khăn. Ngay cả khi có khả năng tương thích mã nguồn POSIX, khác biệt trong cơ sở dữ liệu, cụm, script quản trị và sản phẩm bên ngoài vẫn còn.

Khi thị trường UNIX thương mại truyền thống thu hẹp, hỗ trợ phần cứng và ứng dụng mới cùng khả năng tìm nhân lực có kinh nghiệm có thể trở nên khó khăn. Ngược lại, thay thế một hệ thống cốt lõi đã vận hành ổn định chỉ dựa trên quy mô thị trường cũng tạo ra rủi ro và chi phí lớn.

Vì vậy, việc sử dụng lâu dài hoặc chuyển đổi UNIX thương mại phải được quyết định dựa trên thời gian hỗ trợ của nhà cung cấp, vòng đời chương trình nghiệp vụ và tổng chi phí chuyển đổi, không chỉ dựa trên chức năng của hệ điều hành.

Sự phân tán của tài liệu và kiến thức

Họ UNIX có lượng lớn trang hướng dẫn, handbook chính thức, mã nguồn và tài liệu kỹ thuật lâu đời đã được tích lũy. Khả năng kiểm tra tài liệu của hàm và lệnh được cài đặt ngay trên hệ thống đang chạy là một ưu điểm lớn.

Tuy nhiên, khi tài liệu của nhiều nhánh và phiên bản khác nhau cùng xuất hiện trong kết quả tìm kiếm, người dùng có thể áp dụng hướng dẫn của sai hệ thống. Tùy chọn lệnh hoặc phần mở rộng lời gọi hệ thống của Linux có thể không sử dụng nguyên vẹn trên macOS và FreeBSD.

Vì tài liệu cũ vẫn có thể áp dụng một phần cho hệ thống hiện tại, khó đánh giá tính hợp lệ chỉ dựa trên thời điểm được viết. Ngược lại, blog mới nhất cũng có thể cung cấp giải thích không phù hợp với tiêu chuẩn hoặc triển khai thực tế.

Trong lập trình hệ thống, nên ưu tiên manual được cài trên hệ điều hành đích, tài liệu chính thức của đúng phiên bản và đặc tả POSIX hơn kết quả tìm kiếm web thông thường. Cần hình thành thói quen kiểm tra không chỉ tên lệnh mà cả mục manual, mức tuân thủ tiêu chuẩn và thông tin phiên bản.

Tự do lựa chọn và chi phí ra quyết định

Họ UNIX cho phép lựa chọn đa dạng kernel, shell, hệ thống tệp, môi trường desktop, trình quản lý gói và công cụ phát triển. Khả năng cấu hình hệ thống theo mục đích và loại bỏ chức năng không cần thiết là một ưu điểm mạnh.

Bản phân phối Linux, BSD, UNIX thương mại và macOS cung cấp chính sách cùng mức độ tích hợp khác nhau. Người dùng có thể lựa chọn nhánh phù hợp với máy chủ, desktop, lưu trữ, hệ thống nhúng và nghiệp vụ doanh nghiệp.

Tuy nhiên, số lượng lựa chọn lớn tạo ra chi phí so sánh và bảo trì. Cần quyết định bản phân phối, hệ thống tệp, trình quản lý dịch vụ và định dạng gói, đồng thời cân nhắc thời gian hỗ trợ và quy mô cộng đồng của công nghệ đã chọn.

Nếu các nhóm trong một tổ chức lựa chọn công cụ và bản phân phối khác nhau, kiến thức vận hành và tự động hóa có thể bị phân tán. Nếu chỉ mở rộng tự do mà không có tiêu chuẩn nhất quán, phản ứng sự cố và cập nhật bảo mật có thể trở nên khó khăn.

Vì vậy, để tận dụng khả năng cấu hình của UNIX, điều quan trọng là xác định rõ nền tảng và tiêu chuẩn được hỗ trợ, công cụ mặc định cùng phạm vi cho phép ngoại lệ. Tự do lựa chọn hoạt động hiệu quả nhất khi đi kèm nền tảng chung và chính sách vận hành.

Đánh giá theo từng lĩnh vực

Ưu điểm và hạn chế của họ UNIX biểu hiện khác nhau tùy lĩnh vực sử dụng.

Trong máy chủ và đám mây, vận hành từ xa, cô lập tiến trình, chức năng mạng, tự động hóa và hệ sinh thái phần mềm công khai là những ưu điểm lớn. Ngược lại, khi số lượng bản phân phối, image container và chính sách bảo mật tăng lên, độ phức tạp vận hành cũng tăng.

Trong phát triển phần mềm, trình biên dịch và công cụ dòng lệnh, API POSIX cùng môi trường script là thế mạnh. Tuy nhiên, phần mềm thương mại dành cho desktop và hỗ trợ một số phần cứng tiêu dùng có thể bị giới hạn tùy nền tảng.

Trong lĩnh vực nhúng, có thể tận dụng khả năng sửa mã nguồn, hỗ trợ nhiều bộ xử lý và hệ sinh thái mạng. Với thiết bị có bộ nhớ rất nhỏ hoặc cần bảo đảm thời gian thực nghiêm ngặt, họ UNIX đa dụng có thể quá lớn hoặc quá phức tạp.

Trong nghiệp vụ cốt lõi của doanh nghiệp, hỗ trợ dài hạn và tích hợp phần cứng của UNIX thương mại là ưu điểm. Chi phí cao, phụ thuộc nhà cung cấp và hệ sinh thái thu hẹp có thể đòi hỏi kế hoạch chuyển đổi dài hạn.

Trên máy tính cá nhân, macOS và Linux cung cấp môi trường phát triển UNIX cùng desktop đồ họa. Hỗ trợ ứng dụng, trò chơi, driver thiết bị và trải nghiệm người dùng thay đổi đáng kể theo hệ thống được lựa chọn.

Tổng hợp

Ưu điểm lớn nhất của UNIX không nằm ở một chức năng cụ thể mà ở việc cung cấp mô hình cơ bản ổn định có thể được chia sẻ giữa nhiều chương trình và hệ điều hành. Tệp và tiến trình, nhập/xuất chuẩn, shell, mạng và giao diện hệ thống được kết nối với nhau, cho phép người dùng mở rộng cùng một tập khái niệm từ công cụ nhỏ đến máy chủ quy mô lớn.

Cấu trúc này tạo điều kiện cho tính khả chuyển của mã nguồn, tự động hóa, vận hành từ xa, tái sử dụng công cụ và tích lũy phần mềm trong thời gian dài. Đây cũng là lý do Linux, BSD, macOS và UNIX thương mại có thể chia sẻ lượng lớn kiến thức lập trình và phần mềm dù có cấu trúc nội bộ khác nhau.

Ngược lại, lịch sử lâu dài và nhiều cách triển khai tạo ra sự phân mảnh, giao diện legacy và gánh nặng tương thích. Đồ họa, quản lý dịch vụ, bảo mật, nhập/xuất hiệu năng cao và môi trường gói nằm ngoài nền tảng chung POSIX có nhiều khác biệt, còn chỉ riêng việc cùng thuộc họ UNIX không có nghĩa chương trình và phương thức vận hành hoàn toàn tương thích.

Tính đơn giản của UNIX cũng không có nghĩa toàn bộ hệ thống luôn đơn giản. Những trừu tượng hóa cơ bản nhỏ và tổng quát, nhưng kernel hiện đại, bản phân phối, môi trường bảo mật và đám mây được xây dựng trên chúng rất phức tạp. Sự linh hoạt ở mức thấp mang lại nhiều quyền kiểm soát hơn cho nhà phát triển và người vận hành, đồng thời cũng yêu cầu họ chịu trách nhiệm nhiều hơn đối với xử lý lỗi và cấu hình an toàn.

Vì vậy, có thể đánh giá họ UNIX như một nền tảng cung cấp mô hình hệ thống chung và phương thức tổ chức công cụ hơn là một đáp án hoàn chỉnh duy nhất. Nó vẫn là lựa chọn mạnh trong máy chủ, môi trường phát triển, mạng và tự động hóa; còn trong điều khiển thời gian thực, ứng dụng tiêu dùng cụ thể, thiết bị cực kỳ hạn chế và hệ sinh thái độc quyền tích hợp, cần so sánh với hệ điều hành khác hoặc chức năng riêng của từng nền tảng.

Tài liệu liên quan

  1. The UNIX Time-Sharing System
  2. UNIX®—A Standard of The Open Group
  3. The UNIX Standard
  4. POSIX.1-2024
  5. Evolution of the Unix Time-sharing System
  6. Evolution of the Unix Time-sharing System
  7. Evolution of the Unix Time-sharing System
  8. Evolution of the Unix Time-sharing System
  9. The Earliest Unix Code: An Anniversary Source Code Release
  10. The Development of the C Language
  11. Evolution of the Unix Time-sharing System
  12. Evolution of the Unix Time-sharing System
  13. Evolution of the Unix Time-sharing System
  14. Evolution of the Unix Time-sharing System
  15. The Development of the C Language
  16. Evolution of the Unix Time-sharing System
  17. The Development of the C Language
  18. The UNIX Time-Sharing System
  19. Old Unix Licenses and Price Lists
  20. History of UNIX
  21. Berkeley Computer Science: A 30 Year Celebration
  22. History of UNIX
  23. History of UNIX
  24. History of UNIX
  25. UNIX
  26. Tài liệu liên quan đến UNIX System Laboratories v. Berkeley Software Design
  27. History of UNIX
  28. History of UNIX
  29. The UNIX Standard
  30. UNIX Certification Program
  31. The UNIX Time-Sharing System
  32. POSIX.1-2024 System Interfaces
  33. fork
  34. posix_spawn
  35. FreeBSD Architecture Handbook: Virtual Memory System
  36. open(2)
  37. dup
  38. fork
  39. socket
  40. Standard Input, Standard Output, and Standard Error
  41. POSIX.1-2024 Shell Command Language
  42. POSIX Shell Command Language: Redirection
  43. exec Utility
  44. pipe
  45. signal
  46. UNIX Time-Sharing System: Foreword
  47. awk
  48. POSIX.1-2024 Shell Command Language — Pipelines
  49. POSIX.1-2024 pipe
  50. POSIX.1-2024 Shell and Utilities
  51. The UNIX Time-Sharing System
  52. POSIX.1-2024 Shell Command Language
  53. POSIX.1-2024
  54. The Open Group Base Specifications Issue 8
  55. ISO/IEC/IEEE 9945:2009
  56. Thông tin tải xuống The Open Group Base Specifications Issue 8
  57. POSIX.1-2024 Base Definitions
  58. POSIX.1-2024 Shell and Utilities
  59. UNIX Certification Program
  60. Định nghĩa XSI trong POSIX.1-2024
  61. The Register of UNIX Certified Products
  62. UNIX Standards
  63. ISO/IEC and The Open Group announce international standard for UNIX and POSIX
  64. ISO/IEC/IEEE 9945:2009
  65. POSIX.1-2024 Utility Conventions
  66. The UNIX System Test Suites
  67. UNIX®
  68. Explaining BSD
  69. IBM AIX
  70. Kernel Architecture Overview
  71. Linux kernel release documentation
  72. The Register of UNIX Certified Products
  73. Building Products with FreeBSD
  74. The FreeBSD Project
  75. IBM AIX
  76. IBM Power Virtual Server
  77. IBM AIX
  78. Building Products with FreeBSD
  79. The FreeBSD Project
  80. Reading UNIX Manual Pages
  81. Porting UNIX/Linux Applications to OS X
  82. TOP500 Operating System Family: Linux
  83. IBM Power AIX
  84. Overview of OS X
  85. Building Products with FreeBSD
  86. IBM AIX
  87. The Design and Implementation of the 4.4BSD Operating System
  88. POSIX.1-2024 Shell Command Language
  89. FreeBSD Past Events
  90. FreeBSD tcp(4)
  91. The UNIX Standard
  92. Unix Programmer’s Manual, First Edition
  93. CHM’s Top 10 Blogs of the Decade
  94. POSIX.1-2024 Introduction
  95. POSIX.1-2024 Portability Considerations
  96. Apple App Sandbox
  97. FreeBSD Handbook: Jails and Containers
  98. FreeBSD Handbook: ZFS
  99. Linux Landlock: Unprivileged Access Control
  100. The Linux Kernel Driver Interface
  101. FreeBSD Handbook: Installing Applications
  102. POSIX.1-2024 Conformance
  103. Discovering and Diagnosing App Sandbox Violations