一.進程和線程的區別?
1. 進程是資源分配的最小單位, 線程是cpu進行調度的最小單位。
2. 一個進程可以看做一個運行的程序, 一個進程中可以包含多個線程, 線程在進程內執行。
3. 多進程是指操作系統能同時運行多個任務(程序),多線程是指在同一程序中有多個順序流在執行。
4. 進程擁有自己的內存空間。線程使用進程的內存空間,和該進程的其他線程共享這個空間。
5. 線程可以控制同一進程的其他線程。進程無法控制兄弟進程,只能控制其子進程。
6. 線程可以使用 wait(),notify(),notifyAll()等方法直接與其他線程(同一進程)通信, 進程需要使用“進程間通信”(IPC)來與操作系統中的其他進程通信。
7. 在創建或撤消進程時,由于系統都要為之分配和回收資源,導致系統的開銷明顯大于創建或撤消線程時的開銷。
二. 什么是線程的上下文
1. 某一時間點CPU寄存器和程序計數器的內容,被稱為上下文。
2. 寄存器是CPU內部的少量速度很快的閃存。
3. 程序計數器是一個專用的寄存器,被用來表示指令序列中CPU正在執行的位置。
三.什么會引起線程的上下文切換
1. 當前線程任務正常完成,CPU調度下一個任務
2. 當前任務被掛起,比如用了sleep方法,wait方法,yeild方法等,讓出了CPU
3. 多個任務搶占鎖資源,當前任務沒搶到,就會被調度器掛起,然后調度器會執行下一個任務
4. 當前任務執行I/O等會引起阻塞的操作,調度器會掛起這個任務,然后執行下一個任務
四. Java 進程間的幾種通信方式
1. 管道(pipe): 管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
2. 有名管道 (named pipe): 有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信
3. 信號量(semophore): 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
4. 消息隊列(message queue): 消息隊列是由消息的鏈表,存放在內核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大 小受限等缺點
5. 信號 (sinal): 信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經發生
6. 共享內存(shared memory): 共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量配合使用,來實現進程間的同步和通信
7. 套接字(socket):套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同及其間的進程通信。
五.信號量與信號的區別?
1. 信號:(signal)是一種處理異步事件的方式。信號是比較復雜的通信方式,用于通知接受進程有某種事件發生,除了用于進程外,還可以發送信號給進程本身。
2. 信號量:(Semaphore)進程間通信處理同步互斥的機制。是在多線程環境下使用的一種設施, 它負責協調各個線程, 以保證它們能夠正確、合理的使用公共資源。
3. 簡單地說,信號就是一種異步通信,通知進程某種事件的發生;信號量是進程/線程同步與互斥的一種機制,保證進程/線程間之間的有序執行或對公共資源的有序訪問。
六.select、poll、epoll 區別有哪些?
1. select:它僅僅知道了,有 I/O 事件發生了,卻并不知道是哪那幾個流(可能有一個,多個, 甚至全部),我們只能無差別輪詢所有流,找出能讀出數據,或者寫入數據的流,對他們進行操作。所以 select 具有 O(n)的無差別輪詢復雜度,同時處理的流越多,無差別輪詢時間就越長。
2. poll:poll 本質上和 select 沒有區別,它將用戶傳入的數組拷貝到內核空間,然后查詢每個 fd 對應的設備狀態,但是它沒有最大連接數的限制,原因是它是基于鏈表來存儲的.
3. epoll:epoll 可以理解為 event poll,不同于忙輪詢和無差別輪詢,epoll 會把哪個流發生了怎樣的 I/O 事件通知我們。所以我們說 epoll 實際上是事件驅動(每個事件關聯上 fd)的,此時我們對這些流的操作都是有意義的。(復雜度降低到了 O(1)),通過紅黑樹和雙鏈表數據結構,并結合回調機制,造就了 epoll 的高效,epoll_create(),epoll_ctl()和 epoll_wait()系統調用。
七.select 和 epoll 的底層結構是什么原理
1. select: 支持阻塞操作的設備驅動通常會實現一組自身的等待隊列如讀/寫等待隊列用于支持上層(用戶層)所需的 BLOCK 或 NONBLOCK 操作。當應用程序通過設備驅動訪問該設備時 (默認為 BLOCK 操作),若該設備當前沒有數據可讀或寫,則將該用戶進程插入到該設備驅動對應的讀/寫等待隊列讓其睡眠一段時間,等到有數據可讀/寫時再將該進程喚醒。 select 就是巧妙的利用等待隊列機制讓用戶進程適當在沒有資源可讀/寫時睡眠,有資源可讀/寫時喚醒。
2. epoll: epoll由三個系統調用組成,分別是 epoll_create,epoll_ctl 和 epoll_wait。 epoll_create 用于創建和初始化一些內部使用的數據結構;epoll_ctl 用于添加,刪除或者修改指定的 fd 及其期待的事件,epoll_wait 就是用于等待任何先前指定的 fd 事件。
八.當你用瀏覽器打開一個鏈接的時候,計算機做了哪些工作步驟?
1. 域名解析
2. 發起 TCP 的 3 次握手
3. 建立 TCP 連接后發起 http 請求
4. 服務器響應 http 請求
5. 瀏覽器得到 html 代碼
6. 瀏覽器解析 html 代碼,并請求 html 代碼中的資源(如 js、css、圖片等)
7. 瀏覽器對頁面進行渲染呈現給用戶 。
九.UDP 協議和 TCP 協議的區別?
1. TCP 基于連接,UDP 基于無連接
2. TCP 要求系統資源較多,UDP 較少
3. UDP 程序結構較簡單
4. TCP 保證數據正確性,UDP 可能丟包
5. TCP 保證數據順序,UDP 不保證
十.父進程如果宕掉,子進程會怎樣?
1. 如果父進程是會話首進程,那么父進程退出后,子進程也會退出;
2. 如果父進程不是會話首 進程,那么父進程退出后,子進程不會退出,而它的一個或多個子進程還在運行,那么這些子 進程就成為孤兒進程。
十一. 孤兒進程和僵尸進程有什么區別?
1. 孤兒進程:父進程結束了,而它的一個或多個子進程還在運行,那么這些子進程就成為孤兒進 程(father died)。子進程的資源由 init 進程(進程號 PID = 1)回收。
2. 僵尸進程:子進程退出了,但是父進程沒有用 wait 或 waitpid 去獲取子進程的狀態信息, 那么子進程的進程描述符仍然保存在系統中,這種進程稱為僵死進程。