Lap Trinh May Chu7

  • Uploaded by: HocLieuMo
  • 0
  • 0
  • October 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Lap Trinh May Chu7 as PDF for free.

More details

  • Words: 3,637
  • Pages: 9
12/6/2007

Nội dung bài học

Lập trình máy chủ

Khái niệm các loại máy chủ Máy chủ xứ lý đồng thời, đa tiến trình, hướng kết nối Ví dụ về Máy chủ xử lý đồng thời, đa tiến trình, hướng kết nối Máy chủ xử lý đồng thời, đơn tiến trình, hướng kết nối Ví dụ về Máy chủ xử lý đồng thời, đơn tiến trình, hướng kết nối

  

 

Giáo viên: Nguyễn Hoài Sơn Bộ môn Mạng và Truyền thông máy tính Trường Đại học Công nghệ

Network programming

1





Máy chủ sử dụng giao thức TCP  Sử dụng khái niệm kết nối trong truyền tin  Chấp nhận kết nối từ máy khách  Tất cả các thông tin được gửi qua kết nối giữa máy chủ và máy khách  Đóng kết nối sau khi kết thúc truyền tin Ưu điểm  Truyền tin tin cậy Nhược điểm  Chi phí cao: phải tạo socket riêng cho từng kết nối với máy khách

Network programming

 

 







 

Cung cấp tính tin cậy đòi hỏi chi phí cao

3

Network programming

4

Máy chủ xử lý tuần tự 

Tại mỗi thời điểm, xử lý một yêu cầu 



Một tiến trình điều khiển Dễ thực hiện



Nhiều tiến trình điều khiển Các tiến trình thực hiện đồng thời Khó thực hiện

Đưa các yêu cầu mới vào một hàng đợi

Yêu cầu của một máy khách chỉ được xử lý khi tất cả các yêu cầu trước đó được xử lý xong Dễ thực thi nhưng kém hiệu quả 

Chương trình xử lý đồng thời 

Chỉ cần một socket Thích hợp với kiểu truyền tin quảng bá/quảng phát Người lập trình được tự do lựa chọn cách thức thực thi tính tin cậy trong truyền tin

Nhược điểm 

Chương trình xử lý tuần tự 

Máy chủ sử dụng giao thức UDP Ưu điểm 

Khái niệm xử lý tuần tự/xử lý đồng thời 

2

Máy chủ không kết nối

Máy chủ hướng kết nối 

Network programming

Server

Nhất là trường hợp yêu cầu xử lý ít phải chờ yêu cầu xử lý nhiều kết thúc

Receiving requests from Client 1 Receiving requests from Client 2

Client1 Client2 Network programming

5

Network programming

6

1

12/6/2007

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

Cách thực hiện máy chủ xử lý tuần tự 

Một máy chủ xử lý tuần tự thực hiện theo các bước đơn giản sau  



Tạo socket và gán thông tin cổng cho socket Lặp lại   







Chấp nhận yêu cầu từ máy khách Xử lý yêu cầu Tạo thông báo kết quả và gửi trả lại máy khách

Server

Trong trường hợp của máy chủ xử lý tuần tự hướng kết nối 

Client2 7

Cách thực thi máy chủ xử lý đồng thời 











Tạo ra nhiều tiến trình Mỗi tiến trình xử lý một yêu cầu của máy khách

Đa luồng 

 



Đơn tiến trình Xuất nhập dữ liệu tại nhiều socket cùng một lúc Nhận dữ liệu đồng thời từ nhiều kết nối, xử lý tuần tự các yêu cầu



9

Network programming

Phân loại máy chủ Tuần tự Không kết nối

Tuần tự không kết nối

Hướng kết nối

Tuần tự hướng kết nối

Trả lời một yêu cầu cần nhiều thời gian xuất/nhập dữ liệu 

Tạo ra nhiều luồng Mỗi luồng xử lý một yêu cầu của máy khách

