編程必備基礎之操作系統_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

操作系統概述

  操作系統是管理計算機硬件和軟件資源的計算機程序,管理配置內存、決定資源供需順序、控制輸入輸出設備等。操作系統提供讓用戶和系統交互的操作界面。操作系統的種類是多種多樣的,不局限於計算機,從手機到超級計算機,操作系統可簡單也可複雜,在不同的設備上,操作系統可向用戶呈現多種操作。因為我們不可能直接操作計算機硬件,而且設備種類繁多,需要一個統一的界面,因此有了操作系統,操作系統的簡易性使得更多人能使用計算機。常見的操作系統有:Windows、Linux、MacOS、Android等,總結一句話就是:操作系統是管理硬件、提供用戶交互的軟件系統。

  • 操作系統的基本功能
    • 操作系統統一管理着計算機資源。這些計算機資源包括處理器資源、存儲器資源、IO設備資源和文件資源等。
    • 操作系統實現了對計算機資源的抽象。即用戶無需面向硬件接口編程;IO設備管理軟件,提供獨寫接口;文件管理軟件,提供操作文件的接口。
    • 操作系統提供了用戶和計算機之間的接口。例如圖像窗口形式、命令行形式和系統調用形式等。
  • 操作系統的相關概念
    • 併發性:說到併發就不得不提一下并行性,并行性是指兩個或多個事件可以在同一時刻發生,而併發性是指兩個或多個事件可以在同一個時間間隔發生。
    • 共享性:多個程序可以同時使用主存資源,資源共享根據屬性分為互斥共享和同時訪問兩種形式
      • 互斥共享形式:當資源被程序A佔用時,其他想使用的話就只能等待,只有進程A使用完以後,其他進程才可以使用該資源。
      • 同時訪問形式:某種資源在一段時間內併發地被多個程序訪問,這種“同時”是宏觀的,從宏觀去看該資源可以被同時訪問
    • 虛擬性:虛擬性表現為把一個物理實體轉為若干個邏輯實體,物理實體是真實存在的,邏輯實體是虛擬的,虛擬的技術主要有時分復用技術和空分復用技術。
      • 時分復用技術:資源在時間上進行復用,不同程序進行併發使用,多道程序分時使用計算機的硬件資源,提高資源的利用率
        • 虛擬處理器技術:藉助多道程序設計技術,為每個程序建立進程,多個程序分時復用處理器
        • 虛擬設備技術:物理設備虛擬為多個邏輯設備,每個程序佔用一個邏輯設備,多個程序通過邏輯設備併發訪問
      • 空分復用技術:空分復用技術用來實現虛擬磁盤、虛擬內存等,提高資源利用率,提高編程效率
        • 虛擬磁盤技術:物理磁盤虛擬為邏輯磁盤,例如C、D、E等邏輯盤,使用起來更加安全方便
        • 虛擬內存技術:在邏輯上擴大程序的存儲容量,使用比實際內存更大的容量,大大提升編程效率
    • 異步性:在多道程序環境下,允許多個進程併發執行,進程在使用資源時可能需要等待和放棄,進程的執行並不是一氣呵成的,而是以走走停停的形式推進

進程管理

  為什麼需要進程呢?在沒有配置OS(操作系統)之前,資源屬於當前運行的程序,配置OS之後,引入多道程序設計的概念,可以合理的隔離資源、運行環境、提升資源利用率。進程是系統進行資源分配和調度的基本單位,進程作為程序獨立運行的的載體保障程序正常運行,進程的存在使得操作系統資源的利用率大幅提升。

進程管理之進程實體

主存中得進程形態

  • 標識符:標識符唯一標記一個進程,用戶區別其他進程,如進程id
  • 狀態:標記進程的進程狀態,如:運行態
  • 程序計數器:指向進程即將被執行的下一條指令的地址
  • 內存指針:程序代碼,進程數據相關指針
  • 上下文數據(重要):進程執行時處理存儲器的數據
  • IO狀態信息:被進程IO操作時所佔用的文件列表
  • 記賬信息:使用處理器時間、時鐘數總和等。

  由此可知,主存中的進程形態主要包括進程標識符,處理機狀態,進程調度信息,進程控制信息等。其中進程控制塊(PCB)是用於描述和控制進程運行的通用數據結構,記錄進程當前狀態和控制進程進行運行的全部信息,PCB使得進程成為能夠獨立運行的基本單位。PCB是操作系統進行調度經常會被讀取的信息,而且是常駐內存的,存放在系統專門開闢的PCB區域內。

進程與線程

  之前說過進程是操作系統進行資源分配和調度的基本單位,而線程是操作系統進行運行調度的最小單位,線程包含在進程之中,是進程中實際運行的工作單位,一個進程可以併發多個線程,每個線程執行不同任務。

   進程 線程
資源 資源分配的基本單位 不擁有資源
調度 獨立調度的基本單位 獨立調度最小單位
系統開銷 進程系統開銷大 線程系統開銷小
通信 進程IPC 讀寫同一進程數據通信

  一個進程可以有多個線程,一個進程中的線程共享資源,計算機對進程的調度,實際上是對進程中的線程進行調度

五狀態模型

  • 創建狀態:創建進程時擁有PCB但其它資源尚未就緒的狀態稱為創建狀態,操作系統提供fork函數接口創建進程。
  • 就緒狀態:當進程被分配到除CPU以外的所有必要資源后,只要再獲得CPU的使用權,就可以立即運行。其他資源都轉準備好、只差CPU資源的成為就緒狀態。
    • 在一個系統中處於就緒狀態的進程通常排成一個隊列,稱為就緒隊列。
  • 執行狀態:進程獲得CPU,其程序正在執行稱為執行狀態,再單處理機中,在某個時刻只能有一個進程是處於執行狀態。
  • 阻塞狀態:進程因某種原因如:其他設備未就緒而無法繼續執行,從而放棄CPU的狀態稱為阻塞狀態。
  • 終止狀態:程序執行完成。

進程同步

  為什麼需要進程間的同步呢?先讓我們來看一個經典的問題:生產者-消費者問題
生產者-消費者問題:有一群生產者進程在生產產品,並將這些產品提供給消費者進程進行消費,生產者進程和消費者進程可以併發執行,在兩者之間設置了一個具有n可緩衝區的緩衝池,生產者進程需要將所生產的產品放到一個緩衝區中,消費者進程可以從緩衝區取走產品消費

由上圖我們可以看出,單從生產者程序或消費者程序去看是沒問題的,但兩者併發執行時就可能會出現差錯。如下圖:

這裏的緩衝區就相當於臨界資源。
  再來看一個哲學家進餐問題:
有五個哲學家,他們的生活方式時是交替的進行思考和進餐,哲學家們共同使用一張圓桌子,分別坐在周圍的五張椅子上,在圓桌上有五個碗和五支筷子。平時哲學家們只進行思考,飢餓時則試圖取靠近他們的左、右兩隻筷子,只有兩支筷子都被他拿到的時候才能進餐,進餐完畢后,放下左右筷子繼續思考。

  出現上圖中的問題是什麼呢?其根源問題是:彼此之間沒有相互通信,如果“生產者通知消費者我已經完成了一件生產”,“哲學家向旁邊哲學家說我要進餐了”,就不會出現上圖中的問題了,也就是需要進程間的同步。

  什麼是進程同步呢?當對競爭資源在多個進程間進行使用次序的協調,使得併發執行的多個進程之間可以有效使用資源和相互合作。這裏的競爭資源也就是上圖中的臨界資源,什麼是臨界資源?臨界資源指的是一些雖作為共享資源,卻又無法同時被多個線程共同訪問的共享資源。當有進程在使用臨界資源時,其他進程必須依據操作系統的同步機制,等待佔用進程釋放該共享資源,才可以重新競爭使用共享資源。
進程同步的原則:

  • 空閑讓進:資源五佔用,允許使用
  • 忙則等待:資源有佔用,請求進程等待
  • 有限等待:保證有限等待時間能夠使用資源
  • 讓權等待:等待時,進程需要讓出CPU

  進程間同步的常用方法:如消息隊列,共享存儲,信號量。當多個線程併發使用進程資源時,進程內的多線程也需要,因為進程中的資源時進程中線程的共享資源。線程同步的方法有:互斥量、讀寫鎖、自旋鎖、條件變量等,這些方法是如何保證線程同步的呢?

  • 互斥量:由於多個線程的指令交叉執行,而互斥量可以保證先後執行,即保證原子性。什麼是原子性呢?原子性是指一系列操作不可被中斷的特性, 這一系列操作要麼全部執行完成,要麼全部沒有執行,不存在部分執行部分未執行的情況
    • 互斥量是最簡單的線程同步方法
    • 互斥量(互斥鎖),處於兩態之一的變量:解鎖和加鎖
    • 兩個狀態可以保證資源的串行
  • 自旋鎖:自旋鎖也是一種多線程同步的變量,使用自旋鎖的線程會反覆檢查鎖變量是否可用,自旋鎖不會讓出CPU,是一種忙等待狀態,即死循環等待鎖被釋放。
    • 自旋鎖避免了進程或線程上下文切換的開銷
    • 操作系統內部很多地方都是使用的自旋鎖
    • 自旋鎖不適合在單核CPU中使用
  • 讀寫鎖:這種鎖適用於臨界資源多讀少寫,讀取的時候並不會改變臨界資源的值。
    • 讀寫鎖是一種特殊的自旋鎖
    • 允許多個讀者同時訪問資源以提高讀的性能
    • 對寫的操作則是互斥的
  • 條件變量
    • 條件變量是一種相對複雜的同步方法
    • 條件變量允許線程睡眠,直到滿足某種條件
    • 當滿足條件時,可以向該線程發送信號,通知喚醒
