騰訊后臺(tái)開發(fā)面試題解答_第1頁(yè)
騰訊后臺(tái)開發(fā)面試題解答_第2頁(yè)
騰訊后臺(tái)開發(fā)面試題解答_第3頁(yè)
騰訊后臺(tái)開發(fā)面試題解答_第4頁(yè)
騰訊后臺(tái)開發(fā)面試題解答_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、linux和os:netstat :顯示網(wǎng)絡(luò)狀態(tài)tcpdump:主要是截獲通過本機(jī)網(wǎng)絡(luò)接口的數(shù)據(jù),用以分析。能夠截獲當(dāng)前所有通過本機(jī)網(wǎng)卡的數(shù)據(jù)包。它擁有靈活的過濾機(jī)制,可以確保得到想要的數(shù)據(jù)。ipcs:檢查系統(tǒng)上共享內(nèi)存的分配ipcrm:手動(dòng)解除系統(tǒng)上共享內(nèi)存的分配(如果這四個(gè)命令沒聽說過或者不能熟練使用,基本上可以回家,通過的概率較小 _ ,這四個(gè)命令的熟練掌握程度基本上能體現(xiàn)面試者實(shí)際開發(fā)和調(diào)試程序的經(jīng)驗(yàn))cpu 內(nèi)存 硬盤 等等與系統(tǒng)性能調(diào)試相關(guān)的命令必須熟練掌握,設(shè)置修改權(quán)限 tcp網(wǎng)絡(luò)狀態(tài)查看 各進(jìn)程狀態(tài) 抓包相關(guān)等相關(guān)命令 必須熟練掌握awk sed需掌握共享內(nèi)存的使用實(shí)現(xiàn)原理(必

2、考必問,然后共享內(nèi)存段被映射進(jìn)進(jìn)程空間之后,存在于進(jìn)程空間的什么位置?共享內(nèi)存段最大限制是多少?)共享內(nèi)存定義:共享內(nèi)存是最快的可用IPC(進(jìn)程間通信)形式。它允許多個(gè)不相關(guān)的進(jìn)程去訪問同一部分邏輯內(nèi)存。共享內(nèi)存是由IPC為一個(gè)進(jìn)程創(chuàng)建的一個(gè)特殊的地址范圍,它將出現(xiàn)在進(jìn)程的地址空間中。其他進(jìn)程可以把同一段共享內(nèi)存段“連接到”它們自己的地址空間里去。所有進(jìn)程都可以訪問共享內(nèi)存中的地址。如果一個(gè)進(jìn)程向這段共享內(nèi)存寫了數(shù)據(jù),所做的改動(dòng)會(huì)立刻被有訪問同一段共享內(nèi)存的其他進(jìn)程看到。因此共享內(nèi)存對(duì)于數(shù)據(jù)的傳輸是非常高效的。共享內(nèi)存的原理:共享內(nèi)存是最有用的進(jìn)程間通信方式之一,也是最快的IPC形式。兩個(gè)不同

3、進(jìn)程A、B共享內(nèi)存的意思是,同一塊物理內(nèi)存被映射到進(jìn)程A、B各自的進(jìn)程地址空間。進(jìn)程A可以即時(shí)看到進(jìn)程B對(duì)共享內(nèi)存中數(shù)據(jù)的更新,反之亦然。c+進(jìn)程內(nèi)存空間分布(注意各部分的內(nèi)存地址誰高誰低,注意棧從高到低分配,堆從低到高分配)ELF是什么?其大小與程序中全局變量的是否初始化有什么關(guān)系(注意未初始化的數(shù)據(jù)放在bss段)可執(zhí)行文件:包含了代碼和數(shù)據(jù)。具有可執(zhí)行的程序??芍囟ㄎ晃募喊舜a和數(shù)據(jù)(這些數(shù)據(jù)是和其他重定位文件和共享的 object文件一起連接時(shí)使用的)共享object文件(又可叫做共享庫(kù)):包含了代碼和數(shù)據(jù)(這些數(shù)據(jù)是在連接 時(shí)候被連接器ld和運(yùn)行時(shí)動(dòng)態(tài)連接器使用的)。使創(chuàng)建共享庫(kù)

4、容易,使動(dòng)態(tài)裝載和共享庫(kù)的結(jié)合更加容易。在ELF下,在C+ 中,全局的構(gòu)造函數(shù)和析構(gòu)函數(shù)在共享庫(kù)和靜態(tài)庫(kù)中用同樣方法處理。使用過哪些進(jìn)程間通訊機(jī)制,并詳細(xì)說明(重點(diǎn))makefile編寫,雖然比較基礎(chǔ),但是會(huì)被問到mkdir mfcd mfvim makefilehello.o:hello.c hello.hgcc c hello.o -Lmmake./hellogdb調(diào)試相關(guān)的經(jīng)驗(yàn),會(huì)被問到如何定位內(nèi)存泄露??jī)?nèi)存泄漏是指堆內(nèi)存的泄漏。堆內(nèi)存是指程序從堆中分配的、大小任意的(內(nèi)存塊的大小可以在程序運(yùn)行期決定)、使用完后必須顯示釋放的內(nèi)存。應(yīng)用程序一般使用malloc、realloc、new等函

5、數(shù)從堆中分配到一塊內(nèi)存,使用完后,程序必須負(fù)責(zé)相應(yīng)的調(diào)用free或delete釋放該內(nèi)存塊。否則,這塊內(nèi)存就不能被再次使用,我們就說這塊內(nèi)存泄漏了。 C+程序缺乏相應(yīng)的手段來檢測(cè)內(nèi)存信息,只能使用top指令觀察進(jìn)程的動(dòng)態(tài)內(nèi)存總額。而且程序退出時(shí),我們無法獲知任何內(nèi)存泄漏信息使用Linux命令回收內(nèi)存,可以使用ps、kill兩個(gè)命令檢測(cè)內(nèi)存使用情況和進(jìn)行回收。在使用超級(jí)用戶權(quán)限時(shí)使用命令“ps”,它會(huì)列出所有正在運(yùn)行的程序名稱和對(duì)應(yīng)的進(jìn)程號(hào)(PID)。kill命令的工作原理是向Linux操作系統(tǒng)的內(nèi)核送出一個(gè)系統(tǒng)操作信號(hào)和程序的進(jìn)程號(hào)(PID)動(dòng)態(tài)鏈接和靜態(tài)鏈接的區(qū)別動(dòng)態(tài)鏈接是指在生成可執(zhí)行文件

