進(jìn)程和計劃任務(wù)詳解(一)

學(xué)習(xí)內(nèi)容:

1、進(jìn)程相關(guān)知識(用戶空間、內(nèi)核空間、進(jìn)程創(chuàng)建、進(jìn)程優(yōu)先級、進(jìn)程內(nèi)存)
2、Linux進(jìn)程查看及管理工具(ps、pgrep、pidof、kill、jobs、uptime、top、htop、vmstat、pmap、)

一、進(jìn)程相關(guān)知識

操作系統(tǒng)的組成部分:硬件,kernel,lib,
系統(tǒng)調(diào)用-->調(diào)用kernel
lib調(diào)用--> 庫調(diào)用,kernel調(diào)用
運行用戶代碼-->用戶模式-->用戶空間;
運行kernel-->內(nèi)核模式-->內(nèi)核空間
   內(nèi)核的功用:進(jìn)程管理、文件系統(tǒng)、網(wǎng)絡(luò)功能、內(nèi)存管理、驅(qū)動程序、安全功能等
內(nèi)核空間和用戶空間關(guān)系:
   對計算機(jī)來說,其實只有CPU和內(nèi)存,其中在某一時刻內(nèi)存邏輯上分為兩部分(linux系統(tǒng)):用戶空間和
內(nèi)核空間,每一個用戶進(jìn)程在內(nèi)存的用戶空間進(jìn)行運行,當(dāng)用戶進(jìn)程需要進(jìn)行硬件資源的訪問和使用時此時會
通過系統(tǒng)調(diào)用到內(nèi)核空間,因為只有內(nèi)核才有權(quán)限進(jìn)行硬件的訪問,此時未運行完的進(jìn)程會暫時中止(保留現(xiàn)
場),CPU進(jìn)而處理內(nèi)核相關(guān)請求,而中止的進(jìn)程相關(guān)狀態(tài)信息保存在內(nèi)核task struct(Linux內(nèi)核存儲進(jìn)程
信息的數(shù)據(jù)結(jié)構(gòu)格式),即相當(dāng)于內(nèi)核會建立一個的運行的。
   程序的數(shù)據(jù)庫,當(dāng)內(nèi)核硬件的請求CPU處理完畢,內(nèi)核會根據(jù)記錄進(jìn)程數(shù)據(jù)庫中讀取進(jìn)程的狀態(tài)(恢復(fù)現(xiàn)
場),從而知道程序運行到哪一步,進(jìn)而繼續(xù)運行下去,而不需要重新運行進(jìn)程因為每個進(jìn)程可以通過系統(tǒng)調(diào)用
進(jìn)入內(nèi)核,因此,Linux內(nèi)核空間由系統(tǒng)內(nèi)的所有進(jìn)程共享。
進(jìn)程和線程的關(guān)系:
  進(jìn)程和線程都是由操作系統(tǒng)所體會的程序運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。
進(jìn)程和線程的區(qū)別在于: 簡而言之,一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程. 線程的劃分尺度小于
進(jìn)程,使得多線程程序的并發(fā)性高。 
  另外,進(jìn)程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。 
  線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出
口。但是線程不能夠獨立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制。 
  從邏輯角度來看,多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將
多個線程看做多個獨立的應(yīng)用,來實現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別。 
   進(jìn)程是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的
一個獨立單位. 
   線程是進(jìn)程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨立運行的基本單位.線程自己
基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬
一個進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源. 
   一個線程可以創(chuàng)建和撤銷另一個線程;同一個進(jìn)程中的多個線程之間可以并發(fā)執(zhí)行.
進(jìn)程的創(chuàng)建:
init(centos6)
systemd(centos7)是無法像內(nèi)核調(diào)用特權(quán)指令,但是可以進(jìn)行創(chuàng)建進(jìn)程;
進(jìn)程是由父進(jìn)程創(chuàng)建:父子關(guān)系
  fork(請求創(chuàng)建進(jìn)程的調(diào)用接口;)
  clone(克隆自己的數(shù)據(jù)給子進(jìn)程;)
