TIỂU LUẬN XỬ LÝ SONG SONG

35 1 0
Tài liệu đã được kiểm tra trùng lặp
TIỂU LUẬN XỬ LÝ SONG SONG

Đ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

Trang 1

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI KHOA ĐIỆN – ĐIỆN TỬ

TIỂU LUẬN XỬ LÝ SONG SONG

Gv phụ trách học phần: TS Nguyễn Duy Anh Học viên thực hiện: MOEURN SOKLIN

Lớp: Cao học Kỹ thuật điện tử - K 31.1

Trang 2

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI KHOA ĐIỆN – ĐIỆN TỬ

TIỂU LUẬN XỬ LÝ SONG SONG

Gv phụ trách học phần: TS Nguyễn Duy Anh Học viên thực hiện: MOEURN SOKLIN

Lớp: Cao học Kỹ thuật điện tử - K 31.1

Trang 3

i

MỤC LỤC

CHƯƠNG I: TỔNG QUAN VỀ XỬ LÝ SONG SONG 1

1.1 TẠI SAO CHÚNG TA CẦN HIỆU SUẤT TĂNG LÊN? 1

1.2 XÂY DỰNG HỆ THỐNG XỬ LÝ SONG SONG 1

1.3 CHƯƠNG TRÌNH XỬ LÝ SONG SONG 2

1.4 VIẾT CHƯƠNG TRÌNH XỬ LÝ SONG SONG 5

2.1.1 Cấu trúc von Neumann 10

2.1.2 Các quy trình, đa nhiệm và luồng 11

2.2 BIẾN ĐỔI MÔ HÌNH VON NEUMANN 12

2.2.1 Khái niệm cơ bản về bộ nhớ đệm (caching) 12

2.3.1 Hệ thống SIMD (Single Instruction, Multiple Data) 19

2.3.2 Hệ thống MIMD (Multiple Instruction, Multiple Data) 20

2.3.3 Mạng kết nối (Interconnection networks) 23

2.3.4 Bộ nhớ cache Coherence 26

2.3.5 Bộ nhớ dùng chung so với bộ nhớ phân tán 27

2.4 HIỆU SUẤT (Performance) 27

2.4.1 Tăng tốc và hiệu quả 27

2.4.2 Định luật Amdahl 28

Trang 4

ii

2.4.3 Khả năng mở rộng (Scalability) 282.4.4 Tính thời gian 29TÀI LIỆU THAM KHẢO 31

Trang 5

mô hình khí hậu, để hiểu rõ hơn về biến đổi khí hậu, chúng ta cần những mô

hình máy tính chính xác hơn nhiều, những mô hình bao gồm sự tương tác giữa khí quyển, đại dương, đất liền và các chỏm băng ở hai cực Chúng ta cũng cần có khả năng thực hiện các nghiên cứu chi tiết về mức độ ảnh hưởng của các biện pháp can thiệp khác nhau đến khí hậu toàn cầu

Nghiên cứu chế tạo thuốc Có nhiều cách để tăng sức mạnh tính toán có thể

được sử dụng trong nghiên cứu các phương pháp điều trị y tế mới

Nghiên cứu năng lượng Sức mạnh tính toán tăng lên sẽ giúp lập trình các mô

hình công nghệ chi tiết hơn nhiều như tua-bin gió, pin mặt trời và pin Các chương trình này có thể cung cấp thông tin cần thiết để xây dựng các nguồn năng lượng sạch hiệu quả hơn nhiều

Phân tích dữ liệu Chúng tôi tạo ra lượng dữ liệu khổng lồ Theo một số ước

tính, số lượng dữ liệu được lưu trữ trên toàn thế giới tăng gấp đôi cứ sau hai năm, nhưng phần lớn dữ liệu đó hầu như vô dụng trừ khi được phân tích

Những vấn đề này và hàng loạt vấn đề khác sẽ không được giải quyết nếu không có sự gia tăng đáng kể về khả năng tính toán

1.2 XÂY DỰNG HỆ THỐNG XỬ LÝ SONG SONG

