天天看點

暑期實習準備--作業系統作業系統多線程

作業系統

程序間通信:

暑期實習準備--作業系統作業系統多線程

暑期實習準備--作業系統作業系統多線程

暑期實習準備--作業系統作業系統多線程

暑期實習準備--作業系統作業系統多線程

暑期實習準備--作業系統作業系統多線程

暑期實習準備--作業系統作業系統多線程

Linux 系統下你關注過哪些核心參數,說說你知道的。

暑期實習準備--作業系統作業系統多線程

Tcp/ip io cpu memory 

net.ipv4.tcp_syncookies = 1 

#啟用syncookies 

net.ipv4.tcp_max_syn_backlog = 8192 

#SYN隊列長度 

net.ipv4.tcp_synack_retries=2 

#SYN ACK重試次數 

net.ipv4.tcp_fin_timeout = 30 

#主動關閉方FIN-WAIT-2逾時時間 

net.ipv4.tcp_keepalive_time = 1200 

#TCP發送keepalive消息的頻度 

net.ipv4.tcp_tw_reuse = 1 

#開啟TIME-WAIT重用 

net.ipv4.tcp_tw_recycle = 1 

#開啟TIME-WAIT快速回收 

net.ipv4.ip_local_port_range = 1024 65000 

#向外連接配接的端口範圍 

net.ipv4.tcp_max_tw_buckets = 5000 

#最大TIME-WAIT數量,超過立即清除 

net.ipv4.tcp_syn_retries = 2 

#SYN重試次數 

echo “fs.file-max=65535” >> /etc/sysctl.conf 

sysctl -p

http://www.haiyun.me/category/system/

Linux 下 IO 模型有幾種,各自的含義是什麼。

阻塞式io,非阻塞io,io複用模型,信号驅動io模型,異步io模型。 

https://yq.aliyun.com/articles/46404 

https://yq.aliyun.com/articles/46402

epoll 和 poll 有什麼差別。

select的本質是采用32個整數的32位,即32*32= 1024來辨別,fd值為1-1024。當fd的值超過1024限制時,就必須修改FD_SETSIZE的大小。這個時候就可以辨別32*max值範圍的fd。 

對于單程序多線程,每個線程處理多個fd的情況,select是不适合的。 

1.所有的線程均是從1-32*max進行掃描,每個線程處理的均是一段fd值,這樣做有點浪費 

2.1024上限問題,一個處理多個使用者的程序,fd值遠遠大于1024 

是以這個時候應該采用poll, 

poll傳遞的是數組頭指針和該數組的長度,隻要數組的長度不是很長,性能還是很不錯的,因為poll一次在核心中申請4K(一個頁的大小來存放fd),盡量控制在4K以内 

epoll還是poll的一種優化,傳回後不需要對所有的fd進行周遊,在核心中維持了fd的清單。select和poll是将這個核心清單維持在使用者态,然後傳遞到核心中。但是隻有在2.6的核心才支援。 

epoll更适合于處理大量的fd ,且活躍fd不是很多的情況,畢竟fd較多還是一個串行的操作 

https://yq.aliyun.com/articles/10525

平時用到哪些 Linux 指令。

Ls,find,tar,tail,cp,rm,vi,grep,ps,pkill等等 

https://yq.aliyun.com/articles/69417?spm=5176.100240.searchblog.18.Zrbh9R

用一行指令檢視檔案的最後五行。

Tail -n 5 filename

用一行指令輸出正在運作的 java 程序。

ps -ef|grep Java

介紹下你了解的作業系統中線程切換過程。

控制權的轉換,根據優先級切換上下文(使用者,寄存器,系統) 

http://www.cnblogs.com/kkshaq/p/4544426.html

程序和線程的差別。

Linux 實作并沒有區分這兩個概念(程序和線程) 

1. 程序:程式的一次執行 

2. 線程:CPU的基本排程機關 

一個程序可以包含多個線程。

http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

多線程

多線程的幾種實作方式,什麼是線程安全。

實作runable接口,繼承thread類。 

http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/

volatile 的原理,作用,能代替鎖麼。

Volatile利用記憶體栅欄機制來保持變量的一緻性。不能代替鎖,其隻具備資料可見性一緻性,不具備原子性。 

http://blog.csdn.net/gongzi2311/article/details/20715185

畫一個線程的生命周期狀态圖。

