日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进程篇

發布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是進程

多進程的實現原理 多道技術

進程與程序

進程PID與PPID

并發與并行,阻塞與非阻塞

python實現多進程

孤兒進程與僵尸進程

?

什么是并發編程

并發指的是多個任務同時被執行,并發編程指的是編寫支持多任務并發的應用程序在。

之前的TCP通訊中,服務器在建立連接后需要一個循環來與客戶端循環的收發數據,但服務器并不知道客戶端什么時候會發來數據,導致沒有數時服務器進入了一個等待狀態,此時其他客戶端也無法鏈接服務器,很明顯這是不合理的,學習并發編程就是要找到一種方案,讓一個程序中的的多個任務可以同時被處理;

?

什么是進程

進程指的是正在運行的程序,是一系列過程的統稱,也是操作系統在調度和進行資源分配的基本單位

進程是實現并發的一種方式,在學習并發編程之前要先了解進程的基本概念以及多進程的實現原理,這就不得不提到操作系統了,因為進程這個概念來自于操作系統,沒有操作系統就沒有進程

?

多進程的實現原理-多道技術

操作系統介紹

下圖是操作系統在整個計算機中所在的位置:

?

位于應用軟件和硬件設備之間,本質上也是一個軟件,

由系統內核(管理所有硬件資源)與系統接口(提供給程序員使用的接口)組成

操作系統是為方便用戶操作計算機而提供的一個運行在硬件之上的軟件

操作系統的兩個核心作用

1.為用戶屏蔽了復雜繁瑣的硬件接口,為應用程序提供了,清晰易用的系統接口

有了這些接口以后程序員不用再直接與硬件打交道了

例子:有了操作系統后我們就可以使用資源管理器來操作硬盤上的數據,而不用操心,磁頭的移動啊,數據的讀寫等等

2.操作系統將應用程序對硬件資源的競爭變成有序的使用

例子:所有軟件 qq啊 微信啊 吃雞啊都共用一套硬件設備 假設現有三個程序都在使用打印機,如果不能妥善管理競爭問題,可能一個程序打印了一半圖片后,另一個程序搶到了打印機執行權于是打印了一半文本,導致兩個程序的任務都沒能完成,操作系統的任務就是將這些無序的操作變得有序

操作系統與應用程序的區別

二者的區別不在于的地位,它們都是軟件,而操作系統可以看做一款特殊的軟件

1.操作系統是是受保護的:無法被用戶修改(應用軟件如qq不屬于操作系統可以隨便卸載)

2.大型:linux或widows源代碼都在五百萬行以上,這僅僅是內核,不包括用戶程序,如GUI,庫以及基本應用軟件(如windows Explorer等),很容易就能達到這個數量的10倍或者20倍之多

3.長壽:由于操作系統源碼量巨大,編寫是非常耗時耗力的,一旦完成,操作系統所有者便不會輕易的放棄重寫,二是在原有基礎上改進,基本上可以把windows95/98/Me看出一個操作系統

?

?

操作系統發展歷史:

多道技術出現在第三代操作系統中,是為了解決前兩代操作系統存在的種種問題而出現,那么前兩代操作系統都有哪些問題呢?一起來看看操作系統的發展歷史:

?

第一代計算機(1940~1955):真空管和穿孔卡片

第一代計算機的產生背景:

第一代之前人類是想用機械取代人力,第一代計算機的產生是計算機由機械時代進入電子時代的標志,從Babbage失敗之后一直到第二次世界大戰,數字計算機的建造幾乎沒有什么進展,第二次世界大戰刺激了有關計算機研究的爆炸性進展。

lowa州立大學的john Atanasoff教授和他的學生Clifford Berry建造了據認為是第一臺可工作的數字計算機。該機器使用300個真空管。大約在同時,Konrad Zuse在柏林用繼電器構建了Z3計算機,英格蘭布萊切利園的一個小組在1944年構建了Colossus,Howard Aiken在哈佛大學建造了Mark 1,賓夕法尼亞大學的William Mauchley和他的學生J.Presper Eckert建造了ENIAC。這些機器有的是二進制的,有的使用真空管,有的是可編程的,但都非常原始,甚至需要花費數秒鐘時間才能完成最簡單的運算。