Đa xuất nhập (I/O multiplex) 

8

Network programming

Xử lý đồng thời tốt trong trường hợp nào?

Đa tiến trình 

Receiving requests from Client 1 Receiving requests from Client 2

Client1

Tại mỗi thời điểm, máy chủ xử lý từng yêu cầu đến từ một kết nối tới một máy khách Network programming

Có thể xử lý nhiều yêu cầu đến cùng một lúc Máy khách không cần đợi yêu cầu trước đó kết thúc Hiệu quả cao hơn máy chủ xử lý tuần tự trong hầu hết các trường hợp nhưng khó thực hiện hơn

E.g. File transfer, Telnet

Thời gian xử lý các yêu cầu của máy khách là khác nhau lớn Máy chủ chạy trên một máy tính có nhiều bộ vi xử lý

Network programming

10

Máy chủ xử lý đồng thời, không kết nối, đa tiến trình 

Bước 1 tiến trình mẹ: Khởi tạo socket, gán



Bước 2 tiến trình mẹ: Lặp lại lệnh recvfrom( )

Đồng thời

Network programming

Đồng thời không kết nối Đồng thời hướng kết nối

11

thông tin cho socket

để nhận yêu cầu từ máy khách và khởi tạo tiến trình con để xử lý yêu cầu của máy khách

Network programming

12

2

12/6/2007

Máy chủ xử lý đồng thời, không kết nối (2)

Thực thi máy chủ xử lý đồng thời, hướng kết nối đa tiến trình như thế nào?



Bước 1 tiến trình con: Xử lý yêu cầu của máy khách Bước 2 tiến trình con: Tạo thông báo trả lời và gửi Bước 3 tiến trình con: Kết thúc sau khi xử lý xong





Do chi phí cao khi khởi tạo một tiến trình con nên ít máy chủ không kết nối sử dụng cách xử lý đồng thời đa tiến trình









trả lại máy khách bởi hàm sendto( )

yêu cầu

13

Network programming

Network programming

Bước 1 tiến trình mẹ: Khởi tạo socket, gán



slave1

slave2

slaven

Server application processes

thông tin cho socket và chuyển socket sang trạng thái thụ động, chờ kết nối Bước 2 tiến trình mẹ: 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 tiến trình con để xử lý yêu cầu của máy khách



socket for individual connections

Operating system

Network programming

15





Network programming

#include pid_t fork(void);

Bước 1 tiến trình con: Nhận socket kết nối với máy khách Bước 2 tiến trình con: Đọc yêu cầu của máy khách, xử lý yêu cầu và gửi thông báo trả lời cho máy khách Bước 3 tiến trình con: Đóng kết nối và thoát sau khi xử lý xong yêu cầu của máy khách

Returns: 0 in child, process ID of child in parent, -1 on error 



Khởi tạo một tiến trình con chỉ khác tiến trình mẹ ở PID và PPID Gọi một lần nhưng trả về 2 lần 



 Network programming

16

fork(): Tạo tiến trình mới

Cách thực thi máy chủ xử lý đồng thời, hướng kết nối, đa tiến trình (2) 

14

Cách thực thi máy chủ xử lý đồng thời, hướng kết nối, đa tiến trình

master

Socket for connection requests

Lệnh accept dừng thực thi của máy chủ để đợi kết nối đến cổng chờ Khi có kết nối từ máy khách, tiến trình mẹ sẽ khởi tạo một tiến trình con để xử lý kết nối Tiến trình mẹ sẽ chờ để chấp nhận một kết nối khác

17

Trả về trên tiến trình mẹ với giá trị trả về là PID của tiến trình con Trả về trên tiến trình con, với giá trị trả về là 0

Lấy PID của tiến trình mẹ bằng hàm getppid() Network programming

18

3

12/6/2007

Ví dụ về máy chủ ECHO xử lý đồng thời, đa tiến trình