建立,可運作,運作中, 睡眠,阻塞,等待,死亡。 

暑期實習準備--作業系統作業系統多線程

http://ifeve.com/thread-status

sleep 和 wait 的差別。

Sleep是休眠線程,wait是等待,sleep是thread的靜态方法,wait則是object的方法。 

Sleep依舊持有鎖,并在指定時間自動喚醒。wait則釋放鎖。 

http://www.jianshu.com/p/4ec3f4b3903d

Lock 與 Synchronized 的差別。

首先兩者都保持了并發場景下的原子性和可見性,差別則是synchronized的釋放鎖機制是交由其自身控制,且互斥性在某些場景下不符合邏輯,無法進行幹預,不可人為中斷等。 

而lock常用的則有ReentrantLock和readwritelock兩者,添加了類似鎖投票、定時鎖等候和可中斷鎖等候的一些特性。此外,它還提供了在激烈争用情況下更佳的性能。 

http://blog.csdn.net/vking_wang/article/details/9952063

synchronized 的原理是什麼,解釋以下名詞:重排序,自旋鎖,偏向鎖,輕量級鎖,可重入鎖,公平鎖,非公平鎖,樂觀鎖,悲觀鎖。

Synchronized底層是通過螢幕的enter和exit實作 

https://my.oschina.net/cnarthurs/blog/847801 

http://blog.csdn.net/a314773862/article/details/54095819

用過哪些原子類,他們的原理是什麼。

AtomicInteger; AtomicLong; AtomicReference; AtomicBoolean;基于CAS原語實作 ,比較并交換、加載連結/條件存儲,最壞的情況下是旋轉鎖 

https://www.ibm.com/developerworks/cn/java/j-jtp11234/index.html 

http://www.jmatrix.org/java/848.html

用過線程池嗎,newCache 和 newFixed 有什麼差別,他們的原理簡單概括下,構造函數的各個參數的含義是什麼,比如 coreSize,maxsize 等。

newSingleThreadExecutor傳回以個包含單線程的Executor,将多個任務交給此Exector時,這個線程處理完一個任務後接着處理下一個任務,若該線程出現異常,将會有一個新的線程來替代。

  newFixedThreadPool傳回一個包含指定數目線程的線程池,如果任務數量多于線程數目,那麼沒有沒有執行的任務必須等待,直到有任務完成為止。

newCachedThreadPool根據使用者的任務數建立相應的線程來處理,該線程池不會對線程數目加以限制,完全依賴于JVM能建立線程的數量,可能引起記憶體不足。 

底層是基于ThreadPoolExecutor實作,借助reentrantlock保證并發。 

coreSize核心線程數,maxsize最大線程數。 

http://ifeve.com/java-threadpoolexecutor/

線程池的關閉方式有幾種,各自的差別是什麼。

Shutdown shutdownNow tryTerminate 清空工作隊列,終止線程池中各個線程,銷毀線程池 

http://blog.csdn.net/xxcupid/article/details/51993235

假如有一個第三方接口,有很多個線程去調用擷取資料,現在規定每秒鐘最多有 10 個線程同時調用它,如何做到。

ScheduledThreadPoolExecutor 設定定時,進行排程。 

public ScheduledThreadPoolExecutor(int corePoolSize, 

ThreadFactory threadFactory) { 

super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS, 

new DelayedWorkQueue(), threadFactory); 

}

http://ifeve.com/java-scheduledthreadpoolexecutor/

spring 的 controller 是單例還是多例,怎麼保證并發的安全。

單例 

通過單例工廠 DefaultSingletonBeanRegistry實作單例 

通過保AsyncTaskExecutor持安全

用三個線程按順序循環列印 abc 三個字母,比如 abcabcabc。

public static void main(String[] args) { 

final String str=”abc”; 

ExecutorService executorService= Executors.newFixedThreadPool(3); 

executorService.execute(new Runnable() { 

@Override 

public void run() { 

System.out.println(“1”+str); 

});executorService.execute(new Runnable() { 

@Override 

public void run() { 

System.out.println(“2”+str); 

});executorService.execute(new Runnable() { 

@Override 

public void run() { 

System.out.println(“2”+str); 

}); 

}

ThreadLocal 用過麼,用途是什麼,原理是什麼,用的時候要注意什麼。

Threadlocal底層是通過threadlocalMap進行存儲鍵值 每個ThreadLocal類建立一個Map,然後用線程的ID作為Map的key,執行個體對象作為Map的value,這樣就能達到各個線程的值隔離的效果。 

ThreadLocal的作用是提供線程内的局部變量,這種變量線上程的生命周期内起作用,減少同一個線程内多個函數或者元件之間一些公共變量的傳遞的複雜度。 

誰設定誰負責移除 

http://qifuguang.me/2015/09/02/[Java%E5%B9%B6%E5%8F%91%E5%8C%85%E5%AD%A6%E4%B9%A0%E4%B8%83]%E8%A7%A3%E5%AF%86ThreadLocal/

如果讓你實作一個并發安全的連結清單,你會怎麼做。

Collections.synchronizedList() ConcurrentLinkedQueue 

http://blog.csdn.net/xingjiarong/article/details/48046751

有哪些無鎖資料結構,他們實作的原理是什麼。

LockFree,CAS 

基于jdk提供的原子類原語實作,例如AtomicReference 

http://blog.csdn.net/b_h_l/article/details/8704480

講講 java 同步機制的 wait 和 notify。

首先這兩個方法隻能在同步代碼塊中調用,wait會釋放掉對象鎖,等待notify喚醒。 

http://blog.csdn.net/ithomer/article/details/7685594

多線程如果線程挂住了怎麼辦。

根據具體情況(sleep,wait,join等),酌情選擇notifyAll,notify進行線程喚醒。 

http://blog.chinaunix.net/uid-122937-id-215913.html

countdowlatch 和 cyclicbarrier 的内部原理和用法,以及互相之間的差别。

CountDownLatch是一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它運作一個或者多個線程一直處于等待狀态。 

CyclicBarrier要做的事情是,讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最後一個線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續運作。 

CyclicBarrier初始化的時候,設定一個屏障數。線程調用await()方法的時候,這個線程就會被阻塞,當調用await()的線程數量到達屏障數的時候,主線程就會取消所有被阻塞線程的狀态。 

前者是遞減,不可循環,後者是遞加,可循環用 

countdowlatch 基于abq cb基于ReentrantLock Condition 

http://www.jianshu.com/p/a101ae9797e3 

http://blog.csdn.net/tolcf/article/details/50925145

使用 synchronized 修飾靜态方法和非靜态方法有什麼差別。

對象鎖和類鎖 

https://yq.aliyun.com/articles/24226

簡述 ConcurrentLinkedQueue LinkedBlockingQueue 的用處和不同之處。

LinkedBlockingQueue 是一個基于單向連結清單的、範圍任意的(其實是有界的)、FIFO 阻塞隊列。 

ConcurrentLinkedQueue是一個基于連結節點的無界線程安全隊列,它采用先進先出的規則對節點進行排序,當我們添加一個元素的時候,它會添加到隊列的尾部,當我們擷取一個元素時,它會傳回隊列頭部的元素。它采用了“wait-free”算法來實作,該算法在Michael & Scott算法上進行了一些修改, Michael & Scott算法的詳細資訊可以參見參考資料一。 

http://ifeve.com/concurrentlinkedqueue/ 

http://ifeve.com/juc-linkedblockingqueue/ 

http://blog.csdn.net/xiaohulunb/article/details/38932923

導緻線程死鎖的原因?怎麼解除線程死鎖。

死鎖問題是多線程特有的問題,它可以被認為是線程間切換消耗系統性能的一種極端情況。在死鎖時,線程間互相等待資源,而又不釋放自身的資源,導緻無窮無盡的等待,其結果是系統任務永遠無法執行完成。死鎖問題是在多線程開發中應該堅決避免和杜絕的問題。 

一般來說,要出現死鎖問題需要滿足以下條件: 

1. 互斥條件:一個資源每次隻能被一個線程使用。 

2. 請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。 

3. 不剝奪條件:程序已獲得的資源,在未使用完之前,不能強行剝奪。 

4. 循環等待條件:若幹程序之間形成一種頭尾相接的循環等待資源關系。 

隻要破壞死鎖 4 個必要條件之一中的任何一個,死鎖問題就能被解決。 

https://www.ibm.com/developerworks/cn/java/j-lo-deadlock/

非常多個線程(可能是不同機器),互相之間需要等待協調,才能完成某種工作,問怎麼設計這種協調方案。

此問題的本質是保持順序執行。可以使用executors