1. 程式人生 > >後臺開發知識點總結(一、Linux和OS)

後臺開發知識點總結(一、Linux和OS)

  偶然在知乎上看到想要從事linux後臺開發需要的能力集錦,總結的挺全面的,鑑於自己貧弱的記憶力,還是在這裡總結一下供以後檢視,順便檢驗一下自己。 
  

1、 命令:netstat tcpdump ipcs ipcrm 這四個命令的熟練掌握程度基本上能體現實際開發和除錯程式的經驗

  在《TCP/IP》協議一書中,經常使用到netstat和tcpdump這兩個命令,netstat常用於顯示各種網路資訊與自己的主機資訊,例如路由表資訊。tcpdump用於網路資料包的截獲分析,例如三次握手,資料交換等等的顯示。這裡推薦一個更好用的工具wireshark,有比較好的互動介面,可以設定過濾資訊等等,做爬蟲,分析網路問題的利器。 
  下面給出幾個簡單的例子,具體的使用可以參照linux的man命令或者鳥哥的私房菜。 
  這裡寫圖片描述


- Proto :網路的封包協議,主要分為 TCP 與 UDP 封包; 
- Recv-Q:非由使用者程式連結到此socket 的複製的總 bytes 數; 
- Send-Q:非由程序主機傳送過來的 acknowledged 總 bytes 數; 
- Local Address :本地端的IP:port 情況 
- Foreign Address:程序主機的 IP:port 情況 
- State:聯機狀態,主要有建立(ESTABLISED)及監聽(LISTEN);

  這裡寫圖片描述
  這裡顯示的資訊從左至右分別是時間;源地址到目的地址;報文的flags,S是SYN,F是FIN,.是無標記;報文的序列號;下次期望的序列號;接收快取的視窗大小。這些在《TCP/IP》卷一有詳細的論述。

  ipcs和ipcrm命令是用於顯示ipc資訊和移除ipc訊息物件的命令。這裡首先要對ipc有個大致概念。IPC是(interprocess communication)的簡稱,是執行在作業系統上的不同程序間通訊的方式。 
  使用命令ipcs -a可以得到下面的資訊,可以看到這裡顯示的方式有三種,下面介紹程序間通訊時再詳細講。

  • 共享記憶體
  • 訊號量
  • 訊息佇列
lijun0914:~/workspace $ ipcs -a

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch
status ------ Semaphore Arrays -------- key semid owner perms nsems ------ Message Queues -------- key msqid owner perms used-bytes messages
  • 2、cpu 記憶體 硬碟 等等與系統性能除錯相關的命令必須熟練掌握,設定修改許可權 tcp網路狀態檢視 各程序狀態 抓包相關等相關命令 必須熟練掌握

  這一條後面提到的tcp網路狀態檢視,抓包其實在上一條的命令中已經涵蓋了。設定修改許可權的chmod感覺沒什麼可將的,就是修改檔案的訪問許可權,記住讀寫可執行的數值為4,2,1,u,g,o為使用者,使用者當前組,其他使用者,使用命令設定相應使用者的許可權就可以了。看一下簡單的例子就明白了。

 chmod u+x file                   給file的屬主增加執行許可權
 chmod 751 file                   給file的屬主分配讀、寫、執行(7)的許可權,給file的所在組分配讀、執行(5)的許可權,給其他使用者分配執行(1)的許可權
 chmod u=rwx,g=rx,o=x file         上例的另一種形式
 chmod =r file                     為所有使用者分配讀許可權
 chmod 444 file                  同上例
 chmod a-wx,a+r   file           同上例
 chmod -R u+r directory            遞迴地給directory目錄下所有檔案和子目錄的屬主分配讀的許可權
 chmod 4755                        設定用ID,給屬主分配讀、寫和執行許可權,給組和其他使用者分配讀、執行的許可權。
  
  • 觀察執行中的程序狀態可以使用靜態的ps和動態的top以及top的增強版htop。這些命令可以統計各個程序的CPU和記憶體MEM使用率。當然還有專門針對cpu,記憶體,io做監控的各個命令,mpstat,vmstat,iostat。 

這裡寫圖片描述

htop
  • 1

這裡會有一些程序優先順序的概念,PRI越低越先被CPU執行,PRI(new)=PRI(old)+nice,人越不nice越愛搶嘛,很好記。 
其中nice和renice可以設定優先順序,區別是nice是在程序啟動前調整,renice可以在程序執行中動態調整。 
這裡寫圖片描述

3、awk sed需掌握

  有時候你也許會想要提取多行的某列資訊,或者想要對文字按某一規則進行處理,這時候你可能會選擇python或者shell編寫指令碼,不過awk和sed可能會是更好的選擇,因為需求經常一行就可以搞定。AWK是文字處理語言,常用來進行查詢,支援正則。sed是用程式進行文字編輯的流編輯器,只支援簡單的條件處理,使用label。sed同樣使用正則匹配,可以對文字進行修改,如果你對vim熟悉的話,sed上手會非常快,因為他們有許多相似的命令,例如s/a/b/g 這樣的文字替換。 
  關於工具使用沒有什麼特別的,注意awk是語言,可以使用if else等邏輯判斷,也可以使用system執行shell指令。 
  這裡直接給三個連結。 
  sed:http://coolshell.cn/articles/9070.html 
  awk:http://www.delightpress.com.tw/bookRead/skns00004_read.pdf 
http://wanggen.myweb.hinet.net/ach3/ach3.html?MywebPageId=2016161473995373791#sed_and_awk

4、共享記憶體的使用實現原理、然後共享記憶體段被對映進程序空間之後,存在於程序空間的什麼位置?共享記憶體段最大限制是多少?

  共享記憶體區是可用IPC形式裡面最快的。共享記憶體允許多個程序同時訪問同一記憶體區,程序會將記憶體區對映到自己的地址空間中。這樣程序間資料的傳遞不再涉及核心,減少了資料複製的動作。例如一個客戶從伺服器讀的操作,使用管道訊息佇列等形式的話,需要核心將資料複製到程序空間的伺服器上,然後伺服器寫到核心空間的IPC上。這樣一次讀取或者寫入需要將資料複製兩次。 
  這裡寫圖片描述
  使用共享記憶體 
  

  • 程序必須首先分配它
  • 隨後需要訪問這個共享記憶體塊的每一個程序都必須將這個共享記憶體繫結到自己的地址空間中
  • 當完成通訊之後,所有程序都將脫離共享記憶體,並且由一個程序釋放該共享記憶體塊

/proc/sys/kernel/目錄下,記錄著共享記憶體的一些限制,如一個共享記憶體區的最大位元組數shmmax,系統範圍內最大共享記憶體區識別符號數shmmni等,可以手工對其調整,但不推薦這樣做。

這裡寫圖片描述
共享記憶體的使用,主要有以下幾個API:ftok()、shmget()、shmat()、shmdt()及shmctl()。

#include <sys/shm.h>
void *shmat(int shm_id, const void *shm_addr, int shmflg);
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
int shmdt(const void *shm_addr);
int shmget(key_t key, size_t size, int shmflg);

shmget():建立一個新的共享記憶體區,或者訪問一個已經存在的記憶體區。 
shmat():建立或者開啟後,通過shmat把它連線到呼叫程序的地址空間。 
shmdt():斷開連線的記憶體區。當一個程序終止時,它所有連結的共享記憶體區都會自動斷掉,注意這個函式並不刪除共享記憶體區。 
shmctl():提供對共享記憶體區的多種操作,例如刪除。

這裡需要提及一下mmap 
  mmap系統呼叫並不是完全為了用於共享記憶體而設計的。它本身提供了不同於一般對普通檔案的訪問方式,程序可以像讀寫記憶體一樣對普通檔案的操作。而Posix或系統V的共享記憶體IPC則純粹用於共享目的,當然mmap()實現共享記憶體也是其主要應用之一。 
  mmap系統呼叫使得程序之間通過對映同一個普通檔案實現共享記憶體。普通檔案被對映到程序地址空間後,程序可以像訪問普通記憶體一樣對檔案進行訪問,不必再 呼叫read(),write()等操作。mmap並不分配空間, 只是將檔案對映到呼叫程序的地址空間裡, 然後你就可以用memcpy等操作寫檔案, 而不用write()了.寫完後用msync()同步一下, 你所寫的內容就儲存到檔案裡了. 不過這種方式沒辦法增加檔案的長度, 因為要對映的長度在呼叫mmap()的時候就決定了.

簡單說就是把一個檔案的內容在記憶體裡面做一個映像,記憶體比磁碟快些。

PS:不是所有檔案都可以記憶體對映。例如訪問終端或套接字的描述符,必須使用read和write或者其變體來訪問。

這裡不介紹shm_open這些POSIX操作了,更詳細的資訊可以參考《unix網路程式設計》(卷二)第12-14章

順便提一下區別: 
Both methods are viable. mmap method is a little bit more restrictive then shmget, but easier to use. shmget is the old System V shared memory model and has the widest support. mmap/shm_open is the new POSIX way to do shared memory and is easier to use. If your OS permits the use of POSIX shared memory then I would suggest going with that.

Some hints:

  • If you create your children via fork then mmap with MAP_ANONYMOUS | 
    MAP_SHARED is by far the easiest way - just one call.
  • If you start the processes independently, but can supply them with a 
    shared memory name then shm_open (+ ftruncate) + mmap with MAP_SHARED 
    is two/three calls. Requires librt on some OSes.
  • If your OS has /dev/shm/ then shm_open is equivalent to opening a 
    file in /dev/shm/.

注意共享記憶體本身不提供同步技術,需要自己使用互斥或者訊號量來保證同步。

5、c++程序記憶體空間分佈(注意各部分的記憶體地址誰高誰低,注意棧從高道低分配,堆從低到高分配)

這裡寫圖片描述 
在《深入理解計算機系統》(第九章、虛擬儲存器)中對動態儲存器分配有比較詳細的講解。

6、ELF是什麼?其大小與程式中全域性變數的是否初始化有什麼關係(注意.bss段)

ELF(Executable and Linking Format)是一種物件檔案的格式,用於定義不同型別的物件檔案(Object files)中都放了什麼東西、以及都以什麼樣的格式去放這些東西。它自最早在 System V 系統上出現後,被 xNIX 世界所廣泛接受,作為預設的二進位制檔案格式來使用。可以說,ELF是構成眾多xNIX系統的基礎之一。

ELF檔案有三種類型:

  1. 可重定位的物件檔案(Relocatable file) 由彙編器彙編生成的 .o 檔案
  2. 可執行的物件檔案(Executable file) 可執行應用程式
  3. 可被共享的物件檔案(Shared object file) 動態庫檔案,也即 .so 檔案

在Unix下使用readelf命令來顯示可執行程式的資訊,功能與objdump相似,但是顯示的更加具體。 
下面是我做CSAPP的bomb實驗的可執行檔案資訊。