Phần lớn sự gia tăng đáng kể về hiệu năng của bộ xử lý đơn lẻ được thúc đẩy bởi mật độ ngày càng tăng của các bóng bán dẫn - các công tắc điện tử - trên các mạch tích hợp Khi kích thước của bóng bán dẫn giảm, tốc độ của chúng có thể tăng lên và tốc độ tổng thể của mạch tích hợp có thể tăng lên Tuy nhiên, khi tốc độ của bóng bán dẫn tăng lên thì mức tiêu thụ điện năng của chúng cũng tăng lên Phần lớn năng lượng này bị tiêu tán dưới dạng nhiệt và khi mạch tích hợp trở nên quá nóng, nó sẽ trở nên không đáng tin cậy

Vì vậy, việc tiếp tục tăng tốc độ của các mạch tích hợp là điều không thể Tuy nhiên, sự gia tăng mật độ bóng bán dẫn có thể tiếp tục - ít nhất là trong một thời gian Vậy làm thế nào chúng ta có thể khai thác sự gia tăng liên tục của mật độ bóng bán dẫn? Câu trả lời là xử lý song song Thay vì xây dựng các bộ xử lý

Trang 6

2

nguyên khối, nhanh hơn, phức tạp hơn, ngành công nghiệp đã quyết định đặt nhiều bộ xử lý hoàn chỉnh, tương đối đơn giản trên một con chip Các mạch tích

hợp như vậy được gọi là bộ xử lý đa lõi (Multicore Processors)và lõi (Core) đã

trở thành đồng nghĩa với bộ xử lý trung tâm hoặc CPU Trong cài đặt này, bộ xử

lý thông thường có một CPU thường được gọi là hệ thống lõi đơn (single-core

system)

1.3 CHƯƠNG TRÌNH XỬ LÝ SONG SONG

Hầu hết các chương trình được viết cho các hệ thống lõi đơn (single-core) thông thường không thể khai thác sự hiện diện của nhiều lõi (multiple cores) Chúng ta có thể chạy nhiều phiên bản của một chương trình trên hệ thống đa lõi, nhưng điều này thường không giúp ích được nhiều

Việc triển khai xử lý song song hiệu quả một chương trình nối tiếp có thể không đạt được bằng tìm ra xử lý song song hiệu quả của từng bước của nó Đúng hơn, xử lý song song tốt nhất có thể đạt được bằng cách lùi lại và nghĩ ra một

thuật toán hoàn toàn mới Ví dụ: giả sử chúng ta cần tính n giá trị và cộng chúng

lại với nhau Chúng tôi biết rằng điều này có thể được thực hiện bằng mã code nối tiếp sau:

for (my_i = my_first_i; my_i < my_last_i; my_i++) { my_x = Compute_next_value( .);

my_sum += my_x; }

Ở đây, tiền tố my_ chỉ ra rằng mỗi lõi đang sử dụng các biến riêng, riêng của nó và mỗi lõi có thể thực thi khối mã này một cách độc lập với các lõi khác

Sau khi mỗi lõi hoàn thành việc thực thi mã này, biến my_sum của nó sẽ lưu trữ tổng các giá trị được tính bằng các lệnh gọi của nó tới Computer_next.value

Trang 7

3

Ví dụ: nếu có 8 lõi, n = 24 và 24 lệnh gọi tới Compute_next_value sẽ trả về các

giá trị 1,4,3, 9,2,8, 5,1,1, 6,2,7, 2,5,0, 4,1,8, 6,5,1, 2,3,9, thì các giá trị được lưu trữ trong my_sum có thể là

Ở đây, chúng tôi giả sử các lõi được xác định bằng các số nguyên không âm trong

phạm vi 0, 1, , p-1, trong đó p là số lượng lõi

Khi các lõi tính toán xong các giá trị my_sum của chúng, chúng có thể tạo thành tổng toàn cục bằng cách gửi kết quả của chúng đến lõi “chính-master” được chỉ định, lõi này có thể cộng kết quả của chúng:

if (I’m the master core) { sum = my_x;

for each core other than myself { receive value from core; sum += value;

} } else {

send my_x to the master; }

Trong ví dụ của chúng ta, nếu lõi chính là lõi 0, nó sẽ thêm các giá trị 8+19+7+ 15+7+13+12+1495