任何進(jìn)程銷毀都是其父進(jìn)程進(jìn)行銷毀;
  fork(), clone()
進(jìn)程優(yōu)先級:
0-139:
0-99:實時優(yōu)先級;-->數(shù)字越大優(yōu)先級越高;
100-139:靜態(tài)優(yōu)先級;-->數(shù)字越小優(yōu)先級越高;
NICE值:
 -20,19程序的優(yōu)雅值:
1、普通用戶只能調(diào)大自己進(jìn)程的nice值
2、root可以調(diào)大調(diào)小nice 
時間復(fù)雜度:Big O,用時和規(guī)模的關(guān)系(橫坐標(biāo)可以是規(guī)?;蛘哧犃袛?shù)列,縱坐標(biāo)是時間)  
 Big O
 O(1),O(logn),O(n)線性,O(n^2)拋物線,O(2^n);
每個程序有2個隊列:運行隊列,過期隊列;
程序運行優(yōu)先級查看運行隊列:
進(jìn)程的task struct:
進(jìn)程內(nèi)存:
內(nèi)核完成資源分配:
同一個命令,不同數(shù)據(jù)使用的內(nèi)存也是不一樣的;
將內(nèi)存分割成一個個4k的頁框存儲頁面數(shù)據(jù);
page frame:頁框,存儲頁面數(shù)據(jù);
每個進(jìn)程的所占的內(nèi)存有page frame組成;偽裝成連續(xù)空間給進(jìn)程;

以32位系統(tǒng)位列:每個進(jìn)程運行時內(nèi)核告訴進(jìn)程有3G內(nèi)存可用;-->虛擬內(nèi)存-->線性地址空間;

真正分配的內(nèi)存空間:物理地址空間:-->與先行地址空間是離散對應(yīng)的;

內(nèi)存為每個進(jìn)程都保存了task stauct;
 MMU:Memory Management Unit內(nèi)存管理單元;
 缺頁異常:訪問數(shù)據(jù),發(fā)現(xiàn)物理空間數(shù)據(jù)不在了;

常駐內(nèi)存集:不能被交換
虛擬內(nèi)存集:可以進(jìn)行交換-->swap上

進(jìn)程間通訊 IPC:Inter Process Communication
  進(jìn)程與進(jìn)程無法通信:
  如需要通信:同一主機(jī)上;
      signal :發(fā)信號的形式實現(xiàn)
      shm:shared memory 共享內(nèi)存空間;
      semerphor:信號量,一種計數(shù)器,相當(dāng)于加上一種標(biāo)識位,添加訪問權(quán)限
  不同主機(jī)上:
      rpc:remote procecure call:遠(yuǎn)程過程調(diào)用;
      socket:基于套接通信,IP和端口號
Linux內(nèi)核:搶占式多任務(wù):
進(jìn)程類型:
守護(hù)進(jìn)程:daemon;與終端無關(guān),在系統(tǒng)引導(dǎo)過程中啟動的進(jìn)程;
前臺進(jìn)程:用戶終端啟動進(jìn)程:與終端相關(guān);
    注意:也可把在前臺啟動進(jìn)程送往后臺,變?yōu)橐允刈o(hù)模式運行;
進(jìn)程狀態(tài):
運行態(tài):running
就緒態(tài)或睡眠態(tài):ready
睡眠態(tài):
可中斷睡眠:任意時間都可喚醒:interruptable
不可中斷睡眠:uninterruptable
進(jìn)程:指令+數(shù)據(jù)
一次IO是由分2段進(jìn)行:磁盤加載內(nèi)核內(nèi)存,內(nèi)核內(nèi)存復(fù)制進(jìn)程內(nèi)存;
第二段:IO調(diào)用過程。
第一段:

停止態(tài):暫停于內(nèi)存中,但不會被調(diào)度,除非手動啟動;
僵死態(tài):zombie

