第6章 操做系統考察點

linux常考命令python

介紹linux

  • 早期採用LAMP/LNMP架構web

  • Linux + Apache(Nginx) + Mysql + Php/Pythonsql

  • 如今微服務架構容器技術編程

爲何要學習linux?安全

  • 大部分企業應用跑在linux server上服務器

  • 熟練在linux服務器上操做網絡

  • 瞭解linux工做原理和經常使用工具多線程

  • 瞭解查看文件,進程,內存相關的一些命令,用來調試和排查架構

如何查詢linux命令用法

  • man

  • info

  • help
    • eg: pip --help
  • man的替代工具tldr, Pip install tldr

文件/目錄操做命令

常見的文件操做工具

  • chown/chmod/chgrp

  • ls/rm/cd/cp/mv/touch/rename/ln(軟連接和硬連接)等

  • locate/find/grep 定位查找和搜索
    • eg:find . -name "*.pyc" -delete

文件查看

文件或者日誌查看工具

  • 編輯器 vi/nano

  • cat/head/tail查看文件

  • more/less 交互式查看文件

進程操做命令

掌握常見的進程操做工具

  • ps查看進程

  • kill殺死進程

  • top/htop 監控進程

內存操做命令

掌握常見的內存操做工具

  • free查看可用內存
    • 瞭解每一列的具體含義
  • 排查內存泄漏問題

網絡操做命令

掌握常見的網絡工具

  • ifconfig查看網卡信息

  • lsof/netstat 查看端口信息

  • ssh/scp 遠程登陸/複製。tcpdump抓包

用戶/組操做命令

掌握常見用戶和組操做

  • useradd/usermod

  • groupadd/groupmod

總結:

  • 多用才能熟悉

操做系統線程和進程常考題

線程和進程的區別

進程和線程對比

  • 進程是對運行時程序的封裝,是系統資源調度和分配的基本單位

  • 線程是進程的子任務,cpu調度和分配額基本單位,實現進程內併發

  • 一個進程能夠包含多個線程,線程依賴進程存在,並共享進程內存

線程安全

py哪些操做是線程安全的?

  • 一個操做能夠在多線程環境中安全使用,獲取正確的結果

  • 線程安全的操做比如線程是順序執行而不是併發執行的(i += 1)

  • 通常若是涉及到寫操做須要考慮如何讓多個線程安全訪問數據

線程同步的方式

瞭解線程同步的方式,如何保證線程安全

  • 互斥量(鎖): 經過互斥機制防止多個線程同時訪問公共資源

  • 信號量(Semphare): 控制同一時刻多個線程訪問同一資源的線程數

  • 事件(信號): 經過通知的方式保持多個線程同步

進程間通訊的方式

Inter-Process Communication 進程間傳遞信號或者數據

  • 管道/匿名管道/有名管道(pipe)

  • 信號(signal): 好比用戶使用Ctrl+c產生SIGINT程序終止信號

  • 消息隊列(Message)

  • 共享內存(share memory)

  • 信號量(Semaphore)

  • 套接字(socket): 最經常使用的方式, web應用使用的都是這種方式

py中使用多線程

  • threading模塊

  • threading.Thread類用來建立線程

  • start()方法啓動線程

  • 能夠用join()等待線程結束

import threading

lock = threading.Lock()

n = [0]

def foo():
    with lock:
        n[0] = n[0] + 1
        n[0] = n[0] + 1

threads = []
for i in range(5000):
    t = threading.Thread(target=foo)
    threads.append(t)

for t in threads:
    t.start()

print(n)

py中如何使用多進程

py有GIL 能夠用多進程實現cpu密集程序

  • multiprocessing 多進程模塊

  • Multiprocessing.Process 類實現多進程
    • 通常用在cpu密集程序裏,避免GIL的影響
#多進程
import multiprocessing

def fib(n):
    """worker function"""
    if n <= 1:
        return 1
    return fib(n-1) + fib(n-2)

if __name__ == '__main__':
    jobs = []
    for i in range(10, 20):
        p = multiprocessing.Process(target=fib, args=(i,))
        jobs.append(p)
        p.start()

操做系統內存管理機制常見考題

現代化編程語言通常有垃圾回收機制

什麼是分頁機制

​ 操做系統爲了高效管理內存,減小碎片

​ 邏輯地址和物理地址分離的內存分配管理方案

​ 程序的邏輯地址劃分固定大小的頁(Page)物理地址劃分爲一樣大小的幀(Frame)

​ 經過頁表對應邏輯地址和物理地址

什麼是分段機制

分段是爲了知足代碼的一些邏輯需求 數據共享,數據保護,動態連接等

經過段表實現邏輯地址和物理地址的映射關係 每一個段內部是連續內存分配,段和段之間是離散分配的

分頁和分段的區別

分頁vs分段

頁是出於內存利用率的角度提出的離散分配機制, 段是出於用戶角度,用於數據保護,數據隔離等用途的管理機制,頁的大小是固定的,操做系統決定,段大小不肯定,用戶程序決定

什麼是虛擬內存

經過把一部分暫時不用的內存信息放到硬盤上 局部性原理,程序運行時候只有部分必要的信息裝入內存

內存中暫時不須要的內容放到硬盤上, 系統彷佛提供了比實際內存大得多的容量,稱之爲虛擬內存

什麼是內存抖動(顛簸)

本質是頻繁的頁調度行爲

​ 頻繁的頁調度,進程不斷產生缺頁中斷 置換一個頁,又不斷再次須要這個頁

​ 運行程序太多,頁面替換策略很差,終止進程或者增長物理內存

py的垃圾回收機制原理?

  • 引用計數爲主(缺點: 循環引用沒法解決)

  • 引入標記清除和分代回收解決引用解決引用計數的問題

  • 引用計數爲主+標記清除和分代回收爲輔

引用計數解決不了循環引用問題

  • 兩個對象相互引用沒法清除

  • 標記清除(Mark and Sweep)

  • 分代回收
    • 分三代 0 1 2 每一代使用雙向鏈表
  • 標記回收 閾值

線程練習題

編寫多線程爬蟲

如何使用py的threading模塊

使用py的Threading模塊完成一個多線程爬蟲類

​ 要求1:該類能夠傳入最大線程數和須要抓取的網址列表

​ 要求2:該類能夠經過繼承的方式提供一個處理response的方法

相關文章
相關標籤/搜索