同步方法 描述
互斥鎖 最簡單的一種線程同步方法,會阻塞線程
自旋鎖 避免切換的一種線程同步方法,屬於“忙等待”
讀寫鎖 為“讀多寫少”的資源設計的線程同步方法,可以顯著提高性能
條件變量 相對複雜的一種線程同步方法,有更靈活的使用場景

進程同步之共享內存
  在某種程度上,多進程是是共同使用物理內存的,由於操作系統的進程管理,進程間的內存空間是獨立的,進程默認是不能訪問進程空間之外的內存空間的

共享內存就可以打破這個限制,因為有這個共享內存,不同進程就可以通過頁表映射到同一個共享內存去,這個共享內存既可以被進程1使用,也可以被進程2使用。

  共享存儲允許不相關的進程訪問同一片物理內存,共享內存是兩個進程之間共享和傳遞數據的最快方式,共享內存未提供同步機制,需要藉助其他機制訪問。通過共享內存同步的過程就是:申請共享內存->連接到進程空間->使用共享內存->脫離進程空間並且刪除。共享內存是高性能後台開發中最常用的同步方式。
進程同步之Unix域套接字
  域套接字是一種高級的進程間通信的方法,Unix域套接字可以用於同一台機器進程間通信。其運行過程是創建套接字->綁定(bind)套接字->監聽(listen)套接字->接收&處理信息。域套接字提供了簡單可靠的進程通信同步服務,只能在單機使用,不能跨機器使用。

Linux的進程管理

Linux進程的相關概念:

進程類型:

  1. 前台進程:前台進程就是具有終端,可以和用戶交互的進程
  2. 後台進程:
    • 與前台進程相對,沒有佔用終端的就是後台進程
    • 後台進程基本上b不和用戶交互,優先級比前台進程低
    • 將需要執行的命令以“&”符號結束
  3. 守護進程(daemon):特殊的後台進程
    • 很多守護進程在系統引導的時候啟動,一直運行到系統關閉
    • Linux系統有很多典型的守護進程。例如:crond,sshd,httpd,mysqld等,進程名字以“d”結尾的一般都是守護進程。
      進程標記:
  • 進程ID
    • 進程ID是進程的唯一標記,每個進程擁有不同的ID
    • 進程ID表現為一個非負整數,最大值由操作系統限定
    • 操作系統提供fork()函數接口創建進程。例如進程A調用fork接口創建了進程B,進程B調用fork接口創建了進程C,那此時進程A和進程B就存在父子進程關係,進程A是父進程,進程B是子進程。進程的父子關係可以通過pstree命令查看。

ID為0的進程是idle進程,是系統創建的第一個進程,ID為1的進程init進程,是0號進程的子進程,完成系統初始化,Init進程是所有用戶進程的祖先進程。

  • 進程的狀態標記

Linux中進程的狀態如下:

狀態符號 狀態說明
R (TASK_RUNNING),進程正處於運行狀態
S (TASK_INTERRUPTIBLE),進程正處於睡眠狀態
D (TASK_UNINTERRUPTIBLE),進程正處於IO等待的睡眠狀態
T (TASK_STOPPED),進程正處於暫停狀態
Z (TASK_DEAD or EXIT_ZOMBIE),進程正處於退出狀態,或殭屍進程

操作Linux進程的相關命令

  • ps命令:ps命令常用於显示當前進程的狀態,ps命令常配合aux參數或ef參數和grep命令檢索特定進程
  • top命令
  • kill命令:kill命令發送指定信號給進程,kill-l可以查看操作系統所支持的系統

作業管理

作業管理之進程調度

  進程調度是指計算機通過決策,決定哪個就緒進程可以獲得CPU使用權。通俗來說就是保留舊進程的運行信息,請出舊進程(收拾包袱),選擇新進程,準備運行環境並分配CPU(新駐進)。那麼是如何進行進程的調度的呢?

  • 就緒隊列的排隊機制:將就緒進程按照一定的方式排成隊列,以便調度程序可以最快找到就緒進程。
  • 選擇運行進程的委派機制:調度程序以一定的策略選擇就緒進程,將CPU資源分配給它
  • 新老進程的上下文切換機制:保存當前進程的上下文信息,裝入被委派執行進程的運行上下文

  進程的調度方式分為搶佔式調度和非搶佔式調度。非搶佔式調度是指處理器一旦分配給某個進程,就讓該進程一直使用下去,調度程序不以任何原因搶佔正在被使用的處理器,直到進程完成工作,或因為IO阻塞才會讓出處理器;搶佔式調度是指允許調度程序以一定的策略,暫停當前運行的進程,保存好進程的上下文信息,分配處理器給新進程。

   搶佔式調度 非搶佔式調度
系統開銷 頻繁切換,開銷大 切換次數少,開銷小
公平性 相對公平 不公平
應用 通用系統 專用系統

進程調度算法

  • 先來先服務調度算法
  • 短進程優先調度算法:調度程序優先選擇就緒隊列中估計運行時間最短的進程;短進程優先調度算法不利於長作業進程的運行
  • 高優先權優先調度算法:進程附帶優先權,調度程序優先選擇權最高的進程,高優先權優先調度算法使得 緊迫的任務可以處理
  • 時間片輪轉調度算法:按先來先服務的原則排列就緒進程,每次從隊列頭部取出待執行進程,分配一個時間片執行;是相對公平的調度算法,但不能保證及時響應用戶

作業管理之死鎖

  死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞現象,若無外力作用,他們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。
死鎖的產生

  • 競爭資源:共享資源數量不滿足各個進程需求,各個進程 之間發生資源競爭導致死鎖,
  • 進程調度順序不當
    死鎖的四個必要條件:
  • 互斥條件:進程對資源的使用是排他性的使用,某資源只能由一個進程使用,其他進程需要使用只能等待
  • 請求保持條件:進程至少保持一個資源,又提出新的資源請求,新資源被佔用,請求被阻塞,被阻塞的進程不釋放自己保持的資源
  • 不可剝奪條件:進程獲得的資源在未完成使用前不能被剝奪,獲得的資源只能由進程自生釋放
  • 環路等待條件:發生死鎖時,必然存在進程-資源環形鏈
    死鎖的處理
  • 預防死鎖的方法
    • 摒棄請求保持條件:系統規定進程運行之前,一次性申請所有需要的資源,進程在運行期間不會提出資源的請求,從而摒棄請求保持條件
    • 摒棄步課剝奪條件:當進程請求一個新的資源得不到滿足時,必須釋放佔有的資源,當進程運行時佔有的資源可以被釋放,意味着可以被剝奪
    • 摒棄環路等待條件:可用資源線性排序,申請必須按照需要遞增申請,線性申請不在形成環路,從而摒棄了環路等待條件
  • 銀行家算法:銀行家算法是一個可操作得著名得避免死鎖得方法,以銀行借貸系統分配策略為基礎的算法。
    • 客戶申請的貸款是有限的,每次申請須聲明最大資金量
    • 銀行家在能夠滿足貸款時,都應該給用戶貸款
    • 客戶在使用貸款后,能夠及時歸還貸款。

根據還需要分配的資源表,對比可分配資源表,先給能夠滿足貸款的用戶,給用戶貸款,即圖中的P2,P2使用完資源后,需要及時歸還資源

存儲管理

  早期計算機編程並不需要過多的存儲管理,隨着計算機和程序越來越複雜,存儲管理成為必要。

  • 確保計算機有足夠的內存處理處理數據
  • 確保程序可以從可用內存中,獲取一部分內存使用
  • 確保程序可以歸還使用后的內存,已供其他程序使用

存儲管理之內存分配與回收

內存分配的過程

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

  • 單一連續分配:單一連續分配是最簡單的內存分配方式,只能在單一用戶、單進程的操作系統中使用
  • 固定分區分配:固定分區分配是支持多道程序的最簡單的存儲分配方式,內存空間被劃分成若干個固定大小的區域,每個分區只提供給一個用戶使用,互不干擾
  • 動態分區分配:根據進程實際需要,動態分配內存空間,相關數據結構、分配算法如下:
    • 動態分區空閑表數據結構:對空閑區進行標記,0表示空閑區,1表示已被使用
    • 動態分區空間鏈數據結構
    • 首次適應算法(FF算法):分配內存時從開始,順序查找適合內存區,若沒有合適的空閑區,則該次分配失敗;每次從頭部開始,使得頭部地址不斷被劃分
    • 最佳適應算法(BF算法):最佳適應算法要求空閑鏈表按照容量大小排序,遍歷空閑鏈表找到最佳合適的空閑區
    • 快速適應算法(QF算法):快速適應算法要求有多個空閑區鏈表,每個空閑區鏈表存儲一種容量的空閑區

內存回收的過程

  情況一:不需要新建空閑鏈表節點,只需要把空閑區1的容量增大為空閑區即可;情況二:將回收區與空閑區合併,新的空閑區使用回收區的地址;情況三:將空閑區1、空閑區2和回收區合併,新的空閑區使用空閑區1的地址;情況四:為回收區創建新的空閑節點,插入到相應的空閑區鏈表中去。

存儲管理之段頁式存儲管理

  由於每個進程都有自己獨立的進程空間,那操作系統是如何管理進程的空間呢?

  • 頁式存儲管理:
    • 將進程邏輯空間等分為若干大小的頁面
    • 相應的把物理內存空間分成與頁面大小的物理塊
    • 以頁面為單位把進程空間裝進物理內存中分散的物理塊

      頁表:頁表記錄了進程邏輯空間與物理空間的映射