2 cách sử dụng điển hình với fork 

Một tiến trình muốn thực hiện nhiều công việc cùng một lúc 



Tiến trình sẽ tạo ra một bản copy của nó. Mỗi bản copy sẽ thực hiện một công việc

Tiến trình sẽ tạo ra một bản copy của nó và bản copy đó sẽ chạy chương trình mới

Network programming

19

Chi tiết về xử lý đồng bộ





Xử lý đồng bộ với fork()



fork() Server(child) Server (child) listenfd connfd

Lệnh Exit được sử dụng để kết thúc tiến trình Khi tiến trình con kết thúc, hệ thống sẽ tự động đóng các socket kết nối lại

21

Một tín hiệu (SIGCHLD) sẽ được gửi đến tiến trình mẹ khi một tiến trình con kết thúc Tiến trình con sau khi kết thúc sẽ tồn tại ở trạng thái zombie cho đến khi tiến trình mẹ thực hiện lệnh gọi wait3 (wait, waitpid)

Network programming

Tiến trình mẹ sẽ bắt tín hiệu kết thúc của tiến trình con và gọi hàm xử lý tín hiệu

signal(SIGCHLD, sig_chld)



TT STAT COMMAND WCHAN pts/3 S+ ./daytime_server pts/3 Z+ [daytime_server]<defunct> exit

Tiến trình zombie sẽ làm tốn tài nguyên máy tính chiếm chỗ trên bộ nhớ

Network programming

22

Giải quyết vấn đề tiến trình không kết thúc hoàn toàn như thế nào? 

linux % ps -o pid,ppid,tty,stat,args,wchan

PID PPID 3674 3453 3676 3674



listenfd connfd

connection

Vấn đề tiến trình không kết thúc hoàn toàn



connection request connection

tiết tục sử dụng socket kết nối connfd cho đến khi thoát ra (exit)

Network programming



Server(parent) server

client connect()

Tiến trình con phải thoát ra (exit) sau khi đã thực hiện xong dịch vụ 



20

Network programming

Tiến trình mẹ  đóng socket kết nối connfd của kết nối mới  sử dụng socket chờ listenfd để tiếp tục chờ kết nối mới Tiến trình con  đóng socket chờ istenfd  cung cấp dịch vụ echo (str_echo(connfd)) thông qua kết nối mới





tcpserv02.c

Một tiến trình muốn chạy một chương trình khác 







23

Hàm signal biểu thị rằng tiến trình mẹ cần gọi hàm sig_chld mỗi khi nó nhận được tín hiệu SIGCHLD báo hiệu một tiến trình con đã kết thúc Hàm sig_chld gọi hàm wait3 để hoàn thành việc kết thúc của tiến trình con Network programming

24

4

12/6/2007

/* sig_chld - clean up zombie child */ void sig_chld(int signo){ signo) int status; while (wait3(&status, WNOHANG, (struct rusage *) 0) >= 0) /* empty */; }  Giá trị status sau khi hàm wait3 trả về sẽ cho biết trạng thái kết thúc của tiến trình con  Tùy chọn WNOHANG cho phép tiến trình mẹ không bị dừng thực thi nếu không có tiến trình con nào kết thúc Network programming





waitpid trả về giá trị là cấu trúc status để có thể kiểm tra thông tin về tiến



Tùy chọn –1 để chỉ đợi tiến trình con thứ nhất

trình con đã kết thúc

26

Network programming

Ví dụ về máy chủ ECHO xử lý đồng thời, đa tiến trình

Vấn đề: 

/* reaper - clean up zombie child */ void sig_chld (int sig) { pid_t pid; int status while ((pid = waitpid (-1, &status, WNOHANG) )> 0) /* empty */; return; }

25

Xử lý cuộc gọi hệ thống bị ngắt như thế nào? 

Cách viết khác của hàm sig_chld