在這個時期,同一個小組里的工程師們,設計、建造、編程、操作及維護同一臺機器,所有的程序設計是用純粹的機器語言編寫的,甚至更糟糕,需要通過成千上萬根電纜接到插件板上連成電路來控制機器的基本功能。沒有程序設計語言(匯編也沒有),操作系統則是從來都沒聽說過。使用機器的過程更加原始,詳見下‘工作過程’

特點: 沒有操作系統的概念 所有的程序設計都是直接操控硬件

工作過程: 程序員在墻上的機時表預約一段時間,然后程序員拿著他的插件版到機房里,將自己的插件板街道計算機里,這幾個小時內他獨享整個計算機資源,后面的一批人都得等著(兩萬多個真空管經常會有被燒壞的情況出現)。

后來出現了穿孔卡片,可以將程序寫在卡片上,然后讀入機而不用插件板

優點:

程序員在申請的時間段內獨享整個資源,可以即時地調試自己的程序(有bug可以立刻處理)

缺點:

浪費計算機資源,一個時間段內只有一個人用。 注意:同一時刻只有一個程序在內存中,被cpu調用執行,比方說10個程序的執行,是串行的

?

第二代計算機(1955~1965):晶體管和批處理系統

第二代計算機的產生背景:

由于當時的計算機非常昂貴,自認很自然的想辦法較少機時的浪費。通常采用的方法就是批處理系統。

特點: 設計人員、生產人員、操作人員、程序人員和維護人員直接有了明確的分工,計算機被鎖在專用空調房間中,由專業操作人員運行,這便是‘大型機’。

有了操作系統的概念

有了程序設計語言:FORTRAN語言或匯編語言,寫到紙上,然后穿孔打成卡片,再將卡片盒帶到輸入室,交給操作員,然后喝著咖啡等待輸出接口

工作過程:

第二代如何解決第一代的問題/缺點: 1.把一堆人的輸入攢成一大波輸入, 2.然后順序計算(這是有問題的,但是第二代計算也沒有解決) 3.把一堆人的輸出攢成一大波輸出

現代操作系統的前身:(見圖)

優點:批處理,節省了機時

缺點:1.整個流程需要人參與控制,將磁帶搬來搬去(中間倆小人)

?

2.計算的過程仍然是順序計算-》串行

3.程序員原來獨享一段時間的計算機,現在必須被統一規劃到一批作業中,等待結果和重新調試的過程都需要等同批次的其他程序都運作完才可以(這極大的影響了程序的開發效率,無法及時調試程序)

?

第三代計算機(1965~1980):集成電路芯片和多道程序設計

第三代計算機的產生背景:

20世紀60年代初期,大多數計算機廠商都有兩條完全不兼容的生產線。

一條是面向字的:大型的科學計算機,如IBM 7094,見上圖,主要用于科學計算和工程計算

另外一條是面向字符的:商用計算機,如IBM 1401,見上圖,主要用于銀行和保險公司從事磁帶歸檔和打印服務

開發和維護完全不同的產品是昂貴的,同時不同的用戶對計算機的用途不同。

IBM公司試圖通過引入system/360系列來同時滿足科學計算和商業計算,360系列低檔機與1401相當,高檔機比7094功能強很多,不同的性能賣不同的價格

360是第一個采用了(小規模)芯片(集成電路)的主流機型,與采用晶體管的第二代計算機相比,性價比有了很大的提高。這些計算機的后代仍在大型的計算機中心里使用,此乃現在服務器的前身,這些服務器每秒處理不小于千次的請求。

如何解決第二代計算機的問題1: 卡片被拿到機房后能夠很快的將作業從卡片讀入磁盤,于是任何時刻當一個作業結束時,操作系統就能將一個作業從磁帶讀出,裝進空出來的內存區域運行,這種技術叫做 同時的外部設備聯機操作:SPOOLING,該技術同時用于輸出。當采用了這種技術后,就不在需要IBM1401機了,也不必將磁帶搬來搬去了(中間倆小人不再需要)

?

如何解決第二代計算機的問題2:

第三代計算機的操作系統廣泛應用了第二代計算機的操作系統沒有的關鍵技術:多道技術

