1. Trang chủ
  2. » Công Nghệ Thông Tin

Bai 9 1 xu ly da luong

38 382 0

Đ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 38
Dung lượng 432 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

pthread_create: Kh i t o lu ng ở ạ ồ tid: con trỏ tới biến định danh luồng kiểu pthread_t  pthread_t: thường là unsigned int  attr: con trỏ tới cấu trúc pthread_attr_t  pthread_attr

Trang 1

Máy ch x lý đ ng th i, đa ủ ử ồ ờ

Giảng viên: Nguyễn Hoài Sơn

Bộ môn Mạng và Truyền thông máy tính Khoa Công nghệ thông tin

Trang 3

Create slave2

process request 1

processrequest 1

processrequest 2

process request 2

3/2c+p per request

3/2p per request

Trang 4

Process B

Global Variables Code Stack

Trang 5

Gi i ph ả áp

 Xử lý đa luồng

Trang 6

 Tập thanh ghi (register set)

 Ngăn xếp (stack): chứa các biến cục bộ

Trang 7

T i sao l i l ạ ạ à x lý đa lu ng? ử ồ

 Một tiến trình với nhiều luồng có thể thực hiện nhiều công việc khác nhau tại cùng một thời điểm.

 Ưu điểm của xử lý đa luồng với xử lý đa

tiến trình

 Tạo luồng nhanh hơn

 từ 10–100 lần so với tạo tiến trình

 Tiêu tốn ít tài nguyên bộ nhớ

 Chia xẻ thông tin giữa các luồng sẽ dễ dàng hơn

Trang 8

Đa x lý v ử à đa lu ng ồ

Three processes with one thread each

One process with three threads

Trang 9

Khởi tạo luồng mới

Process A

Thread 1

Global Variables Code

Stack

Process A Thread 2

Stack

pthread_create()

Program counter

Program counter

Trang 10

pthread_create(): Kh i t o lu ng ở ạ ồ

 tid: con trỏ tới biến định danh luồng kiểu pthread_t

 pthread_t: thường là unsigned int

 attr: con trỏ tới cấu trúc pthread_attr_t

 pthread_attr_t: xác định các thuộc tính của luồng như độ ưu tiên, kích thước ban đầu của ngăn xếp, …

 NULL nếu sử dụng mặc định của hệ thống

 func: Hàm gọi khi luồng bắt đầu

 arg: một con trỏ tới một cấu trúc các tham số của hàm

func

#include <pthread.h>

int pthread_create(pthread_t *tid, const pthread_attr_t *attr,

void *(*func) (void *), void *arg); Returns: 0 if OK, positive Exxx value on error

Trang 11

Tu i s ng c a m t lu ng ổ ố ủ ộ ồ

 Khi một luồng được tạo ra, nó sẽ chạy hàm func()

được thiết lập trong lệnh gọi pthread_create().

 Khi hàm func() trả về giá trị, luồng sẽ kết thúc thực thi

 Một luồng cũng có thể kết thúc thực thi bằng hàm

pthread_exit().

 Nếu luồng chính kết thúc thực thi hoặc một luồng nào

đó trong tiến trình gọi lệnh exit() thì tất cả các luồng khác đều kết thúc thực thi

#include <pthread.h>

void pthread_exit (void *status);

Does not return to caller

Trang 12

Lu ng con ph thu c(joinable)/Lu ng ồ ụ ộ ồ

con đ c l p (detached) ộ ậ

 Luồng con phụ thuộc

 Sau khi xử lý của luồng kết thúc, trạng thái và ID của luồng con vẫn được giữ lại trong bộ nhớ cho đến khi hàm pthread_join được gọi

 Trạng thái của một luồng khi được tạo ra sẽ được mặc định là phụ thuộc (joinable)

 Luồng con độc lập

 Trạng thái và ID của luồng con sẽ được xóa ra

khỏi bộ nhớ sau khi xử lý của luồng kết thúc

Trang 13

pthread_join(): đ i m t lu ng ph thu c ợ ộ ồ ụ ộ

d ng th c thi ừ ự

tid: thread ID

status: con trỏ tới giá trị trả về từ luồng

 Tương đương với hàm waitpid trong xử lý đa tiến trình

#include <pthread.h>

int pthread_join (pthread_t tid, void ** status);

Returns: 0 if OK, positive Exxx value on error

Trang 14

pthread_detach(): chuy n m t lu ng sang ể ộ ồ

int pthread_detach (pthread_t tid);

Returns: 0 if OK, positive Exxx value on error

Trang 15

pthread_self() : L y đ nh danh c a ch ấ ị ủ ính

lu ng đ ồ ó

#include <pthread.h>

pthread_t pthread_self (void);

Returns: thread ID of calling thread

 Có thể sử dụng định danh luồng trong hàm

pthread_detach()

Trang 16

Máy ch x lý đ ng th i đa lu ng h ủ ử ồ ờ ồ ướ ng

k t n i ế ố

 Tạo mỗi luồng cho một kết nối mới đến máy khách

Trang 17

Socket for socket for individual

Operating system

Trang 18

Các b ướ c th c thi máy ch x lý đ ng ự ủ ử ồ

th i, h ớ ướ ng k t n i, đa lu ng ế ố ồ

B ướ c 1 lu ng chính: Kh i t o socket, gán thông tin cho socket và ở ạ

chuy n socket sang tr ng thái th đ ng, ch k t n i ể ạ ụ ộ ờ ế ố

B ướ c 2 lu ng chính: L p l i l nh g i ặ ạ ệ ọ accept() đ ch p nh n ể ấ ậ

m t k t n i t máy khách và kh i t o m t lu ng con đ x lý yêu c u ộ ế ố ừ ở ạ ộ ồ ể ử ầ