Nhưng bạn có thể thấy cách tốt hơn để thực hiện việc này - đặc biệt nếu số lượng lõi lớn Thay vì bắt lõi chính thực hiện tất cả công việc tính tổng cuối cùng, chúng ta có thể ghép các lõi để trong khi lõi 0 thêm vào kết quả của lõi 1, lõi 2 có thể thêm vào kết quả của lõi 3, lõi 4 có thể thêm vào kết quả của lõi 5, v.v Sau đó, chúng ta có thể lặp lại quy trình chỉ với các lõi được xếp hạng chẵn: 0 cộng vào kết quả của 2, 4 cộng vào kết quả của 6, v.v Bây giờ các lõi chia hết cho 4 lặp lại quá trình, v.v Xem Hình 1.1 Các vòng tròn chứa giá trị hiện tại của tổng của mỗi lõi và các dòng có mũi tên chỉ ra rằng một lõi đang gửi tổng của nó đến lõi khác Dấu cộng cho biết lõi đang nhận số tiền từ lõi khác và cộng số tiền nhận được vào tổng của chính nó

Đối với cả hai tổng “toàn cục”, lõi chính (lõi 0) thực hiện nhiều công việc hơn bất kỳ lõi nào khác và khoảng thời gian mà chương trình cần để hoàn thành tổng cuối cùng sẽ là khoảng thời gian cần thiết để phần mềm chính hoàn thành Tuy nhiên, với 8 lõi, master sẽ thực hiện bảy lần nhận và thêm bằng phương pháp đầu

Trang 8

4

tiên, trong khi với phương pháp thứ hai, nó sẽ chỉ thực hiện ba Vì vậy, phương pháp thứ hai mang lại kết quả cải thiện nhiều hơn gấp đôi Sự khác biệt trở nên kịch tính hơn với số lượng lớn lõi Với 1000 lõi, phương pháp đầu tiên sẽ yêu cầu 999 lượt nhận và thêm, trong khi phương pháp thứ hai sẽ chỉ yêu cầu 10, cải thiện gần như hệ số 100!

Hình 1.1: Multiple cores forming a global sum

Tổng toàn cục đầu tiên là sự khái quát hóa khá rõ ràng của tổng toàn cục nối tiếp: phân chia công việc cộng giữa các lõi và sau khi mỗi lõi đã tính phần tổng

của nó, lõi chính chỉ cần lặp lại phép cộng nối tiếp cơ bản - nếu có p lõi, thì nó cần thêm giá trị p Mặt khác, tổng toàn cục thứ hai ít liên quan đến phép cộng

nối tiếp ban đầu

Vấn đề ở đây là chương trình dịch khó có thể "khám phá" tổng toàn cục thứ hai Thay vào đó, nhiều khả năng sẽ có một tổng hiệu quả toàn cục được xác định trước mà chương trình dịch thuật sẽ có quyền truy cập Nó có thể "nhận dạng" vòng lặp nối tiếp ban đầu và thay thế nó bằng một tổng toàn cục xử lý song song, hiệu quả, được mã hóa trước

Chúng ta sẽ mong đợi rằng phần mềm có thể được viết sao cho một số lượng lớn các cấu trúc nối tiếp phổ biến có thể được nhận dạng và xử lý song song hóa một cách hiệu quả, tức là được sửa đổi để chúng có thể sử dụng nhiều lõi Tuy nhiên, khi chúng ta áp dụng nguyên tắc này cho các chương trình nối tiếp phức

Trang 9

1.4 VIẾT CHƯƠNG TRÌNH XỬ LÝ SONG SONG

Có hai cách tiếp cận được sử dụng rộng rãi trong việc phân chia công việc cần thực hiện giữa các lõi: xử lý song song nhiệm vụ (task-parallelism) và xử lý song song dữ liệu (data-parallelism) Trong xử lý song song của nhiệm vụ, chúng ta phân chia các nhiệm vụ khác nhau được thực hiện để giải quyết vấn đề giữa các lõi Trong xử lý song song của dữ liệu, chúng tôi phân vùng dữ liệu được sử dụng để giải quyết vấn đề giữa các lõi và mỗi lõi thực hiện ít nhiều các hoạt động tương tự trên phần dữ liệu của nó