現代計算機系統中,可以支持非常大的邏輯地址空間(\(2^{32}\)~\(2^{64}\)),這樣,頁表就變得非常大,要佔用非常大的內存空間,如具有32位邏輯地址空間的分頁系統,規定頁面大小為4KB,則在每個進程頁表中的頁表項可達1M(32位系統進程的尋址空間為4G,4G/4KB=1M)個,如果每個頁表項佔用1Byte,故每個進程僅僅頁表就要佔用1M的內存空間。

  • 段式存儲管理
    • 將進程邏輯空間劃分成若干段(非等分)
    • 段的長度由連續邏輯的長度決定
    • 主函數MAIN,子程序段X,系函數Y等

  段式存儲和頁式存儲都離散地管理了進程的邏輯空間。頁是物理單位,段是邏輯單位,分頁是為了合理利用空間,分段是為了滿足客戶需求;頁大小由硬件空間,段長度可動態變化;頁表信息是一維的,段表信息是二維的。

  • 段頁式存儲管理:由於分頁可以有效提高內存利用率(雖然說存在內存碎片),分段可以滿足用戶需求,我們可以將兩者結合,形成段頁式存儲管理。
    • 先將邏輯空間按段式管理分成若干段
    • 再把段內空間按頁式管理等分成若干頁

存儲管理之虛擬內存

  思考:一個遊戲十幾個G,物理內存只有4G,那這個遊戲是如何運行起來的呢?

  有些進程實際需要的內存很大,超過物理內存的容量,多道程序設計,使得每個進程可用物理內存更加稀缺,不可能無限增加物理內存,物理內存總有不夠的時候,這個時候就需要虛擬內存了。虛擬內存是操作系統內存管理的關鍵技術,使得多道程序運行和大程序運行成為現實,把程序使用內存劃分,將部分暫時不使用的內存放置在輔存。

程序的局部性原理:局部原理是指CPU訪問存儲器時,無論是存取指令還是存取數據,所訪問的存儲單元都趨於集中在一個較小的連續區域中。

  • 程序運行時,無需全部裝入內存,裝載部分即可
  • 如果訪問頁不在內存,則發出缺頁中斷,發起頁面置換
  • 從用戶層面看,程序擁有很大的空間,即是虛擬內存
  • 虛擬內存實際是對物理內存的補充,速度接近於內存,成本接近於輔存

虛擬內存的置換算法:和我在《計算機組成原理》這篇博客中的高速緩存的置換策略差不多,這裏就不詳細介紹了。

  • 先進先出算法(FIFO)
  • 最不經常使用算法(LFU)
  • 最近最少使用算法(LRU)

高速緩存的替換策略發生在Cache-主存層次,只要是為了解決速度問題;虛擬內存的替換策略發生在主存-輔存層次,主要是為了解決容量問題。

Linux的存儲管理

Buddy內存管理算法

  • Buddy算法是經典的內存管理算法
  • 算法基於計算機處理二進制的優勢具有極高的效率
  • 算法主要是為了解決內存外碎片的問題

頁內碎片:內部碎片是已經被分配出去(能明確指出屬於哪個進程)的內存空間大於請求所需的內存空間,不能被利用的內存空間就是內部碎片。
頁外碎片:外部碎片是指還沒有被分配出去(不屬於任何進程),但是由於大小而無法被分配給申請內存空間的新進程的內存空閑塊。
Buddy是夥伴的意思,這裏的”夥伴“指的是內存的”夥伴“,一片連續內存的”夥伴“是相鄰的另一片大小一樣的連續內存
Buddy內存管理算法執行過程:創建一系列空閑塊鏈表,每一種都是2的冪 –> 現在需要分配100kb內存 –> 回收剛才分配的內存

Linux的交換空間

  交換空間(Swap)是磁盤的一個分區,Linux物理內存滿時,會把一些內存交換至Swap空間,Swap空間是初始化系統時配置的。

冷啟動內存依賴:對於一些大型的應用程序,在啟動的過程中需要使用大量的內存,但是這些內存很大一部分只是在啟動的時候使用一下,在運行的時候很少使用到這部分內存,因此有了這個交換空間,系統就可以將這個部分不怎麼使用的內存數據保存在SWAP空間中,從而釋放跟多的物理內存,提供給這個系統使用。

系統睡眠依賴: 當Linux系統需要睡眠的時候,它就會把系統中的所有數據都保存在swap空間內,等下次這個系統需要啟動的時候,才把這些數據重新加載到內存中裏面,這樣就可以加快系統的啟動速度。

大進程空間依賴:有些進程確實需要使用大量的內存空間,但是物理內存不夠使用,因此需要把這些進程需要使用的內存暫時保存到交換空間中,使得這個大的進程也可以運行起來

Swap空間和虛擬內存的對比:

Swap空間 虛擬內存
存儲位置 Swap空間存在於磁盤 虛擬內存存在於磁盤
置換層次 Swap空間與主存發生置換 虛擬內存與主存發生置換
所屬概念 Swap空間是操作系統概念 虛擬內存是進程概念
解決的問題 Swap空間解決系統物理內存不足問題 虛擬內存解決進程物理內存不足的問題

操作系統的文件管理

文件的邏輯結構

  • 邏輯結構的文件類型
    • 有結構文件:例如文本文件、文檔、媒體文件等
      • 文件內容由定長記錄和可變記錄組成
      • 定長記錄存儲文件格式、文件描述等結構化數據項
      • 可變長記錄存儲文件具體內容等
    • 無結構文件:例如二進制文件、鏈接庫等
      • 也稱為流式文件,如exe文件、dll文件、so文件等
      • 文件內容長度以字節為單位
  • 順序文件
    • 順序文件是指按順序存放在存儲介質中的文件
    • 磁帶的存儲特性使得磁帶文件只能存儲順序文件
    • 順序文件是所有邏輯文件當中存儲效率最高的
  • 索引文件
    • 可變長文件不適合使用順序文件格式存儲
    • 索引文件是為解決可變長文件存儲而發明的一種文件格式
    • 索引文件需要配合索引表完成存儲的操作

輔存的存儲空間分配

  • 輔存的分配方式
    • 連續分配:順序讀取文件內容非常容易,速度很快,對存儲要求高,要求滿足容量的連續存儲空間
    • 鏈接分配:鏈接分配可以將文件存儲在離散的盤塊中,需要額外的存儲空間存儲文件的盤塊鏈接順序
      • 隱式鏈接:隱式分配的下一個鏈接指向存儲在當前盤塊內,隱式分配適合順序訪問,隨機訪問效率低,可靠性差,任何一個鏈接出問題都會影響整個文件
      • 显示鏈接:不支持高效的直接存儲(FAT記錄項多),檢索時FAT表佔用較大的存儲空間(需要將整個FAT表加載到內存)
    • 索引分配:把文件的所有盤塊集中存儲(索引),讀取某個文件時,將文件索引讀取進內存即可

      每個文件擁有一個索引塊,記錄所有盤塊信息,索引分配方式支持直接訪問盤塊,文件較大時,索引分配方式具有明顯優勢

  • 存儲空間管理
    • 空閑表:空閑盤區的分配與內存的分配相似,首次適應算法、循環適應算法等,回收過程也與內存回收類似
    • 空閑鏈表:空閑鏈表法把所有空閑盤區組成一個空閑鏈表,每個鏈表節點存儲空閑盤塊和空閑的數目
    • 位示圖:位示圖維護成本很低,可以非常容易找到空閑盤塊,位示圖使用0/1比特位,佔用空間小

目錄管理

  任何文件或目錄都只有唯一路徑。文件常見的描述信息有:文件標識符、文件類型、文件權限、文件物理地址、文件長度、文件連接計數、文件存取時間、索引節點編號、文件狀態、訪問計數、鏈接指針等。

Linux文件基本操作

Linux目錄

目錄 描述
/bin 存放二進制可執行文件(ls,cat,mkdir),常用的命令都在該目錄下
/etc 存放系統管理和配置文件
/home 存放所有用戶文件的根目錄,使用戶目錄的基點,比如用戶user的主目錄就是/home/user
/usr 用戶存放系統應用程序,比較重要的目錄/usr/local本地系統管理員軟件安裝目錄
/opt 額外安裝的可選應用程序包所放置的位置
/proc 虛擬文件系統目錄,是系統內存的映射,可直接訪問這個目錄來獲取系統信息
/root 系統管理員的主目錄
/sbin 存放二進制可執行文件,只有root才能當問
/dev 用於存放設備文件
/mnt 系統管理員安裝臨時文件系統的安裝點,系統提供這個目錄是讓用戶臨時掛載其他的文件系統
/boot 存放用於系統引導時使用的各種文件
/lib 存放跟文件系統種的程序運行所需要的共享庫及內核模塊
/var 用於存放運行時需要改變數據得文件

Linux文件常用操作

  創建文件:touch file 修改文件:vim file 查看文件:cat file 刪除文件:rm file 創建文件夾:mkdir dir 刪除文件夾:rm dir/ 該方式會提示,不能刪除文件夾 遞歸刪除文件夾:rm -r dir/ 進入文件后,通過ls -al 命令可以查看該文件的文件類型,即第一個字符

Linux文件類型

  Linux的文件類型有:套接字(s)、普通文件(-)、目錄文件(d)、符號鏈接(b、c)、設備文件、FIFO(p)

Linux文件系統