lijun0914:~/workspace/bomb $ readelf -all bomb
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x400c90
  Start of program headers:          64 (bytes into file)
  Start of section headers:          18616 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:         36
  Section header string table index: 33

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .interp           PROGBITS         0000000000400238  00000238
       000000000000001c  0000000000000000   A       0     0     1
  [ 2] .note.ABI-tag     NOTE             0000000000400254  00000254
       0000000000000020  0000000000000000   A       0     0     4
  [ 3] .note.gnu.build-i NOTE             0000000000400274  00000274
       0000000000000024  0000000000000000   A       0     0     4
  [ 4] .gnu.hash         GNU_HASH         0000000000400298  00000298
       0000000000000030  0000000000000000   A       5     0     8
  [ 5] .dynsym           DYNSYM           00000000004002c8  000002c8
       0000000000000300  0000000000000018   A       6     1     8
  [ 6] .dynstr           STRTAB           00000000004005c8  000005c8
       000000000000016d  0000000000000000   A       0     0     1
  [ 7] .gnu.version      VERSYM           0000000000400736  00000736
       0000000000000040  0000000000000002   A       5     0     2
  [ 8] .gnu.version_r    VERNEED          0000000000400778  00000778
       0000000000000060  0000000000000000   A       6     1     8
  [ 9] .rela.dyn         RELA             00000000004007d8  000007d8
       0000000000000060  0000000000000018   A       5     0     8
  [10] .rela.plt         RELA             0000000000400838  00000838
       0000000000000288  0000000000000018   A       5    12     8
  [11] .init             PROGBITS         0000000000400ac0  00000ac0
       000000000000000e  0000000000000000  AX       0     0     4
  [12] .plt              PROGBITS         0000000000400ad0  00000ad0
       00000000000001c0  0000000000000010  AX       0     0     16
  [13] .text             PROGBITS         0000000000400c90  00000c90
       0000000000001614  0000000000000000  AX       0     0     16
  [14] .fini             PROGBITS         00000000004022a4  000022a4
       0000000000000009  0000000000000000  AX       0     0     4
  [15] .rodata           PROGBITS         00000000004022b0  000022b0
       00000000000004e5  0000000000000000   A       0     0     16
  [16] .eh_frame_hdr     PROGBITS         0000000000402798  00002798
       0000000000000104  0000000000000000   A       0     0     4
  [17] .eh_frame         PROGBITS         00000000004028a0  000028a0
       0000000000000454  0000000000000000   A       0     0     8
  [18] .init_array       INIT_ARRAY       0000000000602df8  00002df8
       0000000000000008  0000000000000000  WA       0     0     8
  [19] .fini_array       FINI_ARRAY       0000000000602e00  00002e00
       0000000000000008  0000000000000000  WA       0     0     8
  [20] .jcr              PROGBITS         0000000000602e08  00002e08
       0000000000000008  0000000000000000  WA       0     0     8
  [21] .dynamic          DYNAMIC          0000000000602e10  00002e10
       00000000000001d0  0000000000000010  WA       6     0     8
  [22] .got              PROGBITS         0000000000602fe0  00002fe0
       0000000000000008  0000000000000008  WA       0     0     8
  [23] .got.plt          PROGBITS         0000000000602fe8  00002fe8
       00000000000000f0  0000000000000008  WA       0     0     8
  [24] .data             PROGBITS         00000000006030e0  000030e0
       0000000000000660  0000000000000000  WA       0     0     32
  [25] .bss              NOBITS           0000000000603740  00003740
       00000000000006d0  0000000000000000  WA       0     0     32
  [26] .comment          PROGBITS         0000000000000000  00003740
       0000000000000053  0000000000000001  MS       0     0     1
  [27] .debug_aranges    PROGBITS         0000000000000000  00003793
       0000000000000030  0000000000000000           0     0     1
  [28] .debug_info       PROGBITS         0000000000000000  000037c3
       00000000000007a3  0000000000000000           0     0     1
  [29] .debug_abbrev     PROGBITS         0000000000000000  00003f66
       000000000000021f  0000000000000000           0     0     1
  [30] .debug_line       PROGBITS         0000000000000000  00004185
       0000000000000161  0000000000000000           0     0     1
  [31] .debug_str        PROGBITS         0000000000000000  000042e6
       00000000000002f3  0000000000000001  MS       0     0     1
  [32] .debug_loc        PROGBITS         0000000000000000  000045d9
       0000000000000188  0000000000000000           0     0     1
  [33] .shstrtab         STRTAB           0000000000000000  00004761
       0000000000000153  0000000000000000           0     0     1
  [34] .symtab           SYMTAB           0000000000000000  000051b8
       0000000000000eb8  0000000000000018          35    57     8
  [35] .strtab           STRTAB           0000000000000000  00006070
       00000000000006b6  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x00000000000001f8 0x00000000000001f8  R E    8
  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
                 0x000000000000001c 0x000000000000001c  R      1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x0000000000002cf4 0x0000000000002cf4  R E    200000
  LOAD           0x0000000000002df8 0x0000000000602df8 0x0000000000602df8
                 0x0000000000000948 0x0000000000001018  RW     200000
  DYNAMIC        0x0000000000002e10 0x0000000000602e10 0x0000000000602e10
                 0x00000000000001d0 0x00000000000001d0  RW     8
  NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254
                 0x0000000000000044 0x0000000000000044  R      4
  GNU_EH_FRAME   0x0000000000002798 0x0000000000402798 0x0000000000402798
                 0x0000000000000104 0x0000000000000104  R      4
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     8
  GNU_RELRO      0x0000000000002df8 0x0000000000602df8 0x0000000000602df8
                 0x0000000000000208 0x0000000000000208  R      1

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame 
   03     .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 
   04     .dynamic 
   05     .note.ABI-tag .note.gnu.build-id 
   06     .eh_frame_hdr 
   07     
   08     .init_array .fini_array .jcr .dynamic .got 

Dynamic section at offset 0x2e10 contains 24 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400ac0
 0x000000000000000d (FINI)               0x4022a4
 0x0000000000000019 (INIT_ARRAY)         0x602df8
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x602e00
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x400298
 0x0000000000000005 (STRTAB)             0x4005c8
 0x0000000000000006 (SYMTAB)             0x4002c8
 0x000000000000000a (STRSZ)              365 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x602fe8
 0x0000000000000002 (PLTRELSZ)           648 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x400838
 0x0000000000000007 (RELA)               0x4007d8
 0x0000000000000008 (RELASZ)             96 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x400778
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0x400736
 0x0000000000000000 (NULL)               0x0

Relocation section '.rela.dyn' at offset 0x7d8 contains 4 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000602fe0  001000000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
000000603740  001d00000005 R_X86_64_COPY     0000000000603740 stdout + 0
000000603748  001e00000005 R_X86_64_COPY     0000000000603748 stdin + 0
000000603750  001f00000005 R_X86_64_COPY     0000000000603750 stderr + 0

Relocation section '.rela.plt' at offset 0x838 contains 27 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000603000  000100000007 R_X86_64_JUMP_SLO 0000000000000000 getenv + 0
000000603008  000200000007 R_X86_64_JUMP_SLO 0000000000000000 __errno_location + 
            
           

相關推薦

後臺開發知識點總結LinuxOS

  偶然在知乎上看到想要從事linux後臺開發需要的能力集錦,總結的挺全面的,鑑於自己貧弱的記憶力,還是在這裡總結一下供以後檢視,順便檢驗一下自己。   1、 命令:netstat tcpdump ipcs ipcrm 這四個命令的熟練掌握程度基本上能體現實際開發和除錯程式的

Zookeeper學習Linux搭建zookeeper

1.zookeeper單機搭建 下載:wget http://mirrors.shu.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz 解壓:tar -zxvf zookeeper-3.4.12.tar.gz 配置檔案

android影象與影象處理系列BitmapBitmapFactory

1、Drawable物件   Android應用添加了Drawabe資源之後,Android SDK會為這份資原始檔在R清單檔案中建立一個索引項:R.drawable.file_name,接著我們可以在xml資原始檔中通過@drawable/file_name來訪問該draw

c++後臺開發面試常見知識點總結c++基礎

指標和引用的區別 extern,const,static,volatile關鍵字 #define 和const的區別 關於typedef和#define; C++程式中記憶體使用情況分析(堆和棧的區別) new 與 malloc的異同處,new和delete是如何實現的。 C和C++的區別 C++中的過載,

java_web項目開發經驗總結

從數據 簡單 處理 開發 事務 傳輸 記錄 承載 基礎上   web項目就像一個動態的記事本,功能很強大,你最初的項目功能調研越給力,項目所能發揮的作用也就越給力。這是因為web網絡的強聯系性,大家都可以通過訪問到自己想要訪問的頁面,頁面裏既可以承載信息,也可以承載做事情的

react native 知識點總結

修改 ltp 組件 改變 set 覆蓋 sta 一個 個數 一、關於react native 版本的升級 參照文檔:http://reactnative.cn/docs/0.45/upgrading.html react-native -v

C# winform 程序開發知識點總結幹貨

onstop 剛才 cell iss 成功 one 身份驗證 服務 cep 1、數據庫連接及操作   在說數據庫操作之前,先說一下數據庫連接操作字符串的獲取   首先,點擊服務器資源管理器,接下來選中數據連接右鍵點擊添加連接,填入你要連接的服務器名稱,點擊單選框使用SQL