cpu在執行一個任務的過程中,若需要操作硬盤,則發送操作硬盤的指令,指令一旦發出,硬盤上的機械手臂滑動讀取數據到內存中,這一段時間,cpu需要等待,時間可能很短,但對于cpu來說已經很長很長,長到可以讓cpu做很多其他的任務,如果我們讓cpu在這段時間內切換到去做其他的任務,這樣cpu不就充分利用了嗎。這正是多道技術產生的技術背景

?

多道技術:

多道技術中的多道指的是多個程序,多道技術的實現是為了解決多個程序競爭或者說共享同一個資源(比如cpu)的有序調度問題,解決方式即多路復用,多路復用分為時間上的復用和空間上的復用。

?

空間上的復用

將內存分為幾部分,每個部分放入一個程序,這樣,同一時間內存中就有了多道程序。

?

時間上的復用

當一個程序在等待I/O時,另一個程序可以使用cpu,如果內存中可以同時存放足夠多的作業,則cpu的利用率可以接近100%,類似于我們小學數學所學的統籌方法。(操作系統采用了多道技術后,可以控制進程的切換,或者說進程之間去爭搶cpu的執行權限。這種切換不僅會在一個進程遇到io時進行,一個進程占用cpu時間過長也會切換,或者說被操作系統奪走cpu的執行權限)

?

空間上的復用最大的問題是:程序之間的內存必須分割,這種分割需要在硬件層面實現,由操作系統控制。如果內存彼此不分割,則一個程序可以訪問另外一個程序的內存,

首先喪失的是安全性,比如你的qq程序可以訪問操作系統的內存,這意味著你的qq可以拿到操作系統的所有權限。

其次喪失的是穩定性,某個程序崩潰時有可能把別的程序的內存也給回收了,比方說把操作系統的內存給回收了,則操作系統崩潰。

?

多道技術案例:

生活中我們進程會同時做多個任務,但是本質上一個人是不可能同時做執行多個任務的,

例1:吃飯和打游戲,同時執行,本質上是在兩個任務之間切換執行,吃一口飯然后打打游戲,打會兒游戲再吃一口飯;

例2:做飯和洗衣服,如果沒有多道技術,在電飯煲做飯的時候我們就只能等著,假設洗米花費5分鐘,煮飯花費40分鐘,相當于40分鐘是被浪費的時間。那就可以在煮飯的等待過程中去洗衣服,假設把衣服裝進洗衣機花費5分鐘,洗衣服花費40分鐘,那么總耗時為 5(洗米)+5(裝衣服)+40(最長等待時間) 大大提高了工作效率

?

多道技術也是在不同任務間切換執行,由于計算機的切換速度非常快,所以用戶是沒有任何感覺的,看起來就像是兩個任務都在執行,但是另一個問題是,僅僅是切換還不行,還需要在切換前保存當前狀態,切換回來時恢復狀態,這些切換和保存都是需要花費時間的!在上述案例中由于任務過程中出現了等待即IO操作所以進行了切換,而對于一些不會出現IO操作的程序而言,切換不僅不能提高效率,反而會降低效率

例如:做一百道乘法題和做一百道除法題,兩個任務都是計算任務是不需要等待的,此時的切換反而降低了運行效率!

?

?

第三代計算機的操作系統仍然是批處理

許多程序員懷念第一代獨享的計算機,可以即時調試自己的程序。為了滿足程序員們很快可以得到響應,出現了分時操作系統

如何解決第二代計算機的問題3:

分時操作系統: 多個聯機終端+多道技術

20個客戶端同時加載到內存,有17在思考,3個在運行,cpu就采用多道的方式處理內存中的這3個程序,由于客戶提交的一般都是簡短的指令而且很少有耗時長的,索引計算機能夠為許多用戶提供快速的交互式服務,所有的用戶都以為自己獨享了計算機資源

CTTS:麻省理工(MIT)在一臺改裝過的7094機上開發成功的,CTSS兼容分時系統,第三代計算機廣泛采用了必須的保護硬件(程序之間的內存彼此隔離)之后,分時系統才開始流行