Hiện nay, các chương trình xử lý song song mạnh mẽ nhất được viết bằng cách sử dụng các cấu trúc xử lý song song rõ ràng, nghĩa là chúng được viết bằng cách sử dụng phần mở rộng của các ngôn ngữ như C và C++ Các chương trình này bao gồm các hướng dẫn rõ ràng về xử lý song song: lõi 0 thực thi tác vụ 0, lõi 1 thực thi tác vụ 1, , tất cả các lõi đồng bộ hóa, , v.v., vì vậy những chương trình như vậy thường cực kỳ phức tạp Hơn nữa, sự phức tạp của các lõi hiện đại thường khiến cần phải hết sức cẩn thận khi viết mã sẽ được thực thi bởi một lõi duy nhất Có những lựa chọn khác để viết các chương trình xử lý song song - ví dụ, các ngôn ngữ cấp cao hơn - nhưng chúng có xu hướng hy sinh hiệu suất để làm cho việc phát triển chương trình trở nên dễ dàng hơn một chút

1.5 CHÚNG TÔI SẼ LÀM GÌ?

Chúng ta sẽ tập trung vào việc học cách viết các chương trình xử lý song song một cách rõ ràng Mục đích của chúng ta là tìm hiểu những điều cơ bản về lập trình máy tính xử lý song song sử dụng ngôn ngữ C và 3 phần mở rộng khác nhau

của C: Message-Passing Interface hoặc MPI, luồng POSIX hoặc Pthreads và OpenMP MPI và Pthreads là các thư viện chứa định nghĩa kiểu, hàm và macro

có thể được sử dụng trong các chương trình C OpenMP bao gồm một thư viện và một số sửa đổi đối với trình biên dịch C

Bạn có thể thắc mắc tại sao chúng ta lại học 3 phần mở rộng khác nhau của C thay vì chỉ một Câu trả lời liên quan đến cả phần mở rộng và hệ thống xử lý song song Có 2 loại hệ thống xử lý song song chính mà chúng ta sẽ tập trung vào: hệ

thống bộ nhớ dùng chung (shared-memory) và hệ thống bộ nhớ phân tán

(distributed-memory) Trong hệ thống bộ nhớ dùng chung, các lõi có thể chia sẻ

Trang 10

6

quyền truy cập vào bộ nhớ của máy tính; về nguyên tắc, mỗi lõi có thể đọc và ghi từng vị trí bộ nhớ Trong hệ thống bộ nhớ dùng chung, chúng ta có thể điều phối các lõi bằng cách yêu cầu chúng kiểm tra và cập nhật các vị trí bộ nhớ dùng chung Mặt khác, trong hệ thống bộ nhớ phân tán, mỗi lõi có bộ nhớ riêng, riêng và các lõi phải giao tiếp rõ ràng bằng cách thực hiện một số việc như gửi tin nhắn qua mạng Hình 1.2 thể hiện sơ đồ của hai loại hệ thống Pthreads và OpenMP được thiết kế để lập trình các hệ thống bộ nhớ dùng chung Chúng cung cấp các cơ chế để truy cập các vị trí bộ nhớ dùng chung Mặt khác, MPI được thiết kế để lập trình các hệ thống bộ nhớ phân tán Nó cung cấp các cơ chế để gửi tin nhắn Nhưng tại sao lại có hai phần mở rộng cho bộ nhớ dùng chung? OpenMP là một cấp độ tương đối cao phần mở rộng cho C Ví dụ: nó có thể "xử lý song song hóa" vòng lặp bổ sung của chúng ta

sum = 0;

for (i = 0; i < n; i++) {

x = Compute_next_value( .); sum += x;

}

Hình 1.2: (a) A shared-memory system and (b) a distributed-memory system với một lệnh duy nhất, trong khi Pthreads yêu cầu chúng ta làm điều gì đó tương tự như ví dụ của chúng ta Mặt khác, Pthreads cung cấp một số cấu trúc phối hợp không có trong OpenMP OpenMP cho phép chúng ta song song hóa nhiều chương trình một cách tương đối dễ dàng, trong khi Pthreads cung cấp cho chúng ta một số cấu trúc giúp các chương trình khác dễ dàng xử lý song song hơn

Trang 11

7

Trang 12

8

1.6 ĐỒNG THỜI, XỬ LÝ SONG SONG, PHÂN TÁN

▪ Trong tính toán đồng thời, một chương trình là một chương trình trong đó nhiều tác vụ có thể được thực hiện bất cứ lúc nào

▪ Trong tính toán xử lý song song, một chương trình là một chương trình trong đó nhiều tác vụ phối hợp chặt chẽ với nhau để giải quyết một vấn đề

