Vietnamese Developers' Blog

Các user ID của một tiến trình trong Unix

Posted in Unix/Linux/BSD by kiennguyen on the June 8th, 2009

Ba loại user ID của một tiến trình

Một tiến trình (process) trong Unix sở hữu 3 user ID sau đây:

Real user ID (user ID thật): Là user ID của người khởi động tiến trình.
Effective user ID (user ID hiệu dụng): Là một loại user ID được dùng trong những trường hợp sau đây:

  • Khi tiến trình truy nhập một file, hệ điều hành kiểm tra xem effective user của tiến trình có quyền truy nhập file hay không.
  • Khi tiến trình tạo mới một file, hệ điều hành lấy effective user của tiến trình làm chủ sở hữu (owner) của file.
  • Khi tiến trình muốn gửi tín hiệu đến một tiến trình khác, hệ điều hành kiểm tra xem effective user của tiến trình gửi có quyền gửi tín hiệu hay không.

Saved user ID: Là giá trị của effective user ID được lưu trong bảng các tiến trình (process table). Mỗi tiến trình có một vùng dữ liệu tương ứng trong bảng các tiến trình. Saved user ID đóng vai trò như một bản backup cho effective user ID, được dùng khi tiến trình muốn quay lại effective user ID ban đầu.

Tương ứng với 3 loại user ID này là ba loại group ID: real group ID, effective group ID và saved group ID.

Vì sao cần effective user ID?
Effective user là một cơ chế quản lí truy nhập của Unix (access control hay authorization). Xem ví dụ sau đây: Alice là một kế toán và cô ta cần có quyền thay đổi file dữ liệu kế toán account_data của công ty. Tuy nhiên, để đảm bảo tính toàn vẹn dữ liệu, Alice không được phép thay đổi dữ liệu kế toán một cách thủ công mà phải thông qua một chương trình tên là account_program. Như vậy:

  • Alice không có quyền ghi đối với account_data.
  • account_program có quyền ghi đối với account_data.
  • Alice có quyền chạy account_program.

Tuy nhiên, trong Unix chỉ có người dùng mới được coi là các chủ thể được cấp quyền sử dụng tài nguyên. Bởi vậy, giải pháp trong Unix là tạo ra một người dùng có quyền ghi đối với account_data, thiết lập effective user ID của account_program bằng ID của người dùng đó và trao cho Alice quyền chạy account_program. (more…)

Processes and Multi-process Programming (1)

Posted in Unix/Linux/BSD by Hoang Tran on the October 16th, 2007

Thực sự khi đọc đi đọc lại bài viết về fork() tôi cảm thấy nó rất là tệ vì quá sơ sài, không làm nổi bật được vai trò của process trong operating system, sự phức tạp của nó cũng như ưu điểm của multi-process programming. Nó đơn giản chỉ là viết về một system call fork() mà thôi, và điểm cơ bản là không thấy được multi-process programming có thể giúp cho hệ thống trở nên mạnh mẽ như thế nào.

Khái niệm trọng tâm trong tất cả các hệ điều hành (operating system) là process (tiến trình). Một process về cơ bản chỉ là một chương trình có thể thực thi. Đi cùng với process là một không gian địa chỉ (address space) – vùng nhớ (từ tối thiểu, thông thường là 0, đến cực đại) mà process có thể đọc và ghi. Không gian địa chỉ này bao gồm đoạn mã thực thi, dữ liệu và stack của nó. Cũng đi cùng với mỗi process là một tập các thanh ghi, bao gồm program counter, stack pointer, các thanh ghi khác và tất cả các thông tin cần thiết để chạy chương trình.

Tất cả các hệ điều hành tiên tiến chạy trên các máy tính cá nhân bây giờ đều là multi-process, có nghĩa là cho phép chạy nhiều process “cùng lúc”. Hệ điều hành sẽ là trung tâm quản lý các process, nó sẽ quyết định khi nào thì dừng một process và start hay tiếp tục một process khác. Khi một process được tạm dừng kiểu này, thì nó sau đó phải được restart tại chính trạng thái mà nó bị dừng. Điều đó có nghĩa là tất cả các thông tin của process phải được lưu ở đâu đó bên ngoài trong lúc tạm dừng. Ví dụ một process có thể đang mở một vài file để đọc. Với mỗi file này thì có một con trỏ chỉ đến vị trí đang đọc trong file. Khi một process bị tạm thời dừng lại, thì tất cả các con trỏ này phải được ghi lại để sau đó các lệnh tiếp theo đối với file đang mở sẽ có được dữ liệu chính xác khi process được tiếp tục. Trong rất nhiều hệ điều hành, các thông tin về mỗi process được lưu vào trong một bảng được gọi là process table (là một mảng hay link-list mà mỗi phần tử là process đang tồn tại). Vì vậy mỗi process bao gồm không gian địa chỉ của nó, thường được gọi là core image, và một entry trong process table mà chứa đựng thanh ghi của nó và những thứ khác.

Những system calls quan trọng nhất trong process management là những lệnh liên quan đến quá trình tạo và huỷ process. Hãy xem xét một ví dụ điển hình: một process gọi command interpreter hay shell để đọc lệnh từ terminal. User gõ lệnh yêu cầu chương trình được dịch, và shell phải tạo ra một process mới mà chạy trình biên dịch. Khi process kết thúc quá trình biên dịch, nó thực hiện một system call để huỷ chính nó.

Nếu một process tạo ra một hay nhiều process khác (thường được gọi là child processes) và những process đó lại có thể tạo ra những process con, chúng ta sẽ có một cấu trúc cây process (process tree structure). Việc trao đổi thông tin giữa các process để đồng bộ các hành động giữa các process được gọi là interprocess communication (IPC) cũng là một vấn đề lớn trong multi-process programming.

Xây dựng ứng dụng multi-process là một công việc khó khăn. Process khi hoạt động phải luôn ở trạng thái tôn trọng và sẵn sàng nhường quyền xử lý CPU cho các process khác ở bất kỳ thời điểm nào, khi hệ thống yêu cầu. Nếu process xây dựng không tốt, thì khi nó đổ vỡ và gây ra lỗi thì có thể làm treo các process khác hay thậm chí phá vỡ hệ điều hành (treo).

Tagged with: