1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo bài tập lớn nguyên lý hệ điều hành

30 827 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 30
Dung lượng 1,75 MB

Nội dung

Mục Lục Mục Lục 2 1 Tổng quan về tiến trình Linux 6 1.1 Khái niệm 6 1.2 Phân loại tiến trình: 7 1.3 Các trạng thái của tiến trình 9 1.4 Cấu trúc của một tiến trình 10 1.5 Bảng thông tin tiến trình và xem thông tin tiến trình 12 2 Quản lý tiến trình 12 2.1 Tạo lập tiến trình 13 2.2 Dừng một tiến trình 18 2.3 Cấp phát tài nguyên cho tiến trình 19 2.4 Giám sát và điều phối tiến trình 21 2.5 Kiểm soát và đợi tiến trình con 26 2.6 Liên lạc giữa các tiến trình 29 3 Tổng Kết 31 4 Tài liệu tham khảo 31

Trang 1

Tên đề tài: Quản lý tiến trình trong hệ điều hành LINUX

Nhóm thực hiện: Nhóm 2 Lớp: Kĩ thuật phần mềm chất lượng cao 1

Thành viên nhóm : Phạm Thành Tạo

Nguyễn Thanh Tùng Giáo viên hướng dẫn: Ths Vương Quốc Dũng

Hà Nội, tháng 12 năm 2012

Trang 2

Mục Lục

Mục Lục 2

-1 Tổng quan về tiến trình Linux 6

-1.1 Khái niệm 6

-1.2 Phân loại tiến trình: 7

-1.3 Các trạng thái của tiến trình 9

-1.4 Cấu trúc của một tiến trình 10

-1.5 Bảng thông tin tiến trình và xem thông tin tiến trình 12

-2 Quản lý tiến trình 12

-2.1 Tạo lập tiến trình 13

-2.2 Dừng một tiến trình 18

-2.3 Cấp phát tài nguyên cho tiến trình 19

-2.4 Giám sát và điều phối tiến trình 21

-2.5 Kiểm soát và đợi tiến trình con 26

-2.6 Liên lạc giữa các tiến trình 29

-3 Tổng Kết 31

-4 Tài liệu tham khảo 31

-Lời nói đầu

Trang 3

Trước khi tìm hiểu về Linux, chúng ta cùng nói sơ qua về hệ điều hành UNIX- nền tảng của Linux

UNIX là hệ điều hành được Kenneth Thompson, Dennis Ritchie cùng một số ngườikhác phát triển vào năm 1969 tại phòng nghiên cứu Bell Labs trong công ty AT&T của Mỹvới mục đích là tạo ra một môi trường làm việc đa người dùng khác với Windows củaMicrosoft là hệ điều hành một người dùng Phiên bản đầu tiên của UNIX ra đời năm 1971với 60 câu lệnh bằng ngôn ngữ lập trình đơn giản Từ đó trở đi, Hệ Điều Hành này pháttriển rất mạnh tuy nhiên nhược điểm của nó là chi phí rất đắt đỏ và cần có nhiều máy tínhcùng hoạt động Điểm nhấn quan trọng giúp UNIX trở nệ phổ biến rông rãi là vào năm

1983, dự án GNU do Richard Stallman khởi xướng với mục tiêu tạo ra hệ thống các phầnmềm tương thích với UNIX và hoàn toàn miễn phí Đến năm 1990, các phần mềm biêndịch, các thư viện, các phần mềm xử lý văn bản, Unix shell và hệ thống quản lý cửa sổ đãđược tích hợp thành công mặc dù vẫn còn nhiều điểm yếu

Linux kernel là nhân của một Hệ Điều Hành được viết dựa trên nền tảng của Hệ ĐiềuHành UNIX do một sinh viên người Phần Lan có tên Linus Torvalds xây dựng Linux banđầu có tên là Freax, sau đó, một người bạn của Linus đã đặt tên cho thư mục chứa kerneltrên FTP server do anh ta quản trị là Linux Và tên của nó được phổ biến rộng khắp Đếnnay, trên toàn thế giới đã có trên 10 triệu bản Linux được cài đặt với rất nhiều phiên bản vàcác biến thể khác nhau Ví dụ như Ubuntu, Fedora, Debian hay nổi tiếng nhất và được dùngnhiều nhất hiện nay là Android- Hệ Điều Hành dùng trên các smartphone hiện đại Linuxđang ngày càng được phổ biến trên toàn thế giới bởi những lí do:

Linux là hệ điều hành đa người dùng: hệ điều hành đa người dùng là hệ điều hành chophép nhiều người dùng cùng đăng nhập sử dụng và chạy các tiến trình trên hệ điều hành tạicùng một thời điểm

 Linux là hệ điều hành đa chức năng: ta có thể chạy nhiều ứng dụng tại cùng mộtthời điểm Hiện nay, tất cả các hệ điều hành đều làm được việc này, tuy nhiên, hiệu suất khichạy đồng thời các ứng dụng là không bằng nhau và đôi khi không ổn định

 Linux là hệ điều hành ổn định: Linux là hệ điều hành có tính ổn định tuyệt vờidựa trên cấu trúc của hệ điều hành và các modul tích hợp trên nó Khi ta cài thêm phần

Trang 4

mềm mới hay thay đổi cấu hình của hệ thống thì bản không cần phải khởi động lại hệthống Việc này giúp giảm thời gian và quản trị hệ thống dễ dàng hơn

 Linux là hệ điều hành với nhiều phần mềm có sẵn: Khi ta cài đặt thành công linux

ta sẽ có thể sử dụng ngay OpenOffice(tương đương với office của Microsoft), Gimp(giốngvới photoshop) và rất nhiều phần mềm khác Ngoài ra, ta cũng có thể download và cài đặtmiễn phí các phần mềm từ trang chủ

 Linux hỗ trợ hầu hết các phần cứng của hệ thống: vì các driver đã được tích hợpsẵn trong kernel nê khi cài đặt xong ta không phải cài thêm bất kỳ driver nào như khi cài hệđiều hành Windows nữa

 Linux là hệ điều hành chạy rất nhanh và sạch: Linux chạy rất nhanh và miễn dịchvới hầu hết các virus từ hệ điều hành Windows nên ta hoàn toàn có thể yên tâm khi sửdụng

Quản lý tiến trình là một trong những công việc hết sức quan trọng của bất kỳ hệ điều hànhnào Nếu có cơ chế quản lý tốt thì hệ thống sẽ ổn định và mượt mà hơn Sau đây, ta sẽ tìm hiểu kĩhơn về tiến trình và quản lý tiến trình trong hệ điều hành Linux

Trang 5

1 Tổng quan về tiến trình Linux

Tiến trình là một bộ phận của chương trình đang thực hiện, nó sở hữu một con trỏlệnh, tập các thanh ghi và các biến Ngoài ra, tiến trình còn yêu cầu một số tài nguyên từ hệthống như CPU, bộ nhớ và các thiết bị

Ngoài ra còn có nhiều khái niệm khác về tiến trình Ở đây, chúng tôi xin giới thiệu

về hai định nghĩa tiến trình như sau:

+ Định nghĩa của Saltzer: Tiến trình là một chương trình do processor logic thựchiện

+ Định nghĩa của Horning & Rendell: Tiến trình là quá trình chuyển từ trạng tháinày qua trạng thái khác dưới tác động của hàm hành động từ một trạng thái ban đầu nào đó

Ta cần phân biệt rõ hai khái niệm là chương trình và tiến trình Chương trình là mộtthực thể thụ động chứa đựng các chỉ thị điều khiển máy tính thực thi một tác vụ cụ thể nào

đó Khi cho thực thi các tác vụ này, chương trình được chuyển thành các tiến trình- thực thểhoạt động, với con trỏ lệnh xác định điạ chỉ kế tiếp sẽ thi hành kèm theo các tập tài nguyênphục vụ cho hoạt động của tiến trình Định nghĩa của Saltzer cho thấy trên góc độ thực thithì tiến trình hoàn toàn tương tự chương trình, chỉ khác ở chỗ: Tiến trình do processor logicthực hiện mà không phải là processor vật lý Định nghĩa của Horning & Rendell lại chỉ rarằng: Tiến trình thực hiện là sự chuyển đổi từ quá trình này sang quá trình khác nhưng sựthay đổi này không phải do bản thân tiến trình mà do sự tác động bên ngoài, cụ thể ở đây là

bộ phận điều phối tiến trình của hệ điều hành Những điều trên sẽ được thấy rõ trong quátrình phân tích dưới đây

Các tiến trình trong hệ thống có thể chia thành hai loại:

Tiến trình tuần tự và tiến trình song song Tiến trình tuần tự là các tiến trình mà điểmkhởi tạo của nó là điểm kết thúc của tiến trình trước đó Tiến trình song song là các tiếntrình mà điểm khởi tạo của tiến trình này mằn ở thân của các tiến trình khác, tức là có thể

Trang 6

khởi tạo một tiến trình mới khi các tiến trình trước đó chưa kết thúc Tiến trình song songđược chia thành nhiều loại:

 Tiến trình song song độc lập: là các tiến trình hoạt động song song nhưngkhông có quan hệ thông tin với nhau, trong trường hợp này hệ điều hành phải thiết lập cơchế bảo vệ dữ liệu của các tiến trình, và cấp phát tài nguyên cho các tiến trình một cách hợplý

 Tiến trình song song có quan hệ thông tin: trong quá trình hoạt động các tiếntrình thường trao đổi thông tin với nhau, trong một số trường hợp tiến trình gửi thông báocần phải nhận được tín hiệu từ tiến trình nhận để tiếp tục, điều này dễ dẫn đến bế tắc khitiến trình nhận tín hiệu không ở trong trạng thái nhận hay tiến trình gửi không ở trong trạngthái nhận thông báo trả lời

 Tiến trình song song phân cấp: Trong quá trình hoạt động một tiến trình cóthể khởi tạo các tiến trình khác hoạt động song song với nó, tiến trình khởi tạo được gọi làtiến trình cha, tiến trình được tạo gọi là tiến trình con Trong mô hình này hệ điều hành phảigiải quyết vấn đề cấp phát tài nguyên cho các tiến trình con Tiến trình con nhận tài nguyên

ở đâu, từ tiến trình cha hay từ hệ thống Để giải quyết vấn đề này hệ điều hành đưa ra 2 môhình quản lý tài nguyên: Thứ nhất, mô hình tập trung, trong mô hình này hệ điều hành chịutrách nhiệm phân phối tài nguyên cho tất cả các tiến trình trong hệ thống Thứ hai, mô hìnhphân tán, trong mô hình này hệ điều hành cho phép tiến trình con nhận tài nguyên từ tiếntrình cha, tức là tiến trình khởi tạo có nhiệm vụ nhận tài nguyên từ hệ điều hành để cấp phátcho các tiến trình mà nó tạo ra, và nó có nhiệm vụ thu hồi lại tài nguyên đã cấp phát trả vềcho hệ điều hành trước khi kết thúc

 Tiến trình song song đồng mức: là các tiến trình hoạt động song song sử dụngchung tài nguyên theo nguyên tắc lần lượt, mỗi tiến trình sau một khoảng thời gian chiếmgiữ tài nguyên phải tự động trả lại tài nguyên cho tiến trình kia

Các tiến trình tuần tự chỉ xuất hiện trong các hệ điều hành đơn nhiệm đa chương, như hệ điều hành MS_DOS, loại tiến trình này tồn tại nhiều hạn chế, điển hình nhất là không khai thác tối đa thời gian xử lý của processor Các tiến trình song song xuất hiện

Trang 7

trong các hệ điều hành đa nhiệm đa chương, trên cả hệ thống uniprocessor và multiprocessor Nhưng sự song song thực, chỉ có ở các hệ thống multiprocessor, trong hệ thống này mỗi processor chịu trách nhiệm thực hiện một tiến trình Sự song song trên các

hệ thống uniprocessor là sự song song giả, các tiến trình song song trên hệ thống này thực chất là các tiến trình thay nhau sử dụng processor, tiến trình này đang chạy thì có thể dừng lại để nhường processor cho tiến trình khác chạy và sẽ tiếp tục lại sau đó khi có được processor Đây là trường hợp mà ở trên ta cho rằng: điểm khởi tạo của tiến trình này nằm

ở thân của tiến trình khác

Hình vẽ sau đây minh họa sự khác nhau, về mặt thực hiện, giữa các tiến trình songsong/ đồng thời trong hệ thống uniprocessor với các tiến trình song song/ đồng thời trong

P1 P2

a Trong hệ thống uniprocessor

P1 P2

b Trong hệ thống Multiprocessor Hình 2.1: Sự thực hiện đồng thời của các tiến trình trong hệ

thống uniprocessor (a) và hệ thống multiprocessor (b)

Trang 8

xuất vào các vùng dữ liệu được bảo vệ của hệ thống Trong khi đó các tiến trình củachương trình người sử dụng hoạt động trong chế độ không đặc quyền, nên nó không thểtruy xuất vào hệ thống, nhờ đó mà hệ điều hành được bảo vệ Các tiến trình của chươngtrình người sử dụng có thể truy xuất vào hệ thống thông qua các tiến trình của hệ điều hànhbằng cách thực hiện một lời gọi hệ thống

Khi một chương trình đang chạy từ dòng lệnh, ta có thể nhấn tổ hợp phím ctrl+Z đểtạm dừng chương trình và đưa nó vào hoạt động phía hậu trường(background) Tiến trìnhLinux có các trạng thái sau:

-Đang chạy(running): là trạng thái mà tiến trình chiếm quyền sử dụng CPU để tínhtoán hay thực hiện các công việc của mình

-Chờ(waiting): là trạng thái mà CPU tiến trình bị hệ điều hành tước quyền sử dụngCPU, phải chờ cho đến lượt cấp phát khác

-Tạm dừng(suspend): là trạng thái mà hệ điều hành tạm dừng tiến trình Tiến trìnhđược đưa vào trang thái thái ngủ(sleep) Khi cần thiết và có nhu cầu hệ điều hành sẽ đánhthức(wake up) hay nạp lại mã lệnh của tiến trình vào bộ nhớ, cấp phát tài nguyên CPU đểtiến trình tiếp tục hoạt động

Trên dòng lệnh, thay vì dung lệnh ctrl+z, ta có thể dùng lệnh bg để đưa tiến trình vàohoạt động phía hậu trường Chúng ta có thể yêu cầu một chương trình chạy nền bằng cúpháp &, chẳng hạn: $ls –R & Lệnh fg sẽ đem tiến trình trở về hoạt động ưu tiên phía trước.Thực tế khi chúng ta đăng nhập vào hệ thống và tương tác trên dong lệnh cũng là lúc tađang ở trong tiến trình shell của bash Khi gọi một dòng lệnh có nghĩa là ta đã yêu cầu bashtạo thêm một chương trình con thực thi khác Về mặt lập trình,chúng ta có thể dùng lệnhfork() để nhân bản một tiến trình khác từ tiến trình ban đầu, hoặc dùng lệnh system() đểtriệu hồi một chương trình con từ hệ điều hành Hàm exec() cũng có khả năng tạo ra mộttiến trình mới khác

Trang 9

Chúng ta cùng trả lời câu hỏi: Hệ Điều Hành quản lý tiến trình như thế nào?