▪ Trong điện toán phân tán, một chương trình có thể cần hợp tác với các chương trình khác để giải quyết vấn đề

Vì vậy, các chương trình xử lý song song và phân tán là đồng thời, nhưng một chương trình như hệ điều hành đa nhiệm cũng đồng thời, ngay cả khi nó được chạy trên máy chỉ có một lõi, vì nhiều tác vụ có thể được thực hiện bất kỳ lúc nào Không có sự phân biệt rõ ràng giữa các chương trình xử lý song song và phân tán, nhưng một chương trình xử lý song song thường chạy đồng thời nhiều tác vụ trên các lõi gần nhau về mặt vật lý và chia sẻ cùng một bộ nhớ hoặc được kết nối bằng mạng tốc độ rất cao

Mặt khác, các chương trình phân tán có xu hướng được "kết nối lỏng lẻo" hơn Các tác vụ có thể được thực thi bởi nhiều máy tính cách nhau một khoảng cách lớn và bản thân các tác vụ đó thường được thực thi bởi các chương trình được tạo độc lập

1.7 LỜI CẢNH BÁO

Trước khi tiếp tục, một lời cảnh báo Nó có thể hấp dẫn để viết xử lý song song chương trình " by the seat of your pants," mà không cần tốn công sức thiết kế và thiết kế cẩn thận từng bước phát triển chương trình của bạn Điều này gần như chắc chắn sẽ là một sai lầm Mọi chương trình xử lý song song chứa ít nhất một chương trình nối tiếp Vì chúng ta hầu như luôn cần phối hợp hoạt động của nhiều lõi nên việc viết các chương trình xử lý song song hầu như luôn phức tạp hơn việc viết một chương trình nối tiếp giải quyết cùng một vấn đề Trên thực tế, nó thường phức tạp hơn nhiều Tất cả các quy tắc về thiết kế và phát triển cẩn thận thường quan trọng hơn nhiều đối với việc viết các chương trình xử lý song song so với các chương trình nối tiếp

1.8 QUY ĐỊNH TYPOGRAPHIC

Chúng ta sẽ sử dụng các kiểu chữ sau trong văn bản:

▪ Văn bản chương trình, được hiển thị hoặc trong văn bản đang chạy, sẽ sử dụng các kiểu chữ sau:

/∗ This is a short program ∗/ #include <stdio.h>

int main(int argc, char∗ argv[]) {

Trang 13

9 printf("hello, world\n");

return 0; }

▪ Các định nghĩa được đưa ra trong phần nội dung của văn bản và thuật ngữ

được định nghĩa được in đậm: Một chương trình xử lý song song có thể

sử dụng nhiều lõi

▪ Khi cần đề cập đến môi trường trong đó một chương trình đang được phát triển, chúng tôi sẽ giả sử rằng chúng tôi đang sử dụng shell UNIX và chúng tôi sẽ sử dụng $ để biểu thị dấu nhắc shell:

$ gcc -g -Wall -o hello hello.c

▪ Chúng tôi sẽ chỉ định cú pháp của lệnh gọi hàm với danh sách đối số cố định bằng cách đưa vào danh sách đối số mẫu Ví dụ: hàm giá trị tuyệt đối số nguyên, abs, trong stdlib có thể có cú pháp được chỉ định bằng

int abs(int x); /∗ Returns absolute value of int x ∗/

Đối với cú pháp phức tạp hơn, chúng ta sẽ đặt nội dung bắt buộc trong dấu ngoặc nhọn < >và nội dung tùy chọn trong dấu ngoặc vuông [ ] Ví dụ: câu lệnh if của C có thể có cú pháp được chỉ định như sau:

if ( <expression> ) <statement1> [else

<statement2>]

Điều này nói rằng câu lệnh if phải bao gồm một biểu thức được đặt trong dấu ngoặc đơn và sau dấu ngoặc đơn bên phải phải là một câu lệnh Câu lệnh này có thể được theo sau bởi một mệnh đề else tùy chọn Nếu có mệnh đề else thì nó phải bao gồm câu lệnh thứ hai

Trang 14

10

CHƯƠNG 2: PHẦN CỨNG SONG SONG VÀ PHẦN MỀM SONG SONG

2.1 MỘT SỐ NỀN TẢNG

Phần cứng và phần mềm song song đã phát triển từ phần cứng và phần mềm