init(systemd):是負(fù)責(zé)收拾沒有父進(jìn)程的子進(jìn)程;

二、Linux進(jìn)程查看及管理工具:

    CPU-Bound:CPU密集進(jìn)程-->消耗更多的CPU
        非交互式:
    IO-Bound:IO密集進(jìn)程-->
        交互式:
Linux系統(tǒng)狀態(tài)的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap,
 vmstat, dstat, kill, pkill, job, bg, fg, nohup

pstree命令:以樹狀的方式顯示進(jìn)程
    pstree-display a tree of processes
    -p 顯示進(jìn)程編號
例: 以樹狀可以很清晰看見進(jìn)程跟進(jìn)程之間的關(guān)系
進(jìn)程管理工具
ps:process state進(jìn)程狀態(tài)查看工具:
ps - report a snapshot of the current processes
語法:ps [options]
注意:該命令查看的是某一時刻的瞬間進(jìn)程運行的狀態(tài),非連續(xù)查看(靜態(tài))
支持三種選項:
    UNIX選項如-A -e
    BSD選項如a
    GUN選項如--help
常用組合:aux
默認(rèn)顯示當(dāng)前終端中的進(jìn)程
    a 選項包括所有終端中的進(jìn)程
    x 選項包括不鏈接終端的進(jìn)程
    u 選項顯示進(jìn)程所有者的信息
    f 選項顯示進(jìn)程的父進(jìn)程
    o 屬性… 選項顯示定制的信息::
pid、comm、%cpu、%mem、state、tty、euser、ruser
USER:發(fā)起進(jìn)程的用戶
PID:PID號
%CPU:使用CPU百分比
%MEM:使用內(nèi)存百分比
VSZ:Virtual memory SiZe,虛擬內(nèi)存集,線性內(nèi)存,許諾使用內(nèi)存,
RSS:ReSidentSize, 常駐內(nèi)存集,實際使用內(nèi)存
TTY:和終端相關(guān)
STAT:進(jìn)程狀態(tài)
  D:不可中斷睡眠
  S:可中斷的睡眠
  R:就緒或運行狀態(tài)
  T:中止?fàn)顟B(tài)
  Z:僵死狀態(tài)
  <:高優(yōu)先級進(jìn)程
  N:低優(yōu)先級進(jìn)程
  +:前臺進(jìn)程組中的進(jìn)程
  l:多線程的進(jìn)程
  s:會話進(jìn)程的首進(jìn)程
  START:進(jìn)程開始時間
  TIME:進(jìn)程真正在CPU運行的時間,而非掛表時長
   COMMANDD:發(fā)起進(jìn)程的命令,【如果命令中有中括號,代表是內(nèi)核進(jìn)程】

常用組合:-ef
    -e: 顯示所有進(jìn)程
    -f: 顯示完整格式程序信息
常用組合:-eFH
    -F: 顯示更完整格式的進(jìn)程信息
    -H: 以進(jìn)程層級格式顯示進(jìn)程相關(guān)信息
常用組合:自定義
    ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
    ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
    ps -eopid,tt,user,fname,tmout,f,wcha
進(jìn)程優(yōu)先級分類
ni: nice 值,普通優(yōu)先級,值越低優(yōu)先級越高
pri: priority 優(yōu)先級,進(jìn)程優(yōu)先級,數(shù)值越大優(yōu)先級越高
psr: processor CPU編號
rtprio: 實時優(yōu)先級
搜索進(jìn)程
最靈活:ps 選項 |  其它命令
按預(yù)定義的模式:pgrep
    pgrep [options] pattern
        -u uid: effective user,生效者
        -U uid: real user,真正發(fā)起運行命令者
        -t terminal: 與指定終端相關(guān)的進(jìn)程
        -l: 顯示進(jìn)程名
        -a: 顯示完整格式的進(jìn)程名
        -P pid: 顯示指定進(jìn)程的子進(jìn)程

