QUẢN LÝ TIẾN TRÌNH 25-

Một phần của tài liệu đồ án công nghệ thông tin USB driver trên hệ điều hành Linux Red Hat (Trang 25 - 34)

Chỉ có các thực thể hoạt động trong một hệ thống LINUX mới là các quá trình . LINUX xử lí rất giống với các quá trình xử lí tuần tự mà chúng ta được nghiên cứu ở phần trước . Mỗi quá trình chạy một chương trình đơn lẻ và có một dòng điều khiển riêng . Ngoài ra có một chương trình khác gọi là chương trình đếm (counter) là chương trình sẽ lưu dữ dấu vết hay địa chỉ của chỉ thị tiếp theo sẽ được thi hành .

LINUX là một hệ thống đa chương trình vì vậy sẽ có nhiều quá trình độc lập cùng chạy ở cùng một thời điểm . Mỗi người dùng có thể có một vài quá trình hoạt động ở cùng một thời điểm vì vậy với một hệ thống lớn có thể có hàng trăm thậm chí hàng nghìn quá trình cùng chạy . Trong thực tế đối với phần lớn những nhóm người dùng đơn lẻ thì ngay cả khi người dùng vắng mặt cũng có hàng tá các quá trình ở mặt sau được gọi các chương trình thông minh (daemons) đang chạy . Các chương trình dạng này được tự động bắt đầu khi hệ thống khởi động .

Một chương trình điển hình thuộc loại này là chương trình cron

daemon . Nó sẽ tự động được thi hành sau mỗi phút để kiểm tra xem có công việc nào dành cho nó hay không . Nếu có nó sẽ thực hiện công việc đó . Sau đó nó sẽ ẩn vào mặt sau ngừng hoạt động cho đến lần kiểm tra tiếp theo . Chương trình thông minh này là cần thiết bởi vì trong LINUX các hoạt động có thể xy ra sau vài phút , vài giờ , vàI ngày hay thậm chí vàI tháng . Ví dụ một người dùng có công việc cần đến gặp một nha sĩ vào thứ ba tuần sau thì anh ta có thể thiết lập các dữ liệu đầu vào cho chương trình thông minh này để nó nhắc nhở anh ta bằng cách bật chuông vào lúc 2 giờ 30 . Khi ngày và giờ đó tới chương trình thông minh cron sẽ xem xem nó có công việc gì hay không và nó sẽ thi hành chương trình bật chuông như là một nhiệm vụ mới .

Chương trình cũng được sử dụng để thực hiện các công việc mang tính tuần tự như việc sao lưu đĩa vào lúc 4 giờ sáng hay nhắc nhở người dùng . Một vàI chương trình thông minh khác có thể gửi và nhận thư điện tử , kiểm tra xem có đủ bộ nhớ rỗi hay không ... Các chương trình thông minh này làm cho các công việc trong LINUX trở nên dễ dàng vì mỗi chương trình là một quá trình riêng biệt độc lập với mọi quá trình khác .

ar Xây dựng và duy trì các file backup và các file thư viện awk So sánh mẫu ngôn ngữ

basename Loại bỏ các tiền tố và hậu tố khỏi một tên file cat Kết nối ccá file và ghi chúng ra thiết bị ra chuẩn cc Dịch một chương trình C

chmod Thay đổi chế độ bo vệ đối với một file

cmp So sánh hai file để xem chúng có đồng nhất hay không Comm Hiển thị các dòng chung của 2 file được chọn

Cut Thực hiện ghi mỗi cột của một văn bản ra một file riêng date Hiển thị ngày tháng và thời gian

Dd Copy tất c hay một phần của file để thực hiện những sự chuyển đổi khác nhau

Diff Hiển thị mọi sự khác nhau giữa hai file

Echo Hiển thị các tham số ( được sử dụng chủ yếu trong hệ thống scripts ) ed Soạn tho văn bản

find Tìm tất c các file tho mãn một điều kiện nào đó

Grep Tìm file có các dòng chứa đựng một khuôn mẫu nào đó Head Hiển thị một vài dòng đầu tiên của một hay nhiều file

kill Gửi một mệnh lệnh tới một quá trình Ln Tạo một kết nối với một file

ls Liệt kê các file và thư mục