nối tiếp thông thường: phần cứng và phần mềm chạy (ít/ nhiều) một công việc

tại một thời điểm Vì vậy, để hiểu rõ hơn hiện trạng của các hệ thống xử lý song song, chúng ta hãy bắt đầu bằng cái nhìn ngắn gọn về một số khía cạnh của hệ thống nối tiếp

2.1.1 Cấu trúc von Neumann

Cấu trúc von Neumann "cổ điển" bao gồm bộ nhớ chính, bộ xử lý trung tâm (CPU) hoặc bộ xử lý hoặc lõi và kết nối giữa bộ nhớ và CPU Bộ nhớ chính

bao gồm một tập hợp các vị trí, mỗi vị trí có khả năng lưu trữ cả lệnh và dữ liệu Mỗi vị trí bao gồm một địa chỉ, được sử dụng để truy cập vào vị trí và nội dung của vị trí đó - các hướng dẫn hoặc dữ liệu được lưu trữ ở vị trí đó

Bộ xử lý trung tâm được chia thành bộ điều khiển và bộ số học và logic (ALU) Bộ điều khiển quyết định những lệnh nào trong chương trình sẽ được thực thi và ALU chịu trách nhiệm thực hiện các lệnh thực tế Dữ liệu trong CPU và thông tin về trạng thái của một chương trình đang thực thi được lưu trữ trong bộ lưu trữ

đặc biệt, rất nhanh gọi là các thanh ghi Bộ điều khiển có một thanh ghi đặc biệt gọi là bộ đếm chương trình-lưu trữ địa chỉ của lệnh tiếp theo sẽ được thực thi

Các lệnh và dữ liệu được truyền giữa CPU và bộ nhớ thông qua kết nối Theo truyền thống, đây là một bus, bao gồm một tập hợp các dây song song và một số phần cứng kiểm soát quyền truy cập vào dây Máy von Neumann thực hiện một lệnh tại một thời điểm và mỗi lệnh chỉ hoạt động trên một vài phần dữ liệu Xem Hình 2.1

Hình 2.1: The von Neumann architecture

Trang 15

11

Khi dữ liệu hoặc lệnh được truyền từ bộ nhớ tới CPU, là dữ liệu hoặc lệnh được tìm nạp hoặc đọc từ bộ nhớ Khi dữ liệu được truyền từ CPU sang bộ nhớ, là dữ liệu được ghi vào bộ nhớ hoặc được lưu trữ Sự tách biệt giữa bộ nhớ và

CPU thường được gọi là von Neumann bottleneck

Để giải quyết vấn đề von Neumann bottleneck cũng như cải thiện hiệu suất CPU, các kỹ sư máy tính và nhà khoa học máy tính đã thử nghiệm nhiều sửa đổi đối với cấu trúc von Neumann cơ bản Trước khi thảo luận về một số sửa đổi này, trước tiên chúng ta hãy dành chút thời gian để thảo luận về một số khía cạnh của phần mềm được sử dụng trong cả hệ thống von Neumann và các hệ thống hiện đại hơn

2.1.2 Các quy trình, đa nhiệm và luồng

Khi người dùng chạy một chương trình, hệ điều hành sẽ tạo một quy trình (một phiên bản của chương trình máy tính đang được thực thi) Một quy trình bao gồm một số thực thể:

▪ Chương trình ngôn ngữ máy có thể thực thi được

▪ Một khối bộ nhớ sẽ bao gồm mã thực thi, một call stack sẽ theo dõi các hàm đang hoạt động, một đống (heap) và một số vị trí bộ nhớ khác

▪ Bộ mô tả nguồn mà hệ điều hành đã phân bổ cho quy trình ▪ Thông tin bảo mật

▪ Thông tin về trạng thái của quy trình

Hầu hết các hệ điều hành hiện đại đều có tính đa nhiệm - nghĩa là việc vận hành hệ thống cung cấp hỗ trợ cho việc thực hiện đồng thời nhiều chương trình Điều này có thể thực hiện được ngay cả trên hệ thống có một lõi, vì mỗi quy trình

chạy trong một khoảng thời gian nhỏ (vài mili giây), gọi là phần thời gian (time

slice) Sau khi một chương trình đang chạy được thực thi trong một khoảng thời gian, hệ điều hành có thể chạy một chương trình khác Một hệ điều hành đa nhiệm có thể thay đổi quy trình đang chạy nhiều lần trong một phút, mặc dù việc thay đổi quy trình đang chạy có thể mất nhiều thời gian