MIT,貝爾實驗室和通用電氣在CTTS成功研制后決定開發能夠同時支持上百終端的MULTICS(其設計者著眼于建造滿足波士頓地區所有用戶計算需求的一臺機器),很明顯真是要上天啊,最后摔死了。

后來一位參加過MULTICS研制的貝爾實驗室計算機科學家Ken Thompson開發了一個簡易的,單用戶版本的MULTICS,這就是后來的UNIX系統?;谒苌撕芏嗥渌腢nix版本,為了使程序能在任何版本的unix上運行,IEEE提出了一個unix標準,即posix(可移植的操作系統接口Portable Operating System Interface)

后來,在1987年,出現了一個UNIX的小型克隆,即minix,用于教學使用。芬蘭學生Linus Torvalds基于它編寫了Linux

?

第四代計算機(1980~至今):個人計算機

第四代也就是我們常見的操作系統,大多是具備圖形化界面的,例如:Windows,macOS ,CentOS等

由于采用了IC設計,計算機的體積下降,性能增長,并且成本以及可以被普通消費者接受,而第三代操作系統大都需要進行專業的學習才能使用,于是各個大佬公司開始開發那種不需要專業學習也可以快速上手的操作系統,即上述操作系統!

它們都是用了GUI 圖形化用戶接口,用戶只需要通過鼠標點擊拖拽界面上的元素即可完成大部分操作

?

進程與程序

進程是正在運行的程序,程序是程序員編寫的一堆代碼,也就是一堆字符,當這堆代碼被系統加載到內存中并執行時,就有了進程。

例如:生活中我們會按照菜譜來做菜,那么菜譜就是程序,做菜的過程就是進程

需要注意的是:一個程序是可以產生多個進程的,就像我們可以同時運行多個QQ程序一樣,會形成多個進程

測試:

import time while True:time.sleep(1)

多次運行該文件,就會產生多個python.exe進程,可以通過tasklist來查看運行的程序

?

?

PID和PPID

PID

在一個操作系統中通常都會運行多個應用程序,也就是多個進程,那么如何來區分進程呢?

系統會給每一個進程分配一個進程編號即PID,如同人需要一個身份證號來區分。

驗證:

tasklist 用于查看所有的進程信息

taskkill /f /pid pid 該命令可以用于結束指定進程

# 在python中可以使用os模塊來獲取pid import os print(os.getpid())

?

PPID

當一個進程a開啟了另一個進程b時,a稱為b的父進程,b稱為a的子進程

在python中可以通過os模塊來獲取父進程的pid

# 在python中可以使用os模塊來獲取ppid import os print("self",os.getpid()) # 當前進程自己的pid print("parent",os.getppid()) # 當前進程的父進程的pid

如果是在pycharm中運行的py文件,那pycahrm就是這個python.exe的父進程,當然你可以從cmd中來運行py文件,那此時cmd就是python.exe的父進程

?

?

并發與并行,阻塞與非阻塞

并發指的是,多個事件同時發生了

例如洗衣服和做飯,同時發生了,但本質上是兩個任務在切換,給人的感覺是同時在進行,也被稱為偽并行

并行指的是,多個事件同時進行著

例如一個人在寫代碼另一個人在寫書,這兩件事件是同時在進行的,要注意的是一個人是無法真正的并行執行任務的,在計算機中單核CPU也是無法真正并行的,之所以單核CPU也能同時運行qq和微信其實就是并發執行

阻塞與非阻塞指的是程序的狀態

阻塞狀態是因為程序遇到了IO操作,或是sleep,導致后續的代碼不能被CPU執行

非阻塞與之相反,表示程序正在正常被CPU執行

?

補充:進程有三種狀態

就緒態,運行態,和阻塞態

多道技術會在進程執行時間過長或遇到IO時自動切換其他進程,意味著IO操作與進程被剝奪CPU執行權都會造成進程無法繼續執行

?

進程相關理論(了解)

進程的創建

但凡是硬件,都需要有操作系統去管理,只要有操作系統,就有進程的概念,就需要有創建進程的方式,一些操作系統只為一個應用程序設計,比如微波爐中的控制器,一旦啟動微波爐,進程就已經存在。

  而對于通用系統(跑很多應用程序),需要有系統運行過程中創建或撤銷進程的能力,主要分為4中形式創建新的進程

  • 系統初始化(查看進程linux中用ps命令,windows中用任務管理器,前臺進程負責與用戶交互,后臺運行的進程與用戶無關,運行在后臺并且只在需要時才喚醒的進程,稱為守護進程,如電子郵件、web頁面、新聞、打印)

  • 一個進程在運行過程中開啟了子進程(如nginx開啟多進程,os.fork,subprocess.Popen等)

  • 用戶的交互式請求,而創建一個新進程(如用戶雙擊暴風影音)

  • 一個批處理作業的初始化(只在大型機的批處理系統中應用)

  •   

      無論哪一種,新進程的創建都是由一個已經存在的進程執行了一個用于創建進程的系統調用而創建的:

  • 在UNIX中該系統調用是:fork,fork會創建一個與父進程一模一樣的副本,二者有相同的存儲映像、同樣的環境字符串和同樣的打開文件(在shell解釋器進程中,執行一個命令就會創建一個子進程)

  • 在windows中該系統調用是:CreateProcess,CreateProcess既處理進程的創建,也負責把正確的程序裝入新進程。

  •  

      關于創建的子進程,UNIX和windows

      1.相同的是:進程創建后,父進程和子進程有各自不同的地址空間(多道技術要求物理層面實現進程之間內存的隔離),任何一個進程的在其地址空間中的修改都不會影響到另外一個進程。

      2.不同的是:在UNIX中,子進程的初始地址空間是父進程的一個副本,提示:子進程和父進程是可以有只讀的共享內存區的。但是對于windows系統來說,會重新加載程序代碼。

    ?

    進程的銷毀

  • 正常退出(自愿,如用戶點擊交互式頁面的叉號,或程序執行完畢調用發起系統調用正常退出,在linux中用exit,在windows中用ExitProcess)

  • 出錯退出(自愿,python a.py中a.py不存在)

  • 嚴重錯誤(非自愿,執行非法指令,如引用不存在的內存,1/0等,可以捕捉異常,try...except...)

  • 被其他進程殺死(非自愿,如kill -9)

  • 進程的層次結構

    無論UNIX還是windows,進程只有一個父進程,不同的是:

  • 在UNIX中所有的進程,都是以init進程為根,組成樹形結構。父子進程共同組成一個進程組,這樣,當從鍵盤發出一個信號時,該信號被送給當前與鍵盤相關的進程組中的所有成員。

  • 在windows中,沒有進程層次的概念,所有的進程都是地位相同的,唯一類似于進程層次的暗示,是在創建進程時,父進程得到一個特別的令牌(稱為句柄),該句柄可以用來控制子進程,但是父進程有權把該句柄傳給其他子進程,這樣就沒有層次了。

  • ?

    python中實現多進程

    在一個應用程序中可能會有多個任務需要并發執行,但是對于操作系統而言,一個進程就是一個任務,CPU會從上往下依次執行代碼,當代碼中遇到IO操作時,操作系統就會剝奪CPU執行權給其他應用程序,這樣對于當前應用程序而言,效率就降低了,如何使得程序既能完成任務又不降低效率呢?答案就是讓把當前程序中的耗時操作交給子進程來完成,如此當前應用程序可以繼續執行其他任務!

    python中開啟子進程的兩種方式

    方式1:

    實例化Process類

    from multiprocessing import Process import timedef task(name):print('%s is running' %name)time.sleep(3)print('%s is done' %name) if __name__ == '__main__':# 在windows系統之上,開啟子進程的操作一定要放到這下面# Process(target=task,kwargs={'name':'egon'})p=Process(target=task,args=('jack',))p.start() # 向操作系統發送請求,操作系統會申請內存空間,然后把父進程的數據拷貝給子進程,作為子進程的初始狀態print('======主')

    方式2:

    繼承Process類 并覆蓋run方法

    from multiprocessing import Process import timeclass MyProcess(Process):def __init__(self,name):super(MyProcess,self).__init__()self.name=namedef run(self):print('%s is running' %self.name)time.sleep(3)print('%s is done' %self.name) if __name__ == '__main__':p=MyProcess('jack')p.start()print('')

    需要注意的是

    1.在windows下 開啟子進程必須放到__main__下面,因為windows在開啟子進程時會重新加載所有的代碼造成遞歸創建進程

    2.第二種方式中,必須將要執行的代碼放到run方法中,子進程只會執行run方法其他的一概不管

    ?

    進程間內存相互隔離

    from multiprocessing import Process import time x=1000 def task():global xx=0print('兒子死啦',x)if __name__ == '__main_print(x)p=Process(target=task)p.start()time.sleep(5)print(x)

    ?

    ?

    join函數

    調用start函數后的操作就由操作系統來玩了,至于何時開啟進程,進程何時執行,何時結束都與應用程序無關,所以當前進程會繼續往下執行,join函數就可以是父進程等待子進程結束后繼續執行

    案例1:

    from multiprocessing import Process import timex=1000def task():time.sleep(3)global xx=0print('兒子死啦',x) if __name__ == '__main__':p=Process(target=task)p.start()p.join() # 讓父親在原地等print(x)

    ?

    案例2:

    from multiprocessing import Process import time,randomx=1000def task(n):print('%s is runing' %n)time.sleep(n)if __name__ == '__main__':start_time=time.time()p1=Process(target=task,args=(1,))p2=Process(target=task,args=(2,))p3=Process(target=task,args=(3,))p1.start()p2.start()p3.start()p3.join() #3s p1.join()p2.join()print('',(time.time() - start_time))start_time=time.time()p_l=[]for i in range(1,4):p=Process(target=task,args=(i,))p_l.append(p)p.start()for p in p_l:p.join()print('',(time.time() - start_time))

    ?

    Process對象常用屬性:

    from multiprocessing import Process def task(n):print('%s is runing' %n)time.sleep(n)if __name__ == '__main__':start_time=time.time()p1=Process(target=task,args=(1,),name='任務1')p1.start() # 啟動進程print(p1.pid) # 獲取進程pidprint(p1.name) # 獲取進程名字p1.terminate() # 終止進程p1.join() # 提高優先級print(p1.is_alive()) # 獲取進程的存活狀態print('')

    ?

    ?

    孤兒進程與僵尸進程(了解)

    什么是孤兒進程

    孤兒進程指的是開啟子進程后,父進程先于子進程終止了,那這個子進程就稱之為孤兒進程

    例如:qq聊天中別人發給你一個鏈接,點擊后打開了瀏覽器,那qq就是瀏覽器的父進程,然后退出qq,此時瀏覽器就成了孤兒進程

    孤兒進程是無害的,有其存在的必要性,在父進程結束后,其子進程會被操作系統接管。

    ?

    什么是僵尸進程

    僵尸進程指的是,當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程占用的資源,此時子進程將成為一個僵尸進程。如果父進程先退出 ,子進程被操作系統接管,子進程退出后操作系統會回收其占用的相關資源!

    僵尸進程的危害:

    由于子進程的結束和父進程的運行是一個異步過程,即父進程永遠無法預測子進程 到底什么時候結束. 那么會不會因為父進程太忙來不及wait子進程,或者說不知道 子進程什么時候結束,而丟失子進程結束時的狀態信息呢? 不會。因為UNⅨ提供了一種機制可以保證只要父進程想知道子進程結束時的狀態信息, 就必然可以得到。這種機制就是: 在每個進程退出的時候,內核釋放該進程所有的資源,包括打開的文件,占用的內存等。但是仍然為其保留一定的信息(包括進程號the process ID,退出狀態the termination status of the process,運行時間the amount of CPU time taken by the process等)。直到父進程通過wait / waitpid來取時才釋放. 但這樣就導致了問題,如果進程不調用wait / waitpid的話,那么保留的那段信息就不會釋放,其進程號就會一直被占用,但是系統所能使用的進程號是有限的,如果大量的產生[僵死進程],將因為沒有可用的進程號而導致系統不能產生新的進程. 此為僵尸進程的危害,應當避免。

    ?

    ?

    ?

    轉載于:https://www.cnblogs.com/HZLS/p/10959433.html

    總結

    以上是生活随笔為你收集整理的进程篇的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。