Nếu có hai người dùng user1 và user2 cùng đăng nhập vào chạy chương trình chạygrep đồng thời, thực tế hệ điều hành sẽ quản lý nạp mã của chương trình grep vào hai vùngnhớ khác nhau và gọi mỗi phân vùng như vậy là tiến trình

User1: chạy file grep tìm kiếm chuỗi abc trong file 1

$grep abc file1

User2: chạy file grep tìm kiếm chuỗi def trong file 2

$grep def file 2

Nếu dùng lệnh ps thì hệ thống sẽ liệt kê cho chúng ta thông tin của những tiến trình mà

hệ điều hành đang kiểm soát Ví dụ: $ps –af

Mỗi tiến trình được gắn được gán cho một định danh để nhận dạng gọi là PID(processidentify) PID là số nguyên dương thường có giá trị từ 2 đến 32768 Khi một tiến trình mớiyêu cầu khởi động, hệ điều hành sẽ chọn lấy một số chưa bị tiến trình nào chiếm giữ trongkhoảng số nguyên trên và cấp phát cho tiến trình mới Khi tiến trình kết thúc, hệ điều hành

sẽ thu hồi số PID để cấp phát cho tiến trình khác trong lần sau PID được bắt đầu từ 2 vì 1được dành cho tiến trình đầu tiên gọi là init Tiến trình init được nạp và chạy ngay khichúng ta khởi động hệ điều hành Init là tiến trình quản lý và tạo ra mọi tiến trình con khác

Ở ví dụ trên chúng ta thấy lệnh $ps –af sẽ hiển thị hai tiến trình grep chạy bởi user 1 vàuser2 với số PID lần lượt là 101 và 102

Mã lệnh thực thi của lệnh grep được chứa trong tập tin trên đĩa cứng được hệ điều hànhnạp vào vùng nhớ Mỗi tiến trình được hệ điều hành phân chia rõ ràng: vùng chứa mã lệnh(code) và vùng chứa dữ liệu (data) Mã lệnh thường giống nhau và có thể sử dụng chung.Linux quản lý cho phép tiến trình của cùng một chương trình có thể dùng chung mã lệnhcủa nhau Thư viện cũng vậy, trừ những thư viện đặc thù, các thư viện chuẩn sẽ được hệđiều hành cho phép chia sẻ và dùng chung bởi các chương trình trong hệ thống Bằng việc

sử dụng chung thư viện, kích thước các chương trình giảm đi đáng kể Mã lệnh của chươngtrình khi chạy trong hệ thống ở dạng tiến trình cũng đỡ tốn bộ nhớ hơn

Trừ mã lệnh và thư viện có thể chia sẻ, dữ liệu thì không Mỗi phân đoạn sở hữu một

Trang 10

phân đoạn dữ liệu riêng Ví dụ tiến trình grep do user1 nắm giữ lưu trữ biến s có giá trị

‘abc’ còn tiến trình grep do user2 nắm giữ lưu trữ biến s có giá trị ‘def’

Mỗi tiến trình cũng được hệ thống dành riêng cho một bảng mô tả file(file descriptiontable) Bảng này chứa các số mô tả áp đặt cho các file đang được mở Mỗi tiến trình khikhởi động, Hệ Điều Hành sẽ mở cho chúng ta 3 file: stdin(số mô tả 0), stdout(số mô tả 1)

và stderr(số mô tả 2) Các file này tượng trưng cho các thiết bị nhập, xuất và thông báo lỗi.chúng ta có thể mở thêm các file khác Ví dụ user1 mở file1, user2 mở file2 Hệ Điều Hànhcáp phát số mô tả file cho các tiến trình và lưu riêng chúng trong bảng mô tả file của tiếntrình đó

Ngoài ra mỗi tiến trình có riêng ngăn xếp stack để lưu trữ biến cục bộ và giá trị trả vềsau lời gọi hàm Tiến trình cũng được giành cho khoảng không gian riêng để lưu trữ cácbiến môi trường Chúng ta sẽ dùng lệnh putenv và getenv để đặt riêng biến môi trường chotừng tiến trình

