Bài giảng Hệ điều hành nâng cao
Tại sao cần tìm hiểu Hệ điều hành ?
? Để phá vỡ sự “bí ẩn” của hệ thống :
? Tại sao máy tính có thể “biết” được nội dung đĩa ?
? Tại sao có thể vừa soạn thảo, vừa nghe nhạc trên cùng 1 máy
tính (có 1 CPU ?)
? Tại sao 1 ứng dụng kích thước 1 M có thể hoạt động trên
Windows mà bị báo “Not enough memory” trên DOS ?
? Để khai thác tốt hơn môi trường làm việc :
? Lập trình trên môi trường đa nhiệm (multitask), đa xử
lý(multiprocessing) với các mô hình multiprocess,
multithreads.
? Sử dụng bộ nhớ hiệu quả
? sử dụng các cơ chế Thông tin liên lạc, an toàn & bảo mật
? Vì là môn học bắt buộc
Chức năng của Hệ điều hành
? Quản trị tài nguyên (resource principle) :
? Tài nguyên : CPU, Mem, IO; Files, ports, mailboxes
? Đối tượng sử dụng tài nguyên : Process, Thread
? Nhiệm vụ : Cung cấp các giải thuật cấp phát, quản lý tài
nguyên.cho các đối tượng hoạt động trong hệ thống
? Mục tiêu : Cấp phát đầy đủ, công bằng R cho Ps; Sử dụng
hiệu quả Rs, Nâng cao thông lượng Ps
? Trừu tượng hoá hệ thống (beautification principle)
? Nhiệm vụ : Cung cấp các giải thuật để che dấu chi tiết phần
cứng, tạo 1 môi trường dễ làm việc hơn (hope) cho user
? Mục tiêu : tạo môi trường an toàn, tạo sự trừu tượng hoá,
độc lập thiết bị
? Ví dụ : device driver
Tóm tắt nội dung tài liệu: Bài giảng Hệ điều hành nâng cao
1HỆ ĐIỀU HÀNH NÂNG CAO Trường đại học Khoa học tự nhiên Khoa Công nghệ Thông tin Trần Hạnh Nhi Simpo PDF Merge and Split Unregistered Version - 2Tổ chức Phụ trách Lý thuyết : Trần Hạnh Nhi Phụ trách thực hành: Phạm Nguyễn Anh Huy Trần Anh Tuấn Lê Thụy Anh Đinh Bá Tiến Trang web của môn học : Simpo PDF Merge and Split Unregistered Version - 3Mục tiêu Kết quả mong đợi về lý thuyết : Hiểu được cách thức Hệ điều hành làm việc Nắm được các nguyên lý thiết kế Hệ điều hành Biết được một số cơ chế, chiến lược cơ bản để giải quyết các nhiệm vụ của Hệ điều hành Kết quả cần đạt được về thực hành Vận dụng được các kiến thức lý thuyết để cài đặt giả lặp một số module của Hệ điều hành Sử dụng được các cơ chế hỗ trợ của một Hệ điều hành cụ thể (Windows NT) để giải quyết các bài toán cơ bản. Simpo PDF Merge and Split Unregistered Version - 4Kiến thức yêu cầu Kiến trúc Máy tính Hệ điều hành cơ bản Lập trình C/C++ Simpo PDF Merge and Split Unregistered Version - 5Tính điểm 70% Lý thuyết + 30% Thực hành Lý thuyết : 1 bài thi cuối khoá (không tham khảo tài liệu) Mỗi sinh viên làm bài độc lập Thực hành: 2 bài tập lớn Thời hạn và cách thức nộp bài sẽ do giáo viên phụ trách thực hành qui định Mỗi nhóm thực hành gồm 2 sinh viên Bắt buộc có nộp bài thực hành mới được thi lý thuyết Simpo PDF Merge and Split Unregistered Version - 6Tài liệu tham khảo Trần Hạnh Nhi : Giáo trình Hệ điều hành Nâng cao A.Silberschatz & P/Galvin : OS concepts (5e) Slides : W. Stallings : Operating Systems A.Tanenbaum et al : OS Design and Implementation Minix : R.Finkel:: An OS vade mecum Book online : Jeffrey Richter : Advanced Windows Tiến Huy- Đan Thư- Hạnh Nhi : Kỹ thuật lập trình trên Windows NT Simpo PDF Merge and Split Unregistered Version - 7Nội dung Chương 1 : Tổ chức Hệ điều hành Chương 2 : Quản lý tiến trình Chương 3 : Liên lạc giữa các tiến trình Chương 4 : Quản lý bộ nhớ chính Chương 5 : An toàn hệ thống Simpo PDF Merge and Split Unregistered Version - 8Bài giảng 1 : Giới thiệu Tại sao phải tìm hiểu về Hệ điều hành ? Hệ điều hành là gì ? Vai trò trong hệ thống ? Chức năng ? Kiến trúc ? Các nguyên lý thiết kế Hệ điều hành Simpo PDF Merge and Split Unregistered Version - 9Tại sao cần tìm hiểu Hệ điều hành ? Để phá vỡ sự “bí ẩn” của hệ thống : Tại sao máy tính có thể “biết” được nội dung đĩa ? Tại sao có thể vừa soạn thảo, vừa nghe nhạc trên cùng 1 máy tính (có 1 CPU ?) Tại sao 1 ứng dụng kích thước 1 M có thể hoạt động trên Windows mà bị báo “Not enough memory” trên DOS ? Để khai thác tốt hơn môi trường làm việc : Lập trình trên môi trường đa nhiệm (multitask), đa xử lý(multiprocessing) với các mô hình multiprocess, multithreads.. Sử dụng bộ nhớ hiệu quả sử dụng các cơ chế Thông tin liên lạc, an toàn & bảo mật Vì là môn học bắt buộc Simpo PDF Merge and Split Unregistered Version - 10 Hệ điều hành, anh là ai ? Ưùng dụng Hệ điều hành Phần cứng Giao diện ảo Giao diện vật lý Simpo PDF Merge and Split Unregistered Version - 11 Chức năng của Hệ điều hành Quản trị tài nguyên (resource principle) : Tài nguyên : CPU, Mem, IO; Files, ports, mailboxes Đối tượng sử dụng tài nguyên : Process, Thread Nhiệm vụ : Cung cấp các giải thuật cấp phát, quản lý tài nguyên.cho các đối tượng hoạt động trong hệ thống Mục tiêu : Cấp phát đầy đủ, công bằng R cho Ps; Sử dụng hiệu quả Rs, Nâng cao thông lượng Ps Trừu tượng hoá hệ thống (beautification principle) Nhiệm vụ : Cung cấp các giải thuật để che dấu chi tiết phần cứng, tạo 1 môi trường dễ làm việc hơn (hope) cho user Mục tiêu : tạo môi trường an toàn, tạo sự trừu tượng hoá, độc lập thiết bị Ví dụ : device driver Simpo PDF Merge and Split Unregistered Version - 12 Các thành phần Quản lý tiến trình Quản lý bộ nhớ chính Quản lý nhậäp xuất Quản lý bộ nhớ phụ Hệ thống tập tin Hệ thống bảo vệ Giao tiếp mạngBộ thông dịch lệnh Simpo PDF Merge and Split Unregistered Version - 13 Kiến trúc Hệ điều hành Đơn giản (Monolithic) Hạt nhân (Kernel) Phân lớp (Layered) Máy ảo (Virtual Machine) Hướng đối tượng (OOOS) Exokernel Simpo PDF Merge and Split Unregistered Version - 14 Monolithic Simpo PDF Merge and Split Unregistered Version - 15 Monolithic OS = Thư viện tiện ích Có thể tổ chức thành nhiều module : CPU scheduling, Mem Management, Device managementnhưng chỉ có 1 trong những module này hoạt động tại một thời điểm Đơn nhiệm Quyền điều khiển được chuyển đổi thông qua lời gọi hàm Khi tầm vóc phát triển hệ thống trở nên thiếu tin cậy. Ví dụ : MS-DOS, Ultrix (mature Unix) Simpo PDF Merge and Split Unregistered Version - 16 Kernel Simpo PDF Merge and Split Unregistered Version - 17 Kernel OS = Kernel + System processes Kernel được bảo vệ Đa nhiệm Kernel chịu trách nhiệm phân chia thời gian sử dụng CPU, Giao tiếp giữa các tiến trình Chỉ có 2 mức kernel/non-kernel =>kernel lớn, thiếu tin cậy như trước Định nghĩa cứng các giao tiếp với ứng dụng trong kernel Ví dụ : Windows NT Simpo PDF Merge and Split Unregistered Version - 18 Layered Simpo PDF Merge and Split Unregistered Version - 19 Layered OS = các lớp trừu tượng hoá một tác vụ quản lý Lớp trên được sử dụng các hàm xử lýù tài nguyên thuộc tác vụ do lớp dưới cung cấp Khó xác định được các lớp xử lý rạch ròi, thứ tự lớp ? Tạo tiến trình -> PM gọi MM Bộ nhớ đầy -> MM gọi PM Xếp lớp theo hàm xử lý , thay vì tác vụ Seg management- P scheduling- Seg creation- P creation Ví dụ : THE , MULTICS Simpo PDF Merge and Split Unregistered Version - 20 Virtual Machine Simpo PDF Merge and Split Unregistered Version - 21 Virtual Machine OS = Virtualizing kernel + virtual machines Virtual machine = physical hardware Virtualizing kernel tạo ra nhiều VM trên 1 máy tính. Process interface = hardware interface Ưu điểm : Môi trường thuận lợi cho sự tương thích (compatibility) Tăng tính an toàn hệ thống do cung cấp các VM độc lập. Dể phát triển các HDH đơn nhiệm cho mỗi VM Khuyết điểm: Phức tạp cho việc giả lặp (transput, add translation) Ví dụ : CMS(conversational Monitor System) trên VM/370 (hỗ trợ hardware) Simpo PDF Merge and Split Unregistered Version - 22 OOOS OS = tập các đối tượng Tiến trình, tập tin, hàm, khối nhớ Một hàm xử lý (kernel/non-kernel mode) thao tác trên một tập các đối tượng. Che dấu thông tin Ví dụ :CAP, StarOS, iMAX432 Simpo PDF Merge and Split Unregistered Version - 23 Exokernel Simpo PDF Merge and Split Unregistered Version - 24 Exokernel Hướng đến một HDH linh đông trong giao tiếp với ứng dụng, cho phép ứng dụng chuyên biệt hoá hệ điều hành theo nhu cầu đặc thù một cách dễ dàng OS = Exokernel + Library OS Ưùng dụng có thể phát triển các mô hình tổ chức VM, IPC theo nhu cầu riêng Ví dụ : ý tưởng của project do Dawson R Engler et al phát triển tại MIT Simpo PDF Merge and Split Unregistered Version - 1Bài 2 : CÁC MÔ HÌNH XỬ LÝ ĐỒNG HÀNH XỬ LÝ ĐỒNG HÀNHVÌ SAO ? VẤN ĐỀ ? Simpo PDF Merge and Split Unregistered Version - 2Xử lý đồng hành, để tăng hiệu suất sử dụng CPU CPU IO CPU IO CPU Job 1 Job 1 IO CPU IOCPU Job 1 CPU IO CPU Job 2 CPU Job 1 Job 1Job 1 Job 1 Simpo PDF Merge and Split Unregistered Version - 3Xử lý đồng hành, để tăng tốc độ xử lý Job : kq = a*b + c*d; Xử lý tuần tự : Xử lý đồng hành : kq1 = a * b; kq2 = c* d; kq = kq1 + kq2; kq = kq1 + kq2; kq2 = c*d;kq1 = a*b; Simpo PDF Merge and Split Unregistered Version - 4Xử lý đồng hành, những khó khăn ? HĐH : “ Giải quyết nhiều công việc đồng thời, đâu có dễ ! - Tài nguyên giới hạn, ứng dụng “vô hạn” - Nhiều hoạt động đan xen ??? Phân chia tài nguyên ? ??? Chia sẻ tài nguyên ? ??? Bảo vệ? Excel Visual C++ CDplayer Winword Simpo PDF Merge and Split Unregistered Version - 5Giải pháp HĐH : “ Ai cũng có phần khi đến lượt mà ! ” -“Chia để trị”, cô lập các hoạt động. - Mỗi thời điểm chỉ giải quyết 1 yêu cầu. - Aûo hoá tài nguyên : biến ít thành nhiều Winword CDPlayer Visual C ++ Excel Simpo PDF Merge and Split Unregistered Version - 6Thuật ngữ Concurrency (đồng hành): mô hình xử lý nhiều tác vụ đồng thời. Multitasking (đa nhiệm) : cho phép nhiều tác vụ/ công việc được xử lý đồng thời Multiprogramming (đa chương) : cho phép nhiều chương trình được thực hiện đồng thời (trên 1 CPU) Multiprocessing (đa xử lý): nhiều bộ xử lý làm việc đồng thời Simpo PDF Merge and Split Unregistered Version - 7Khái niệm tiến trình P2 int a; IP P1 int a; IP Simpo PDF Merge and Split Unregistered Version - 8Mô hình đa tiến trình (MultiProcesses) Hệ thống là một tập các tiến trình hoạt động đồng thời Các tiến trình độc lập với nhau => không có sự trao đổi thông tin hiển nhiên.. winword Visual C CDplayer Excel OS Simpo PDF Merge and Split Unregistered Version - 9Mô hình đa tiểu trình (MultiThreads) Muốn nhiều dòng xử lý đồng thời cùng chia sẻ tài nguyên (server, OS, các chương trình tính toán song song) alta vista TIỂU TRÌNH (THREAD) Simpo PDF Merge and Split Unregistered Version - 10 Khác biệt giữa Tiểu trình & Tiến trình Tiểu trình : 1 dòng xử lý Tiến trình : 1 không gian địa chỉ 1 hoặc nhiều tiểu trình Các tiến trình là độc lập Các tiểu trình trong cùng 1 tiến trình không có sự bảo vệ lẫn nhau (cần thiết ? ). P1 int a; T1 T2 T 3 Simpo PDF Merge and Split Unregistered Version - 11 Tiểu trình hạt nhân (Kernel thread) Khái niệm tiểu trình được xây dựng bên trong hạt nhân T1 T2 HDH System call User mode Kernel mode Simpo PDF Merge and Split Unregistered Version - 12 Tiểu trình người dùng (User thread) Khái niệm tiểu trình được hỗ trợ bởi một thư viện hoạt động trong user mode T1 Kernel T2 User mode Kernel mode T3 LWP1 LWP2 P1 P2 Simpo PDF Merge and Split Unregistered Version - 1Bài 3 : QUẢN LÝ TIẾN TRÌNH Phân chia CPU cho các tiến trình ? Tiếp cận Mục tiêu ? Tổ chức ? Chiến lược ? Trạng thái tiến trình ? Lưu trữ thông tin tiến trình ? Các thao tác trên tiến trình ? Bảo vệ tiến trình ? Trao đổi thông tin giữa các tiến trình ? Simpo PDF Merge and Split Unregistered Version - 2Phân chia CPU ? 1 CPU vật lý : làm thế nào để tạo ảo giác mỗi tiến trình sở hữu CPU riêng của mình ? Dispatcher luân chuyển CPU giữa các tiến trình: Ngữ cảnh xử lý riêng biệt cho mỗi tiến trình (PCB) Dispatching loop : CPU while(1) { interrupt Pcur save state Pcur Scheduler gets Pnext load state Pnext jump to it } Simpo PDF Merge and Split Unregistered Version - 3Trạng thái tiến trình ? ready Rs CPU running Rs CPU blocked Rs CPU Nhận CPU Trả CPU Chờ R Nhận R Simpo PDF Merge and Split Unregistered Version - 4Khối quản lý tiến trình trong mô hình multiprocesses pid State (State, details) Context (IP, Mem, Files) Scheduling statistic Relatives ( Dad, children) Process control Block PCB Simpo PDF Merge and Split Unregistered Version - 5PCB và TCB trong mô hình multithreads pid Threads list Context (Mem, global ressources) Scheduling statistic Relatives ( Dad, children) PCB tid State (State, details) Context (IP, local stack) Thread Control Block TCB Simpo PDF Merge and Split Unregistered Version - 6Các thao tác trên tiến trình Tạo lập tiến trình : Cấp phát tài nguyên cho tiến trình con ? Hoạt động của cha và con độc lập Kết thúc tiến trình : Thu hồi tài nguyên ? Eùp buộc kết thúc ? Thay đổi trạng thái tiến trình : Assign(), Block(), Awake(), Resume(), Suspend() Simpo PDF Merge and Split Unregistered Version - 7Trạng thái tiến trình ? Có nhu cầu Suspend &Resume : Hệ thống quá tải Kiểm soát hoạt động của tiến trình con Simpo PDF Merge and Split Unregistered Version - 8An ninh trật tự cho môi trường đa tiến trình ! Bảo vệ tiến trình : Ngăn cản các tiến trình xâm phạm tài nguyên, can thiệp vàoxử lý của nhau => KGĐC riêng biệt, 2 mode xử lý Bảo đảm quyền tiến triển xử lý cho mỗi tiến trình => công bằng trong các chiến lược phân phối tài nguyên. Trao đổi thông tin , phối hợp hoạt động ? Nhu cầu ? Vấn đề ? => Chương kế tiếp Giải pháp ? Simpo PDF Merge and Split Unregistered Version - 9Các danh sách tiến trình Ready List P1 P4 P5 Waiting Lists R1 P7P2 P10P3 P6 R1 R1 Simpo PDF Merge and Split Unregistered Version - 10 Điều phối tiến trình Mục tiêu ? Các cấp độ điều phối Thời điểm ra quyết định điều phối ? Đánh giá chiến lược điều phối ? Một số chiến lược điều phối Simpo PDF Merge and Split Unregistered Version - 11 Điều phối tiến trình SCHEDULER chọn một tiến trình nhận cpu DISPATCH ER chuyển đổi ngữ cảnh Simpo PDF Merge and Split Unregistered Version - 12 Chuyển đổi ngữ cảnh (context switching) Kịch bản : Lưu ngữ cảnh tiến trình hiện hành Nạp ngữ cảnh tiến trình được chọn kế tiếp Chi tiết cụ thể phụ thuộc vào phần cứng general-purpose & floating point registers, co- processor state Chi phí chuyển đổi ngữ cảnh : Giữa các tiến trình ? Giữa các tiểu trình ? Simpo PDF Merge and Split Unregistered Version - 13 Chuyển đổi ngữ cảnh giữa các tiến trình Chuyển đổi mode xử lý Chuyển đổi IP và các thanh ghi khác của CPU Chuyển đổi không gian địa chỉ P1 P2 Dispatcher System call User mode Kernel mode Simpo PDF Merge and Split Unregistered Version - 14 Tiểu trình hạt nhân (Kernel thread) Khái niệm tiểu trình được xây dựng bên trong hạt nhân Distpatcher làm việc với đơn vị là tiểu trình T1 T2 Dispatcher System call User mode Kernel mode Simpo PDF Merge and Split Unregistered Version - 15 Tiểu trình người dùng (User thread) Khái niệm tiểu trình được hỗ trợ bởi một thư viện hoạt động trong user mode Distpatcher của hạt nhân làm việc với đơn vị là tiến trình ThreadDistpatcher làm việc với đơn vị là tiểu trình P -– LWP - T Không cần chuyển đổi chế độ xử lý khi chuyển đổi các tiểu trình cùng thuộc 1 tiến trình. T1 Kernel T2 User mode Kernel mode T3 LWP1 LWP2 P1 P2 Simpo PDF Merge and Split Unregistered Version - 16 Lựa chọn tiến trình ? Tác vụ của Scheduler Mục tiêu ? Sử dụng CPU hiệu quả Đảm bảo tất cả các tiến trình đều tiến triển xử lý Tiêu chuẩn lựa chọn ? Tất cả các tiến trình đều như nhau ? Đề xuất một độ ưu tiên cho mỗi tiến trình ? Thời điểm lựa chọn ? (Thời điểm kích hoạt Scheduler()) Simpo PDF Merge and Split Unregistered Version - 17 Mục tiêu điều phối Hiệu qủa (Efficiency) Thời gian Đáùp ứng (Response time) Hoàn tất(Turnaround Time = Tquit -Tarrive): Chờ (Waiting Time = T in Ready ) : Thông lượng (Throughput = # jobs/s ) Hiệu suất Tài nguyên Chi phí chuyển đổi Công bằng ( Fairness) : Tất cả các tiến trình đều có cơ hội nhận CPU Simpo PDF Merge and Split Unregistered Version - 18 Các cấp độ điều phối Longterm scheduling : chọn tiến trình kế tiếp được khởi động (mang vao bộ nhớ và nhận trạng thái ready) Mediumterm scheduling : quyết định chuyển tiến trình đang running sang trạng thái blocked. Shorterm scheduling : chọn 1 tiến trình ở trạng thái ready để chuyển sang trạng thái running. Không có sự phân biệt rõ ràng hoàn toàn giữa 3 cấp Simpo PDF Merge and Split Unregistered Version - 19 Thời điểm ra quyết định điều phối Điều phối độc quyền (non-preemptive scheduling): tiến trình được chọn độc chiếm CPU Điều phối không độc quyền (preemptive scheduling): tiến trình được chọn có thể bị « cướp » CPU bởi tiến trình có độ ưu tiên cao hơn Simpo PDF Merge and Split Unregistered Version - 20 Các chiến lược điều phối FIFO RR SJF MULTILEVELFEEDBACK LOTTERY Simpo PDF Merge and Split Unregistered Version - 21 FIFO – RR -SJF FIFO RR SJF addrun run add Simpo PDF Merge and Split Unregistered Version - 22 Multilevel Feedback priority Simpo PDF Merge and Split Unregistered Version - 23 Lottery 1 11 1 P1 P2 P3 P4 1 17 1 P1 P2 P3 P4 P2 có 25 % cơ hội P2 có 70 % cơ hội Simpo PDF Merge and Split Unregistered Version - 1BÀI 4 : LIÊN LẠC GIỮA CÁC TIẾN TRÌNH & VẤN ĐỀ ĐỒNG BỘ HOÁ CƠ CHẾ ? VẤN ĐỀ ? TRAO ĐỔI THÔNG TIN GIỮA CÁC TIẾN TRÌNH GỈAI PHÁP ? Simpo PDF Merge and Split Unregistered Version - 2Nhu Cầu Liên Lạc Q Lp Chia sẻ thông tin R Phối hợp tăng tốc độ xử lý Q L p JOB Simpo PDF Merge and Split Unregistered Version - 3Các Cơ Chế Liên Lạc Signal Không truyền được dữ liệu Pipe Truyền dữ liệu không cấu trúc Shared Memory Broadcast Mâu thuẫn truy xuất => nhu cầu đồng bộ hoá Message Liên lạc trên môi trường phân tán Socket Liên lạc trên nhiều môi trường khác biệt Simpo PDF Merge and Split Unregistered Version - 4Race condition hits = 0 + 1 read hits (0) hits = 0 + 1 read hits (0) P1 P2 hits = 1 hits = 0 time Kết quả cuối cùng không dự đoán được ! P1 và P2 chia sẻ biến chung hits Simpo PDF Merge and Split Unregistered Version - 5Miền găng (critical section) hits = 0 + 1 read hits (0) hits = 0 + 1 read hits (0) P1 P2 CSCS CS là đoạn chương trình có khả năng gây ra hiện tượng race condition Simpo PDF Merge and Split Unregistered Version - 6Giải pháp tổng quát Bảo đảm tính “độc quyền truy xuất” miền găng tại một thời điểm hits = hits + 1 P1 P2 hits = 2 hits = 0 time hits = hits + 1 Simpo PDF Merge and Split Unregistered Version - 7Mô hình đảm bảo độc quyền truy xuất Kiểm tra và dành quyền vào CS CS; Từ bỏ quyền sử dụng CS Simpo PDF Merge and Split Unregistered Version - 8Rendez-Vous Làm thế nào bảo đảm trình tự thực hiện Job1 - Job2 ? P1 P2 Job1; Job2; Simpo PDF Merge and Split Unregistered Version - 9Giải pháp Hai tiến trình cần trao đổi thông tin về diễn tiến xử lý P1 P2 Job1; Job2; Simpo PDF Merge and Split Unregistered Version - 10 Mô hình tổ chức phối hợp hoạt động giữa hài tiến trình P1 P2 Job1; Chờ ;Báo hiệu ; Job2; Simpo PDF Merge and Split Unregistered Version - 11 Bài toán đồng bộ hoá Nhiều tiến trình chia sẻ tài nguyên chung đồng thời : Tranh chấp ? Nhu cầu “độc quyền truy xuất” (mutual exclusion) Các tiến trình phối hợp hoạt động : Tương quan diễn tiến xử lý ? Nhu cầu “hò hẹn” (rendez-vous) Simpo PDF Merge and Split Unregistered Version -
File đính kèm:
- bai_giang_he_dieu_hanh_nang_cao.pdf