Make Dịch lại một vài phần của một chương trình lớn được có sự thay đổi mkdir Tạo một thư mục

Mv Chuyển hay thay đổi tên của một file

Od Đưa ra nội dung của một file ở dạng bát phân

paste Kết hợp nhiều file lại như là các cột của một file duy nhất Pr Định dạng một file để in

pwd Hiển thị thư mục đang làm việc Rm Xóa một file

Rmdir Xóa một thư mục

sed Sửa chữa các dòng vào / ra sh Lenh chay mot shell script

sleep Ngừng hoạt động sau một số giây định trước

Stty Thiết lập các tuỳ chọn đầu cuối như các kí thự dành cho việc sửa chữa Sort Sắp xếp một file bao gồm các dòng ASCII

tail Hiển thị một vài dòng cuối cùng của một file

Tr Dịch các mã kí tự

Uniq Xoá các dòng kế tiếp trùng nhau trong một file Wc Đếm số kí tự , số từ và số dòng trong một file

Các quá trình được tạo ra trong LINUX là ở trong một trường hợp cụ thể nào đó . Lời gọi hệ thống FORK sẽ tạo một bản sao chính xác với quá trình nguyên thủy. Quá trình này được gọi là quá trình cha còn quá trình mới được gọi là quá trình con. Mỗi quá trình cha và con sẽ sở hữu và có các hình nh riêng về bộ nhớ . Nếu sau đó quá trình cha thay đổi bất kì một biến nào đó của nó thì sự thay đổi này là không hiện hữu đối với quá trình con và ngược lại .

Mở các file là được chia sẻ giữa quá trình cha và con . Nghĩa là nếu một file được mở trong quá trình cha trước FORK thì file này vẫn tiếp tục được mở trong c quá trình cha và con . Mọi thay đổi với file bởi một quá trình nào đó sẽ có nh hưởng đến các quá trình khác . Cách xử lí này chỉ có lí do những thay đổi này cũng hiện hữu đối với mọi quá trình sau đó mà file này cũng được mở .

Trong thực tế hình nh bộ nhớ , các biến , các thanh ghi và mọi thứ khác là đồng nhất trong quá trình cha và con , điều này dẫn đến một khó khăn nhỏ là làm thế nào để các quá trình biết được là cái nào có thể chạy trong các lệnh của cha và cái nào có thể chạy trong các lệnh của con . Điều này được giải quyết là hệ thống sẽ tr lại 0 cho quá trình con và một trị khác 0 được biết đến là pid (prcess identifier - Số nhận diện quá trình ) cho cha . C hai quá trình đơn gin là kiểm tra trị trả lại và hành động tưng ứng . Ví dụ :

if ( pid < 0 ) {

/* fork failed , usually because memory or some table is full */ }

else if ( pid > 0 ) {

/* Parent code goes here */ }

else {

/* Child code goes here */ }

Các quá trình được đặt tên theo pid của chúng . Như chúng ta thấy khi một quá trình được tạo thì cha của nó sẽ nhận được pid của con . Nếu quá trình con muốn biết pid của mình thì có một hàm hệ thống là GETPID sẽ cung cấp cho nó . Các pid sẽ được sử dụng trong một thời điểm nào đó . Ví dụ khi quá trình con kết thúc quá trình cha sẽ nhận được pid của quá trình con vừa mới kết thúc . Đây có thể là một điều quan trọng vì một quá trình cha có thể có nhiều quá trình con . Hơn nữa một quá trình con cũng có thể có các quá trình con dưới nữa , như vậy từ một quá trình ban đầu có thể xây dựng nên một cây ph hệ các quá trình .

Kh năng tạo khuôn dạng cho một cây các quá trình là chìa khoá để tìm ra cách chia sẻ thời gian làm việc trong LINUX . Khi hệ thống khởi động , một quá trình sẽ gọi init để khởi tạo thủ công bằng bộ phận nòng cốt . Quá trình này sau đó sẽ đọc file /ect/ttys có bao nhiêu đầu cuối trong hệ thống và cung cấp các thông tin cần thiết miêu t mỗi đầu cuối đó . Sau đó Init sẽ phân ra mỗi quá trình con cho mỗi đầu cuối và đi vào trạng thái ngủ cho đến khi một đầu cuối nào đó kết thúc .

login :