6、時(shí)不將所有程序用到的函數(shù)鏈接到一個(gè)文件,因?yàn)橛性S多函數(shù)在操作系統(tǒng)帶的dll文件中,當(dāng)程序運(yùn)行時(shí)直接從操作系統(tǒng)中找。 而靜態(tài)鏈接就是把所有用到的函數(shù)全部鏈接到exe文件中。動(dòng)態(tài)鏈接是只建立一個(gè)引用的接口,而真正的代碼和數(shù)據(jù)存放在另外的可執(zhí)行模塊中,在運(yùn)行時(shí)再裝入;而靜態(tài)鏈接是把所有的代碼和數(shù)據(jù)都復(fù)制到本模塊中,運(yùn)行時(shí)就不再需要庫(kù)了。32位系統(tǒng)一個(gè)進(jìn)程最多有多少堆內(nèi)存多線程和多進(jìn)程的區(qū)別(重點(diǎn) 面試官最最關(guān)心的一個(gè)問題,必須從cpu調(diào)度,上下文切換,數(shù)據(jù)共享,多核cup利用率,資源占用,等等各方面回答,然后有一個(gè)問題必須會(huì)被問到:哪些東西是一個(gè)線程私有的?答案中必須包含寄存器,否則悲催)寫一個(gè)c程

7、序辨別系統(tǒng)是16位or32位法一:int k=0;if(unsigned int)k >63356) cout<<"at least 32 bits"<<endl;else cout<<"16 bits"<<endl;法二:/32為系統(tǒng)int i=65536;cout<<i<<endl;int j=65535;cout<<j<<endl;寫一個(gè)c程序辨別系統(tǒng)是大端or小端字節(jié)序用聯(lián)合體:如char類型的,可以看他輸出的是int的高字節(jié)還是低字節(jié)信號(hào):列出

8、常見的信號(hào),信號(hào)怎么處理?i+是否原子操作?并解釋為什么? 說出你所知道的linux系統(tǒng)的各類同步機(jī)制(重點(diǎn)),什么是死鎖?如何避免死鎖(每個(gè)技術(shù)面試官必問)死鎖的條件。(互斥條件(Mutual exclusion):1、資源不能被共享,只能由一個(gè)進(jìn)程使用。2、請(qǐng)求與保持條件(Hold and wait):已經(jīng)得到資源的進(jìn)程可以再次申請(qǐng)新的資源。3、非剝奪條件(No pre-emption):已經(jīng)分配的資源不能從相應(yīng)的進(jìn)程中被強(qiáng)制地剝奪。4、循環(huán)等待條件(Circular wait):系統(tǒng)中若干進(jìn)程組成環(huán)路,該環(huán)路中每個(gè)進(jìn)程都在等待相鄰進(jìn)程正占用的資源。處理死鎖的策略:1.忽略該問題。例如鴕鳥

9、算法,該算法可以應(yīng)用在極少發(fā)生死鎖的的情況下。為什么叫鴕鳥算法呢,因?yàn)閭髡f中鴕鳥看到危險(xiǎn)就把頭埋在地底下,可能鴕鳥覺得看不到危險(xiǎn)也就沒危險(xiǎn)了吧。跟掩耳盜鈴有點(diǎn)像。2.檢測(cè)死鎖并且恢復(fù)。3.仔細(xì)地對(duì)資源進(jìn)行動(dòng)態(tài)分配,以避免死鎖。4.通過破除死鎖四個(gè)必要條件之一,來防止死鎖產(chǎn)生。)列舉說明linux系統(tǒng)的各類異步機(jī)制exit()與_exit()的區(qū)別?_exit終止調(diào)用進(jìn)程,但不關(guān)閉文件,不清除輸出緩存,也不調(diào)用出口函數(shù)。exit函數(shù)將終止調(diào)用進(jìn)程。在退出程序之前,所有文件關(guān)閉,緩沖輸出內(nèi)容將刷新定義,并調(diào)用所有已刷新的“出口函數(shù)”(由atexit定義)。exit()與_exit()有不少區(qū)別在使

10、用fork(),特別是vfork()時(shí)變得很突出。 exit()與_exit()的基本區(qū)別在于前一個(gè)調(diào)用實(shí)施與調(diào)用庫(kù)里用戶狀態(tài)結(jié)構(gòu)(user-mode constructs)有關(guān)的清除工作(clean-up),而且調(diào)用用戶自定義的清除程序如何實(shí)現(xiàn)守護(hù)進(jìn)程?守護(hù)進(jìn)程(Daemon)是運(yùn)行在后臺(tái)的一種特殊進(jìn)程。它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。守護(hù)進(jìn)程是一種很有用的進(jìn)程。 Linux的大多數(shù)服務(wù)器就是用守護(hù)進(jìn)程實(shí)現(xiàn)的。比如,Internet服務(wù)器inetd,Web服務(wù)器httpd等。同時(shí),守護(hù)進(jìn)程完成許多系統(tǒng)任務(wù)。比如,作業(yè)規(guī)劃進(jìn)程crond,打印進(jìn)程lpd等。守護(hù)

11、進(jìn)程的編程本身并不復(fù)雜,復(fù)雜的是各種版本的Unix的實(shí)現(xiàn)機(jī)制不盡相同,造成不同 Unix環(huán)境下守護(hù)進(jìn)程的編程規(guī)則并不一致。需要注意,照搬某些書上的規(guī)則(特別是BSD4.3和低版本的System V)到Linux會(huì)出現(xiàn)錯(cuò)誤的。下面將給出Linux下守護(hù)進(jìn)程的編程要點(diǎn)和詳細(xì)實(shí)例。一 守護(hù)進(jìn)程及其特性守護(hù)進(jìn)程最重要的特性是后臺(tái)運(yùn)行。在這一點(diǎn)上DOS下的常駐內(nèi)存程序TSR與之相似。其次,守護(hù)進(jìn)程必須與其運(yùn)行前的環(huán)境隔離開來。這些環(huán)境包括未關(guān)閉的文件描述符,控制終端,會(huì)話和進(jìn)程組,工作目錄以及文件創(chuàng)建掩模等。這些環(huán)境通常是守護(hù)進(jìn)程從執(zhí)行它的父進(jìn)程(特別是shell)中繼承下來的。最后,守護(hù)進(jìn)程的啟動(dòng)方式

12、有其特殊之處。它可以在Linux系統(tǒng)啟動(dòng)時(shí)從啟動(dòng)腳本/etc/rc.d中啟動(dòng),可以由作業(yè)規(guī)劃進(jìn)程crond啟動(dòng),還可以由用戶終端(shell)執(zhí)行??傊_這些特殊性以外,守護(hù)進(jìn)程與普通進(jìn)程基本上沒有什么區(qū)別。因此,編寫守護(hù)進(jìn)程實(shí)際上是把一個(gè)普通進(jìn)程按照上述的守護(hù)進(jìn)程的特性改造成為守護(hù)進(jìn)程。如果對(duì)進(jìn)程有比較深入的認(rèn)識(shí)就更容易理解和編程了。二 守護(hù)進(jìn)程的編程要點(diǎn)前面講過,不同Unix環(huán)境下守護(hù)進(jìn)程的編程規(guī)則并不一致。所幸的是守護(hù)進(jìn)程的編程原則其實(shí)都一樣,區(qū)別在于具體的實(shí)現(xiàn)細(xì)節(jié)不同。這個(gè)原則就是要滿足守護(hù)進(jìn)程的特性。同時(shí),Linux是基于Syetem V的SVR4并遵循Posix標(biāo)準(zhǔn),實(shí)現(xiàn)起來與