Tín hiệu SIGCHLD được tạo ra khi tiến trình mẹ đang ngừng thực thi để chờ chấp nhận kết nối mới. Điều gì xảy ra khi hàm xử lý tín hiệu trả về giá trị? Hàm accept sẽ trả về giá trị lỗi là EINTR (interrupted signal call). Tiến trình mẹ cần phải bỏ qua lỗi này.

tcpserv03.c

If ((ssock=accept(….)) <0) if (errno = EINTR) continue; else err_sys(“accept error”); Network programming

27

28

Network programming

Tại sao lại xử lý đồng thời đơn tiến trình? tr nh?

Máy chủ hướng kết nối, xử lý đồng thời, đơn tiến trình

  

Chi phí khi tạo tiến trình Chia sẻ thông tin giữa các kết nối được dễ dàng Máy chủ xử lý đồng thời sẽ xử lý một cách tuần tự nếu thời gian xử lý một yêu cầu của máy khách là ngắn 

Sử dụng đa tiến trình chỉ có hiệu quả khi CPU không thể xử lý các yêu cấu một cách tuần tự request1

request 2 request 3

request1

request 2 request 1 request 3 request 1

CPU time

CPU time

Network programming

29

Network programming

30

5

12/6/2007

Thực hiện xử lý đồng thời đơn tiến trình như thế nào? 





Một socket sẽ được gán với cổng lắng nghe để chấp nhận kết nối mới đến Các socket khác sẽ ứng với các kết nối đến các máy khách

Network programming

Socket lắng nghe yêu cầu kết nối

 

Nếu socket lắng nghe sẵn sàng, tiến trình sẽ gọi hàm accept() để chấp nhận kết nối mới đến Nếu socket kết nối sẵn sàng, tiến trình sẽ gọi hàm read() để nhận yêu cầu đến từ máy khách, xử lý yêu cầu và gửi trả lại kết quả xử lý Sau đó các bước trên được lặp lại Làm thế nào để đợi xuất nhập dữ liệu trên tất cả các sockets và biết socket nào đã sẵn sàng?

Network programming

recvfrom

   



Network programming

34

Nonblocking model application system call recvfrom EWOULDBLOCK

no datagram ready

datagram ready copy datagram copy data from kernel to user

recvfrom

system call

kernel no datagram ready no datagram ready

EWOULDBLOCK process repeatedly call recvfrom, waiting for an OK return

recvfrom

system call

wait for data

datagram ready copy datagram copy data from kernel to user

return OK process datagram

32

Xuất nhập chặn (Blocking I/O) Xuất nhập không chặn (Nonblocking I/O) Đa xuất nhập (I/O multiplexing) Xuất nhập dựa tín hiệu (signal driven I/O) (SIGIO) Xuất nhập không đồng bộ (asynchronous I/O)

wait for data process blocks in call to recvfrom

Operating system

Các mô hình xuất nhập dữ liệu

kernel system call

<---

Network programming

33

Blocking I/O Model application

Socket kết nối ứng với mỗi kết nối riêng biệt

31

Thực hiện xử lý đồng thời đơn tiến trình như thế nào? (2)



Server <--application process

Duy trì một tập các sockets 



server

Một máy chủ đồng thời, đơn tiến trình sẽ phải thực hiện chức năng của cả tiến trình mẹ và tiến trình con trong mô hình máy chủ đa tiến trình

return OK copy complete

Network programming

process datagram

35

copy complete

Network programming

36

6

12/6/2007

I/O Multiplexing Model kernel

application select process blocks in call to select, waiting for one of possibly many sockets to become readable process blocks while data is copied into application buffer

Signal-driven I/O model

system call

establish SIGIO signal handler wait for data

system call

datagram ready copy datagram

recvfrom copy data from kernel to user

return OK copy complete

process datagram

process continues executing

signal handler

return readable recvfrom

process blocks while data is copied into application buffer

37

Network programming

aio_read



no datagram ready