ArcGIS Engine開發基礎總結

目錄 reader style mov 空間 圖層 不能添加 頁面 制圖 標準Engine功能 地圖瀏覽 地圖制作 數據查詢 數據分析 及 所有的開發控件 —MapControl, PageLayout, Toolbar, TOC, ArcRea

Vue 組件總結 拖拽組件 Vue-draggable

Vue-draggable vue 一、vue-draggable 安裝使用npm地址: https://www.npmjs.com/package/vuedraggable 二、表格拖拽使用, 舉例: <table class="table table-co

Mybatis核心知識點總結

nfa 邏輯 efault Go 不常用 pojo code ive 圖片 一、初識Mybatis框架   mybatis是一個持久層的框架,是apache下的頂級項目。   mybatis托管到goolecode下,再後來托管到github下(https://github

Java後臺開發Servlet學習

一、Servlet介紹   開始接觸一個新的東西,首先要知道它是幹什麼的吧。Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程式或服務聯結器,用Java編寫的伺服器端程式,主要功能在於互動式地瀏覽和修改資料,生成動態Web內容。我自己的理解就是對客戶端或者瀏覽器傳送的

Android知識點總結

1、android:layout_weight 屬性的意義 1、權重的值指的是每個部件所佔剩餘空間的大小,該值與同級部件所佔空間大小有關。 2、例如,我們定義一個權重為 2 的 View,另一個 View 的權重是 1,那麼總數就是 3;這時第一個 View 佔據 2/3 的空間,第二個佔據

雲伺服器linux系統啟動web專案環境配置_jdk下載安裝

官網下載jdk(linux)  檢視linux 多少位 命令:getconf LONG_BIT    下載對應jdk 1.上傳壓縮包            cd ..回

linux指令目錄與檔案

一、文件與目錄 1.Linux檔案屬性 第一個字元代表這個檔案是『目錄、檔案或連結檔等等』: 當為[ d ]則是目錄; 當為[ - ]則是檔案; 若是[ l ]則表示為連結檔(

關於javaweb的“網上書店”專案知識點總結

這是本人第一次寫部落格,主要記錄用java作專案的一些技術點,方便自己日後回憶。 本次java專案是傳智播客的“網上書店”專案,用的架構是 jsp + servlet +javabean,這個專案是本人的第一個專案。 以下是自己在做專案的過程中自己覺得需要注意的知識點: 一、request.

dubbo實用知識點總結

1. dubbo基礎架構 架構 特性 服務提供者 服務消費者 配置可以用dubbo.properties來替換 2. 註解配置 提供方(注意:serivce註解是dubbo的service) 消費者 3. API 服務提供者 服務消費者

Hadoop知識點總結

HADOOP hadoop的概念 Hadoop是一個由Apache基金會所開發的分散式系統基礎架構。使用者可以在不瞭解分散式底層細節的情況下,開發分散式程式。充分利用叢集的威力進行高速運算和儲存。 它主要有以下幾個優點: 高可靠性:Hadoop按位儲存和處理

IOS 知識點總結

###IOS執行緒講解 對於單核的處理器,可以把多個操作放到不同的執行緒,當用戶操作完UI之後其他後續任務在其他執行緒操作,當CPU空閒時繼續其他操作; 對於多核操作,操作任務可以分散到多個空閒的CPU中繼續執行; 一個核(CPU)可以有多個執行緒,但其實

微信開發學習總結——微信開發環境搭建轉載

轉自:https://www.cnblogs.com/xdp-gacl/p/5149171.html   目前移動開發處於比較火的的趨勢,很多的開發者都躍躍欲試,目前移動App開發領域主要分為以下幾種型別      我在平時的工作中接觸得比較多的就是基於Android的

java呼叫Linux執行Python爬蟲,並將資料儲存到elasticsearch--環境指令碼搭建

java呼叫Linux執行Python爬蟲,並將資料儲存到elasticsearch中 一、以下部落格程式碼使用的開發工具及環境如下: 1、idea: 2、jdk:1.8 3、elasticsearch:5.2.0 4、Linux 5、Python 6、maven 二、maven座標: <!--jav