13、BSD4相比更方便。編程要點(diǎn)如下;1. 在后臺(tái)運(yùn)行。為避免掛起控制終端將Daemon放入后臺(tái)執(zhí)行。方法是在進(jìn)程中調(diào)用fork使父進(jìn)程終止,讓Daemon在子進(jìn)程中后臺(tái)執(zhí)行。if(pid=fork()exit(0); /是父進(jìn)程,結(jié)束父進(jìn)程,子進(jìn)程繼續(xù)2. 脫離控制終端,登錄會(huì)話和進(jìn)程組有必要先介紹一下Linux中的進(jìn)程與控制終端,登錄會(huì)話和進(jìn)程組之間的關(guān)系:進(jìn)程屬于一個(gè)進(jìn)程組,進(jìn)程組號(hào)(GID)就是進(jìn)程組長(zhǎng)的進(jìn)程號(hào)(PID)。登錄會(huì)話可以包含多個(gè)進(jìn)程組。這些進(jìn)程組共享一個(gè)控制終端。這個(gè)控制終端通常是創(chuàng)建進(jìn)程的登錄終端??刂平K端,登錄會(huì)話和進(jìn)程組通常是從父進(jìn)程繼承下來的。我們的目的就是要擺脫它們

14、,使之不受它們的影響。方法是在第1點(diǎn)的基礎(chǔ)上,調(diào)用setsid()使進(jìn)程成為會(huì)話組長(zhǎng):setsid();說明:當(dāng)進(jìn)程是會(huì)話組長(zhǎng)時(shí)setsid()調(diào)用失敗。但第一點(diǎn)已經(jīng)保證進(jìn)程不是會(huì)話組長(zhǎng)。setsid()調(diào)用成功后,進(jìn)程成為新的會(huì)話組長(zhǎng)和新的進(jìn)程組長(zhǎng),并與原來的登錄會(huì)話和進(jìn)程組脫離。由于會(huì)話過程對(duì)控制終端的獨(dú)占性,進(jìn)程同時(shí)與控制終端脫離。3. 禁止進(jìn)程重新打開控制終端現(xiàn)在,進(jìn)程已經(jīng)成為無終端的會(huì)話組長(zhǎng)。但它可以重新申請(qǐng)打開一個(gè)控制終端。可以通過使進(jìn)程不再成為會(huì)話組長(zhǎng)來禁止進(jìn)程重新打開控制終端:if(pid=fork() exit(0); /結(jié)束第一子進(jìn)程,第二子進(jìn)程繼續(xù)(第二子進(jìn)程不再是會(huì)話組

15、長(zhǎng))4. 關(guān)閉打開的文件描述符進(jìn)程從創(chuàng)建它的父進(jìn)程那里繼承了打開的文件描述符。如不關(guān)閉,將會(huì)浪費(fèi)系統(tǒng)資源,造成進(jìn)程所在的文件系統(tǒng)無法卸下以及引起無法預(yù)料的錯(cuò)誤。按如下方法關(guān)閉它們:for(i=0;i 關(guān)閉打開的文件描述符close(i);>5. 改變當(dāng)前工作目錄進(jìn)程活動(dòng)時(shí),其工作目錄所在的文件系統(tǒng)不能卸下。一般需要將工作目錄改變到根目錄。對(duì)于需要轉(zhuǎn)儲(chǔ)核心,寫運(yùn)行日志的進(jìn)程將工作目錄改變到特定目錄如 /tmpchdir("/")6. 重設(shè)文件創(chuàng)建掩模進(jìn)程從創(chuàng)建它的父進(jìn)程那里繼承了文件創(chuàng)建掩模。它可能修改守護(hù)進(jìn)程所創(chuàng)建的文件的存取位。為防止這一點(diǎn),將文件創(chuàng)建掩模清除:um

16、ask(0);7. 處理SIGCHLD信號(hào)處理SIGCHLD信號(hào)并不是必須的。但對(duì)于某些進(jìn)程,特別是服務(wù)器進(jìn)程往往在請(qǐng)求到來時(shí)生成子進(jìn)程處理請(qǐng)求。如果父進(jìn)程不等待子進(jìn)程結(jié)束,子進(jìn)程將成為僵尸進(jìn)程(zombie)從而占用系統(tǒng)資源。如果父進(jìn)程等待子進(jìn)程結(jié)束,將增加父進(jìn)程的負(fù)擔(dān),影響服務(wù)器進(jìn)程的并發(fā)性能。在Linux下可以簡(jiǎn)單地將 SIGCHLD信號(hào)的操作設(shè)為SIG_IGN。signal(SIGCHLD,SIG_IGN);這樣,內(nèi)核在子進(jìn)程結(jié)束時(shí)不會(huì)產(chǎn)生僵尸進(jìn)程。這一點(diǎn)與BSD4不同,BSD4下必須顯式等待子進(jìn)程結(jié)束才能釋放僵尸進(jìn)程。三 守護(hù)進(jìn)程實(shí)例守護(hù)進(jìn)程實(shí)例包括兩部分:主程序test.c和初始化

17、程序init.c。主程序每隔一分鐘向/tmp目錄中的日志test.log報(bào)告運(yùn)行狀態(tài)。初始化程序中的init_daemon函數(shù)負(fù)責(zé)生成守護(hù)進(jìn)程。讀者可以利用init_daemon函數(shù)生成自己的守護(hù)進(jìn)程。linux的內(nèi)存管理機(jī)制是什么?Linux虛擬內(nèi)存的實(shí)現(xiàn)需要6種機(jī)制的支持:地址映射機(jī)制、內(nèi)存分配回收機(jī)制、緩存和刷新機(jī)制、請(qǐng)求頁(yè)機(jī)制、交換機(jī)制和內(nèi)存共享機(jī)制內(nèi)存管理程序通過映射機(jī)制把用戶程序的邏輯地址映射到物理地址。當(dāng)用戶程序運(yùn)行時(shí),如果發(fā)現(xiàn)程序中要用的虛地址沒有對(duì)應(yīng)的物理內(nèi)存,就發(fā)出了請(qǐng)求頁(yè)要求。如果有空閑的內(nèi)存可供分配,就請(qǐng)求分配內(nèi)存(于是用到了內(nèi)存的分配和回收),并把正在使用的物理頁(yè)記錄

18、在緩存中(使用了緩存機(jī)制)。如果沒有足夠的內(nèi)存可供分配,那么就調(diào)用交換機(jī)制;騰出一部分內(nèi)存。另外,在地址映射中要通過TLB(翻譯后援存儲(chǔ)器)來尋找物理頁(yè);交換機(jī)制中也要用到交換緩存,并且把物理頁(yè)內(nèi)容交換到交換文件中,也要修改頁(yè)表來映射文件地址。linux的任務(wù)調(diào)度機(jī)制是什么?標(biāo)準(zhǔn)庫(kù)函數(shù)和系統(tǒng)調(diào)用的區(qū)別?1、系統(tǒng)調(diào)用和庫(kù)函數(shù)的關(guān)系系統(tǒng)調(diào)用通過軟中斷int 0x80從用戶態(tài)進(jìn)入內(nèi)核態(tài)。函數(shù)庫(kù)中的某些函數(shù)調(diào)用了系統(tǒng)調(diào)用。函數(shù)庫(kù)中的函數(shù)可以沒有調(diào)用系統(tǒng)調(diào)用,也可以調(diào)用多個(gè)系統(tǒng)調(diào)用。編程人員可以通過函數(shù)庫(kù)調(diào)用系統(tǒng)調(diào)用。高級(jí)編程也可以直接采用int 0x80進(jìn)入系統(tǒng)調(diào)用,而不必通過函數(shù)庫(kù)作為中介。如果是在

19、核心編程,也可以通過int 0x80進(jìn)入系統(tǒng)調(diào)用,此時(shí)不能使用函數(shù)庫(kù)。因?yàn)楹瘮?shù)庫(kù)中的函數(shù)是內(nèi)核訪問不到的。 2、從用戶調(diào)用庫(kù)函數(shù)到系統(tǒng)調(diào)用執(zhí)行的流程。1) 假設(shè)用戶調(diào)用ssize_t write (int fields, cont void *buff, size_t nbytes);庫(kù)函數(shù)。2) 庫(kù)函數(shù)會(huì)執(zhí)行int 0x80中斷。因?yàn)橹袛嗍沟眠M(jìn)程從用戶態(tài)進(jìn)入內(nèi)核態(tài),所以參數(shù)通過寄存器傳送。3) 0x80中斷對(duì)應(yīng)的中斷例程被稱為system call handler。其工作是: i.  存儲(chǔ)大多數(shù)寄存器到內(nèi)核堆棧中。這是匯編代碼寫的。 ii.  執(zhí)行真正

20、的系統(tǒng)調(diào)用函數(shù)system call service routine。這是C代碼。 iii. 通過ret_from_sys_call ()返回,回到用戶態(tài)的庫(kù)函數(shù)。這是匯編代碼。1、系統(tǒng)調(diào)用系統(tǒng)調(diào)用提供的函數(shù)如open, close, read, write, ioctl等,需包含頭文件unistd.h。以write為例:其函數(shù)原型為 size_t write(int fd, const void *buf, size_t nbytes),其操作對(duì)象為文件描述符或文件句柄fd(file descriptor),要想寫一個(gè)文件,必須先以可寫權(quán)限用open系統(tǒng)調(diào)用打開一個(gè)文件,

21、獲得所打開文件的fd,例如 fd=open(/"/dev/video/", O_RDWR)。fd是一個(gè)整型值,每新打開一個(gè)文件,所獲得的fd為當(dāng)前最大fd加1。Linux系統(tǒng)默認(rèn)分配了3個(gè)文件描述符值:0standard input,1standard output,2standard error。系統(tǒng)調(diào)用通常用于底層文件訪問(low-level file access),例如在驅(qū)動(dòng)程序中對(duì)設(shè)備文件的直接訪問。系統(tǒng)調(diào)用是操作系統(tǒng)相關(guān)的,因此一般沒有跨操作系統(tǒng)的可移植性。系統(tǒng)調(diào)用發(fā)生在內(nèi)核空間,因此如果在用戶空間的一般應(yīng)用程序中使用系統(tǒng)調(diào)用來進(jìn)行文件操作,會(huì)有用戶空間到內(nèi)核空

