Bài giảng Tổng quan về hệ điều hành

Hiện thực ý niệm VM  Làm thế nào để thực thi một chương trình MS-DOS trên một hệ thống Sun với hệ điều hành Solaris? 1. Tạo một máy ảo Intel bên trên hệ điều hành Solaris và hệ thống Sun 2. Các lệnh Intel (x86) được máy ảo Intel chuyển thành lệnh tương ứng của hệ thống Sun.

pdf57 trang | Chia sẻ: hao_hao | Ngày: 12/06/2014 | Lượt xem: 1617 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Bài giảng Tổng quan về hệ điều hành, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
HỆ ĐIỀU HÀNH Phan Trung Kiên Bộ môn Kỹ thuật máy tính và Mạng CHƯƠNG 1. TỔNG QUAN VỀ HỆ ĐIỀU HÀNH Nội dung 1.1. Hệ điều hành là gì? 1.3. Cấu trúc hệ điều hành 1.2. Cấu trúc hệ thống máy tính 2 1.1. Hệ điều hành là gì? 1.1.1. Các thành phần của hệ thống máy tính 3 Cấu trúc của máy tính 4 Định nghĩa  HĐH là chương trình trung gian giữa phần cứng máy tính và người sử dụng, có chức năng điều khiển phần cứng và cung cấp các dịch vụ cơ bản cho các ứng dụng.  Mục tiêu của HĐH là làm cho người sử dụng:  Thực thi dễ dàng các ứng dụng của mình  Thao tác điều khiển máy tính trở nên thuận tiện.  Quản lý và cấp phát tài nguyên hệ thống một cách hiệu quả. 5 6 Các chức năng chính của HĐH  Phân chia thời gian xử lý trên CPU (định thời)  Phối hợp và đồng bộ hoạt động giữa các quá trình  Quản lý tài nguyên hệ thống hiệu quả  Kiểm soát quá trình truy cập, bảo vệ hệ thống  Duy trì sự nhất quán của hệ thống, kiểm soát lỗi và phục hồi hệ thống khi có lỗi xảy ra.  Cung cấp giao diện làm việc thuận tiện cho người dùng 7 Lịch sử phát triển  Máy tính lớn (mainframes)  Xử lý bó (batch)  Đa chương (multiprogrammed)  Đa nhiệm (time-sharing, multitasking)  (Mainframe) Batch systems  I/O: card đục lỗ, băng từ (tapes), line printer  Cần có người vận hành (user  operator)  Giảm setup time bằng cách ghép nhóm công việc (batching)  Vd: ghép các công việc cùng sử dụng trình biên dịch Fortran  Tự động nạp lần lượt các chương trình 8 Lịch sử phát triển hệ điều hành (tt)  (Mainframe) Multiprogrammed systems  Nhiều công việc được nạp đồng thời vào bộ nhớ chính  Thời gian xử lý của CPU được phân chia giữa các công việc đó  Tận dụng được thời gian rảnh, tăng hiệu suất sử dụng CPU (CPU utilization)  Yêu cầu đối với hệ điều hành  Định thời công việc (job scheduling): chọn job trong job pool trên đĩa và nạp nó vào bộ nhớ để thực thi.  Quản lý bộ nhớ (memory management)  Định thời CPU (CPU scheduling)  Cấp phát tài nguyên (đĩa, máy in,…)  Bảo vệ 9 Lịch sử phát triển hệ điều hành (tt) 10 Lịch sử phát triển hệ điều hành (tt)  (Mainframe) Time-sharing systems  Multiprogrammed systems không cung cấp khả năng tương tác hiệu quả với users  CPU luân phiên thực thi giữa các công việc  Mỗi công việc được chia một phần nhỏ thời gian CPU (time slice, quantum time)  Cung cấp tương tác giữa user và hệ thống với thời gian đáp ứng (response time) nhỏ (1 s)  Một công việc chỉ được chiếm CPU khi nó nằm trong bộ nhớ chính.  Khi cần thiết, một công việc nào đó có thể được chuyển từ bộ nhớ chính ra thiết bị lưu trữ (swapping), nhường bộ nhớ chính cho công việc khác. 11 Lịch sử phát triển hệ điều hành (tt)  Yêu cầu đối với HĐH trong hệ thống time-sharing  Định thời công việc (job scheduling)  Quản lý bộ nhớ (memory management)  Virtual memory  Quản lý các quá trình (process management)  Định thời CPU  Đồng bộ các quá trình (synchronization)  Giao tiếp giữa các quá trình (process communication)  Tránh deadlock  Quản lý hệ thống file, hệ thống lưu trữ  Cấp phát hợp lý các tài nguyên  Bảo vệ (protection) 12 1.13 Lịch sử phát triển hệ điều hành (tt)  Máy để bàn (desktop system, personal computer)  Nhiều thiết bị I/O: bàn phím, chuột, màn hình, máy in,…  Phục vụ người dùng đơn lẻ.  Mục tiêu chính của HĐH  Thuận tiện cho user và khả năng tương tác cao.  Không cần tối ưu hiệu suất sử dụng CPU và thiết bị ngoại vi.  Nhiều hệ điều hành khác nhau (MS Windows, Mac HĐH, Solaris, Linux,…). Lịch sử phát triển hệ điều hành (tt)  Hệ thống song song  Nhiều CPU  Chia sẻ computer bus, clock  Ưu điểm  System throughput: càng nhiều processor thì càng nhanh xong công việc  Multiprocessor system ít tốn kém hơn multiple single- processor system: vì có thể dùng chung tài nguyên (đĩa,…)  Độ tin cậy: khi một processor hỏng thì công việc của nó được chia sẻ giữa các processor còn lại 14 Lịch sử phát triển hệ điều hành (tt)  Phân loại hệ thống song song  Đa xử lý đối xứng (symmetric multiprocessor - SMP)  Mỗi processor vận hành một identical copy của hệ điều hành  Các copy giao tiếp với nhau khi cần  Đa xử lý bất đối xứng (asymmetric multiprocessor)  Mỗi processor thực thi một công việc khác nhau  Master processor định thời và phân công việc cho các slave processors 15 Lịch sử phát triển hệ điều hành (tt)  Hệ thống phân bố (distributed system, loosely-coupled system)  Mỗi processor có bộ nhớ riêng, các processor giao tiếp qua các kênh nối như mạng, bus tốc độ cao, leased line  Người dùng chỉ thấy một hệ thống đơn nhất  Ưu điểm  Chia sẻ tài nguyên (resource sharing)  Chia sẻ sức mạnh tính toán (computational sharing)  Độ tin cậy cao (high reliability)  Độ sẵn sàng cao (high availability): các dịch vụ của hệ thống được cung cấp liên tục cho dù một thành phần hardware trở nên hỏng 16 Lịch sử phát triển hệ điều hành (tt)  Hệ thống phân bố (tt) Các mô hình hệ thống phân bố  Client-server  Server: cung cấp dịch vụ  Client: có thể sử dụng dịch vụ của server  Peer-to-peer (P2P)  Các peer (máy tính trong hệ thống) đều ngang hàng nhau  Không có cơ sở dữ liệu tập trung  Các peer là tự trị  Vd: Gnutella (Napster không phải là hệ thống P2P đúng nghĩa vì có cơ sở dữ liệu tập trung) 17 Lịch sử phát triển hệ điều hành (tt)  Hệ thống thời gian thực (real-time system)  Sử dụng trong các thiết bị chuyên dụng như điều khiển các thử nghiệm khoa học, điều khiển trong y khoa, dây chuyền công nghiệp, thiết bị gia dụng  Ràng buộc về thời gian: hard và soft real-time Phân loại  Hard real-time  Hạn chế (hoặc không có) bộ nhớ phụ, tất cả dữ liệu nằm trong bộ nhớ chính (RAM hoặc ROM)  Yêu cầu về thời gian đáp ứng/xử lý rất nghiêm ngặt, thường sử dụng trong điều khiển công nghiệp, robotics,…  Soft real-time  Thường được dùng trong lĩnh vực multimedia, virtual reality với yêu cầu mềm dẻo hơn về thời gian đáp ứng 18 1.2. Cấu trúc hệ thống máy tính  Kiến trúc cơ bản của hệ thống máy tính  Cơ chế vận hành của hệ thống  Cấu trúc hệ thống xuất nhập (I/O)  Cấu trúc và phân cấp hệ thống lưu trữ 19 Kiến trúc cơ bản của hệ thống máy tính CPU Disk controller USB controller Graphics adapter MEMORY Disks Mouse Keyboard Printer Monitor Đệm dữ liệu (local buffer) 20 Chu trình hoạt động của CPU Start Fetch Next Instruction Execute Instruction HALT 1. Chu trình đơn giản (không có ngắt) Start Fetch Next Instruction Execute Instruction HALT 2. Chu trình có điều khiển ngắt Check for interrupt; Process interrupt Interrupts enabled Interrupts disabled 21 Ngắt  Phân loại: ngắt do  Program: tràn số học, chia cho 0, truy cập bộ nhớ bất hợp pháp  Timer: cho phép CPU thực thi một tác vụ nào đó theo định kỳ  I/O: kết thúc tác vụ I/O, xảy ra lỗi trong I/O  Hardware failure: Hư hỏng nguồn, lỗi memory parity,…  Trap (software interrupt): yêu cầu dịch vụ hệ thống (gọi system call),… Lược đồ thời gian khi process có yêu cầu các tác vụ I/O 22 Quá trình xử lý ngắt i i+1 0 M User Program Interrupt handler 0   21 00ffe23f N Interrupt vector table int. 0x21 0  00ffe23f interrupt 0x21 routine ret ffffffff 1 2 3 23 Quá trình xử lý ngắt (tt) Có ngắt I/O interrupts Không có ngắt 24 Cấu trúc hệ thống I/O 1.A.26 Các kỹ thuật thực hiện I/O  Polling  Để gửi dữ liệu ra một thiết bị I/O (thông qua I/O port), CPU ghi byte dữ liệu vào thanh ghi dữ liệu (data register), sau đó thiết lập một bit (bit  1) của thanh ghi điều khiển (control register) để báo hiệu cho I/O controller. (PIO: programmed I/O)  I/O controller đọc byte dữ liệu từ thiết bị I/O, xóa bit điều khiển (bit  0). CPU tiếp tục gửi byte kế.  I/O controller không gây ra ngắt mỗi khi xong việc. CPU phải dùng cơ chế polling để kiểm tra trạng thái thiết bị I/O  Truyền dữ liệu từng byte một PIO 1.A.27 Các kỹ thuật thực hiện I/O (tt)  Interrupt-driven I/O  CPU không poll mà I/O controller sẽ gây ra ngắt mỗi khi sẵn sàng cho tác vụ I/O.  Trong lúc thiết bị I/O thực thi lệnh, CPU có thể thực thi công việc khác.  Polling và interrupt-driven I/O đều tiêu tốn thời gian xử lý của CPU bởi vì CPU phải copy byte dữ liệu được đọc/ghi  memory.  Thích hợp cho các thiết bị I/O có tốc độ không cao (keyboard, mouse) X X Các kỹ thuật thực hiện I/O (tt) Synchronous Asynchronous  Phương pháp thực hiện I/O - - - : “bypassing” kernel kernel 28 Các kỹ thuật thực hiện I/O (tt) Các hàng đợi (wait queue) I/O  Asynchronous I/O 29 1.A.30 Các kỹ thuật thực hiện I/O (tt)  Direct Memory Access (DMA)  CPU gửi yêu cầu đến module DMA (= DMA controller)  Module DMA chuyển một khối dữ liệu giữa bộ nhớ và thiết bị I/O mà không cần CPU can thiệp.  Khi xong một tác vụ gửi nhận thì phát khởi một ngắt.  CPU chỉ tham gia vào giai đoạn khởi đầu và kết thúc của việc truyền nhận dữ liệu  Trong khi đang truyền nhận dữ liệu, CPU có thể thực thi công việc khác  Thích hợp cho các thiết bị có tốc độ cao (đĩa) Cấu trúc & phân cấp hệ thống lưu trữ 1.A.32 Hệ thống lưu trữ  Lưu trữ là một trong những dạng thức I/O quan trọng  Bộ nhớ chính (main memory, primary memory)  CPU chỉ có thể truy cập trực tiếp thanh ghi (registers) và bộ nhớ ROM, RAM  Bộ nhớ phụ (secondary storage)  Hệ thống lưu trữ thông tin bền vững (nonvolatile storage)  Đĩa từ (magnetic disks): đĩa mềm, đĩa cứng, băng từ  Đĩa quang (optical disk): CD-ROM, DVD-ROM  Flash ROM: USB disk 1.A.33 Phân cấp hệ thống lưu trữ Tốc độ cao Giá thành thấp Dung lượng lớn vd: file-system data Cơ chế caching  Caching  nạp trước dữ liệu vào thiết bị lưu trữ tốc độ cao hơn  Tại sao phải dùng cache?  Chênh lệch lớn giữa tốc độ CPU và tốc độ bộ nhớ RAM, đĩa,…  Khai thác nguyên lý cục bộ (locality)  Kích thước cache nhỏ  phải quản lý cache: thay nội dung cache  Trong cơ chế caching, một dữ liệu có thể được lưu trữ nhiều nơi  phải bảo đảm tính nhất quán dữ liệu: cache coherency problem A: dữ liệu 34 1.A.35 Bảo vệ phần cứng – dual mode  Cơ chế dual-mode: cần có phần cứng hỗ trợ  User mode – thực thi với quyền hạn của user bình thường  Kernel mode (còn gọi là supervisor mode, system mode, monitor mode) – có toàn quyền truy xuất tài nguyên hệ thống Phần cứng có thêm mode bit để kiểm soát mode hiện hành:  mode bit = 0: kernel mode  mode bit = 1: user mode  Khi có ngắt hoặc có lỗi xảy ra, hệ thống sẽ chuyển sang kernel mode. 1.A.36 Bảo vệ phần cứng – I/O  Lệnh I/O đều là privileged instruction  Users không được phép tương tác trực tiếp với các thiết bị I/O mà phải thông qua lời gọi system call System call  Là phương thức duy nhất để process yêu cầu các dịch vụ của hệ điều hành  System call sẽ gây ra ngắt mềm (trap), quyền điều khiển được chuyển đến trình phục vụ ngắt tương ứng, đồng thời thiết lập mode = 0 (kernel mode).  Hệ điều hành kiểm tra tính hợp lệ, đúng đắn của các đối số, thực hiện yêu cầu rồi trả quyền điều khiển về lệnh kế tiếp ngay sau lời gọi system call, mode = 1. Bảo vệ phần cứng – Bộ nhớ Vd: bảo vệ bộ nhớ dùng 2 thanh ghi - Truy cập bộ nhớ ngoài vùng xác định bởi thanh ghi base và thanh ghi limit sẽ sinh ra trap - Lệnh nạp giá trị cho các thanh ghi base và thanh ghi limit đều là privileged instruction (a) (b) 37 1.A.38 Bảo vệ phần cứng – CPU  Bảo vệ CPU  Bảo đảm HĐH duy trì được quyền điều khiển  Tránh trường hợp CPU bị kẹt trong các vòng lặp vô hạn Cơ chế thực hiện là dùng timer để kích khởi các ngắt định kỳ  Bộ đếm timer sẽ giảm dần sau mỗi xung clock.  Khi bộ đếm timer bằng 0 thì ngắt timer được kích hoạt  hệ điều hành sẽ nắm quyền điều khiển.  Lệnh nạp giá trị bộ đếm timer là một privileged instruction. 1.A.39 Timer  Có thể sử dụng timer để thực hiện cơ chế time- sharing.  Thiết lập timer gây ngắt định kỳ N ms (N: time slice, quantum time) và định thời CPU sau mỗi lần ngắt.  Có thể dùng timer để tính thời gian trôi qua (elapse time) Cấu Trúc Hệ Điều Hành  Các thành phần của hệ điều hành  Các dịch vụ hệ điều hành cung cấp  Giao tiếp giữa tiến trình và hệ điều hành  Các chương trình hệ thống (system programs)  Cấu trúc logic của hệ thống  Máy ảo (virtual machine) 40 Các thành phần của hệ điều hành  Quản lý tiến trình (process management)  tiến trình vs. chương trình  Một tiến trình cần các tài nguyên của hệ thống như CPU, bộ nhớ, file, thiết bị I/O,… để hoàn thành công việc.  Các nhiệm vụ của thành phần  Tạo và hủy tiến trình  Tạm ngưng/tiếp tục thực thi (suspend/resume) tiến trình  Cung cấp các cơ chế  đồng bộ hoạt động các tiến trình (synchronization)  giao tiếp giữa các tiến trình (interprocess communication)  khống chế deadlock 41 Các thành phần của hệ điều hành (tt)  Quản lý bộ nhớ chính  Để có hiệu suất sử dụng CPU và thời gian đáp ứng tốt, hệ điều hành cần dùng giải thuật quản lý bộ nhớ thích hợp  Các nhiệm vụ của thành phần  Theo dõi, quản lý các vùng nhớ trống và đã cấp phát  Quyết định sẽ nạp chương trình nào khi có vùng nhớ trống  Cấp phát và thu hồi các vùng nhớ 42 Các thành phần của hệ điều hành (tt)  Quản lý file (file management)  Hệ thống file (file system)  File  Thư mục  Các dịch vụ mà thành phần cung cấp  Tạo và xoá file/thư mục.  Các tác vụ xử lý file/thư mục (rename, copy, move, new,…)  “Ánh xạ” file/thư mục vào thiết bị lưu trữ thứ cấp tương ứng  Sao lưu và phục hồi dữ liệu 43 Các thành phần của hệ điều hành (tt)  Quản lý hệ thống I/O (I/O system management)  Che dấu các đặc trưng riêng biệt của từng thiết bị I/O  Có chức năng  Cơ chế: buffering, caching, spooling  Cung cấp giao diện chung đến các trình điều khiển thiết bị (device-driver interface)  Trình điều khiển thiết bị (device driver) cho mỗi chủng loại thiết bị phần cứng khác nhau. 44 1.B.45 Các thành phần của hệ điều hành (tt)  Quản lý hệ thống lưu trữ thứ cấp (secondary storage management)  Bộ nhớ chính: kích thước nhỏ, là môi trường chứa tin không bền vững  cần hệ thống lưu trữ thứ cấp để lưu trữ bền vững các dữ liệu, chương trình  Phương tiện lưu trữ thông dụng là đĩa từ, đĩa quang  Nhiệm vụ của thành phần  Quản lý vùng trống (free space management)  Cấp phát không gian lưu trữ (storage allocation)  Định thời đĩa (disk scheduling) Các thành phần của hệ điều hành (tt)  Hệ thống bảo vệ Khi hệ thống cho phép nhiều user hay nhiều tiến trình  Kiểm soát tiến trình người dùng đăng nhập/xuất và sử dụng hệ thống  Kiểm soát việc truy cập các tài nguyên trong hệ thống  Bảo đảm chỉ những người dùng/tiến trình đủ quyền hạn mới được phép sử dụng các tài nguyên tương ứng  Các nhiệm vụ của thành phần  Cung cấp cơ chế kiểm soát đăng nhập/xuất (login, log out)  Phân định được sự truy cập tài nguyên hợp pháp và bất hợp pháp (authorized/unauthorized)  Phương tiện thi hành các chính sách (enforcement of policies) Chính sách: cần bảo vệ dữ liệu của ai đối với ai 46 Các thành phần của hệ điều hành (tt)  Trình thông dịch lệnh  Là giao diện chủ yếu giữa người dùng và HĐH  Ví dụ: shell, mouse-based window-and-menu  Khi user login  command line interpreter (shell) chạy, và chờ nhận lệnh từ người dùng, thực thi lệnh và trả kết quả về  Liên hệ chặt chẽ với các thành phần khác của hệ điều hành để thực thi các yêu cầu của người dùng  Các nhóm lệnh trình thông dịch lệnh để  Tạo, hủy, xem thông tin tiến trình, hệ thống  Điều khiển truy cập I/O  Quản lý, truy cập hệ thống lưu trữ thứ cấp  Quản lý, sử dụng bộ nhớ  Truy cập hệ thống file  … 47 Các dịch vụ hệ điều hành  Một số dịch vụ chủ yếu mà người dùng hay chương trình cần  Thực thi chương trình  Thực hiện các tác vụ I/O do yêu cầu của chương trình  Các tác vụ lên hệ thống file  Đọc/ghi hay tạo/xóa file  Cơ chế giao tiếp, trao đổi thông tin giữa các tiến trình  Shared memory  Message passing  Phát hiện lỗi  Trên thiết bị I/O: dữ liệu hư, hết giấy,…  Chương trình ứng dụng: chia cho 0, truy cập đến địa chỉ bộ nhớ không được phép 48 Các dịch vụ hệ điều hành (tt)  Các chức năng khác (giúp hệ điều hành chạy hữu hiệu)  Cấp phát tài nguyên (resource allocation)  Tài nguyên: CPU, bộ nhớ chính, tape drives,…  HĐH có các routine tương ứng  Kế toán (accounting)  Ví dụ để tính phí  Bảo vệ (protection)  Các tiến trình lạ nhau không được ảnh hưởng nhau  Kiểm soát được các truy cập vào tài nguyên  An ninh (security)  Chỉ các user được phép sử dụng hệ thống mới truy cập được tài nguyên của hệ thống (vd: thông qua password) 49 Giao tiếp giữa tiến trình và hệ điều hành  System call  Cung cấp giao diện giữa tiến trình và hệ điều hành  Vd: open, read, write file  Thông thường ở dạng thư viện nhị phân (binary libraries)  Trong các ngôn ngữ lập trình cấp cao, một số thư viện lập trình được xây dựng dựa trên các thư viện hệ thống (ví dụ Windows API, thư viện GNU C/C++ như glibc, glibc++,…)  Ba phương pháp truyền tham số khi sử dụng system call  Truyền thông số qua thanh ghi  Truyền tham số thông qua một vùng nhớ, địa chỉ của vùng nhớ được gửi đến hệ điều hành qua thanh ghi  Truyền tham số qua stack 50 Các chương trình hệ thống  Chương trình hệ thống (system program, phân biệt với application program) gồm  Quản lý hệ thống file: như create, delete, rename, list  Thông tin trạng thái: như date, time, dung lượng bộ nhớ trống  Soạn thảo file: như file editor  Hỗ trợ ngôn ngữ lập trình: như compiler, assembler, interpreter  Nạp, thực thi, giúp tìm lỗi chương trình: như loader, debugger  Giao tiếp: như email, talk, web browser…  Người dùng chủ yếu làm việc thông qua các system program (không làm việc “trực tiếp” với các system call) 51 1.B.52 Cấu trúc logic của hệ thống  Hệ thống đơn (monolithic)  MS-DOS: khi thiết kế, do giới hạn về dung lượng bộ nhớ nên không phân chia module (modularization), chưa phân chia rõ chức năng giữa các phần của hệ thống.  MS-DOS, xem như được phân lớp (layered): Cấu trúc logic của hệ thống (tt)  Hệ thống đơn (monolithic)  UNIX: gồm hai phần  các system program và kernel (file system, CPU scheduling, memory management, và một số chức năng khác) Xem như được phân lớp: signals terminal handling character I/O system terminal drivers file system swapping block I/O system disk and tape drivers 1.A.53 Cấu trúc logic của hệ thống (tt)  Thiết kế HĐH: phân chia module theo cách phân lớp (layered). Vd: hệ điều hành OS/2 54 Cấu trúc logic của hệ thống (tt)  Thiết kế HĐH: phân chia module theo microkernel (CMU Mach HĐH, 1980)  Chuyển một số chức năng của HĐH từ kernel space sang user space  Thu gọn kernel  microkernel, microkernel chỉ bao gồm các chức năng tối thiểu như quản lý tiến trình, bộ nhớ và cơ chế giao tiếp giữa các tiến trình  Giao tiếp giữa các module qua cơ chế truyền thông điệp Application File server X-application X-window server POSIX application POSIX server Microkernel một module 55 Máy ảo  Từ HĐH layer đến máy ảo (virtual machine) Non-virtual machine system model Virtual machine system model processes kernel hardware processes processes processes kernel kernel kernel VM1 VM2 VM3 Virtual-machine implementation hardware programming interface 56 1.B.57 Máy ảo (tt)  Hiện thực ý niệm VM  Làm thế nào để thực thi một chương trình MS-DOS trên một hệ thống Sun với hệ điều hành Solaris? 1. Tạo một máy ảo Intel bên trên hệ điều hành Solaris và hệ thống Sun 2. Các lệnh Intel (x86) được máy ảo Intel chuyển thành lệnh tương ứng của hệ thống Sun. Sun hardware Solaris kernel VM interpretation Intel x86 VM Intel x86 Application

Các file đính kèm theo tài liệu này:

  • pdfsinhvienit_net_hdh_chuong_1_7956.pdf
Tài liệu liên quan