freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

顧客服務(wù)員程序設(shè)計要點(編輯修改稿)

2025-08-23 00:33 本頁面
 

【文章內(nèi)容簡介】 MSS值是一個16位字段,最大值是65535字節(jié)。這個值適合IPv4,因為IPv4數(shù)據(jù)報中的最大TCP數(shù)據(jù)量為65495字節(jié)(即65535減去IPv4頭部20字節(jié)和TCP頭部20字節(jié))。但是,IPv6有特大有效負(fù)荷選項,因此需要使用另外的技術(shù)。首先,沒有特大有效負(fù)荷選項的IPv6數(shù)據(jù)報中最大的TCP數(shù)據(jù)量為65515字節(jié)(即65535減去TCP頭部20字節(jié))。因此65535這個MSS值被認(rèn)為是“無限”的特殊值,它只在用到特大有效負(fù)荷選項時才有用,而這種情況又要求MTU超過65535。如果TCP使用特大有效負(fù)荷選項,并且接收到的對方通告的MSS超過65535,那么它所發(fā)送數(shù)據(jù)報的大小限制就是接口MTU。如果這個值太大(即路徑上某個鏈路的MTU比它?。敲绰窂組TU的發(fā)現(xiàn)功能將確定這個最小值。 TCP發(fā)送 圖47說明了應(yīng)用程序發(fā)送數(shù)據(jù)到TCP套接口的過程。用戶進(jìn)程應(yīng)用進(jìn)程緩沖區(qū)(大小任意)應(yīng)用進(jìn)程內(nèi)核套接口發(fā)送緩沖區(qū)TCPMSS大小的TCP分片MSSMTU40(IPv4)或60(IPv6)IPMTU大小的IPv4或IPv6分組輸出隊列數(shù)據(jù)鏈路圖47 應(yīng)用程序發(fā)送數(shù)據(jù)到TCP套接口的過程 每個TCP套接口都有一個發(fā)送緩沖區(qū),用戶可以使用SO_SNDBUF套接口選項來改變這個緩沖區(qū)的大小。當(dāng)應(yīng)用程序調(diào)用write時,內(nèi)核從應(yīng)用進(jìn)程的緩沖區(qū)中拷貝所有數(shù)據(jù)到套接口的發(fā)送緩沖區(qū)。如果套接口的發(fā)送緩沖區(qū)不能存放應(yīng)用程序的所有數(shù)據(jù)(即應(yīng)用程序的緩沖區(qū)大于套接口發(fā)送緩沖區(qū),或者套接口發(fā)送緩沖區(qū)還有其它數(shù)據(jù)),應(yīng)用程序?qū)⒈粧炱穑ㄋ撸@里假設(shè)套接口是阻塞的(缺省設(shè)置)。內(nèi)核將不從write系統(tǒng)調(diào)用返回,直到應(yīng)用進(jìn)程緩沖區(qū)中的所有數(shù)據(jù)都拷貝到套接口發(fā)送緩沖區(qū)。所以從寫一個TCP套接口的write調(diào)用成功返回僅表示可以重新使用應(yīng)用進(jìn)程的緩沖區(qū)。它并不能告訴用戶對方的TCP或?qū)Ψ綉?yīng)用進(jìn)程已接收到數(shù)據(jù)。 TCP取出套接口發(fā)送緩沖區(qū)的數(shù)據(jù)并把它發(fā)送給對方TCP,其過程基于TCP數(shù)據(jù)傳送的所有規(guī)則。對方TCP必須確認(rèn)收到的數(shù)據(jù),只有收到對方的ACK,發(fā)送方TCP才能刪除套接口發(fā)送緩沖區(qū)中已確認(rèn)的數(shù)據(jù)。TCP必須保留數(shù)據(jù)拷貝直到對方確認(rèn)為止。 TCP以MSS大小或者更小的塊發(fā)送數(shù)據(jù)給IP(它同時給每個數(shù)據(jù)塊填上TCP頭部以構(gòu)成分片),其中MSS是由對方通告的,當(dāng)對方未通告時使用536這個值。IP給每個TCP分片填上IP頭部以構(gòu)成數(shù)據(jù)報,查找其目的IP地址的路由表項以確定外出接口,然后把數(shù)據(jù)報傳遞給相應(yīng)的數(shù)據(jù)鏈路。IP可能先將數(shù)據(jù)報分段,再傳送給鏈路層。但如上所述,MSS選項的目的是避免分片,而新的實現(xiàn)又使用路徑MTU發(fā)現(xiàn)功能。每個鏈路有一個輸出隊列,如果輸出隊列滿,則分組丟棄,并沿協(xié)議棧向上返回一個錯誤。TCP將注意這個錯誤,并在以后的某個時刻重傳這個分片,但應(yīng)用進(jìn)程不知道這些細(xì)節(jié)。 UDP發(fā)送 圖48說明了應(yīng)用程序發(fā)送數(shù)據(jù)到UDP套接口的過程。用戶進(jìn)程應(yīng)用進(jìn)程緩沖區(qū)應(yīng)用進(jìn)程內(nèi)核套接口發(fā)送緩沖區(qū)UDPUDP數(shù)據(jù)報 IPMTU大小的IPv4或IPv6分組輸出隊列數(shù)據(jù)鏈路圖48 應(yīng)用程序發(fā)送數(shù)據(jù)到UDP套接口的過程 在圖48中,套接口發(fā)送緩沖區(qū)用虛線框,因為它并不存在。UDP套接口有發(fā)送緩沖區(qū)的大?。ㄓ脩艨梢允褂肧O_SNDBUF套接口選項修改),但是它僅僅是發(fā)送(sendto)到套接口的UDP數(shù)據(jù)報的上限。如果應(yīng)用程序發(fā)送一個大于套接口發(fā)送緩沖區(qū)的數(shù)據(jù)報,則返回EMSGSIZE錯誤。由于UDP是一種不可靠的服務(wù),它不必保存應(yīng)用程序的數(shù)據(jù)拷貝,因此不需要一個真正的緩沖區(qū)。(應(yīng)用進(jìn)程的數(shù)據(jù)沿協(xié)議棧向下傳遞時,以某種形式拷貝到內(nèi)核的緩沖區(qū),當(dāng)鏈路層把數(shù)據(jù)傳出后這個拷貝將丟棄。) UDP簡單地填加它的8個字節(jié)的頭部以構(gòu)成數(shù)據(jù)報并把它傳遞給IP。IPv4或IPv6給它填加相應(yīng)的IP頭部,執(zhí)行路由操作確定外出接口,然后或者直接將數(shù)據(jù)報加入鏈路層輸出隊列(如果適合于MTU),或者分段后在把每個段加入數(shù)據(jù)鏈路層的輸出隊列。 如果UDP應(yīng)用進(jìn)程發(fā)送一個大的數(shù)據(jù)報(例如2000字節(jié)數(shù)據(jù)報),它比TCP應(yīng)用進(jìn)程更有可能分片,因為TCP會將應(yīng)用進(jìn)程數(shù)據(jù)分成MSS大小的塊,但UDP卻沒有這個能力。 從寫UDP套接口的sendto調(diào)用成功返回表示數(shù)據(jù)報或所有片段已被加入鏈路層的輸出隊列。如果輸出隊列沒有足夠的空間存放數(shù)據(jù)報或它的某個分片,UDP將返回應(yīng)用進(jìn)程ENOBUFS錯誤。這里需要注意的是,有些UDP的實現(xiàn)不返回這種錯誤,這樣甚至數(shù)據(jù)報未經(jīng)發(fā)出就丟失的情況應(yīng)用進(jìn)程也不知道。 網(wǎng)絡(luò)服務(wù)員工作模式 當(dāng)用戶開發(fā)一個服務(wù)器程序時,有如下類型的進(jìn)程控制方法可供選擇:l 迭代服務(wù)器程序。這種方式主要用于簡單的網(wǎng)絡(luò)服務(wù)。它的主要缺點是在當(dāng)前顧客服務(wù)完成之前,新到達(dá)的顧客無法得到服務(wù)。l 并發(fā)服務(wù)器程序,它為每個顧客fork一個子進(jìn)程提供服務(wù),這是Unix服務(wù)器程序通常的做法。l 使用select調(diào)用在一個進(jìn)程內(nèi)同時服務(wù)多個顧客的TCP服務(wù)器程序。l 使用線程替代進(jìn)程實現(xiàn)的并發(fā)服務(wù)器程序。本節(jié)中介紹兩種新的并發(fā)程序設(shè)計方法:l 預(yù)先派生子進(jìn)程(preforking)。服務(wù)器啟動后就派生一組子進(jìn)程,形成一個子進(jìn)程池。沒當(dāng)?shù)絹硪粋€顧客請求,就從進(jìn)程池內(nèi)選擇一個可用子進(jìn)程為它服務(wù)。l 預(yù)先創(chuàng)建線程(prethreading)。服務(wù)器啟動后就創(chuàng)建一組線程,形成一個線程池。每個顧客請求由池中的一個線程提供服務(wù)。 TCP迭代服務(wù)器程序 迭代服務(wù)器總是在完全處理了一個顧客的請求后,才響應(yīng)下一個顧客的請求。這種方式主要用于簡單的網(wǎng)絡(luò)服務(wù),下面程序給出了使用迭代方法實現(xiàn)的一個簡單的時間/日期服務(wù)器程序。include include intmain(int argc, char **argv){ int listenfd, connfd。 struct sockaddr_in servaddr。 char buff[MAXLINE]。 time_t ticks。 listenfd = Socket(AF_INET, SOCK_STREAM, 0)。 bzero(amp。servaddr, sizeof(servaddr))。 = AF_INET。 = htonl(INADDR_ANY)。 = htons(13)。 /* daytime server */ Bind(listenfd, (SA *) amp。servaddr, sizeof(servaddr))。 Listen(listenfd, LISTENQ)。 for ( 。 。 ) { connfd = Accept(listenfd, (SA *) NULL, NULL)。 ticks = time(NULL)。 snprintf(buff, sizeof(buff), %.24s\r\n, ctime(amp。ticks))。 Write(connfd, buff, strlen(buff))。 Close(connfd)。 }} 從進(jìn)程控制的角度來看,迭代服務(wù)器是最快的,因為它不進(jìn)行進(jìn)程控制。 TCP并發(fā)服務(wù)器程序 傳統(tǒng)上,并發(fā)服務(wù)器是調(diào)用fork派生一個子進(jìn)程來處理顧客的請求。這使得服務(wù)器可在同一時間為多個顧客提供服務(wù)。唯一的限制是操作系統(tǒng)對同一用戶可擁有的進(jìn)程數(shù)量的限制。下面的程序例子是一個并發(fā)服務(wù)器的實現(xiàn)。絕大多數(shù)TCP服務(wù)器程序也是這樣編寫的。include intmain(int argc, char **argv){ int listenfd, connfd。 pid_t childpid。 void sig_chld(int), sig_int(int), web_child(int)。 socklen_t clilen, addrlen。 struct sockaddr *cliaddr。 if (argc == 2) listenfd = Tcp_listen(NULL, argv[1], amp。addrlen)。 else if (argc == 3) listenfd = Tcp_listen(argv[1], argv[2], amp。addrlen)。 else err_quit(usage: serv01 [ host ] port)。 cliaddr = Malloc(addrlen)。 Signal(SIGCHLD, sig_chld)。 Signal(SIGINT, sig_int)。 for ( 。 。 ) { clilen = addrlen。 if ( (connfd = accept(listenfd, cliaddr, amp。clilen)) 0) { if (errno == EINTR) continue。 /* back to for() */ else err_sys(accept error)。 } if ( (childpid = Fork()) == 0) { /* child process */ Close(listenfd)。 /* close listening socket */ web_child(connfd)。 /* process the request */ exit(0)。 } Close(connfd)。 /* parent closes connected socket */ }}/* end serv01 */ 并發(fā)服務(wù)器的問題在于fork子進(jìn)程時所消耗的CPU時間。20世紀(jì)80年代后期,當(dāng)一個服務(wù)器一天只需處理幾百、幾千個顧客請求時,這樣實現(xiàn)從性能上是能夠滿足的。然而到了Web時代,一個重負(fù)荷的Web服務(wù)器一天的訪問數(shù)量以百萬計。這種情況下,就單臺主機(jī)而言,對于最繁忙的站點往往運行多臺主機(jī)來分?jǐn)傌?fù)載。改進(jìn)服務(wù)器性能的方法有以下幾種。 可以采用預(yù)先派生子進(jìn)程技術(shù)來提高并發(fā)服務(wù)器的性能。預(yù)先派生子進(jìn)程服務(wù)器程序不再為每個顧客請求fork一個子進(jìn)程,而是在服務(wù)器啟動時就預(yù)先派生一組子進(jìn)程,做好為接入的顧客請求服務(wù)的準(zhǔn)備。圖49顯示了一個預(yù)先派生N個子進(jìn)程的服務(wù)器正在為2個顧客同時服務(wù)的情形。顧客1子進(jìn)程1顧客2子進(jìn)程2父進(jìn)程子進(jìn)程3可用子進(jìn)程池…..子進(jìn)程N圖49 預(yù)先派生子進(jìn)程的并發(fā)服務(wù)器 使用預(yù)先派生子進(jìn)程的描述代碼如下:include static int nchildren。static pid_t *pids。intmain(int argc, char **argv){ int listenfd, i。 socklen_t addrlen。 void sig_int(int)。 pid_t child_make(int, int, int)。 if (argc == 3) listenfd = Tcp_listen(NULL, argv[1], amp。addrlen)。 else if (argc == 4) listenfd = Tcp_listen(argv[1], argv[2], amp。addrlen)。 else err_quit(usage: serv02 [ host ] port children)。 nchildren = atoi(argv[argc1])。 pids = Calloc(nchildren, sizeof(pid_t))。 for (i = 0。 i nchildren。 i++) pids[i] = child_make(i, listenfd, addrlen)。 /* parent returns */ Signal(SIGINT, sig_int)。 for ( 。 。 ) pause()。 /* everything done by children */} 這種技術(shù)的優(yōu)點在于:不需要引入父進(jìn)程執(zhí)行fork的開銷,新的顧客請求就能得到服務(wù)。而缺點在于:每次啟動服務(wù)器時
點擊復(fù)制文檔內(nèi)容
法律信息相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1