22、間切換的開銷。事實(shí)上,即使在用戶空間使用庫(kù)函數(shù)來對(duì)文件進(jìn)行操作,因?yàn)槲募偸谴嬖谟诖鎯?chǔ)介質(zhì)上,因此不管是讀寫操作,都是對(duì)硬件(存儲(chǔ)器)的操作,都必然會(huì)引起系統(tǒng)調(diào)用。也就是說,庫(kù)函數(shù)對(duì)文件的操作實(shí)際上是通過系統(tǒng)調(diào)用來實(shí)現(xiàn)的。例如C庫(kù)函數(shù)fwrite()就是通過write()系統(tǒng)調(diào)用來實(shí)現(xiàn)的。這樣的話,使用庫(kù)函數(shù)也有系統(tǒng)調(diào)用的開銷,為什么不直接使用系統(tǒng)調(diào)用呢?這是因?yàn)?,讀寫文件通常是大量的數(shù)據(jù)(這種大量是相對(duì)于底層驅(qū)動(dòng)的系統(tǒng)調(diào)用所實(shí)現(xiàn)的數(shù)據(jù)操作單位而言),這時(shí),使用庫(kù)函數(shù)就可以大大減少系統(tǒng)調(diào)用的次數(shù)。這一結(jié)果又緣于緩沖區(qū)技術(shù)。在用戶空間和內(nèi)核空間,對(duì)文件操作都使用了緩沖區(qū),例如用fwrite寫文件

23、,都是先將內(nèi)容寫到用戶空間緩沖區(qū),當(dāng)用戶空間緩沖區(qū)滿或者寫操作結(jié)束時(shí),才將用戶緩沖區(qū)的內(nèi)容寫到內(nèi)核緩沖區(qū),同樣的道理,當(dāng)內(nèi)核緩沖區(qū)滿或?qū)懡Y(jié)束時(shí)才將內(nèi)核緩沖區(qū)內(nèi)容寫到文件對(duì)應(yīng)的硬件媒介。2、庫(kù)函數(shù)調(diào)用標(biāo)準(zhǔn)C庫(kù)函數(shù)提供的文件操作函數(shù)如fopen, fread, fwrite, fclose, fflush, fseek等,需包含頭文件stdio.h。以fwrite為例,其函數(shù)原型為size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),其操作對(duì)象為文件指針FILE *pf,要想寫一個(gè)文件,必須先以可寫權(quán)限用

24、fopen函數(shù)打開一個(gè)文件,獲得所打開文件的FILE結(jié)構(gòu)指針pf,例如pf=fopen(/"/proj/filename/", /"w/")。實(shí)際上,由于庫(kù)函數(shù)對(duì)文件的操作最終是通過系統(tǒng)調(diào)用實(shí)現(xiàn)的,因此,每打開一個(gè)文件所獲得的FILE結(jié)構(gòu)指針都有一個(gè)內(nèi)核空間的文件描述符fd與之對(duì)應(yīng)。同樣有相應(yīng)的預(yù)定義的FILE指針:stdinstandard input,stdoutstandard output,stderrstandard error。庫(kù)函數(shù)調(diào)用通常用于應(yīng)用程序中對(duì)一般文件的訪問。庫(kù)函數(shù)調(diào)用是系統(tǒng)無關(guān)的,因此可移植性好。由于庫(kù)函數(shù)調(diào)用是基于C庫(kù)的,因

25、此也就不可能用于內(nèi)核空間的驅(qū)動(dòng)程序中對(duì)設(shè)備的操作ping命令所利用的原理是這樣的:網(wǎng)絡(luò)上的機(jī)器都有唯一確定的IP地址,我們給目標(biāo)IP地址發(fā)送一個(gè)數(shù)據(jù)包,對(duì)方就要返回一個(gè)同樣大小的數(shù)據(jù)包,根據(jù)返回的數(shù)據(jù)包我們可以確定目標(biāo)主機(jī)的存在,可以初步判斷目標(biāo)主機(jī)的操作系統(tǒng)等。補(bǔ)充一個(gè)坑爹坑爹坑爹坑爹的問題:系統(tǒng)如何將一個(gè)信號(hào)通知到進(jìn)程?(這一題哥沒有答出來)c語言:宏定義和展開(必須精通)位操作(必須精通)指針操作和計(jì)算(必須精通)內(nèi)存分配(必須精通)sizeof必考各類庫(kù)函數(shù)必須非常熟練的實(shí)現(xiàn)哪些庫(kù)函數(shù)屬于高危函數(shù),為什么?(strcpy等等)c+:一個(gè)String類的完整實(shí)現(xiàn)必須很快速寫出來(注意:賦

26、值構(gòu)造,operator=是關(guān)鍵)虛函數(shù)的作用和實(shí)現(xiàn)原理(必問必考,實(shí)現(xiàn)原理必須很熟)有虛函數(shù)的類內(nèi)部有一個(gè)稱為“虛表”的指針(有多少個(gè)虛函數(shù)就有多少個(gè)指針),這個(gè)就是用來指向這個(gè)類虛函數(shù)。也就是用它來確定調(diào)用該那個(gè)函數(shù)。實(shí)際上在編譯的時(shí)候,編譯器會(huì)自動(dòng)加入“虛表”。虛表的使用方法是這樣的:如果派生類在自己的定義中沒有修改基類的虛函數(shù),就指向基類的虛函數(shù);如果派生類改寫了基類的虛函數(shù)(就是自己重新定義),這時(shí)虛表則將原來指向基類的虛函數(shù)的地址替換為指向自身虛函數(shù)的指針。那些被virtual關(guān)鍵字修飾的成員函數(shù),就是虛函數(shù)。虛函數(shù)的作用,用專業(yè)術(shù)語來解釋就是實(shí)現(xiàn)多態(tài)性(Polymorphism)