Hệ điều hành lưu trữ một cấu trúc danh sách bên trong hệ thống gọi là bảng tiến

trình(process table) Bảng tiến trình quản lý tất cả các PID và thông tin chi tiết về các tiếntrình đang chạy Ví dụ như khi ta gọi lệnh ps, Linux thường đọc thông tin trong bảng tiếntrình này và hiển thị tên và các lệnh của các tiến trình được gọi: thời gian sử dụng CPU củatiến trình, tên người sử dụng tiến trình,…

Lệnh ps của hệ điều hành dùng để xem thông tin của các tiến trình Tùy theo tham sốlệnh ps sẽ cho ta thông tin về tiến trình người dùng, tiến trình của hệ thống hoặc tất cả cáctiến trình đang chạy Ví dụ ps sẽ đưa ra chi tiết bằng tham số -af

Trong thông tin do ps trả về, UID là tên người dùng đã gọi tiến trình, PID là số địnhdanh mà hệ thống cấp cho tiến trình, PPID là số định danh của tiến trình cha(parent PID) Ởđây chúng ta sẽ gặp một số tiến trình có định danh PPID là 1, là định danh của tiến trìnhinit, được gọi và chạy khi khởi động Nếu ta hủy tiến trình init thì hệ điều hành sẽ chấm dứtphiên làm việc STIME là thời điểm tiến trình được đưa vào sử dụng TIME là thời gianchiếm dụng CPU của tiến trình, CMD là toàn bộ dòng lệnh khi tiến trình được triệu gọi,

Trang 11

TTY là màn hình terminal ảo nơi gọi thực thi tiến trình Như chúng ta đã biết người dùng

có thể đăng nhập từ rất nhiều terminal khác nhau để gọi tiến trình Để liệt kê các tiến trình

hệ thống ta sử dụng lệnh $ps –ax

2 Quản lý tiến trình

Hệ điều hành các thao tác chủ yếu sau đây cho một tiến trình:

+ tạo lập tiến trình(create) + tạm dừng một tiến trình(suspend)+ dừng một tiến trình(destroy) + tái kích hoạt tiến trình(resume)

+ thay đổi độ ưu tiên đối với tiến trình +cấp phát tài nguyên cho tiến trình

+ giám sát và điều phối +kiểm soát và đợi tiến trình con

Sau đây chúng ta sẽ cùng tìm hiểu lần lượt về các thao tác nói trên:

Hình 1: Một cây tiến trình trong hệ thống Linux

Để tạo lập tiến trình, hệ điều hành cần làm các công việc sau:

+ định danh cho tiến trình mới phát sinh

Trang 12

+ đưa tiến trình này vào danh sách quản lý của hệ thốn

+ xác định độ ưu tiên của tiến trình vừa tạo

+ lập bảng PCB cho tiến trình

+ cấp phát tài nguyên ban đầu cho tiến trình

Chúng ta có thể gọi tiến trình khác bên trong một tiến trình đang thực thi bằng hàmsystem() Có nghĩa là chúng ta có thể tạo ra một tiến trình mới từ tiến trình đang chạy Hàmsystem() được khai báo như sau:

#include <stdlib.h>

int system( const char (cmdstr) )

Hàm này gọi chuỗi lệnh cmdstr thực thi và chờ lệnh chấm dứt mới quay về nơi gọi hàmtương đương với việc gọi hàm shell thực thi lệnh hệ thống: $sh –c cmdstr

System() sẽ trả về mã lỗi 127 nếu không khởi động được shell để thực hiện lệnh cmdstr

Mã lỗi là 1 nếu gặp các lỗi khác Còn lại mã trả về của system() là mã lỗi do cmdstr sau khilệnh được gọi trả về

Trang 13