文件系統概覽

  • FAT(File Allocation Table):例如FAT16、FAT32等,微軟Dos/Windows使用的文件系統,使用一張表保存盤塊的消息
  • NTFS(New Technology File System):WindowsNT環境文件系統,NTFS對FAT進行了改進,取代了舊的文件系統
  • EXT(Extended file System):擴展文件系統,這個是Linux的文件系統,EXT2/3/4數字錶示第幾代。
    • Boot Selector:啟動扇區,安裝開機管理程序
    • Block Group:塊組,存儲數據的實際位置

EXT文件系統

  Inode Table是存放文件Inode的地方,每一個文件(目錄)都有一個Inode,是每一個文件(目錄)的索引節點。文件名不是存放在Inode節點上的,而是存放在目錄的Inode節點上,列出目錄文件的時候無需加載文件的Inode。Inode bitmap即Inode的位示圖,記錄已分配的Inode和未分配的Inode。Data block是存放文件內容的地方,每個block都有唯一的編號,文件的block記錄在文件的Inode上。Block bitmap功能與Inode bitmap類似,記錄Data block的使用情況。superblock是記錄整個文件系統相關信息的地方,包括block和Inode的使用情況,以及時間、控制信息等。

  命令 df -T:查看該系統所掛載的磁盤信息,查看文件系統的Inode信息:dumpe2fs 指定某個一設備,如 dumpe2fs /dev/sda2,使用超級管理員權限查看:sudo dumpe2fs /dev/sda2,查看文件的具體信息:stat dumpe2fs.log,文件重命名: mv dumpe2fs.log dumpe2fs.bak.log。Inode編號才是文件的唯一標記,文件名不是文件的唯一標記。

操作系統的設備管理

廣義的IO設備

  對CPU而言,凡是對CPU進行數據輸入的都是輸入設備;對CPU而言,凡是CPU進行數據輸出的都是輸出設備

  • 按使用特性分類
    • 存儲設備:U盤、內存、磁盤等
    • 交互IO設備:鍵盤、显示器、鼠標等
  • 按信息交換的單位分類
    • 塊設備:磁盤、SD卡
    • 字符設備:打印機、Shell終端
  • 按設備的共享屬性分類:獨佔設備、共享設備、虛擬設備
  • 按傳輸速率分類:底速設備、中速設備、高速設備

IO設備的緩衝區

  由於CPU與IO設備的速率不匹配,所以需要IO設備緩衝區,這樣可以減少CPU處理IO請求的頻率,提高CPU與IO設備之間的并行性。專用緩衝區只適用於特定的IO進程,當這樣的IO進程比較多時,對內存的消耗也很大,操作系統劃出可供多個進程使用的公共緩衝區,稱之為緩衝池。

SPOOLing技術

  SPOOLing技術是關於慢速字符設備如何與計算機主機交換信息的一種技術,利用高速共享設備將低速的獨享設備模擬為高速的共享設備。邏輯上,系統為每一個用戶都分配了一台獨立的高速共享設備。SPOOling技術把同步調用低速設備改為異步調用。SPOOLing技術在輸入、輸出之間增加了排隊轉儲環節(輸入井、輸出井),SPOOLing技術負責輸入(出)井與低速設備之間的調度,邏輯上,進程直接與高速設備交互,減少了進程的等待時間。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

SUV確實很火 但這幾款真正品質出色的SUV為何沒啥人關注?_網頁設計

1{icon} {views}

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

39-30。19萬福特 撼路者售價:26。58-36。08萬英菲尼迪 QX50售價:34。98-44。98萬總結:其實一款汽車真的在市場上的反響不好,可能有着各種的原因。有些事可能目前整個市場的份額開始萎縮,但究其基本,一款本就比較出色的車型沒有收到消費者的歡迎,最終還是價格不夠親民影響了它最後的銷量,因此做好一款車需要時間與金錢,同時賣好一款車也同樣需要智慧。

對於目前的汽車市場,相比前些年已經發生了不少的變化。之前的一段時間可能大家買車的時候都在關注小型車為主,有些改善型買家則偏向於一些高品質的中型車為主,只是時代是在發展的。消費者的胃口也是跟着發生變化,

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

這些年當中,SUV已經從當年的嶄露頭角變成了消費者購車的首選了。但就是這樣的背景下,一些品質非常出眾,但市場的反應卻依然不太好,為何有這樣的原因呢,今天就給你好好說道說道。

售價:22.48-28.98萬

售價:19.39-30.19萬

售價:26.58-36.08萬

售價:34.98-44.98萬

總結:其實一款汽車真的在市場上的反響不好,可能有着各種的原因。有些事可能目前整個市場的份額開始萎縮,但究其基本,一款本就比較出色的車型沒有收到消費者的歡迎,最終還是價格不夠親民影響了它最後的銷量,因此做好一款車需要時間與金錢,同時賣好一款車也同樣需要智慧。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

M1 MacBook Air / MacBook Pro / Mac Mini 在台開賣,RAM 升級要 6,000_網頁設計公司

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

終於,在「效率」上贏得全面優異好評的 Apple M1 晶片 MacBook Air、MacBook Pro 與 Mac mini 在通過 NCC 之後,已經全面在蘋果線上商店開賣。現在購買的話,基本上都能在 1/5 日以前送達消費者手中。至於升級 RAM 與 SSD 的價格也已經正式公佈… 繼續閱讀 M1 MacBook Air / MacBook Pro / Mac Mini 在台開賣,RAM 升級要 6,000 報導內文。

【 購買 M1 MacBook Air(官網) 】

▲圖片來源:Apple

M1 MacBook Air / MacBook Pro / Mac Mini 在台開賣,RAM 升級要 6,000

採用蘋果自家 M1 晶片,全面轉換為 ARM 架構的新世代 Mac 入門產品線,在今天早上已經正式在官方商店開賣。新世代的 M1 MacBook Air、M1 MacBook Pro 與 M1 Mac mini,其實應該不用多作介紹 — 儘管發表會上蘋果一直持續的「快快快」多少,當時還沒太多人相信。

直到正式上市之後才發現,這一系列的入門蘋果電腦產品,居然效能與功耗表現都真的不錯,而且還沒被 Rosetta 2 轉譯拖慢太多速度(!),緊接著各家選擇支援 Apple Silicon 的速度也超乎想像的快。甚至原生支援 ARM 的應用,在效能上更是直逼高階 Intel Mac 產品 — 這裡就不說 Adobe 補刀的故事了(咦)。

這次的 M1 Mac 主要的差異在,相較於另外兩款 MacBook Air 採用的是無風扇的設計(MBA 基礎機型的 GPU 也少 1 核),在長時間高負載的情況下,理論上效能會遜色於搭載風扇的機型。

【 購買 M1 MacBook Pro(官網) 】

是說,既然幾款 M1 Mac 的價格早已公布,這次主要的新消息大概就是升級 RAM 與 SSD 的售價了 — 兩者基本上都是 6,000 起跳;而從 256GB 升級到 2TB 則是價差 NT$24,000;512GB 升級到 2TB 為 NT$18,000。

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

【 購買 M1 Mac mini(官網) 】

延伸閱讀:

HomePod mini 開箱體驗:一顆就能敲開蘋果智慧家門,兩顆更是不嫌多

支援 M1 Mac 的 Windows 虛擬機應用 Parallels Desktop 16 技術預覽版來了

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

國外開發者成功在 M1 Mac 上運行 Nintendo Switch 遊戲_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

稍早 M1 MacBook Air / MacBook Pro / Mac Mini 終於正式在台開賣,目前軟體的支援性還沒有算很好,很多都需要透過 Rosetta 2 來模擬,不過國外多篇評測也顯示,即使是模擬也跑得很順,甚至還贏過 ARM Windows 版非常多,也能拿來玩遊戲,不僅如此,最近又有國外開發者實現一個很多人都想要的夢想:”成功在 M1 上運行 Switch 遊戲”,雖然速度似乎還沒有很順暢,但至少第一步已經實現,未來可說讓人相當期待。

M1 Mac 成功運行 Nintendo Switch 遊戲

一位名叫 Sera Tonin Brocious 的開發者,近日於個人 Twitter 上分享他成功在 M1 Mac 運行 Switch 版本的 Super Mario Odyssey(超級瑪利歐:奧德賽)遊戲影片,使用知名 Yuzu Emulator 模擬器實現:

I’m so fucking proud of this. It only gets a few frames into the game before it hits the first MoltenVK limitation, but damn. pic.twitter.com/NcLIBLWOPz

— Sera Tonin Brocious (@daeken) December 20, 2020

從影片可以看到,他從 Yuzu 模擬器選單中選擇打開 Super Mario Odyssey(超級瑪利歐:奧德賽)遊戲,成功進入 Loading 畫面,右下角也有寫著 NINTENDO SWITCH 的字樣,接著跳出如何使用 Joy-Con 控制的說明頁面,然後就進到遊戲主選單,選擇 “開始遊戲” 或 “從輔助模式開始”。

不過受限於 MoltenVK 的限制,跑起來沒有非常順暢。後續開發者也提到,在實際 Metal 的支援性到來之前,目前只能發揮中等效能:

It’s probably going to have pretty middling performance until the actual Metal backend is in place. Right now it’s going through MoltenVK which isn’t ideal for this situation.

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

— Sera Tonin Brocious (@daeken) December 20, 2020

至於是怎麼成功模擬運行的,Sera Tonin Brocious 就沒有特別說明,不過既然有人成功,就代表未來很有可能看到真正實現 M1 完美模擬 Nintendo Switch 的遊戲,再加上  Switch 使用的處理器也是 ARM 版本,難度也沒那麼高。

說真的,這還蠻讓人期待的,過去 Mac 最讓人詬病的一點,不外乎就是沒辦法玩什麼遊戲,但隨著改搭載 M1 晶片後,這缺點也瞬間消失。

資料來源:Sera Tonin Brocious

外媒爆料明年 Windows 10 有可能原生支援 Android App,不用再用模擬器

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

python基本操作-文件、目錄及路徑_包裝設計

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

目錄

  • 1 前言
  • 2 文件夾操作
    • 2.1 查詢操作
    • 2.2 創建操作
    • 2.3 刪除操作
    • 2.4 修改操作
  • 3 文件操作
    • 3.1 查詢操作
    • 3.2 創建操作
    • 3.3 修改操作
    • 3.4 刪除
  • 4 路徑操作
  • 5 示例應用
    • 5.1 批量修改文件名
    • 5.2 遍歷目錄及子目錄下所有指定擴展名的文件
    • 5.3 按修改時間排序指定目錄下的文件
  • 6 總結
  • 參考資料
  • 往期文章

使用python的os模塊,簡單方便完成對文件夾、文件及路徑的管理與訪問操作。

1 前言

在最近開發中,經常需要對文件進行讀取、遍歷、修改等操作,想要快速、簡單的完成這些操作,我選擇用 python 。通過 python 的標準內置 os 模塊,只需要幾行代碼,即可完成想要的操作。經過對 os 的使用,本文把 os 模塊的常用的操作進行總結,主要分為以下幾個劃分:

  • 文件夾操作:即文件夾的創建、修改(改名/移動),查詢(查看、遍歷)、刪除等。
  • 文件操作:即文件的創建、修改、讀取、刪除等。
  • (文件夾/文件)路徑操作:即文件夾或文件的路徑操作,如絕對路徑,文件名與路徑分割,擴展名分割等

本文涉及常用 的 os 函數的使用展示,主要使用 python 交互模式下進行代碼說明。後續操作默認已經引入 os 模塊,如下:

import os

2 文件夾操作

以本地 E://pythontest 目錄作為演示目錄,此目錄下當前文件如下:

test
 │ test.txt
 └─test-1
     test-1.txt

testtest-1 是文件夾,test.txttest-1.txt 是文件。

2.1 查詢操作

熟悉 linux 同學應該對 ls / pwd / cd 等操作不陌生,對應的 python 也有對應的方法,主要包括:

  • listdir : 文件及目錄列表
  • getcwd :獲取當前目錄
  • chdir :更換目錄
  • stat :文件及目錄基本信息
  • walk :遞歸遍歷目錄
>>> os.chdir("E://pythontest")  # 更改目錄
>>> os.getcwd()                 # 獲取當前目錄
'E:\\pythontest'
>>> os.listdir("test")          # 文件及目錄列表,相對路徑
['test-1', 'test.txt']          
>>> os.listdir("E://pythontest/test")  # 文件及目錄列表,絕對路徑
['test-1', 'test.txt']
>>> os.stat("test")             # 獲取目錄信息
os.stat_result(st_mode=16895, st_ino=4503599627377599, st_dev=266147611, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1590833033, st_mtime=1590832647, st_ctime=1590832207)
>>> os.stat("test/test.txt")    # 獲取文件信息
os.stat_result(st_mode=33206, st_ino=2251799813692354, st_dev=266147611, st_nlink=1, st_uid=0, st_gid=0, st_size=4, st_atime=1590832653, st_mtime=1590832609, st_ctime=1590832598)

其中 stat 函數返回的是文件或者目錄的基本信息,具體如下:

  • st_mode: inode 保護模式
  • st_ino: inode 節點號。
  • st_dev: inode 駐留的設備。
  • st_nlink: inode 的鏈接數。
  • st_uid: 所有者的用戶ID。
  • st_gid: 所有者的組ID。
  • st_size: 普通文件以字節為單位的大小
  • st_atime: 上次訪問的時間。
  • st_mtime: 最後一次修改的時間。
  • st_ctime: 創建時間。

日常使用中,我們一般使用 st_size 、st_ctime 及 st_mtime 獲取文件大小,創建時間,修改時間。另外,我們看到輸出的時間是秒數,在這裏提一下,關於日期的轉換處理。

(1)秒數轉日期時間格式字符串

>>> import time                              # 引入time模塊
>>> timestruct = time.localtime(1590803070)  # 轉換為時間結構體
>>> print(timestruct)
time.struct_time(tm_year=2020, tm_mon=5, tm_mday=30, tm_hour=9, tm_min=44, tm_sec=30, tm_wday=5, tm_yday=151, tm_isdst=0)
>>> time.strftime("%Y-%m-%d %H:%M:%S",timestruct)   # 格式化時間
'2020-05-30 09:44:30'

(2)格式日期時間字符串轉秒數

>>> import datetime               # 引入datetime模塊
>>> timeobject = datetime.datetime.strptime("2020-05-23 10:00:00","%Y-%m-%d %H:%M:%S") #解析時間字符串為時間對象
>>> timeseconds=time.mktime(timeobject.timetuple())  # 獲取時間秒數
>>> print(int(timeseconds))       # 轉為int显示
1590199200
  • 遍歷操作

    walk 函數對目錄進行遞歸遍歷,返回 root,dirs,files,分別對應當前的遍歷的目錄,此目錄中的子目錄及文件。

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

>>> data = os.walk("test")               # 遍歷test目錄
>>> for root,dirs,files in data:         # 遞歸遍歷及輸出
...    print("root:%s" % root)
...    for dir in dirs:
...       print(os.path.join(root,dir))
...    for file in files:
...       print(os.path.join(root,file))
...
root:test
test\test-1
test\test-2
test\test.txt
root:test\test-1
test\test-1\test-1.txt
root:test\test-2
test\test-2\test-2.txt

2.2 創建操作

  • mkdir :新建單個目錄,若目錄路徑中父目錄不存在,則創建失敗

  • makedirs :新建多個目錄,若目錄路徑中父目錄不存在,則自動創建

>>> os.mkdir("test")
>>> os.mkdir("test1/test1-1")          # 父目錄不存在,報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 3] 系統找不到指定的路徑。: 'test1/test1-1'
>>> os.makedirs("test1/test1-1")       # 父目錄不存在,自動創建
>>> os.listdir("test1")
['test1-1']

2.3 刪除操作

  • rmdir :刪除單個空目錄,目錄不為空則報錯
  • removedirs : 按路徑刪除遞歸多級空目錄,目錄不為空則報錯
>>> os.rmdir("test1")                         # 若目錄不為空,報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [WinError 145] 目錄不是空的。: 'test1'
>>> os.rmdir("test1/test1-1")
>>> os.removedirs("test1/test1-1")            # 刪除多級空目錄
>>> os.listdir(".")
['test']

由於刪除空目錄的限制,更多的是使用 shutil 模塊中的 rmtree 函數,可以刪除不為空的目錄及其文件。

2.4 修改操作

  • rename :重命名目錄或文件,可修改文件或目錄的路徑(即移動操作),若目標文件目錄不存在,則報錯。
  • renames :重命名目錄或文件,若目標文件目錄不存在,則自動創建
>>> os.makedirs("test1/test1-1")
>>> os.rename("test1/test1-1","test1/test1-2")     # test1-1 修改為test1-2
>>> os.listdir("test1")
['test1-2']
>>> os.rename("test1/test1-2","test2/test2-2")     # 由於test2目錄不存在,報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 3] 系統找不到指定的路徑。: 'test1/test1-2' -> 'test2/test2-2'
>>> os.renames("test1/test1-2","test2/test2-2")    # renames可自動創建不存在的目錄
>>> os.listdir("test2")
['test2-2']

如果目標路徑文件已經存在,那麼os.rename()和os.renames()都會報錯:FileExistsError: [WinError 183] 當文件已存在時,無法創建該文件。

3 文件操作

3.1 查詢操作

  • open/read/close :文件讀取
  • stat :文件信息,詳細見前面文件夾中的 stat 說明
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT)  # 打開文件
>>> str_bytes = os.read(f,100)                          # 讀100字節
>>> str = bytes.decode(str_bytes)                       # 字節轉字符串
>>> print(str)
test write data
>>> os.close(f)                                         # 關閉文件

注意 open/read/close 需要一起操作,其中 open 操作需要指定模式,上述是以讀寫模式打開文件,若文件不存在則創建文件。各模式具體如下:

flags — 該參數可以是以下選項,多個使用 “|” 隔開:

  • os.O_RDONLY: 以只讀的方式打開
  • os.O_WRONLY: 以只寫的方式打開
  • os.O_RDWR : 以讀寫的方式打開
  • os.O_NONBLOCK: 打開時不阻塞
  • os.O_APPEND: 以追加的方式打開
  • os.O_CREAT: 創建並打開一個新文件
  • os.O_TRUNC: 打開一個文件並截斷它的長度為零(必須有寫權限)
  • os.O_EXCL: 如果指定的文件存在,返回錯誤
  • os.O_SHLOCK: 自動獲取共享鎖
  • os.O_EXLOCK: 自動獲取獨立鎖
  • os.O_DIRECT: 消除或減少緩存效果
  • os.O_FSYNC : 同步寫入
  • os.O_NOFOLLOW: 不追蹤軟鏈接

3.2 創建操作

前面已提到,使用 open ,指定模式, 若文件不存在,則創建。有點類似 linux 操作中的 touch。

>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT)   # 若文件不存在,則創建
>>> os.close(f)

3.3 修改操作

  • open/write/close :寫入文件內容
  • rename ,renames : 與前面介紹的修改名稱、移動操作一致。
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT)     # 打開文件
>>> os.write(f,b"test write data")                         # 寫入內容
15
>>> os.close(f)                                   # 關閉文件

3.4 刪除

  • remove :刪除文件,注意不能刪除目錄(使用 rmdir/removedirs)
>>> os.remove("test/test-1")       # 刪除目錄報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 2] 系統找不到指定的文件。: 'test/test1'
>>> os.remove("test/test.txt")     # 刪除文件
>>> os.listdir("test")
['test-1']

4 路徑操作

在使用文件或目錄過程中,經常需要對文件及目錄路徑進行處理,因此,os 中有一個子模塊 path,專門就是處理路徑操作的。主要有以下操作:

  • abspath :返回絕對路徑
>>> os.path.abspath("test")
'E:\\pythontest\\test'
  • exists :判斷文件或目錄是否存在
>>> os.path.exists("test")
True
>>> os.path.exists("test/test.txt")
False
>>> os.path.exists("test/test-1/test-1.txt")
True
  • isfile/isdir :判斷是否為文件/目錄
>>> os.path.isdir("test")
True
>>> os.path.isfile("test/test-1/test-1.txt")
True
  • basename/dirname:獲取路徑尾部和路徑頭部。其實就是以路徑中最後一個 / 為分割符,分為頭(head) 和尾(tail)兩部分,tail 是 basename 返回的內容,head 是 dirname 返回的內容。經常用於獲取文件名,目錄名等操作
>>> os.path.basename("test/test-1/test-1.txt")   # 文件名
'test-1.txt'
>>> os.path.basename("test/test-1/")     # 空內容
''
>>> os.path.basename("test/test-1")      # 目錄名
'test-1'
>>> os.path.dirname("test/test-1/test-1.txt")   # 文件所在目錄路徑
'test/test-1'
>>> os.path.dirname("test/test-1/")   # 目錄路徑
'test/test-1'
>>> os.path.dirname("test/test-1")   # 父目錄路徑
'test'
  • join :合成路徑,即把兩個參數使用系統路徑分割符進行連接,形成完整路徑。
>>> os.path.join("test","test-1")   # 連接兩個目錄
'test\\test-1'
>>> os.path.join("test\\test-1","test-1.txt")   # 連接目錄與文件名
'test\\test-1\\test-1.txt'
  • split :分割文件名和文件夾,即把 path 以最後一個斜線”/”為分隔符,切割為 head 和 tail ,以 (head, tail) 元組的形勢返回。
>>> os.path.split("test/test-1")     # 分割目錄
('test', 'test-1')
>>> os.path.split("test/test-1/")    # 以/結尾的目錄分割
('test/test-1', '')
>>> os.path.split("test/test-1/test-1.txt")  # 分割文件
('test/test-1', 'test-1.txt')
  • splitext :分割路徑名和文件擴展名,把path 以最後一個擴展名分隔符“.”分割,切割為 head 和 tail ,以 (head, tail) 元組的形勢返回。注意與 split 的區別是分隔符的不同。
>>> os.path.splitext("test/test-1")  
('test/test-1', '')
>>> os.path.splitext("test/test-1/") 
('test/test-1/', '')
>>> os.path.splitext("test/test-1/test-1.txt")  # 區分文件名及擴展名
('test/test-1/test-1', '.txt')
>>> os.path.splitext("test/test-1/test-1.txt.tmp") # 以最後的"."為分割點
('test/test-1/test-1.txt', '.tmp')

5 示例應用

下面以一些平時使用到的場景,對前面的操作函數進行綜合使用。

5.1 批量修改文件名

def batch_rename(dir_path):
    itemlist = os.listdir(dir_path)
    # 獲取目錄文件列表
    for item in itemlist:
        # 連接成完整路徑
        item_path = os.path.join(dir_path, item)
        print(item_path)
        # 修改文件名
        if os.path.isfile(item_path):
            splitext = os.path.splitext(item_path)
            os.rename(item_path, splitext[0] + "-副本" + splitext[1])

5.2 遍歷目錄及子目錄下所有指定擴展名的文件


def walk_ext_file(dir_path,ext):
    # 遍歷
    for root, dirs, files in os.walk(dir_path):
        # 獲取文件名稱及路徑
        for file in files:
            file_path = os.path.join(root, file)
            file_item = os.path.splitext(file_path)
            # 輸出指定擴展名的文件路徑
            if ext == file_item[1]:
                print(file_path)

5.3 按修改時間排序指定目錄下的文件

def sort_file(dir_path):
    # 排序前
    itemlist = os.listdir(dir_path)
    print(itemlist)
    # 正向排序
    itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename)))
    print(itemlist)
    # 反向排序
    itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename)), reverse=True)
    print(itemlist)
    # 獲取最新修改的文件
    print(itemlist[0])

6 總結

在需要對文件或者目錄進行操作時,python 是一個簡單快速選擇。本文通過 python 的標準內置 os 模塊及子模塊 os.path 的常用方法進行介紹,最後結合使用場景進行綜合使用。相信已經滿足大家對文件及目錄操作的大部分需求。

參考資料

  • python之os模塊:https://www.cnblogs.com/yufeihlf/p/6179547.html
  • Python OS 文件/目錄方法: https://www.runoob.com/python/os-file-methods.html
  • Python os.path() 模塊: https://www.runoob.com/python/python-os-path.html

往期文章

  • MinIO 的分佈式部署
  • 利用MinIO輕鬆搭建靜態資源服務
  • 搞定SpringBoot多數據源(3):參數化變更源
  • 搞定SpringBoot多數據源(2):動態數據源
  • 搞定SpringBoot多數據源(1):多套源策略
  • java開發必學知識:動態代理
  • 2019 讀過的好書推薦

我的公眾號(搜索Mason技術記錄),獲取更多技術記錄:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

從輾轉相除法到求逆元,數論算法初體驗_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

本文始發於個人公眾號:TechFlow,原創不易,求個關注

今天是算法和數據結構專題的第22篇文章,我們一起來聊聊輾轉相除法。

輾轉相除法又名歐幾里得算法,是求最大公約數的一種算法,英文縮寫是gcd。所以如果你在大牛的代碼或者是書上看到gcd,要注意,這不是某某黨,而是指的輾轉相除法。

在介紹這個算法之前,我們先來看下最大公約數問題。

暴力解法

這個問題應該很明確了,我們之前數學課上都有講過。給我們紙筆讓我們求都沒有問題,分解因數找下共同的部分,很快就算出來了。但是用代碼實現怎麼做呢?

用代碼實現的話,首先排除分解因數的方法。因為分解因數複雜度太高了,也很容易想明白,既然要分解因數,那麼首先需要獲得一定量的質數吧。有了質數之後還要遍歷質數,將整數一點一點分解,顯然很麻煩,還不如直接暴力了。暴力解法並不複雜,我們直接從1開始遍歷,記錄下來同時能夠整除這兩個數的最大數即可。我們暴力的範圍也不大,從1到n。

很容易寫出代碼:

def gcd(a, b):
    ret = 0
    for i in range(min(a, b)):
        if a % i == 0 and b % i == 0:
            ret = i
    return ret

這個很簡單,也許你可能還會想出一些優化,比如說首先判斷一下a和b之間是否有倍數關係,如果有的話直接就可以得到結果了。再比如說我們i的遍歷範圍其實可以不用到min(a, b),如果a和b沒有倍數關係的話min(a, b) / 2就可以了。這些都是沒有問題的,但是即使加上了這些優化依然改變不了這是一個O(n)算法的本質。

比如說a是1e9,b是1e9-1,毫無疑問這樣的做法會超時。

輾轉相除法

接下來就輪到正主——輾轉相除法出場了,這個算法在《九章算術》當中曾經出現過,叫做更相減損術。不管叫什麼,原理都是一樣的,它的最核心本質是下面這個式子:

\[gcd(a, b) = gcd(b, r), a = bq + r \]

這個式子就是著名的歐幾里得定理,這裏的r可以看成是a對b取余之後的結果,也就是說a和b的最大公約數等於b和r的最大公約數。這樣我們就把a和b的gcd轉移成了b和r,然後我們可以繼續轉移,直到這兩個數之間存在倍數關係的時候就找到了答案。

在我們寫代碼之前,我們先來看一下這個定理的證明。

我們假設u同時整除a和b,顯然這樣的u一定存在,因為u至少可以是1,所以:

\[\begin{aligned} a = su, b = tu \\ r = a – bq = su – tuq = (s – tq) u\\ \end{aligned} \]

所以可以得到u也整除r,同樣我們可以證明能夠整除b和r的整數也可以整除a。我們假設v可以同時整除b和r:

\[\begin{aligned} b = sv, r = tv\\ a = bq + r = svq + tv = v(sq + t) \end{aligned} \]

這樣我們就得到了v也可以整除a。也就是說a和b的每一個因子都是b和r的因子,同樣b和r的每一個因子也是a和b的因子,那麼可以得出a和b的最大公約數就是b和r的最大公約數。

以上就是歐幾里得定理的簡單證明,如果看不懂也沒有關係,我們記住這個定理的內容就可以了。

接下來就是用代碼實現了,我們把這個公式套進遞歸當中非常容易:

def gcd(a, b):
    if a < b:
        a, b = b, a
        
   	if a % b == 0:
        return b
    return gcd(b, a % b)

我們首先判斷了a和b的大小關係,如果a小於b的話,我們就交換它們的值,保證a大於b。如果a和b取模的結果為0,那麼說明a已經是b的倍數了,顯然它們之間的最大公約數就是b。

但其實我們沒有必要判斷a和b的大小,我們假設a小於b,那麼顯然a % b = a,於是會遞歸調用b和a % b,也就是b和a,也就是說算法會自動調整兩者的順序。這麼一來,這個代碼還可以進一步簡化,只需要一行代碼