27、,多態(tài)性是將接口與實(shí)現(xiàn)進(jìn)行分離;用形象的語言來解釋就是實(shí)現(xiàn)以共同的方法,但因個(gè)體差異而采用不同的策略。每個(gè)類都有自己的vtbl,vtbl的作用就是保存自己類中虛函數(shù)的地址,我們可以把vtbl形象地看成一個(gè)數(shù)組,這個(gè)數(shù)組的每個(gè)元素存放的就是虛函數(shù)的地址,虛函數(shù)的效率低,其原因就是,在調(diào)用虛函數(shù)之前,還調(diào)用了獲得虛函數(shù)地址的代碼。sizeof一個(gè)類求大?。ㄗ⒁獬蓡T變量,函數(shù),虛函數(shù),繼承等等對(duì)大小的影響)指針和引用的區(qū)別(一般都會(huì)問到)相同點(diǎn):1. 都是地址的概念;指針指向一塊內(nèi)存,它的內(nèi)容是所指內(nèi)存的地址;引用是某塊內(nèi)存的別名。區(qū)別:1. 指針是一個(gè)實(shí)體,而引用僅是個(gè)別名;2. 引用使用時(shí)無需解

28、引用(*),指針需要解引用;3. 引用只能在定義時(shí)被初始化一次,之后不可變;指針可變;4. 引用沒有 const,指針有 const;5. 引用不能為空,指針可以為空;6. “sizeof 引用”得到的是所指向的變量(對(duì)象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或?qū)ο蟮牡刂?的大?。?. 指針和引用的自增(+)運(yùn)算意義不一樣;8.從內(nèi)存分配上看:程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域,而引用不需要分配內(nèi)存區(qū)域。多重類構(gòu)造和析構(gòu)的順序先調(diào)用基類的構(gòu)造函數(shù),在調(diào)用派生類的構(gòu)造函數(shù)先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu)stl各容器的實(shí)現(xiàn)原理(必考)STL共有六大組件 1、容器。2、算法

29、。3、迭代器。4、仿函數(shù)。6、適配器。序列式容器:vector-數(shù)組,元素不夠時(shí)再重新分配內(nèi)存,拷貝原來數(shù)組的元素到新分配的數(shù)組中。list單鏈表。deque-分配中央控制器map(并非map容器),map記錄著一系列的固定長(zhǎng)度的數(shù)組的地址.記住這個(gè)map僅僅保存的是數(shù)組的地址,真正的數(shù)據(jù)在數(shù)組中存放著.deque先從map中央的位置(因?yàn)殡p向隊(duì)列,前后都可以插入元素)找到一個(gè)數(shù)組地址,向該數(shù)組中放入數(shù)據(jù),數(shù)組不夠時(shí)繼續(xù)在map中找空閑的數(shù)組來存數(shù)據(jù)。當(dāng)map也不夠時(shí)重新分配內(nèi)存當(dāng)作新的map,把原來map中的內(nèi)容copy的新map中。所以使用deque的復(fù)雜度要大于vector,盡量使用ve

30、ctor。stack-基于deque。queue-基于deque。heap-完全二叉樹,使用最大堆排序,以數(shù)組(vector)的形式存放。priority_queue-基于heap。slist-雙向鏈表。關(guān)聯(lián)式容器:set,map,multiset,multimap-基于紅黑樹(RB-tree),一種加上了額外平衡條件的二叉搜索樹。hash table-散列表。將待存數(shù)據(jù)的key經(jīng)過映射函數(shù)變成一個(gè)數(shù)組(一般是vector)的索引,例如:數(shù)據(jù)的key%數(shù)組的大小數(shù)組的索引(一般文本通過算法也可以轉(zhuǎn)換為數(shù)字),然后將數(shù)據(jù)當(dāng)作此索引的數(shù)組元素。有些數(shù)據(jù)的key經(jīng)過算法的轉(zhuǎn)換可能是同一個(gè)數(shù)組的索引值

31、(碰撞問題,可以用線性探測(cè),二次探測(cè)來解決),STL是用開鏈的方法來解決的,每一個(gè)數(shù)組的元素維護(hù)一個(gè)list,他把相同索引值的數(shù)據(jù)存入一個(gè)list,這樣當(dāng)list比較短時(shí)執(zhí)行刪除,插入,搜索等算法比較快。hash_map,hash_set,hash_multiset,hash_multimap-基于hash table。extern c 是干啥的,(必須將編譯器的函數(shù)名修飾的機(jī)制解答的很透徹)volatile是干啥用的,(必須將cpu的寄存器緩存機(jī)制回答的很透徹)volatile的本意是“易變的” 因?yàn)樵L問寄存器要比訪問內(nèi)存單元快的多,所以編譯器一般都會(huì)作減少存取內(nèi)存的優(yōu)化,但有可能會(huì)讀臟數(shù)據(jù)

32、。當(dāng)要求使用volatile聲明變量值的時(shí)候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)。精確地說就是,遇到這個(gè)關(guān)鍵字聲明的變量,編譯器對(duì)訪問該變量的代碼就不再進(jìn)行優(yōu)化,從而可以提供對(duì)特殊地址的穩(wěn)定訪問;如果不使用volatile,則編譯器將對(duì)所聲明的語句進(jìn)行優(yōu)化。(簡(jiǎn)潔的說就是:volatile關(guān)鍵詞影響編譯器編譯的結(jié)果,用volatile聲明的變量表示該變量隨時(shí)可能發(fā)生變化,與該變量有關(guān)的運(yùn)算,不要進(jìn)行編譯優(yōu)化,以免出錯(cuò))5.volatile的本質(zhì):1> 編譯器的優(yōu)化 在本次線程內(nèi), 當(dāng)讀取一個(gè)變量時(shí),為提高存取速度,編譯器優(yōu)化時(shí)有時(shí)會(huì)先把變量讀取到一個(gè)