trên màn hình của thiết bị đầu cuối và cố gắng đọc tên người dùng từ bàn phím . Khi một ai đó cung cấp tên thì chương trình login sẽ hỏi password , lưu trữ nó và kiểm tra với password được được lưu trữ trong file password là /etc/passwd . Nếu mật khẩu được cung cấp là đúng thì login sẽ tự che phủ bản thân nó bởi hệ thống của người dùng , hệ thống này sẽ đợi nhận yêu cầu đầu tiên . Nếu mật khẩu là không đúng , login sẽ hỏi một tên người dùng mới .

C chế này được giải thích dưới hình sau với một hệ thống gồm 3 đầu cuối . Quá trình login đang chạy ở đầu cuối số 0 vẫn đang đợi đầu vào . Còn quá trình ở đầu cuối số 1 được thành công và hệ thống của người dùng đang đợi lệnh . Quá trình login cũng được thành công ở đầu cuối số 2 và ở đây chương trình cp được được người dùng thi hành , chương trình này như là một con của hệ thống và hệ thống sẽ bị chặn lại cho đến khi quá trình con này kết thúc . Nếu người dùng ở đầu cuối số 2 nhập cc thay cho cp thì chương trình chính của bộ dịch C sẽ được thi hành .

init 0 ~~~~ 1 ~~~~ 2 ~~~~ / etc/ttys At start up ,

Init reads this file login Shell login login Shell

Các quá trình trong LINUX có thể liên lạc với nhau bằng việc sử dụng một khuôn dạng các thông báo (message ) gửi đi . Nó có thể tạo ra một loại kênh giữa hai quá trình theo đó một quá trình có thể ghi một dãy các byte cho một quá trình khác sẽ đọc nó . Các kênh này được gọi là các ống dẫn . Sự đồng bộ phải là hợp lí vì nếu một quá trình đọc một ống dẫn rỗng thì nó sẽ bị ngừng lạI cho đến khi có dữ liệu kh dụng .

Các đường ống hệ thống này sẽ được thi hành băng các ống dẫn . Khi hệ thống gặp một lệnh có dạng :

Sort < f | head

nó sẽ tạo ra hai quá trình , sort và head và thiết lập một ống dẫn giữa chúng theo cách thiết bị ra chuẩn của sort được nối voứi thiết bị vào chuẩn của head . Theo cách này các dữ liệu sẽ được quá trình sort ghi trực tiếp ra đầu vào của quá trình head thay thế cho việc phải ghi ra file . Nếu ống dẫn bị đầy thì hệ thống sẽ ngừng việc chạy sort cho đến khi head đọc hết dữ liệu khỏi ống dẫn .

Các quá trình cũng có thể liên lạc với nhau theo một cách khác : thông qua các ngắt mềm . Một quá trình có thể gửi đi một cái được gọi là cờ báo ( signal ) đến một quá trình khác . Các quá trình có thể bo hệ thống những gì nó muốn thực hiện khi một cờ báo đến . Các cách lựa chọn là lờ cờ báo đó đi , gọi nó hay ngăn cản dấu hiệu kết thúc quá trình ( ngầm định ) . Nếu một quá trình lựa chọn là nắm giữ dáu hiệu hay cờ báo gửi đến nó thì nó phải xác định được thủ tục nắm giữ dấu hiệu ( các thủ tục ngắt ) . Do đó khi cờ báo đến điều khiển có thể được chuyển đến cho chương trình ngắt . Khi chương trình ngắt kết thúc thì điều khiển sẽ được tr lại ở ni được chuyển điều khiển tưng tự như các ngắt cứng vào / ra . Một quá trình chỉ có thể gửi cờ báo đến các thành viên ở trong nhóm của nó là nhóm bao gồm các qúa trình ông bà tổ tiên , anh em và các con cháu .

Các dấu hiệu cũng có thể được sử dụng cho các mục đích khác . Ví dụ một quá trình làm việc với các số dấu phẩy động và tình cờ chia cho 0 thì nó sẽ nhận được một cờ báo SIGFPE . Các dấu hiệu được yêu cầu bởi POSIX được liệt kê ở bảng dưới. Nhiều hệ thống LINUX có thêm các cờ báo phụ trợ khác nhưng các chương trình sử dụng chúng có thể không tưng thích với các versions khác của LINUX .