def gcd(a, b):
    return a if b == 0 else gcd(b, a % b)

所以聽到有人說自己用一行代碼實現了一個算法,不要覺得它在裝逼,有可能他真的寫了一個gcd。

拓展歐幾里得

拓展歐幾里得本質上就是gcd,只是在此基礎上做了一定的拓展,從而來解決不定方程。不定方程就是ax + by = c的方程,方程要有解充要條件是(a, b) | c,也就是說a和b的最大公約數可以整除c

也就是說求解ax + by = gcd(a, b)的解。假如說我們找到了這樣一組解x0和y0,那麼x0 + (b / gcd) * t和y0 – (a / gcd) * t也是方程的解,這裏的t可以取任意整數。

我們代入算一下即可:

\[\begin{aligned} a*(x_0 + (b / gcd) * t) + b*(yo-(a/gcd)*t) \\ a*x_0+ b*y_0 + abt / gcd – abt/gcd = gcd \end{aligned} \]

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

\[\begin{aligned} \end{aligned} \]

所以我們求出了這樣的x0和y0之後就相當於求出了無數組解,那麼這個x0和y0怎麼求呢,這就需要用到gcd算法了。

我們觀察一下gcd算法的遞歸代碼,可以發現算法的終止條件是a=gcd,b=0。對於這樣的a和b來說,我們已經找到了一組解使得ax+by=gcd,比如很明顯,x=1,y=0。實際上y可以為任何值,因為b=0。

我們回到遞歸的上一層的a和b,假設我們已經求出了b和a%b的最大公約數,並且求出了一組解x0和y0。使得b*x0 + (a%b)* y0 = gcd。那麼我們能不能倒推得到a和b時候的解呢?

因為a % b = a – (a/b)*b,這裏的/是整除計算的意思,我們代入:

\[\begin{aligned} gcd &= b*x_0 + (a\%b)*y_0 \\ &= b*x_0 + (a – (a/b)*b)*y_0 \\ &= b*x_0 + a*y_0 – (a/b)*b*y_0 \\ &= a*y_0 + b*(x_0 – (a/b)*b*y_0) \end{aligned} \]

顯然對於a和b來說,它的一組解就是y0和x0 – (a/b)*b*y0,我們把這幾行計算加在代碼當中即可,非常簡單:

def exgcd(a, b, x=1, y=0):
    # 當b=0的時候return
    if b == 0:
        return a, x, y
    # 遞歸調用,獲取b, a%b時的gcd與通項解
    gcd, x, y = exgcd(b, a%b, x, y)
    # 代入,得到新的通項解
    x, y = y, x - a//b*y
    return gcd, x, y

這裏我建議大家不要死記代碼,都去推導一下遞歸的這個推導公式。這個公式搞明白了,即使代碼記不住也沒有關係,後面臨時用到的時候再推導也可以。不然的話,即使背下來了代碼也不記得什麼意思,如果碰到的場景稍微變動一下,可能還是做不出來。

逆元與解逆元

拓展歐幾里得算法我們理解了,但是好像看不出來它到底有什麼用。一般情況下我們也碰不到讓我們計算通解的情況,但其實是有用的,用的最多的一個功能就是計算逆元

在解釋逆元之前先來看一個問題,我們有兩個數a和b,和一個模底數p。我們可以得到(a + b) % p = (a%p + b%p)%p,也可以得到 (a – b)%p = (a%p – b%p)%p。甚至還可以得到 (a*b)% p =(a%p * b%p) %p,這些都是比較明確的,但是(a / b) % p = (a % p / b % p) % p,這個式子成立嗎?

最後的式子是不成立的,因為模數沒有除法的傳遞性,我們可以很方便舉出反例。比如a是20, b是10,p是4,(a/b)%p=2,而(a %p / b%p) % p = 0。

這就導致了一個問題,假如說我們在一連串計算當中,由於最終的結果特別大,我們無法存儲精確的值,希望存儲它關於一個模底數取模之後的結果。但是我們的計算當中又涉及除法,這個時候應該怎麼辦?

這個時候就需要用到逆元了,逆元也叫做數論倒數。它其實起到一個和倒數類似的效果,假設a關於模底數p的逆元是x,那麼可以得到:ax = 1 (mod p)

所以我們想要算 (a / b) % p,可以先求出b的逆元假設是inv(b),然後轉化成(a%p * inv(b)%p)%p。

這個逆元顯然不會從天上掉下來,需要我們設計算法去求出來,這個用來求的算法就用到拓展歐幾里得,我們下面來看一下推導過程。

假設a和b互質,那麼gcd(a, b) = 1,代入:

\[\begin{aligned} ax + by &= 1\\ ax \% b + by \% b &= 1 \% b\\ ax\%b &= 1\%b\\ ax &= 1 \pmod b \end{aligned} \]

所以x是a關於b的逆元,反之可以證明y是b關於a的逆元。

這麼計算是有前提的,就是a和b互質,也就是說a和b的最大公約數為1。否則的話這個計算是不成立的,也就是說a沒有逆元。那麼整個求解逆元的過程其實就是調用拓展歐幾里得的過程,把問題說清楚花了很多筆墨,但是寫成代碼只有兩三行:

def cal_inv(a, m):
    gcd, x, y = exgcd(a, m)
    # 如果gcd不為1,那麼說明沒有逆元,返回-1
    return (x % m + m) % m if gcd == 1 else -1

在return的時候我們對x的值進行了縮放,這是因為x有可能得到的是負數,我們把它縮放到0到m的範圍當中。

逆元的求解方法除了拓展歐幾里得之外,還有一種算法,就是利用費馬小定理。根據費馬小定理,在m為質數的時候,可以得到

\[a^{m-1}\equiv 1 \pmod m \]

等式兩邊同時除以a,也就是乘上a的逆元,可以得到:

\[a^{m-2} \equiv inv(a) \pmod m \]

也就是說我們求出\(a^{m-2}\)然後再對m取模就得到了a的逆元,我們使用快速冪可以很方便地求出來。但是這個只有m為質數的時候才可以使用。

總結

今天我們聊了歐幾里得定理聊了輾轉相除法還聊了拓展歐幾里得和求解逆元,雖然這些內容單獨來看並不難,合在一篇文章當中量還是不小的。這些算法底層的基礎知識是數論,對於沒有參加過競賽的同學來說可能有些陌生,但是它也是算法領域一個很重要的分支。

如果喜歡本文,可以的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

【JVM】垃圾回收的四大算法_貨運

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

GC垃圾回收

JVM大部分時候回收的都是新生代(伊甸區+倖存0區+倖存1區)。按照回收的區域可以分成兩種類型:Minor GC和Full GC(MajorGC)。

  • Minor GC:只針對新生代區域的GC,大多數Java對象的存活率都不高,Minor GC非常頻繁,回收速度快。
  • Full GC:發生在老年代的GC,經常會伴隨至少一次的Minor GC(但不一定會),Full GC掃描的範圍更廣泛,Full GC的速度比Minor GC慢10倍以上。

 

 

GC四大算法

引用計數法

對於單個對象來說,當有引用發生,引用計數器就+1;當丟失引用,引用計數器就-1。當引用數減到0的時候,說明對象不再有用,被垃圾回收。引用計數法缺點是每次對對象賦值都要維護引用計數器,且計數器本身也有一定的消耗,難以處理引用循環(例如:對象雙方互相引用,但實際上二者為空,此時雙方引用都不為空)。JVM的實現一般不採用這種方式。

複製算法

年輕代中使用的是Minor GC,這種Minor GC採用的是複製算法。複製的思想是將內存分為2快,每次只用其中一塊,當這一塊內存用完,就將或者的對象複製到另一塊上面,複製算法不會產生內存碎片

HotSpot JVM中年輕代可以分成三個部分:Eden區、Survivor0區,Survivor1區,默認比例為8:1:1。Survivor的兩個區在邏輯上可以視為from區和to區,每次GC後會交換from區和to區,在Eden區和from區滿之前,to區始終是為空的區。如果to區也被填滿了,所有對象移動到老年代。

新創建的對象一般會被分配到伊甸區,經過一次Minor GC后,如果對象還存活,就會被移到Survivor區。from區的對象如果繼續存活,且能夠被另一塊倖存區to區容納,則使用複製算法將這些仍然存活的的對象複製到另一塊倖存區to區中,然後清理使用過的Eden和from區(下一次分配就從to區開始,to區成為下一次GC的from區),且這些對象的年齡設置為1,以後對象在倖存區每經歷一次Minor GC,對象的年齡就會+1,當對象的年齡到達某個閾值的時候,這些對象就會進入老年代。(閾值默認是15,可以通過-XX:MaxTenuringThreshhold來設定對象在新生代在存活的次數)。

這種算法的優點了不會產生內存碎片,缺點是浪費內存空間,在HotSpot虛擬機中8:1:1的比例下,可用內存為80%+10%,有10%的內存會被浪費掉。如果對象存活率很高,就需要將所有對象都複製一邊,並重置引用地址。

標記清除(Mark-Sweep)

老年代一般是由標記清除 或者 標記清除和標記整理的混合實現的。

標記清除算法分為兩個步驟,先標記出要回收的對象,然後統一回收這些對象。

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

優點是節約內存空間,不需要額外空間。缺點是兩次掃描,標記和清除的效率都不高,耗時嚴重。標記清除後會產生大量不連續的內存碎片。內存碎片會導致以後程序需要分配大對象的時候,找不到足夠的連續內存,導致提前觸發GC。

 標記整理(Mark-Compact)