33、寄存器中;以后,再取變量值時(shí),就直接從寄存器中取值;當(dāng)變量值在本線程里改變時(shí),會(huì)同時(shí)把變量的新值copy到該寄存器中,以便保持一致。當(dāng)變量在因別的線程等而改變了值,該寄存器的值不會(huì)相應(yīng)改變,從而造成應(yīng)用程序讀取的值和實(shí)際的變量值不一致。當(dāng)該寄存器在因別的線程等而改變了值,原變量的值不會(huì)改變,從而造成應(yīng)用程序讀取的值和實(shí)際的變量值不一致。2>volatile應(yīng)該解釋為“直接存取原始內(nèi)存地址”比較合適,“易變的”這種解釋簡(jiǎn)直有點(diǎn)誤導(dǎo)人。static const等等的用法,(能說出越多越好)數(shù)據(jù)結(jié)構(gòu)或者算法:離散數(shù)學(xué)范圍內(nèi)的一切問題皆由可能被深入問到(這個(gè)最坑爹,最重要,最體現(xiàn)功底,最能加分,

34、特別是各類樹結(jié)構(gòu)的實(shí)現(xiàn)和應(yīng)用)各類排序:大根堆的實(shí)現(xiàn),快排(如何避免最糟糕的狀態(tài)?),bitmap的運(yùn)用等等hash, 任何一個(gè)技術(shù)面試官必問(例如為什么一般hashtable的桶數(shù)會(huì)取一個(gè)素?cái)?shù)?如何有效避免hash結(jié)果值的碰撞)網(wǎng)絡(luò)編程:tcp與udp的區(qū)別(必問)1基于連接與無連接 2對(duì)系統(tǒng)資源的要求(TCP較多,UDP少) 3UDP程序結(jié)構(gòu)較簡(jiǎn)單 4流模式與數(shù)據(jù)報(bào)模式 5TCP保證數(shù)據(jù)正確性,UDP可能丟包,TCP保證數(shù)據(jù)順序,UDP不保證TCP-傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務(wù)。當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個(gè)TCP連接,之后才能傳輸數(shù)據(jù)。TCP提

35、供超時(shí)重發(fā),丟棄重復(fù)數(shù)據(jù),檢驗(yàn)數(shù)據(jù),流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端。UDP-用戶數(shù)據(jù)報(bào)協(xié)議,是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議。UDP不提供可靠性,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個(gè)連接,且沒有超時(shí)重發(fā)等機(jī)制,故而傳輸速度很快udp調(diào)用connect有什么作用?1:UDP中可以使用connect系統(tǒng)調(diào)用2:UDP中connect操作與TCP中connect操作有著本質(zhì)區(qū)別.TCP中調(diào)用connect會(huì)引起三次握手,client與server建立連結(jié).UDP中調(diào)用connect內(nèi)核僅僅把對(duì)

36、端ip&port記錄下來.3:UDP中可以多次調(diào)用connect,TCP只能調(diào)用一次connect.UDP多次調(diào)用connect有兩種用途:1,指定一個(gè)新的ip&port連結(jié).2,斷開和之前的ip&port的連結(jié).指定新連結(jié),直接設(shè)置connect第二個(gè)參數(shù)即可.斷開連結(jié),需要將connect第二個(gè)參數(shù)中的sin_family設(shè)置成 AF_UNSPEC即可. 4:UDP中使用connect可以提高效率.原因如下:普通的UDP發(fā)送兩個(gè)報(bào)文內(nèi)核做了如下:#1:建立連結(jié)#2:發(fā)送報(bào)文#3:斷開連結(jié)#4:建立連結(jié)#5:發(fā)送報(bào)文#6:斷開連結(jié)采用connect方式的UDP發(fā)送兩個(gè)

37、報(bào)文內(nèi)核如下處理:#1:建立連結(jié)#2:發(fā)送報(bào)文#3:發(fā)送報(bào)文另外一點(diǎn),每次發(fā)送報(bào)文內(nèi)核都由可能要做路由查詢.5:采用connect的UDP發(fā)送接受報(bào)文可以調(diào)用send,write和recv,read操作.當(dāng)然也可以調(diào)用sendto,recvfrom.調(diào)用sendto的時(shí)候第五個(gè)參數(shù)必須是NULL,第六個(gè)參數(shù)是0.調(diào)用recvfrom,recv,read系統(tǒng)調(diào)用只能獲取到先前connect的ip&port發(fā)送的報(bào)文. UDP中使用connect的好處:1:會(huì)提升效率.前面已經(jīng)描述了.2:高并發(fā)服務(wù)中會(huì)增加系統(tǒng)穩(wěn)定性.原因:假設(shè)client A 通過非connect的UDP與server

38、B,C通信.B,C提供相同服務(wù).為了負(fù)載均衡,我們讓A與B,C交替通信.A 與 B通信IPa:PORTa <-> IPb:PORTbA 與 C通信IPa:PORTa' <->IPc:PORTc 假設(shè)PORTa 與 PORTa'相同了(在大并發(fā)情況下會(huì)發(fā)生這種情況),那么就有可能出現(xiàn)A等待B的報(bào)文,卻收到了C的報(bào)文.導(dǎo)致收?qǐng)?bào)錯(cuò)誤.解決方法內(nèi)就是采用connect的UDP通信方式.在A中創(chuàng)建兩個(gè)udp,然后分別connect到B,C.tcp連接中時(shí)序圖,狀態(tài)圖,必須非常非常熟練socket服務(wù)端的實(shí)現(xiàn),select和epoll的區(qū)別(必問)select的本質(zhì)

39、是采用32個(gè)整數(shù)的32位,即32*32= 1024來標(biāo)識(shí),fd值為1-1024。當(dāng)fd的值超過1024限制時(shí),就必須修改FD_SETSIZE的大小。這個(gè)時(shí)候就可以標(biāo)識(shí)32*max值范圍的fd。對(duì)于單進(jìn)程多線程,每個(gè)線程處理多個(gè)fd的情況,select是不適合的。1.所有的線程均是從1-32*max進(jìn)行掃描,每個(gè)線程處理的均是一段fd值,這樣做有點(diǎn)浪費(fèi)2.1024上限問題,一個(gè)處理多個(gè)用戶的進(jìn)程,fd值遠(yuǎn)遠(yuǎn)大于1024所以這個(gè)時(shí)候應(yīng)該采用poll,poll傳遞的是數(shù)組頭指針和該數(shù)組的長(zhǎng)度,只要數(shù)組的長(zhǎng)度不是很長(zhǎng),性能還是很不錯(cuò)的,因?yàn)閜oll一次在內(nèi)核中申請(qǐng)4K(一個(gè)頁(yè)的大小來存放fd),盡量控