c a máy khách ủ

Trang 19

Các b ướ c th c thi máy ch x lý đ ng ự ủ ử ồ

Trang 20

 Luồng con không cần đóng socket lắng nghe

 Luồng con phải đóng socket kết nối trước khi kết thúc thực thi

Trang 21

Ví d v máy ch TCP echo x lý đ ng th i đa ụ ề ủ ử ồ ờ

lu ng ồ

int main(int argc, char **argv){

int listenfd, connfd;

pthread_t tid;

socklen_t addrlen, len;

struct sockaddr cliaddr;

int *iptr;

listenfd = passiveTCP(argv[1], QLEN);

len = sizeof(cliaddr);

for (; ; ) {

connfd = accept(listenfd, cliaddr, &len);

pthread_create(&tid, NULL, &doit, (void *) &connfd);

}

}

 Luồng chính không cần đóng socket kết nối

Trang 22

V n đ c a x lý đa lu ng ấ ề ủ ử ồ

 Thread-safe

 Nếu một hàm sử dụng biến toàn cục, có thể

không an toàn nếu sử dụng hàm này với đa luồng

 Một hàm là thread-safe nếu nó hoạt động đúng khi được sử dụng tại nhiều luồng khác nhau

 Đồng bộ hóa bộ nhớ giữa các luồng

 Các luồng tranh chấp việc truy cập vào cùng một tài nguyên

Trang 23

Thread Safe library functions

 POSIX.1 requires that all the functions defined by POSIX.1 and by the ANSI C

Trang 24

C i ti n v i hàm thread-safe ả ế ớ

int main(int argc, char **argv){

int listenfd;

pthread_t tid;

socklen_t addrlen, len;

struct sockaddr cliaddr;

*iptr = accept(listenfd, cliaddr, &len);

pthread_create(&tid, NULL, &doit, (void *) iptr);

}

}

Trang 25

static void *doit(void *arg)

str_echo(connfd); /* same function as before */

close(connfd); /* done with connected socket */

return (NULL);

}

 Cẩn thận với các biến chung

Trang 26

Thread-Specific Data

 Dữ liệu riêng của luồng

 Quản lý vùng bộ nhớ riêng cho mỗi luồng

 đảm bảo các hàm là thread-safe

 Mỗi tiến trình duy trì một số lượng nhất định các thông tin

về dữ liệu riêng của luồng

 Theo POSIX, >= 128

Câu trúc Key

Dữ liệu riêng hiện được dùng hay không?

Con trỏ đến hàm giải phóng bộ nhớ

Trang 27

Thông tin v d li u riêng t i m i lu ng ề ữ ệ ạ ỗ ồ

Trang 28

S d ng d li u riêng c a lu ng nh th ử ụ ữ ệ ủ ồ ư ế nào?

cấu trúc key và gán hàm giải phóng bộ nhớ

Trang 29

Ví d v h ụ ề àm readline

Trang 30

Lo i tr l n nhau ạ ừ ẫ

 Các luồng chia xẻ bộ nhớ, xử lý file (file handles),

sockets, và các tài nguyên khác

 Nếu hai luồng muốn sử dụng cùng một tài nguyên tại

một thời điểm nào đó, một trong 2 luồng phải đợi luồng kia kết thúc việc sử dụng tài nguyên

Trang 32

Lo i tr l n nhau (2) ạ ừ ẫ

 mptr: con trỏ tới biến mutex ("mutual

exclusion") kiểu pthread_mutex_t

 Biến mutex được khởi tạo với giá trị

PTHREAD_MUTEX_INITIALIZER nếu được gán tĩnh

 Thiết lập truy cập loại trừ lẫn nhau đến một biến chung

 Chỉ cho phép truy cập vào biến chung khi không bị khóa

Trang 33

Ví d v lo i tr l n nhau ụ ề ạ ừ ẫ

Trang 34

Đ t v n đ : Web client v i nhi u k t ặ ấ ề ớ ề ế

n i đ ng th i ố ồ ờ

 Luồng chính tạo nhiều luồng con để download nhiều đối

tượng Web cùng một lúc

 Luồng chính đợi các luồng con kết thúc download

 Tạo biến đếm số lượng luồng con đã thực hiện

xong ndone

Khi luồng con kết thúc, tăng biến đếm ndone lên 1

Luồng chính chờ đến khi biến đếm ndone khác 0

thì xử lý dữ liệu đọc được

Trang 35

Làm th n ế ào đ lu ng A theo dõi s ể ồ ự

thay đ i t i lu ng B? ổ ạ ồ

 Giải pháp

 Tạo một biến toàn cục X

 Luồng B update giá trị của biến X

 Luồng A đọc giá trị của biến X

 Vấn đề

 Luồng A phải tạo một vòng lặp để theo dõi biến X

=> Lãng phí CPU

Trang 36

Bi n đi u ki n Condition Variables ế ề ệ

 Cho phép một luồng chờ một tín hiệu gửi từ một luồng khác thông qua một biến điều kiện

pthread_mutex_t *mptr);

 Cho phép một luồng gửi tín hiệu qua một biến trạng thái

Trang 37

V i Web client v i nhi u k t n i đ ng ớ ớ ề ế ố ồ

 Tạo các luồng con để download file

 Khi biến đếm bằng 0, luồng chính chờ tín hiệu từ luồng con gửi qua biến trạng thái

 Luồng con

Sau khi kết thúc download, tăng biến đếm ndone và gửi tín

hiệu qua biến trạng thái

 Luồng chính

 Xử lý dữ liệu download từ luồng con

Trang 38

Ví d ụ

Ngày đăng: 22/12/2016, 13:11

TỪ KHÓA LIÊN QUAN

w