Hình 2.2: A process and two threads

Trong hệ điều hành đa nhiệm, nếu một quy trình cần đợi nguồn - chẳng hạn

như nó cần đọc dữ liệu từ bộ nhớ ngoài - thì nó sẽ chặn (block) Nghĩa là nó sẽ

ngừng thực thi và hệ điều hành có thể chạy một quy trình khác Tuy nhiên, nhiều chương trình có thể tiếp tục thực hiện công việc hữu ích mặc dù phần chương

Trang 16

12

trình hiện đang thực thi phải chờ nguồn Threading cung cấp một cơ chế để các

lập trình viên chia chương trình của chúng thành các tác vụ độc lập ít hoặc nhiều với đặc tính là khi một luồng bị chặn, một luồng khác có thể chạy Hơn nữa, trong hầu hết các hệ thống, có thể chuyển đổi giữa các luồng nhanh hơn nhiều so với khả năng chuyển đổi giữa các quy trình Điều này là do các luồng có "trọng lượng nhẹ hơn" so với các quy trình Các luồng được chứa trong các quy trình, vì vậy chúng có thể sử dụng cùng một tệp thực thi và chúng thường chia sẻ cùng một bộ nhớ và cùng các thiết bị I/O Trong thực tế, hai luồng thuộc một quy trình có thể chia sẻ hầu hết nguồn của quy trình đó Hai trường hợp ngoại lệ quan trọng nhất là chúng sẽ cần bản ghi bộ đếm chương trình của riêng mình và chúng sẽ cần ngăn xếp cuộc gọi riêng để có thể thực thi độc lập với nhau

Nếu một quy trình là luồng thực thi “master” và các luồng được bắt đầu và dừng bởi quy trình đó, thì chúng ta có thể hình dung quy trình đó và các luồng phụ của nó dưới dạng các dòng: khi một luồng được bắt đầu, nó sẽ tách ra khỏi quy trình; khi một luồng kết thúc, nó sẽ tham gia vào quy trình Xem Hình 2.2

2.2 BIẾN ĐỔI MÔ HÌNH VON NEUMANN 2.2.1 Khái niệm cơ bản về bộ nhớ đệm (caching)

Bộ nhớ đệm là một trong những phương pháp được sử dụng rộng rãi nhất để giải quyết von Neumann bottleneck Thay vì vận chuyển một lệnh hoặc mục dữ liệu, chúng ta có thể sử dụng kết nối rộng hơn một cách hiệu quả, một kết nối có thể vận chuyển nhiều dữ liệu hơn hoặc nhiều lệnh hơn trong một lần truy cập bộ nhớ Ngoài ra, thay vì chỉ lưu trữ tất cả dữ liệu và lệnh trong bộ nhớ chính, chúng ta có thể lưu trữ các khối dữ liệu và lệnh trong bộ nhớ đặc biệt gần với các thanh ghi trong CPU hơn một cách hiệu quả

Bộ đệm là tập hợp các vị trí bộ nhớ có thể được truy cập trong thời gian ngắn

hơn một số vị trí bộ nhớ khác Trong bài này, khi nói về bộ đệm, chúng ta thường

muốn nói đến bộ đệm CPU, là tập hợp các vị trí bộ nhớ mà CPU có thể truy cập

nhanh hơn bộ nhớ chính Bộ đệm CPU có thể được đặt trên cùng một chip với CPU hoặc nó có thể được đặt trên một chip riêng biệt có thể truy cập nhanh hơn nhiều so với chip bộ nhớ thông thường

Một vấn đề hiển nhiên về bộ nhớ đệm là quyết định dữ liệu và lệnh nào sẽ được lưu trữ trong bộ đệm Nguyên tắc được sử dụng phổ biến dựa trên ý tưởng rằng các chương trình có xu hướng sử dụng dữ liệu và lệnh gần gũi về mặt vật lý với dữ liệu và lệnh được sử dụng gần đây Một ví dụ cực đoan về điều này là việc sử dụng mảng

float z[1000];

sum = 0.0;

for (i = 0; i < 1000; i++)

Trang 17

13 sum += z[i];