Thay thế tiến trình hiện hành với hàm exec()

Mỗi tiến tình được hệ điều hành cấp cho một không gian nhớ để các tiến trình tự dohoạt động Nếu tiến trình A của chúng ta gọi một tiến trình ngoài B thì hệ điều hành thườngthực hiện các thao tác như: cấp phát không gian nhớ cho tiến trình mới, điều chỉnh lại danhsách các tiến trình, nạp mã lệnh của chương trình B trên đĩa cứng vào không gian nhớ vừacấp phát cho tiến trình, đưa tiến trình mới vào danh sách các tiến trình cần điều phối của hệđiều hành Những công việc này thường mất thời gian đáng kể và chiếm dụng thêm tàinguyên của hệ thống

Nếu tiến trình A đang chạy và nếu ta muốn tiến trình B khởi động và chạy trong khônggian nhớ có sẵn của tiến trình A, ta có thế dùng hàm exec() được cung cấp bởi Linux Cáchàm exec() sẽ thay thế hoàn toàn ảnh của tiến trình A(tập lệnh, dữ liệu, bảng mô tả file)thành ảnh của tiến trình B hoàn toàn khác Chỉ có chỉ số định danh PID của tiến trình Ađược giữ lại Tập hàm exec() bao gồm các hàm sau:

#include <unistd.h>

extern char **environ;

int execl( const char *path, const char *arg, );

int execlp( const char *file, const char *arg, );

int execle( const char *path, const char *arg, , char *const envp[] );

int exect( const char *path, char *const argv[] );

int execv( const char *path, char *const argv[] );

int execvp( const char *file, char *const argv[] );

Đa số các hàm này đều yêu cầu chúng ta chỉ đối số path hoặc file là đường dẫn đến tênchương trình cần được thực thi trên đĩa Arg là đối số cần truyền cho chương trình cần thựcthi, những đối số này tương tự cách chúng ta gọi chương trình từ dòng lệnh

Ví dụ về việc sử dụng hàm exec và pexec.c

#include <unistd.h>

Trang 14

Thay thế tiến trình đôi khi bất lợi với chúng ta Đó là tiến trình mới chiến giữ toàn bộkhông gian nhớ của tiến trình cũ và chúng ta không thể kiểm soát cũng như điều khiển tiếptiến trình hiện hành của mình sau khi gọi hàm exec() nữa Cách đơn giản mà các chươngtrình của Linux thường dùng là hàm fork() để nhân bản hay tạo một bản mới của tiến trình.Fork() là một hàm khá đặc biệt, khi thực thi, nó sẽ trả về hai giá trị khác nhau trong khibình thường một hàm chỉ trả về một giá trị trong một lần thực thi Khai báo của hàm fork()như sau:

Trang 15

Sau khi tách tiến trình thì mã lệnh ở hai tiến trình được sao chép là giống hệt nhau Chỉ

có một dấu hiệu để ta nhận dạng được tiến trình cha và con là giá trị trả về của hàm fork().Bên trong tiến trình con, hàm fork() sẽ trả về giá trị 0 Trong khi bên trong tiến trình cha thìgiá trị trả về là trị số nguyên chỉ là số PID của tiến trình con vừa tạo Nếu không tách đượctiến trình thì hàm fork() sẽ trả về giá trị -1 Kiểu pid_t được khai báo và định nghĩa tronguinstd.h là kểu số nguyên(int)

Đoạn mã điều khiển và sử dụng hàm fork() thường có dạng chuẩn sau:

pid_t new_pid;

new_pid = fork(); // tách tiến trình

switch (new_pid)

{

case -1: printf( "Khong the tao tien trinh moi" ); break;

case 0: printf( "Day la tien trinh con" );

// mã lệnh dành cho tiến trình con đặt ở đây

break;

default: printf( "Day la tien trinh cha" );

// mã lệnh dành cho tiến trình cha đặt ở đây

Ngày đăng: 11/05/2016, 08:06

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w