05-quanlytientrinh
TRANSCRIPT
1
2/26/2014 open sourse 1/35
Quản lý tiến trình
Chương 5
open sourse 2/35 2/26/2014
Quá trình khởi động (boot) hệ điều hành
Linux
Quá trình khởi động hệ điều hành Linux thực hiện qua các bước cơ
bản như sau:
1. BIOS thực hiện kiểm tra tính toàn vẹn trên bộ nhớ và tìm kiếm các
chỉ dẫn trên Master Boot Record (MBR) trên đĩa mềm hay trên ổ
cứng
2. MBR gọi bộ nạp khởi động của Linux – LILO hay GRUB
3. LILO/GRUB sau đó sẽ nhận diện nhân hệ điều hành để thi hành và
sau đó sẽ nạp nhân hệ điều hành Linux từ phần chia /boot/
4. Nhân hệ điều hành chuyển điều khiển cho chương trình /sbin/init.
5. Dựa trên mức thi hành tương ứng, /sbin/init thực hiện nạp các dịch
vụ và gắn (mount) tất cả các phần chia hệ thống (được khai báo
trong /etc/fstab).
open sourse 3/35 2/26/2014
Giới thiệu Một tiến trình = thực thi của một chương trình
Mỗi tiến trình sẽ tương ứng với một tập các thông tin sau: Một định danh (pid)
Một tiến trình cha (ppid)
Người sở hữu (uid) và nhóm (gid)
Câu lệnh khởi tạo tiến trình
Một đầu vào chuẩn (stdin), một đầu ra chuẩn (stdout), một kênh báo lỗi chuẩn (stderr)
Thời gian sử dụng CPU (CPU time) và mức độ ưu tiên
Thư mục hoạt động hiện tại của tiến trình
Bảng các tham chiếu đến các file được tiến trình sử dụng.
Các tiến trình được sắp xếp để chia sẻ thời gian sử dụng CPU
open sourse 4/35 2/26/2014
Các kiểu tiến trình (1)
Các tiến trình hệ thống
Thường thuộc về quyền root
Không có giao diện tương tác
Thường được chạy dưới dạng các tiến trình ngầm
(daemon)
Đảm nhiệm các nhiệm vụ chung, phục vụ mọi người
sử dụng.
Ví dụ:
lpsched: Quản lý các dịch vụ in ấn
cron: tự động thực hiện một lệnh/chương trình vào một thời
gian xác định trước.
inetd: quản lý các dịch vụ mạng.
open sourse 5/35 2/26/2014
Các kiểu tiến trình (2)
Các tiến trình của người sử dụng
Thực hiện các nhiệm vụ của một người dùng cụ thể
Thực hiện dưới dạng một shell tương ứng với một sự đăng
nhập.
Thực hiện dưới dạng một lệnh thông qua shell
Thường được thực hiện, quản lý bằng một terminal
Ví dụ:
cp
vi
man
…
open sourse 6/35 2/26/2014
Lệnh ps
Hiển thị các tiến trình Theo ngầm định, lệnh ps hiển thị các tiến trình thuộc về người
sử dụng terminal.
Sử dụng tùy chọn aux để hiển thị tất cả các tiến trình đang chạy trong máy.
$ ps
PID TTY TIME CMD
2803 pts/1 00:00:00 bash
2965 pts/1 00:00:00 ps
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 1104 460 ? S 15:26 0:03 init[3]
...
ttanh 951 0.0 0.3 1728 996 pts/0 S 16:09 0:00 bash
ttanh 953 0.0 1.9 6860 4916 pts/0 S 16:09 0:00 emacs
ttanh 966 0.0 0.3 2704 1000 pts/0 R 16:23 0:00 ps aux
...
2
7/35
Lệnh ps Cú pháp: ps [option]
* Các tham số đơn giản
-A, -e : chọn để hiển thị tất cả các tiến trình.
-T : chọn để hiển thị các tiến trình trên trạm cuối đang chạy.
-a : chọn để hiển thị tất cả các tiến trình trên một trạm cuối
-r : chỉ hiển thị tiến trình đang được chạy.
*Chọn theo danh sách
-C : chọn hiển thị các tiến trình theo tên lệnh.
-G : hiển thị các tiến trình theo chỉ số nhóm người dùng.
-U : hiển thị các tiến trình theo tên hoặc chỉ số của người dùng thực sự
-p : hiển thị các tiến trình theo chỉ số của tiến trình.
-s : hiển thị các tiến trình thuộc về một phiên làm việc.
-t : hiển thị các tiến trình thuộc một trạm cuối.
-u : hiển thị các tiến trình theo tên và chỉ số của người dùng hiệu quả.
open sourse 8/35 2/26/2014
Trạng thái của tiến trình
9/35 2/26/2014
Trạng thái của tiến trình
exit()
Pre-empt
Pre-empted
wake up
wake up
Swap out
Sleeping
Swapped out
Ready to run
Swapped out
Swap out Swap in
Not Enough Memory
Re -schedule
fork()
User running
Return to user mode
Return to user mode
System call or Interrupt
Interrupt and Interrupt return
Zombie
Kernel running
Sleep
Created
Ready to run in memory Sleeping
in memory Enough Memory
open sourse 10/35 2/26/2014
Trạng thái của tiến trình Created
Một tiến trình mới được tạo. Các tiến trình được tạo có thường trú toàn bộ
trong bộ nhớ hay không là phụ thuộc vào các chi tiết của hệ thống quản lý bộ nhớ.
Trạng thái này cũng có thể bao gồm các tiến trình chưa được tạo hoàn chỉnh.
Ready to run in memory
Tiến trình sẵn sàng được thi hành trong bộ nhớ.
Kernel running
Tiến trình đang chạy trong chế độ nhân hệ điều hành (kernel mode). Nó có thể
quản lý một lời gọi hệ thống hoặc một ngắt hay tiến trình khác (cũng trong chế độ nhân
hệ điều hành) có thể chạy theo lịch lập sẵn. Tiến trình có thể quyết định rằng nó đã kết
thúc (kết thúc bình thường thông qua lệnh exit() hoặc khi nhân hệ điều hành phát hiện
điều kiện không bình thường) hoặc nó được đóng (block) để đợi một số sự kiện như là
một tín hiệu thời gian hoặc sự hoạt động của thiết bị ngoại vi.
open sourse 11/35 2/26/2014
Trạng thái của tiến trình User running
Trạng thái hoạt động bình thường của tiến trình.
Pre-empted
Tiến trình bị gián đoạn và sắp sửa lấy lại quá trình hoạt động bình thường trong
chế độ người dùng (user mode). Bộ lập lịch của nhân hệ điều hành có thể chuyển một
tiến trình vào trong trạng thái này.
Zombie
Tiến trình ngừng thi hành.
open sourse 12/35 2/26/2014
Trạng thái của tiến trình
Sleeping in memory
Tiến trình bị ‘đóng’ để đợi một sự kiện. Tất cả tiến trình có thể ở trạng thái này
là tiến trình có thể sang trạng thái wake up (bằng cách thay đổi trạng thái của nó
thành “ready to run”) hoặc swapped out.
Sleeping, swapped out
Tiến trình đang đợi một sự kiện (các chi tiết trong bảng tiến trình của tiến trình)
và đã được swapped out
Ready to run, swapped in
Sao chép ngược ‘tiến trình’ từ đĩa vào trong bộ nhớ trước khi được tiếp tục thi
hành.
3
open sourse 13/35 2/26/2014
Tiến trình init
init là một trong những chương trình thiết yếu đối với hoạt
động của một hệ thống Linux. init có nhiều nhiệm vụ quan trọng,
như là khởi nạp các thể hiện của getty (để người dùng có thể
đăng nhập), thực thi các mức thi hành chương trình và quản lý
những tiến trình vô chủ (mất tiến trình cha)
init là tiến trình cha của mọi tiến trình
Không thể kết thúc được tiến trình init khi hệ thống còn hoạt
động
open sourse 14/35 2/26/2014
Tiến trình init
Các bước khởi động của init
Bước1, init gọi thi hành script /etc/rc.d/rc.sysinit để thiết lập
đường dẫn, khởi động tập tin tráo đổi, kiểm tra các hệ thống
tập tin v.v…
Về cơ bản, rc.sysinit quản lý tất cả mọi thao tác mà hệ thống
cần phải thực hiện tại thời điểm khởi động, thí dụ như khởi động bộ
định thời (đồng hồ), khởi nạp cổng nối tiếp …
Bước 2, init sẽ thực thi script /etc/inittab. Script này mô tả
cách thức hệ thống cần được thiết lập tại mỗi mức thi hành
(run level) và thiết lập mức thi hành mặc định (tại dòng
initdefault trong tập tin /etc/inittab).
Mỗi khi thay đổi mức thi hành, init sử dụng các script có trong thư mục
/etc/rc.d/init.d/ để khởi động và dừng thi hành các dịch vụ khác nhau.
open sourse 15/35 2/26/2014
Tiến trình init
Các bước khởi động của init
Bước 3, init gọi thi hành script /etc/rc.d/init.d/functions.
Script này cho biết cách thức khởi động hay ngừng một
chương trình và cách thức xác định PID của một chương
trình.
Bước 4, init khởi động tất cả các tiến trình 'ngầm' cần thiết
cho hệ thống hoạt động bằng cách thi hành các script có
trong thư mục (/etc/rc.d/rc0.d/, /etc/rc.d/rc1.d/,
/etc/rc.d/rc2.d/, …, /etc/rc.d/rc6.d/) tương ứng đối với mức
thi hành được xác định.
Thi hành tất cả các script khởi động trong cùng thư mục
tương ứng với mức thi hành (bằng cách thi hành lệnh
/etc/rc.d/init.d/command start) để khởi động các ứng dụng
và dịch vụ.
open sourse 16/35 2/26/2014
Tiến trình init
Các bước khởi động của init
Bước 5, Gọi thi hành script /etc/rc.d/rc.local. Script này dùng
để bổ sung thêm các lệnh cần thiết cho môi trường hệ
thống.
Bước 6, Sau khi init đã xử lý tất cả các mức thi hành, script
/etc/inittab phát sinh một tiến trình getty cho mỗi bàn giao
tiếp ảo (virtual console) cho mỗi mức thi hành (mức 2-5 có 6
tiến trình getty, mức 1 chỉ có duy nhất một tiến trình, còn tại
mức 0 và 6 không có tiến trình) …
open sourse 17/35 2/26/2014
Tiến trình init
Các mức thi hành và cấu hình /etc/inittab
0 Ngừng thi hành hệ thống (shutdown)
1 Chế độ một người dùng
2 Không dùng (người dùng có thể định nghĩa)
3 Chế độ đa người dùng đầy đủ
4 Không dùng (người dùng có thể định nghĩa)
5 Chế độ đa người dùng trong môi trường X
6 Khởi động lại máy
open sourse 18/35 2/26/2014
Quản lý khởi động dịch vụ - chkconfig
Các script quản lý daemon dịch vụ hệ thống thực sự được đặt
trong thư mục /etc/rc.d/init.d/ và được liên kết (dạng symbolic
link) vào các thư mục /etc/rc.d/rc[0-6].d/ tương ứng. Tiện ích
/sbin/chkconfig là một công cụ dòng lệnh đơn giản được sử
dụng để giúp tạo hay xoá bỏ những liên kết này. Nó giúp
người quản trị hệ thống không cần phải thực hiện thủ công
tạo các symbolic link trong các thư mục nằm trong /etc/rc.d/.
4
open sourse 19/35 2/26/2014
Quản lý khởi động dịch vụ - chkconfig
Lệnh chkconfig được sử dụng với một số cú pháp cơ bản
sau:
chkconfig --add name
chkconfig --del name
chkconfig [--lelvel levels] name [on | off]
chkconfig --list [name]
open sourse 20/35 2/26/2014
Quản lý khởi động dịch vụ - chkconfig
--del name Xoá bỏ tất cả các symbolic link của dịch vụ name ra khỏi các thư mục
/etc/rc.d/rc[0-6].d và dịch vụ name được loại bỏ khỏi sự quản lý của chkconfig
--add name Tạo các symbolic link của script của dịch vụ name này vào trong tất cả
các thư mục /etc/rc.d/rc[0-6].d/ (thường là với script thực hiện ngừng dịch
vụ), đồng thời đưa dịch vụ name vào sự quản lý của chkconfig
--level
levels Xác định mức thi hành của dịch vụ name. Mức thi hành là một chuỗi số
gồm các con số từ 0-6 chỉ ra các mức thi hành được chọn.
Nếu một trong các cờ on hay off được chỉ ra sau tên dịch vụ name,
chkconfig sẽ thay đổi thông tin khởi động cho dịch vụ tại mức thi
hành được chỉ ra. Theo mặc định, các lựa chọn on và off sẽ chỉ tác
động trên các cấp thi hành 3, 4 và 5
--list Liệt kê thông tin trạng thái (khởi động hay ngừng) của tất cả các dịch
vụ mà chkconfig quản lý tại mọi cấp thi hành. Nếu có đối số name,
chỉ có thông tin về dịch vụ name được hiển thị.
21/35
Lệnh kill Cú pháp: kill [tùy-chọn] <chỉ-số-của-tiến-trình>
Lệnh kill sẽ gửi một tín hiệu đến tiến trình được chỉ ra. Nếu không
chỉ ra một tín hiệu nào thì ngầm định là tín hiệu TERM sẽ được gửi.
-s : xác định tín hiệu được gửi. Tín hiệu có thể là số hoặc tên của tín
hiệu. Dưới đây là một số tín hiệu hay dùng:
o SIGHUP (hang up) đây là tín hiệu được gửi đến tất cả các quá
trình đang chạy trước khi logout khỏi hệ thống
o SIGINT (interrupt) đây là tín hiệu được gửi khi nhấn Ctrl+C
o SIGK (kill) tín hiệu này sẽ dừng tiến trình ngay lập
o SIGT tín hiệu này yêu cầu dừng tiến trình ngay lập tức, nhưng cho
phép chương trình xóa các file tạm
-p : lệnh kill sẽ chỉ đưa ra chỉ số của tiến trình mà không gửi một tín
hiệu nào.
-l : hiển thị danh sách các tín hiệu mà lệnh kill có thể gửi đến các
tiến trình (các tín hiệu này có trong file /usr/include/Linux/signal.h)
open sourse 22/35 2/26/2014
Lệnh kill Lệnh killall: dùng để kết thúc tất cả các tiến trình của một
câu lệnh thông qua việc truyền tên của câu lệnh dưới
dạng một tham số.
Quyền hủy tiến trình thuộc về người sở hữu tiến trình
open sourse 23/35 2/26/2014
Độ ưu tiên của các tiến trình
Tất cả các tiến trình đều có độ ưu tiên ban đầu được ngầm định là 0
Mức độ ưu tiên của một tiến trình dao động trong khoảng từ -20 đến +19
Chỉ người sử dụng có quyền root mới có thể giảm
giá trị biểu diễn độ ưu tiên của tiến trình. Một người
sử dụng thông thường chỉ có thể làm giảm độ ưu tiên
của tiến trình thông qua việc tăng giá trị biểu diễn độ
ưu tiên.
open sourse 24/35 2/26/2014
Độ ưu tiên của các tiến trình
Để chạy một chương trình với độ ưu tiên định trước,
hãy sử dụng lệnh nice.
Cú pháp lệnh: nice [tùy-chọn] [lệnh [tham-số ]... ]
Lệnh nice sẽ chạy một chương trình (lệnh) theo độ ưu
tiên đã sắp xếp. Nếu không có lệnh, mức độ ưu tiên
hiện tại sẽ hiển thị. Độ ưu tiên được sắp xếp từ -20
(mức ưu tiên cao nhất) đến 19 (mức ưu tiên thấp nhất).
-ADJUST : tăng độ ưu tiên theo ADJUST đầu tiên
--help : hiển thị trang trợ giúp và thoát
5
open sourse 25/35 2/26/2014
Độ ưu tiên của các tiến trình - Để thay đổi độ ưu tiên của một tiến trình đang chạy,
hãy sử dụng lệnh renice.
Cú pháp lệnh: renice <độ-ưu-tiên> [tùy-chọn]
Lệnh renice sẽ thay đổi mức độ ưu tiên của một hoặc
nhiều tiến trình đang chạy.
-g : thay đổi quyền ưu tiên theo nhóm người dùng
-p : thay đổi quyền ưu tiên theo chỉ số của tiến trình
-u : thay đổi quyền ưu tiên theo tên người dùng
open sourse 26/35 2/26/2014
Lệnh top Hiển thị và cập nhật các thông tin sau của các
tiến trình đang chạy:
Phần trăm sử dụng CPU
Phần trăm sử dụng bộ nhớ trong (RAM)
$ top [–d]
Tùy chọn –d cho phép xác định thời gian định kỳ cập nhật thông tin (tính theo giây).
Lệnh top cho phép người sử dụng tương tác và quản lý các tiến trình (thay đổi độ ưu tiên, gửi các tín hiệu, …)
open sourse 27/35 2/26/2014
Các kiểu thực thi
Thực thi nhiều lệnh độc lập
Sử dụng ký tự ; để thực thi nhiều lệnh liên tiếp, các
lệnh này hoạt động độc lập với nhau.
$cp public/* perso; rm -r public
Thực thi nhiều lệnh phụ thuộc nhau
Sử dụng ký hiệu && để thực thi nhiều lệnh liên tiếp,
các lệnh này phụ thuộc nhau, lệnh sau chỉ được thực
hiện nếu lệnh trước không gặp lỗi.
$cp public/* perso && rm -r public
open sourse 28/35 2/26/2014
• cơ chế đường ống
Cơ chế đường ống giữa
hai tiến trình cho phép
định hướng lại đầu ra của
tiến trình thứ nhất trở
thành đầu vào của tiến
trình thứ hai
Cơ chế đường ống được
thiết lập bằng cách sử
dụng ký tự: |
$ cmd1 | cmd2
open sourse 29/35 2/26/2014
Chạy ở chế độ hiện (foreground và
chạy ở chế độ ngầm (background) (1)
Quá trình chạy ở chế độ hiện sẽ tiến hành theo những bước như sau:
Thực hiện quá trình « fork », nhân bản tiến trình cha (trong trường hợp thực thi các lệnh, đó sẽ là tiến trình shell)
Thực hiện quá trình « wait », đưa tiến trình cha vào trạng thái ngủ (sleep).
Thực hiện quá trình « exec », thực thi tiến trình con.
Sau khi tiến trình con thực thi xong, một tín hiệu « đánh thức » sẽ được gửi đến tiến trình cha.
Do quá trình chạy như trên => trong quá trình thực hiện tiến trình con, người sử dụng không thể tương tác với tiến trình cha.
open sourse 30/35 2/26/2014
Chạy ở chế độ hiện (foreground và
chạy ở chế độ ngầm (background) (2)
Quá trình chạy ở chế độ ngầm cho phép thực thi
tiến trình cha và tiến trình con một cách độc lập.
Ví dụ: $ emacs&
Sau khi thực hiện lệnh trên, emacs sẽ chạy ở
chế độ ngầm, người sử dụng có thể tiếp tục sử
dụng console để thực thi các lệnh khác
6
open sourse 31/35 2/26/2014
Quản lý tác vụ Một tác vụ = việc thực hiện một câu lệnh. Một tác vụ có thể
liên quan đến một nhóm các tiến trình (một tiến trình cha và tập các tiến trình con của nó)
Không thể có nhiều hơn 1 tác vụ chạy ở chế độ hiện (foreground)
Có thể có nhiều hơn 1 tác vụ chạy ở chế độ ngầm (background)
Background Foreground
Stop
$ command $ command &
fg kill
Ctrl-C fg
bg
Ctrl-Z stop
Kết
thúc
Kết
thúc
open sourse 32/35 2/26/2014
Ví dụ
$ emacs &
[1] 756
$ stop 756
# or $ stop %1
$ bg 756
# or $ bg %1
$ kill 756
# or $ kill %1
open sourse 33/35 2/26/2014
Chuyển hướng các kênh chuẩn
Mỗi tiến trình sở hữu: Một đầu vào chuẩn (ngầm định là bàn phím)
Một đầu ra chuẩn (ngầm định là terminal)
Một kênh báo lỗi chuẩn (ngầm định là terminal)
Chuyển hướng đầu vào chuẩn (<) $ tee < test.txt
Chuyển hướng đầu ra chuẩn (>, >>) $ ls > /dev/lp $ ls >> test.txt
Chuyển hướng kênh báo lỗi $ rm prog.c 2> /dev/null
$ gcc prog.c 2>> erreur.txt
open sourse 34/35 2/26/2014
Chuyển hướng đầu vào
Sử dụng ký tự ‘nhỏ hơn’ cùng với một tên tập tin như sau:
< file1
trong một lệnh để chỉ dẫn shell đọc thông tin đầu vào từ một tập tin
gọi là file1 thay thế việc nhập từ bàn phím.
Thí dụ, sử dụng chuyển hướng đầu vào để gửi nội dung tập tin
/etc/passwd tới lệnh more:
$ more < /etc/passwd
Nhiều lệnh của Linux chấp nhận một tên tập tin như là một đối số
dòng lệnh, đồng thời cũng chấp nhận nhập thông tin từ tập tin nhập
chuẩn nếu không có tập tin nào được đưa ra trên dòng lệnh.
Thí dụ, để xem 10 dòng đầu tiên của tập tin /etc/passwd, hai lệnh
sau đây đều thực hiện chức năng như nhau:
$ head /etc/passwd
$ head < /etc/passwd
open sourse 35/35 2/26/2014
Chuyển hướng đầu ra
Sử dụng ký tự ‘lớn hơn’ cùng với một tên tập tin như
sau:
> file2
Để cho phép shell chuyển đầu ra của một lệnh vào trong
một tập tin gọi là file2 thay thế việc xuất ra tập tin xuất
chuẩn (màn hình). Nếu tập tin file2 đã có, tập tin cũ sẽ bị
ghi đè.
Thí dụ, để chuyển hướng xuất của lệnh ls vào tập tin
ls.out trong thư mục chủ của người dùng, ta thi hành
lệnh sau:
$ ls /temp > ~/ls.out
open sourse 36/35 2/26/2014
Chuyển hướng đầu ra
Sử dụng hai dấu ‘lớn hơn’ để bổ sung thêm nội dung tới một
tập tin đã có. Thí dụ lệnh có sử dụng chuyển hướng đầu ra
như sau:
>> file2
sẽ thông báo cho shell bổ sung thêm nội dung xuất của một
lệnh vào cuối tập tin file2; trường hợp tập tin file2 chưa có, nó
sẽ được tạo.
Thí dụ, để liệt kê nội dung của thư mục /tmp, và ghi kết quả
vào tập tin myls. Sau đó liệt kê nội dung của thư mục /etc, và
bổ sung nội dung này vào phần cuối tập tin myls, ta thực hiện
các lệnh sau:
$ ls /tmp > myls
$ ls /etc >> myls
7
open sourse 37/35 2/26/2014
Chuyển hướng lỗi
Sự chuyển hướng tập tin lỗi chuẩn là khá phức tạp, phụ thuộc
vào kiểu shell đang sử dụng. Trong bash, chuyển hướng tập
tin lỗi chuẩn bằng ký tự '2>'
Thí dụ, ta có thể thực hiện sắp xếp thứ tự tập tin /etc/passwd,
ghi kết quả vào trong một tập tin có tên là foo, và bắt các lỗi
(nếu có) ghi vào một tập tin có tên là err bằng lệnh như sau:
$ sort < /etc/passwd > foo 2> err
open sourse 38/35 2/26/2014
tee command