按確切的程序名稱:/sbin/pidof
pidof bash

搜索指定進(jìn)程的pidof init

kill
kill:向進(jìn)程發(fā)送控制信號,以實現(xiàn)對進(jìn)程管理
顯示當(dāng)前系統(tǒng)可用信號:kill -l  trap -l
-l:列出當(dāng)前kill能夠使用的信號(注意是小寫L)
常用信號:man 7 signal
  1) SIGHUP: 無須關(guān)閉進(jìn)程而讓其重讀配置文件
  2) SIGINT: 中止正在運行的進(jìn)程;相當(dāng)于Ctrl+c
  9) SIGKILL: 殺死正在運行的進(jìn)程(強(qiáng)制立刻殺死進(jìn)程)
  15) SIGTERM:終止正在運行的進(jìn)程(可能不會立即生效,會等進(jìn)程保存完所有數(shù)據(jù)才正常退出)
  18) SIGCONT:
  19) SIGSTOP:
由鍵盤輸入ctrl-c同樣的動作-9:立刻強(qiáng)制刪除一個作業(yè)-15:以正常方式終止一項作業(yè)。與-9不一樣。

指定信號的方法:
  (1) 信號的數(shù)字標(biāo)識;1, 2, 9
  (2) 信號完整名稱;SIGHUP
  (3) 信號的簡寫名稱;HUP
jobs 查看后臺執(zhí)行程序

將“當(dāng)前”作業(yè)放到后臺“暫停”:ctrl+z
觀察當(dāng)前后臺作業(yè)狀態(tài):jobs

參數(shù):
-l  列出進(jìn)程 ID 及其它信息。
-p  僅列出進(jìn)程 ID。
-n僅列出自從上次輸出了狀態(tài)變化提示(比如顯示有進(jìn)程退出)后的發(fā)生了狀態(tài)變化的進(jìn)程。
-r  僅顯示運行中的作業(yè)。
-s  僅顯示停止的作業(yè)。
-x  運行命令及其參數(shù),并用新的命令的進(jìn)程 ID 替代所匹配的原有作業(yè)的進(jìn)程組 ID。

將后臺作業(yè)拿到前臺處理:fg
fg %jobnumber (%可有可無)

讓作業(yè)在后臺運行:bg
ctrl+z讓當(dāng)前作業(yè)到后臺去暫停,bg 作業(yè)號就可以在后臺run

&是指在后臺運行
同時運行多個進(jìn)程,提高效率
方法1
vi all.sh
f1.sh&
f2.sh&
f3.sh&
方法2
(f1.sh&);(f2.sh&);(f3.sh&)
方法3
{ f1.sh& f2.sh& f3.sh& }
nohup是永久執(zhí)行
運行 nohup --help
Run COMMAND, ignoring hangup signals. 可以看到是“運行命令,忽略掛起信號”
就是指,用nohup運行命令可以使命令永久的執(zhí)行下去,和用戶終端沒有關(guān)系,例如我們斷開SSH連接都不會

&是指在后臺運行,但當(dāng)用戶推出(掛起)的時候,命令自動也跟著退出

那么,我們可以巧妙的吧他們結(jié)合起來用就是
nohup COMMAND &
這樣就能使命令永久的在后臺執(zhí)行

舉個例子nohup tail -f nohup.out
然后退出登錄,再連接,用ps -ef 你會還能看到在運行
ps -ef
root      3457     1  0 18:20 ?        00:00:00 tail -f nohup.out

另外,nohup執(zhí)行后,會產(chǎn)生日子文件,把命令的執(zhí)行中的消息保存到這個文件中,一般在當(dāng)前目錄下,如果當(dāng)
前目錄不可寫,那么自動保存到執(zhí)行這個命令的用戶的home目錄下,例如root的話就保存在/root/下
這個我們常在運行命令和腳本中常用到的

