1. 程式人生 > >【面試題】Linux相關

【面試題】Linux相關

1.常用命令有哪些

  • 檔案相關命令

    • head -n、tail、ln、locate、wc、more、less、ll、dd、df、du、tar-zxvf、ls、nl、cat、pwd、mkdir、rm 、cd、cp、touch、 awk、
    • date由localtime函式將時間數值轉換為日期,是非執行緒安全的(靜態變數)。 而localtime_r和strftime是執行緒安全的。
    • find -name、-user、-mtime -n、-size -n
    • ln:硬連結:以檔案副本的形式存在,但同步更新,不佔用實際空間,不允許給目錄建立硬連結,只有在同一個檔案系統中才能建立,共享i節點,i節點引用計數遞增,刪除任意一個檔案不會對其他檔案造成影響,因為只有引用計數為零時才真正刪除檔案。
    • ln-s:軟連線,以路徑的形式存在。可跨檔案系統 ,可以對一個不存在的檔名進行連結、可以對目錄進行連結
  • 許可權相關命令
    chmod、chgrp、chown、sudo、useradd。

  • 網路相關命令

    • iptables、tcpdump、wget -b、netstat-an、 ss-ln、ping-c、ifconfig、telnet、apt-get
    • tcpdump -i 指定監聽的網路介面,例tcpdump -nvvv -i any -c 3 port 22 and port 8080:只輸出埠號是 22 和 8080 的資料包
  • 程序相關命令
    ps-ef(aux)、kill-9、lsof、strace、free-m、sysctl-w、nice-n 、renice-p、vmstat 3、ulimit -a -n -s、 top @duck1

  • 計劃任務命令
    at、crontab、2>

  • vim常用命令

    • 命令模式:ZZ、dd、D、yy、p、gg、G、
    • 進入插入模式:a、i、o、r.
    • 編輯模式::setnu 、:setnonu、:/、:?、:5,10s/cat/dog/g

2.Linux的五種IO模型

  • BIO:能夠及時返回資料,無延遲,效能低。
  • NIO:能夠在等待任務完成的過程中處理其他事件,需要不斷詢問資料是否準備好了,但拷貝資料的整個過程,程序仍然是阻塞的,延遲會增加
  • 多路複用IO:有資料可讀或可寫(就緒事件),就通知使用者程序
  • 訊號驅動IO:當資料準備完成之後,會主動的通知使用者程序
  • AIO:當用戶程序發起系統呼叫後,立刻就可以開始去做其它的事情,讀寫操作由核心完成,完成後核心將資料放到指定的緩衝區,通知應用程式來取

3.IO多路複用select/poll/epoll?

  • select

    • 引數nfds:被監聽的檔案描述符的總數;readfds:可讀;writefds:可寫;exceptfds:異常;timeout:超時時間(s、us),
    • fd_set結構體僅包含一個整型陣列,能容納的檔案描述符數量由FD_SETSIZE指定,所以select檔案描述符的數量存在最大限制
    • 對socket進行線性掃描,即採用輪詢的方法,O(n),使用者空間和核心空間在傳遞fd時複製開銷大
    • 若timeout呼叫失敗,它的值是不確定的,所以說不能完全信任該值
  • pselect
    新增sigmask引數,為null時和select相同,timeout引數具有精確(s、ns)、不變的特性

  • poll

    • 引數struct pollfd *fds表示fd、events、revents;nfds:指定被監聽事件集合fds的大小;timeout:指定poll的超時值(ms)
    • 沒有最大連線數的限制,因為它是基於連結串列來儲存的,
    • 大量的fd的陣列被整體複製於使用者態和核心地址空間之間,開銷大,輪詢方式,O(n)
  • dev / poll是Solaris的推薦輪詢替換
    開啟後,輪詢程序必須先初始化一個pollfd結構,可以預先設定感興趣描述符的列表,然後迴圈等待事件發生,而select和poll需要每次輪詢所有fd,它是級別觸發的,比poll快。

  • epoll

    • 三個函式epoll_create(size);epoll_ctl(epfd, op, fd, event);epoll_wait(epfd, events, maxevents, timeout);
    • 沒有最大併發連線的限制,1G的記憶體上能監聽約10萬個埠
    • 回撥機制:活躍的FD才會呼叫callback函式
    • 記憶體拷貝:利用一個檔案描述符管理多個描述符,將使用者關係的檔案描述符的事件存放到核心的一個事件表中,在使用者空間和核心空間的copy只需一次。即epoll使用mmap(共享記憶體)減少複製開銷,
    • LT(預設):fd可讀或可寫就通知應用程式,若不做任何操作,下次還會再通知,支援阻塞和非阻塞介面。
    • ET:fd有可讀或可寫事件通知應用程式,只通知一次,必須使用非阻塞介面,以避免檔案描述符的飢餓情況發生。
    • epoll適用於同時需要保持大量長連線,而且連線的關閉很頻繁時,但其中只有少數的連線是活躍的。select/poll適用於連線數少並且連線都十分活躍,
  • Kqueue專用於FreeBSD系統,只能用於UFS檔案系統

    • 函式 kqueue()類似於epoll_create()。而kevent函式集成了epoll_ctl()和epoll_wait() 的角色,kevent可以一次系統呼叫多次更新興趣集。而epoll不能在單次系統呼叫中多次更新興趣集,kevent結構體支援多種非檔案事件,而epoll只能基於檔案描述符工作
    • Kqueue支援磁碟檔案,而epoll並不支援所有的檔案描述符,它是基於準備就緒模型的
  • IOCP:專用於Windows
    支援asynchronous I/O的系統,是Proactor模式,但由於侷限性,大型伺服器部署在UNIX。

4.看過epoll的原始碼嗎?

  • epoll_create()函式的size引數沒用,只是為了相容(之前是hash表),該函式由巨集定義(系統限制了引數個數和傳參方式),它的主要功能是通過sys_epoll_create1()函式來完成的

  • epoll_create1()函式通過ep_alloc生成一個eventpoll物件,並初始化eventpoll的三個等待佇列,wait,poll_wait以及rdlist 。同時還會初始化被監視fs的rbtree 根節點。

  • evet_init()函式會做一些系統化的工作,建立檔案資訊等。

  • epoll_ctl()函式:通過epoll_create生成一個eventpoll後,可以通過epoll_ctl提供的相關操作(ep_find),根據op的型別對eventpoll進行ADD(ep_insert),MOD(ep_modify),DEL(ep_remove)操作。

  • ep_insert()函式:從slub中分配一個epitem的物件。並初始化epitem的三個list頭指標,指向傳入的eventpoll,將epitem插入目標檔案的polllist並註冊回撥函式;將epitem插入eventpoll的rbtree。

  • Poll()函式是系統函式,一般由裝置驅動提供。

  • poll_wait()函式呼叫 ep_ptable_queue_proc()函式

  • ep_ptable_queue_proc():使用等待佇列實現epitem和callback函式的關聯。然後通過目標檔案的poll函式呼叫callback函式。

  • ep_poll_callback()函式:當fd狀態改變時(感興趣事件),呼叫該函式,首先會把檔案描述符epitem 放到eventpoll 的rdllist中,然後呼叫wake_up函式喚醒epitem上wq的程序。這樣就可以返回到epoll_wait的呼叫者,將他喚醒。

  • epoll_wait()函式:首先會檢測傳入引數的合法性,epfd是否合法等。然後通過file->private_data獲取eventpoll。獲取epoll後呼叫ep_poll函式完成真正的epoll_wait工作。

  • ep_poll()函式:首先根據timeout的值判斷是否是無限等待,然後判斷eventpoll的rdlist是否為空,如果為空,那麼將current程序通過一個waitquene entry加入eventpoll的waitlist(wq)。如果rdlist非空,那麼通過ep_send_events將event轉發到使用者空間。

  • ep_send_events函式呼叫ep_scan_ready_list對ready_list進行掃描

  • ep_scan_ready_list對ready_list進行掃描。將所有的epitem都轉移到了txlist上, 而rdllist被清空了。然後呼叫ep_send_events_proc()函式。

  • ep_send_events_proc掃描rdlist從頭上面拿出epitem,然後呼叫ep_eventpoll_poll函式,完成轉發。
    先把就緒事件連結串列轉移到中間連結串列,然後挨個遍歷拷貝到使用者空間,並且判斷是否為水平觸發,是的話再次插入到就緒連結串列。

  • LT與ET的區別:通過ep_send_events_proc()函式實現,用if判斷如果沒有標上EPOLLET(預設的LT)且“事件被關注”的fd就會被重新放回了rdllist。那麼下次epoll_wait當然會又把rdllist裡的fd拿來拷給使用者了。

5.程序的排程演算法?

  • 程序分類

    • 程序區分為實時程序:不會被低優先順序的程序阻塞. 響應時間儘可能短;互動式程序:當接受了使用者的輸入後, 程序必須很快被喚醒, 否則使用者會感覺系統反應遲鈍;批處理程序:經常在後臺執行。
    • 按優先順序分,時間片:CPU分配給各個程式的時間,每個執行緒被分配一個時間段,
  • 排程策略

    • 先來先服務:相同優先順序的任務先到先服務,高優先順序的任務可以搶佔低優先順序的任務
    • 短作業優先:從後備佇列中選擇一個或若干個估計執行時間最短的作業,將它們調入記憶體執行
    • 優先順序排程:具有最高優先權的程序會被分配到CPU,用老化解決飢餓問題。
    • 時間片輪轉:相同優先順序的任務當用完時間片會被放到佇列尾部,以保證公平性,高優先順序可以搶佔低優先順序的任務
    • 多級佇列排程:分為多個獨立佇列,互動式(輪轉排程)和批處理(FCFS),每個佇列都有自己的排程演算法。
    • 多級反饋佇列排程:允許程序在佇列之間移動,以此實現老化

6.程序間通訊方式?

  • 管道:一種半雙工的通訊方式,資料只能單向流動

    • 無名管道:只能在具有親緣關係的程序間使用。即父子程序關係。
    • 有名管道: 允許無親緣關係程序間的通訊。
  • 訊號: 訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。

  • 訊號量: 訊號量是一個計數器,可以用來控制多個程序對共享資源的訪問。常作為一種鎖機制,防止某程序在訪問資源時其它程序也訪問該資源。

  • 訊息佇列 : 訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

  • 共享記憶體:對映一段能被其他程序所訪問的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以訪問。共享記憶體是最快的 IPC 方式,

  • 套接字: 它可用於不同機器間的程序通訊。



本人才疏學淺,若有錯,請指出,謝謝!
如果你有更好的建議,可以留言我們一起討論,共同進步!
衷心的感謝您能耐心的讀完本篇博文!