Mỗi người dùng được nhận diện bởi một số nguyên gọi là uid ( user identification - mã nhận diện người dùng) chứa ở trong file password . Chúng được xác định bởi người quản trị hệ thống . Mọi quá trình sẽ tự động thu nhận số uid của người được tạo ra quá trình đó .

Người dùng với uid là 0 là một người dùng đặc biệt và được gọi là superuser (hay root) . Superuser có quyền đọc và ghi vào tất c các file trong hệ thống , không có ai và điều gì có thể cẩn trở điều này .Các quá trình với uid là 0 cũng có kh năng tạo ra một số lượng nhỏ các chức năng bo vệ để ngăn cản đối với những người dùng thông thường . Bình thường chỉ có những người quản trị hệ thống mới biết được mật khẩu của superuser mặc dù nhiều sinh viên coi việc tìm ra các điểm yếu trong hệ thống bo mật của hệ thống như là một sở thích lớn vì vậy họ có thể thâm nhập như là một superuser mà không cần phải biết mật khẩu .

Quyền lực của superuser bị lợi dụng theo một cách thông minh nào đó cho phép người dùng làm những điều chứa đựng những nguy c tiềm tàng trong cách điều khiển . Ví dụ nhiều hệ thống LINUX có các chương trình cho phép người dùng biết dung lượng đĩa còn trống . Thông tin này được lưu trữ trên mỗi đĩa ở block 0 nhưng thường thì các đĩa này được bo vệ để ngăn những người bình thường không được đọc những thông tin này . Superuser có thể tìm thấy các thông tin này một cách dễ dàng nhưng nói cho mọi người biết mật khau của superuser sẽ làm thất bại toàn bộ sự bo vệ của hệ thống .

Thay vào đó LINUX có một bit liên kết với mỗi chương trình thi hành gọi là setuid bit .

SIGABRT Gửi để bỏ qua quá trình và SIGALRM Chuông đồng hồ tắt

SIGFPE Lỗi số dấu phẩy động ( như chia cho 0 ) SIGHUP Đường kết nối của quá trình bị treo

SIGILL Quá trình thi hành một chỉ thị không hợp lệ SIGINT Người dùng ấn DEL để ngắt quá trình SIGQUIT Người dùng ấn phím yêu cầu hệ thống SIGKILL Bỏ quá trình

SIGPIPE Quá trình tham gia vào một ống dẫn thừa

SIGSEGV Quá trình tham kho đến một địa chỉ bộ nhớ không hợp lệ

SIGTERM Sử dụng để yêu cầu quá trình kết thúc

SIGUSR1 Giành cho các mục đích mà chương trình tự định nghĩa

SIGUSR2 Giành cho các mục đích mà chương trình tự định nghĩa

Bit này thực sự là một phần của từ lưu dữ chế độ bo vệ ( Phần lưu dữ chế độ bo vệ chỉ sử dụng 9 bits vì thế một vài bít ở phía trái được sử dụng dành cho các mục đích khác ). Khi một chương trình với bit setuid tích cực được thi hành thì uid có nh hưởng tới quá trình là uid của người sở hưu file sẽ thay thế cho uid của người thực hiện . Bằng cách làm cho chương trình báo cáo về lượng đĩa trống có chủ là superuser với bit setuid tích cực sẽ làm cho mọi người dùng được superuser cho phép đều có thể thi hành được nó .

Theo cách này superuser có thể thiết lập đối với những người dùng bình thường một tập các chương trình sử dụng quyền của superuser nhưng

chỉ trong giới hạn và mục đích của chương trình . Chạy một chương trình thông báo về lượng đĩa còn trống cho phép người đó có được quá trình của superuser nhưng không được phép đọc các file được bo vệ vì đó không phải là một trong các chức năng của chương trình thông báo dung lượng đĩa . Vì vậy chương trình này sẽ chỉ thông báo lượng đĩa trống và sau đó kết thúc . C chế setuid bit được sử dụng rộng rãi trong suốt LINUX để tránh cho hệ thống

Một phần của tài liệu đồ án công nghệ thông tin USB driver trên hệ điều hành Linux Red Hat (Trang 25 - 34)

Tải bản đầy đủ (DOC)

(78 trang)
w