return wait for data datagram ready



copy datagram

signal handler process datagram

copy data from kernel to user

 

39

datagram ready copy datagram

return OK copy complete

process datagram

copy data from kernel to user

38

Không chỉ có socket Có thể thiết lập thời gian timeout tối đa

Một trong các mô tả file của tập {1,4,5} sẵn sàng để đọc Một trong các mô tả file của tập {2,7} sẵn sàng để ghi Một trong các mô tả file của tập {1,4,5} nhận ngoại lệ Sau khi đã hết 20 giây

Network programming







maxfdp1: số lượng tối đa các mô tả file mà hệ thống phải kiểm tra trạng



readset, writeset, exceptset: tập các mô tả file mà hệ thống sẽ kiểm tra

thái

trạng thái sẵn sàng đọc, viết, và có ngoại lệ timeout: thời gian timeout đợi một trong các mô tả file trở nên sẵn sàng



Kiểu dữ liệu fd_set data :



Biểu diễn tập các miêu tả file dưới dạng chuỗi integer, mỗi bit trong chuỗi ứng với một miêu tả file

Network programming

system call

40

Khi nào một socket ở trạng thái sẵn sàng đọc

Các tham số





copy complete

#include <sys/select.h>#include <sys/time.h> int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); Returns: positive count of ready descriptors, 0 on timeout, –1 on error



deliver SIGIO

Ví dụ, hàm select sẽ trả về giá trị khi: 

deliver signal

Select(): dùng cho xuất nhập không đồng bộ





specified in aio_read

Network programming



wait for data

Hàm Select cung cấp xuất nhật dữ liệu không đồng bộ bằng cách cho phép một tiến trình có thể đợi trạng thái sẵn sàng đầu tiên của nhiều sockets trong một tập mô tả file đã được định sẵn 

process continues executing

return

Hàm gọi select

kernel system call

sigaction system call

Network programming

Asynchronous I/O Model application

kernel

application

no datagram ready

41

Khi số byte dữ liệu trong buffer của socket lớn hơn hoặc bằng kích thước tối thiểu (mặc định là 1)  Chúng ta có thể thiết lập giá trị kích thước tối thiểu bằng tùy chọn SO_RCVLOWAT Khi một nửa đọc của kết nối bị đóng  Kết nối TCP nhận được gói tin FIN  Một thao tác đọc socket sẽ trả về giá trị 0 (i.e. EOF) Nếu socket là socket lắng nghe thì số lượng kết nối đã hoàn thành bắt tay ba bước trong hàng đợi lớn hơn 0 Một lỗi socket đang chờ  Một thao tác đọc socket sẽ trả về giá trị -1 với tập errno được gán giá trị tùy thuộc vào lỗi xảy ra Network programming

42

7

12/6/2007

Khi nào một socket ở trạng thái sẵn sàng ghi?

Macros 

Khi số byte trống trong buffer gửi của socket lớn hơn hoặc bằng độ lớn tối thiểu (mặc định là 2048) và :



 

socket đang được kết nối socket không cần kết nối(e.g., UDP)



Một nữa đọc của kết nối bị đóng







Một thao tác viết trên socket sẽ sinh ra tín hiệu SIGPIPE

Một socket sử dụng kết nối non-blocking vừa hoàn thành bắt tay 3 bước hay kết nối đó bị thất bại Một lỗi socket đang chờ









Một thao tác viết trên socket đó sẽ trả về giá trị -1 cùng với tập errno set được gán giá trị của lỗi

Network programming

43

Cách thực thi máy chủ 1.

2.

3.

4.

5.

6.

45

Ví dụ - Máy chủ ECHO đơn tiến trình

44

Nếu có socket kết nối sẵn sàng, gọi hàm đọc để đọc yêu cầu từ máy khách, xử lý yêu cầu và tạo thông báo trả lới. Gọi hàm ghi để gửi thông báo trả lời cho máy khách Tiếp tục xử lý với bước 2 ở trên