和標記清除一樣,先標記出要回收的對象,然後讓存活對象都向一端移動,直接清理掉端邊界 以外的內存。

優點是沒有內存碎片,缺點是效率不高,需要標記存活對象還要整理存活對象的引用地址,從效率上來說是不如複製算法的。

還有一種折衷的方案,將標記清除和標記整理算法相結合,一般直接標記清除,當GC達到一定次數的時候,進行一次標記整理,從而減少了移動對象的成本,又有處理內存碎片的步驟。

總結

效率排名:複製算法>標記清除>標記整理

內存整齊度:複製算法=標記整理>標記清理

內存利用率:標記整理=標記清理>複製算法

四種算法各有優劣,一般的JVM實現會採用分代收集算法,根據不同代所具有的不同特點使用不同的算法。

年輕代的特點是區域較小,對象存活率低,適合使用複製算法。複製算法的效率只和當前存活對象的大小有關,適用於年輕代的回收,內存利用率不高的問題HotSopt通過兩個survivor的設計進行和緩解,新生代可用容量為80%+10%,只有10%的內存被浪費掉。

老年代的特點是區域較大,對象存活率高,適合使用標記清除/標記整理算法。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

15萬買合資SUV必看!這款車居然是歐洲最暢銷車型之一!_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

而且作為一款SUV它的離地間隙達到了將近20cm這也保證了它具備一定實力的通過性,可以適合歐洲主要以丘陵為主的道路,以及中國多路況的局面,這也是為什麼逍客的銷量在中國銷量也不差的原因。逍客配備的是一款2。0L自然吸氣發動機,最大馬力達到150ps,以及一台模擬七速的CVT變速箱,動力總成的賬面參數並不突出,但是對於家用來說,動力輸出已經完全可以滿足日常的用車需求。



歐洲,世界汽車工業誕生的搖籃,孕育出了寶馬、奔馳、大眾等等世界知名的汽車品牌,但是來自日產的逍客,居然成為了歐洲最暢銷的SUV車型之一,而且逍客在國內的銷量也不低,平均月銷量都過萬台,這車究竟為什麼會如此受歡迎?

外觀:其貌不揚卻迎合觀眾

熟悉歐洲車的朋友都知道,除了法系車以外,以德系車為代表的汽車外觀設計都是普遍偏向保守,這其實也跟歐洲人普遍的審美還是偏向保守嚴謹有關。

逍客的外觀其實沒有什麼突出的亮點,日產家族式的前臉,用整體性更強的幾何板塊營造出一個不過不失,中庸圓潤的車輛外形,這也十分符合一台家用SUV應有的定位。

逍客的車主年齡層次涵蓋十分廣泛,從65后的中年人到85后的年輕人,購買逍客的不在少數,正式這種其貌不揚但是老少通殺的外觀設計才能做到真正迎合消費者的普遍審美。

操控:駕控靈活,可適應路況眾多

作為一台緊湊型SUV,逍客的軸距並不算短,達到了2645mm,但是車身的前後懸較短,營造出了一個較為短小精悍的外觀,

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

而且由於逍客的操控特性建立得十分靈敏,導致逍客的操控感受十分靈敏輕便。談不上什麼運動感和駕駛樂趣,但是逍客卻可以成為一家人所有會開車的人士都比較好上手的一台SUV。

而且作為一款SUV它的離地間隙達到了將近20cm這也保證了它具備一定實力的通過性,可以適合歐洲主要以丘陵為主的道路,以及中國多路況的局面,這也是為什麼逍客的銷量在中國銷量也不差的原因。

逍客配備的是一款2.0L自然吸氣發動機,最大馬力達到150ps,以及一台模擬七速的CVT變速箱,動力總成的賬面參數並不突出,但是對於家用來說,動力輸出已經完全可以滿足日常的用車需求。

內飾:樸實無華,舒適至上

日產的汽車在內飾層面不會體現過多的設計感,走量的車型普遍都是以很樸素的樣式進行設計,中控功能區的按鍵布局合理簡潔,內飾的溝通感做得不錯,但是方向盤尺寸偏大而且握感很細,在駕駛的時候或許需要駕駛員做更多的適應。

逍客的乘坐空間布局不算很大,後排空間顯得比較局促,但是勝在座椅的貼合程度很高,所以乘坐起來很舒適,各種布局都體現了逍客是一款適合家用的SUV。

全文總結:什麼車是一台好車,相信不少人眼裡都會有不同的答案。有些人注重的是品牌情懷,有人注重的是各種突出的性能,而更多人可能選擇是一款足夠實用,簡單,而且不過不失的車型,SUV作為國人家庭接受度程度比較高的車型,日產的逍客或許沒有什麼吸引的品牌效應,甚至有不少排斥日系的朋友會對其不屑一顧,但就事論事的說,逍客作為15萬級的合資家用SUV來說,可以作為一款不錯的選擇。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

海峽兩岸學者講述家文化_網頁設計公司

1{icon} {views}

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

《回家》 薛仁明 白劍峰著 紅旗出版社

近日,《回家》一書由紅旗出版社出版,作者為台灣作家薛仁明和人民日報高級記者白劍峰。這是海峽兩岸學者首次聯袂出版的“家文化”專著。本書從中華傳統文化的視角解讀了“回家”的內涵和意義。《回家》以家庭為切入點,從飲食男女到四時祭祀,從鄉愁鄉思到祠堂家譜,從居住空間到民俗風情,從家風家教到家國情懷,涵蓋了家庭的方方面面,將中華傳統文化融入日常生活的細節之中,剖析了中國人的文化基因,闡述了中國人的家國情懷。本書分為家居、家祭、家鄉、家庭、家風、家教、家國七章,站在中華幾千年文明的高度,涉及儒釋道及諸子百家,體現了儒家“修身、齊家、治國、平天下”的人生理想。書中有美食的味道,有節氣的韻律,有建築的光影,有祭祀的虔敬,有生死的感悟,有血脈的綿續,有鄉愁的記憶,有夫妻的恩愛,有教子的良方,既是一本中華傳統文化的“濃縮讀本”,也是一本家庭生活的“百科全書”。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

讀懂時代,從讀懂語言開始_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

時節如流,歲月不居。年終歲末,不同機構相繼發布年度漢字、漢語盤點,國家語言資源監測與研究中心發布了中國媒體十大流行語:我和我的祖國、金色十年、學習強國、中美經貿磋商、最美奮鬥者、硬核、垃圾分類、先行示範區、基層減負年、我太難了。《咬文嚼字》編輯部、《語言文字周報》等機構公布的年度流行語與之有重合也有不同。

年度流行語盤點,既是語言文字研究領域的一件盛事,也是整個文化界的一樁“雅事”,而且被大眾看成是觀察中國社會、洞悉世道人心的一扇窗口。因此,年復一年,如期而至,廣受關注。今年的年度流行語形態各異,既有“我和我的祖國”“最美奮鬥者”“硬核”等與時代大局大勢同頻共振的“鐘鼓之音”,也有諸如“我太難了”“好嗨呦”之類,反映社會風尚、大眾心態、百姓心聲的“網言網語”。“大珠小珠落玉盤”,盡顯漢語言文字的豐富性。

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

過去的2019年,我們為共和國70年的輝煌成就喝彩,愛國主義情感讓我們熱淚盈眶,“我和我的祖國”在大江南北唱響。我們感動於千千萬萬奮鬥者“擼起袖子加油干”的蓬勃朝氣,也為基層幹部切實減輕了負擔鬆了一口氣;我們為偉大祖國的欣欣向榮而驕傲,也每每因工作的壓力、生活的不易感到焦慮……不論社會如何變化,總有一些與每個人息息相關的國家大事、社會大潮引領着我們的注意力,總有一些標誌性的人和事讓我們產生情感的交集;總有一些共同的情感把我們的心凝聚在一起。也因此,在人口基數如此龐大的中國,每年總有一些被普遍認同的年度流行語。

過去的2019年,我們的社交方式、信息獲取方式乃至生活方式,都在發生更深刻改變。人們在為奮鬥者喝彩的同時,也對所謂的“996工作制”產生質疑;既熱衷於以“X千萬條,Y第一條”造句,也在類似“我不要你覺得,我要我覺得”的表達中展現着自我意識的增強、個體個性的鮮明;盤他、雨女無瓜、檸檬精、斷舍離等等流行語,讓很多人感到摸不着頭腦,一些人卻高度認同、非常默契,這提示我們,分眾化的社交趨勢更加明顯,不同社交圈的人往往有着全然不同的文化生態和話語體系。如果把這種巨大的差異性放在70年歲月變遷的歷史長河中去觀察,我們就會看到,這種千差萬別、百花齊放、形態各異,展現的正是生活選擇的自由、社會文化的多元、人的個性的舒展。“和而不同,各美其美”是社會繁榮進步的體現。

語言是時代的風向標,讀懂時代,當從讀懂語言開始。十多年來,每至歲末,一串串閃現在語言文字大潮中的流行語被“打撈”出來。這種“打撈”,實際上是對國家大勢、世界風雲、民生實事、社會熱點的“打撈”,是對時代變化、社會變遷的“打撈”。一個個時代流行語鋪展在面前,嘴角輕揚,看似波瀾不驚地咂摸間,往往蘊含着人們對自身生活、社會變革與人類發展的深長思考,往往寄予着擁抱更美好生活、更美好時代的蓬勃進取心。“只爭朝夕,不負韶華”,新年已至,讓我們整裝出發。(作者:李思輝,系華中科技大學新聞評論研究中心特聘研究員)

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!