系統(tǒng)工具
uptime命令
顯示當(dāng)前時間,系統(tǒng)已啟動的時間、當(dāng)前上線人數(shù),系統(tǒng)平均負(fù)載
系統(tǒng)平均負(fù)載:(1、5、10分鐘的平均負(fù)載,一般不會超過1)
 指在特定時間間隔內(nèi)運行隊列中的平均進(jìn)程數(shù)。
如果每個CPU內(nèi)核的當(dāng)前活動進(jìn)程數(shù)不大于3的話,那么系統(tǒng)的性能良好。如果每個CPU內(nèi)核的任務(wù)數(shù)大于5,那
么這臺機(jī)器的性能有嚴(yán)重問題。
如果linux主機(jī)是1個雙核CPU的話,當(dāng)Load Average 為6的時候說明機(jī)器已經(jīng)被充分使用了。
進(jìn)程管理工具
top命令:
選項:
 -d #: 指定刷新時間間隔,默認(rèn)為3秒
 -b: 以批次方式
 -n #: 顯示多少批次

有許多內(nèi)置命令:
排序:
  P:以占據(jù)的CPU百分比,%CPU
  M:占據(jù)內(nèi)存百分比,%MEM
  T:累積占據(jù)CPU時長,TIME+

首部信息顯示:
  uptime信息:l命令
  tasks及cpu信息:t命令
  cpu分別顯示:1 (數(shù)字)
memory信息:m命令

退出命令:q
修改刷新時間間隔:s
終止指定進(jìn)程:k
保存文件:W

欄位信息簡介
us:用戶空間
sy:內(nèi)核空間
ni:調(diào)整nice時間
id:空閑
wa:等待IO時間
hi:硬中斷
si:軟中斷(模式切換)
st:虛擬機(jī)偷走的時間

欄位信息簡介
PID (Process Id):任務(wù)的進(jìn)程ID
PPID (Parent Process Pid):父任務(wù)的進(jìn)程ID
RUSER (Real User Name):任務(wù)的所有者真實名稱
UID (User Id):任務(wù)所有者ID
USER (User Name):任務(wù)所有者名稱
GROUP (Group Name):任務(wù)所有者群組名
TTY (Controlling Tty):終端
PR (Priority):優(yōu)先級
%CPU (CPU usage):CPU使用率
%MEM (Memory usage (RES)):內(nèi)存使用率
S (Process Status):進(jìn)程狀態(tài)
TIME+ (CPU Time, hundredths):CPU時間,精確到秒
htop命令:需從Fedora-EPEL源安裝
選項:
    -d #: 指定延遲時間;
    -u UserName: 僅顯示指定用戶的進(jìn)程;
    -s COLUME: 以指定字段進(jìn)行排序;
子命令:
    s: 跟蹤選定進(jìn)程的系統(tǒng)調(diào)用;
    l: 顯示選定進(jìn)程打開的文件列表;
    a:將選定的進(jìn)程綁定至某指定CPU核心;
    t: 顯示進(jìn)程樹
F1-F10選項
F3直接搜索進(jìn)程
F9發(fā)送kill命令,默認(rèn)級別是15
vmstat命令:查看虛擬內(nèi)存信息
vmstat [options] [delay [count]]
      -s 內(nèi)存信息匯總
procs:
  r:等待運行的進(jìn)程的個數(shù),和核心數(shù)有關(guān)
  b:處于不可中斷睡眠態(tài)的進(jìn)程個數(shù)(被阻塞的隊列的長度)
memory:
  swpd: 交換內(nèi)存的使用總量
  free:空閑物理內(nèi)存總量
  buffer:用于buffer的內(nèi)存總量
  cache:用于cache的內(nèi)存總量
swap:
  si:從磁盤交換進(jìn)內(nèi)存的數(shù)據(jù)速率(kb/s)
  so:從內(nèi)存交換至磁盤的數(shù)據(jù)速率(kb/s)
io:
  bi:從塊設(shè)備讀入數(shù)據(jù)到系統(tǒng)的速率(kb/s)
  bo: 保存數(shù)據(jù)至塊設(shè)備的速率