40、制在4K以內(nèi)epoll還是poll的一種優(yōu)化,返回后不需要對(duì)所有的fd進(jìn)行遍歷,在內(nèi)核中維持了fd的列表。select和poll是將這個(gè)內(nèi)核列表維持在用戶態(tài),然后傳遞到內(nèi)核中。但是只有在2.6的內(nèi)核才支持。epoll更適合于處理大量的fd ,且活躍fd不是很多的情況,畢竟fd較多還是一個(gè)串行的操作epoll哪些觸發(fā)模式,有啥區(qū)別?(必須非常詳盡的解釋水平觸發(fā)和邊緣觸發(fā)的區(qū)別,以及邊緣觸發(fā)在編程中要做哪些更多的確認(rèn))epoll可以同時(shí)支持水平觸發(fā)和邊緣觸發(fā)(Edge Triggered,只告訴進(jìn)程哪些文件描述符剛剛變?yōu)榫途w狀態(tài),它只說一遍,如果我們沒有采取行動(dòng),那么它將不會(huì)再次告知,這

41、種方式稱為邊緣觸發(fā)),理論上邊緣觸發(fā)的性能要更高一些,但是代碼實(shí)現(xiàn)相當(dāng)復(fù)雜。epoll同樣只告知那些就緒的文件描述符,而且當(dāng)我們調(diào)用epoll_wait()獲得就緒文件描述符時(shí),返回的不是實(shí)際的描述符,而是一個(gè)代表就緒描述符數(shù)量的值,你只需要去epoll指定的一個(gè)數(shù)組中依次取得相應(yīng)數(shù)量的文件描述符即可,這里也使用了內(nèi)存映射(mmap)技術(shù),這樣便徹底省掉了這些文件描述符在系統(tǒng)調(diào)用時(shí)復(fù)制的開銷。另一個(gè)本質(zhì)的改進(jìn)在于epoll采用基于事件的就緒通知方式。在select/poll中,進(jìn)程只有在調(diào)用一定的方法后,內(nèi)核才對(duì)所有監(jiān)視的文件描述符進(jìn)行掃描,而epoll事先通過epoll_ctl()來注冊(cè)一個(gè)

42、文件描述符,一旦基于某個(gè)文件描述符就緒時(shí),內(nèi)核會(huì)采用類似callback的回調(diào)機(jī)制,迅速激活這個(gè)文件描述符,當(dāng)進(jìn)程調(diào)用epoll_wait()時(shí)便得到通知。大規(guī)模連接上來,并發(fā)模型怎么設(shè)計(jì)tcp結(jié)束連接怎么握手,time_wait狀態(tài)是什么,為什么會(huì)有time_wait狀態(tài)?哪一方會(huì)有time_wait狀態(tài),如何避免time_wait狀態(tài)占用資源(必須回答的詳細(xì))tcp頭多少字節(jié)?哪些字段?(必問)頭20字節(jié),選項(xiàng)12字節(jié)什么是滑動(dòng)窗口(必問)動(dòng)窗口(Sliding window )是一種流量控制技術(shù)。滑動(dòng)窗口協(xié)議是用來改善吞吐量的一種技術(shù),即容許發(fā)送方在接收任何應(yīng)答之前傳送附加的包。接收方告

43、訴發(fā)送方在某一時(shí)刻能送多少包(稱窗口尺寸)。TCP中采用滑動(dòng)窗口來進(jìn)行傳輸控制,滑動(dòng)窗口的大小意味著接收方還有多大的緩沖區(qū)可以用于接收數(shù)據(jù)。發(fā)送方可以通過滑動(dòng)窗口的大小來確定應(yīng)該發(fā)送多少字節(jié)的數(shù)據(jù)。當(dāng)滑動(dòng)窗口為0時(shí),發(fā)送方一般不能再發(fā)送數(shù)據(jù)報(bào),但有兩種情況除外,一種情況是可以發(fā)送緊急數(shù)據(jù),例如,允許用戶終止在遠(yuǎn)端機(jī)上的運(yùn)行進(jìn)程。另一種情況是發(fā)送方可以發(fā)送一個(gè)1字節(jié)的數(shù)據(jù)報(bào)來通知接收方重新聲明它希望接收的下一字節(jié)及發(fā)送方的滑動(dòng)窗口大小?;瑒?dòng)窗口協(xié)議的基本原理就是在任意時(shí)刻,發(fā)送方都維持了一個(gè)連續(xù)的允許發(fā)送的幀的序號(hào),稱為發(fā)送窗口;同時(shí),接收方也維持了一個(gè)連續(xù)的允許接收的幀的序號(hào),稱為接收窗口。發(fā)

44、送窗口和接收窗口的序號(hào)的上下界不一定要一樣,甚至大小也可以不同。不同的滑動(dòng)窗口協(xié)議窗口大小一般不同。發(fā)送方窗口內(nèi)的序列號(hào)代表了那些已經(jīng)被發(fā)送,但是還沒有被確認(rèn)的幀,或者是那些可以被發(fā)送的幀。connect會(huì)阻塞,怎么解決?(必考必問)最通常的方法最有效的是加定時(shí)器;也可以采用非阻塞模式。設(shè)置非阻塞,返回之后用select檢測(cè)狀態(tài))如果select返回可讀,結(jié)果只讀到0字節(jié),什么情況?某個(gè)套接字集合中沒有準(zhǔn)備好,可能會(huì)select內(nèi)存用FD_CLR清該位為0;keepalive 是什么東東?如何使用?設(shè)置Keepalive參數(shù),檢測(cè)已中斷的客戶連接· Determine how long to wait before probing the connection. On most platforms the default is 2 hours. · Determine how long to wait before retrying the probe. · Determine how many times to probe the conne

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論