Network programming

46

/* main- concurrent TCP server for ECHO service */ int main(int argc, *argv[]) { char *service = “echo”; /*service name or port number */ struct sockaddr_in fsin; /* the from address of a client */ int alen; /* length of a client’s address */ int msock; /* master server socket */ fd_set rfds; /* read file descriptor set */ fd_set afsd; /* active file descriptor set */ int fd;

/* TCPmechod.c - main, TCPechod */ /* include header files here */ #define QLEN 5 /*max. connection queue length */ #define BUFSIZE 4096 extern int errno; /*echo data until end of file */ int echo (int fd) int errexit (const char *format, …); int passiveTCP (const char *service, int qlen);

Network programming

Network programming

Cách thực thi máy chủ (2)

Tạo ra socket lắng nghe tại một cổng dịch vụ. Gán socket này vào tập mô tả file xuất nhập dữ liệu Sử dụng lệnh gọi select để chờ xuất nhập dữ liệu trên tập mô tả file của các sockets Nếu socket lắng nghe sẵn sàng, gọi hàm accept để chấp nhận kết nối mới và nhận về một socket kết nối. Gán socket kết nối vào tập mô tả file xuất nhập dữ liệu Network programming

/* Xóa tất cả các bits trong fdset */ void FD_ZERO(fd_set *fdset); /* Bật một bit ứng với fd trong fdset */ void FD_SET(inf fd, fd_set *fdset); /* Tắt một bit ứng với fd trong fdset */ void FD_CLR(inf fd, fd_set *fdset); /* Kiểm tra xem bit ứng với fd trong fdset có được bật lên hay không*/ Int FD_ISSET(inf fd, fd_set *fdset);

/* check arguments - not detailed here*/

47

Network programming

48

8

12/6/2007

if ( FD_ISSET (msock, &rfds)) { int ssock;

msock = passiveTCP (service, QLEN); FD_ZERO (&afds); FD_SET (msock, &afds);

alen = sizeof (fsin); ssock = accept(msock,(struct sockaddr *)&fsin, &alen); if ( ssock < 0) errexit (“accept: %s\n, strerror (errno)); FD_SET (ssock, &afds);

while(1) { memcpy(&rfds, &afds, sizeof(rfds)); if ( select (FD_SETSIZE, &rfds, (fd_set *) 0, (fd_set *) 0, (struct timeval *) 0) < 0) errexit (“select: %s\n”, strerror(errno)); Network programming

49

Network programming

50

/* Echo - echo one buffer of data, returning byte count */

for ( fd = 0; fd < FD_SETSIZE; ++fd) if (fd!=msock && FD_ISSET(fd, &rfds)) if (echo(fd) ==0 ) { (void) close (fd); FD_CLR (fd, &afds); } }

int echo (int fd) { char buf[BUFSIZE]; int cc; cc = read (fd, buf, sizeof(buf)); if ( cc < 0 ) errexit(“echo read: %s\n”, strerror(errno)); if (cc && write(fd, buf, cc) < 0 ) errexit (“echo write: %s\n”, strerror(errno)); return cc; }

}

Network programming

}

51

Network programming

52

Vấn đề của xử lý đồng thời, đơn tiến trình Xử lý đồng thời nhiều kết nối … nhưng xử lý tuần tự các yêu cầu => Denial Of Service



Network programming

53

9

Related Documents

Lap Trinh May Chu7
October 2019 32
Lap Trinh
June 2020 25
Phong Cach Lap Trinh
July 2020 17
Lap Trinh Vb.net
November 2019 23
Lap Trinh Can Ban
May 2020 23

More Documents from ""

Ltdt6
October 2019 9
Dstt05
October 2019 7
Otmat08
October 2019 10
Otmat04
October 2019 11
Sthc04
October 2019 10
Pluatdc5
October 2019 7