system:
  in: interrupts, 中斷速率,包括時鐘
  cs: context switch, 進(jìn)程切換速率
cpu:
  us: Time spent running non-kernel code
  sy: Time spent running kernel code
  id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
  wa: Time spent waiting for IO. 2.5.41前,包括in idle.
  st: Time stolen from a virtual machine. 2.6.11前, unknown.
例1:vmstat 2 5 兩秒一次,顯示5次
例2:查看內(nèi)存匯總信息
例3:dd if=/dev/sda of=/dev/null 測試硬盤讀數(shù)據(jù),并且監(jiān)控
可以看見io bi暴增,假如系統(tǒng)的io值過高,這個時候就需要查看是系統(tǒng)哪個進(jìn)程占用大量的io了
例4:dd if=/dev/zero of=f1 測試硬盤寫數(shù)據(jù),并且監(jiān)控
可以看見io bo暴增,假如系統(tǒng)的io值過高,這個時候就需要查看是系統(tǒng)哪個進(jìn)程占用大量的io了
注意:例3和例4都是測試磁盤吞吐量
如果io比較大,可以看看是哪個程序產(chǎn)生那么大的io,磁盤io太大的話會帶來系統(tǒng)的負(fù)載偏大
pmap命令:進(jìn)程的內(nèi)存映射
 pmap[options] pid[...]
   -x: 顯示詳細(xì)格式的信息;
cat /proc/PID/maps
另外一種實現(xiàn): pmap1

資源監(jiān)視工具 Glances



圖中顏色含義為:

綠色:OK(正常)、藍(lán)色:CAREFUL(注意)、紫色:WARNING(警告)、紅色:CRITICAL(嚴(yán)重),狀態(tài)
閥值可參考或修改/etc/glances/glances.conf
默認(rèn)刷新時間間隔為3s,可通過 glances -t xx指定刷新時間
退出可按q、Esc、Ctrl-C

監(jiān)控界面可用選項:

命令
說明
a 自動排序
l Show/hide logs
c 根據(jù)CPU使用率排序
b  Bytes or bits for network I/O
m  根據(jù)內(nèi)存占用比排序
w 刪除警告日志
p 根據(jù)進(jìn)程名字排序
x 刪除警告和嚴(yán)重級別的日
i Sort processes by I/O rate
1全局CPU或者每個CPU的狀態(tài)
d 顯示/隱藏硬盤I/O狀態(tài)
h Show/hide this help screen
f 顯示/隱藏文件系統(tǒng)狀態(tài)
t View network I/O as combination
n 顯示/隱藏network狀態(tài)
u View cumulative network I/O
s 顯示/隱藏sensors狀態(tài)
q Quit (Esc and Ctrl-C also work)
y 顯示/隱藏hddtemp狀態(tài)

glances支持遠(yuǎn)程模式:

即可以以C/S模式工作:
   Server: 以監(jiān)聽模式啟動glances;
   Client: 以遠(yuǎn)程模式啟動glances,遠(yuǎn)程連入指定服務(wù)器,并顯示Server上的相關(guān)性能數(shù)據(jù);

服務(wù)模式:
 glances -s -B 本地IP地址
    -B: 用于指明監(jiān)聽的本地地址;

客戶端模式:
 glances -c 服務(wù)器IP地址
    -c: 用于連入的服務(wù)器的地址;
在172.18.70.70上執(zhí)行g(shù)lances -s -B 172.18.70.70
在172.18.70.40上執(zhí)行g(shù)lances -c 172.18.70.70
注意:可能由于防火墻的原因無法連接

glances 的高級應(yīng)用
glances 的結(jié)果輸出方法
讓 glances 輸出 HTML 格式文件,首先安裝相關(guān)軟件包
[root@centos7 ~] # yum install Jinja2 
[root@centos7 ~] # glances -o HTML -f /var/www/html
[root@centos7 ~]#systemctl start httpd
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容