Nguyên tắc truy cập vào một vị trí sẽ được theo sau bởi truy cập vào một vị

trí lân cận vị trí thường được gọi là locality Sau khi truy cập vào một vị trí bộ

nhớ (lệnh hoặc dữ liệu), một chương trình thường sẽ truy cập vào một vị trí lân

cận (spatial locality) ở gần tương lai (temporal locality)

Về mặt khái niệm, sẽ thuận tiện hơn nếu coi bộ đệm CPU như một cấu trúc nguyên khối duy nhất Tuy nhiên, trên thực tế, bộ đệm thường được chia thành các cấp: cấp đầu tiên (L1) là nhỏ nhất và nhanh nhất, còn các cấp cao hơn (L2, L3, ) thì lớn hơn và chậm hơn Hầu hết các hệ thống hiện nay, trong năm 2010, đều có ít nhất hai cấp độ và ba cấp độ là khá phổ biến Bộ nhớ đệm thường lưu trữ các bản sao của thông tin trong bộ nhớ chậm hơn và nếu chúng ta coi bộ nhớ đệm cấp thấp hơn (nhanh hơn, nhỏ hơn) là bộ nhớ đệm cho cấp cao hơn thì điều này thường được áp dụng Vì vậy, ví dụ: một biến được lưu trữ trong bộ nhớ đệm cấp 1 cũng sẽ được lưu trữ ở cấp độ 2 Tuy nhiên, một số bộ nhớ đệm nhiều cấp không trùng lặp thông tin có sẵn ở cấp độ khác Đối với những bộ đệm này, một biến trong bộ đệm cấp 1 có thể không được lưu trữ ở bất kỳ cấp độ bộ đệm nào khác, nhưng nó sẽ được lưu trong bộ nhớ chính

Khi CPU cần truy cập một lệnh hoặc dữ liệu, nó sẽ hoạt động theo hệ thống phân cấp bộ đệm: Đầu tiên, nó kiểm tra bộ đệm cấp I, sau đó là cấp 2, v.v Cuối cùng, nếu thông tin cần thiết không có trong bất kỳ bộ đệm nào, nó sẽ truy cập vào bộ nhớ chính Khi mộtbộ đệm được kiểm tra thông tin và thông tin có sẵn,

nó được gọi là cache hit hoặc chỉ là hit Nếu thông tin không có sẵn, nó được gọi là cache miss hoặc miss Hit hoặc miss thường được sửa đổi theo cấp độ Ví dụ,

khi CPU cố gắng truy cập vào một biến, nó có thể bị trượt L1 và trúng L2

Lưu ý rằng các thuật ngữ truy cập bộ nhớ đọc và ghi cũng được sử dụng cho

bộ đệm Ví dụ: chúng tôi có thể đọc lệnh từ bộ đệm L2 và chúng tôi có thể ghi dữ liệu vào bộ đệm L1

Khi CPU cố gắng đọc dữ liệu hoặc lệnh và xảy ra tình trạng đọc nhầm bộ đệm, nó sẽ đọc từ bộ nhớ dòng bộ đệm chứa thông tin cần thiết và lưu nó vào bộ đệm Điều này có thể khiến bộ xử lý bị đình trệ trong khi chờ bộ nhớ chậm hơn: bộ xử lý có thể ngừng thực thi các câu lệnh từ chương trình hiện tại cho đến khi dữ liệu hoặc lệnh cần thiết được lấy từ bộ nhớ Vì vậy, trong ví dụ của chúng tôi, khi chúng tôi đọc z[0], bộ xử lý có thể bị treo trong khi dòng bộ nhớ đệm chứa z[0] bị treo được chuyển từ bộ nhớ vào bộ đệm

Khi CPU ghi dữ liệu vào bộ đệm, giá trị trong bộ đệm và giá trị trong bộ nhớ

chính khác nhau hoặc không nhất quán Có hai cách tiếp cận cơ bản để giải quyết sự không nhất quán Trong bộ đệm ghi qua (write-through), dòng này được ghi vào bộ nhớ chính khi nó được ghi vào bộ đệm Trong bộ đệm ghi lại (write-

back), dữ liệu không được ghi ngay lập tức Đúng hơn, dữ liệu cập nhật trong bộ

Ngày đăng: 16/05/2024, 12:32

Tài liệu cùng người dùng

Tài liệu liên quan