圖解分析Javaweb進(jìn)程與線程
一、認(rèn)識(shí)進(jìn)程
1,線程初識(shí)
一個(gè)可執(zhí)行程序運(yùn)行起來,就可以看作是一個(gè)進(jìn)程
進(jìn)程也是操作系統(tǒng)分配資源的最小單元
一個(gè)進(jìn)程在內(nèi)核中都會(huì)對(duì)應(yīng)一個(gè)PCB對(duì)象
一個(gè)線程就是一個(gè) "執(zhí)行流". 每個(gè)線程之間都可以按照順訊執(zhí)行自己的代碼. 多個(gè)線程之間 "同時(shí)" 執(zhí)行 著多份代碼.
2,進(jìn)程屬性
進(jìn)程id:身份表示
一組內(nèi)存指針:指向進(jìn)程運(yùn)行時(shí)依賴的指令和數(shù)據(jù)在內(nèi)存的哪個(gè)位置
進(jìn)程狀態(tài):是正在運(yùn)行,還是正在休眠
進(jìn)程優(yōu)先級(jí):這個(gè)進(jìn)程是優(yōu)先上CPU執(zhí)行還是放在后面上
進(jìn)程的上下文:保存了上次進(jìn)程在CPU上執(zhí)行的進(jìn)度,以便下次進(jìn)程上CPU的時(shí)候能夠繼續(xù)執(zhí)行
進(jìn)程的記賬信息:記錄了進(jìn)程在CPU上一共執(zhí)行了多長(zhǎng)時(shí)間,通過這個(gè)時(shí)間來限制不要讓某個(gè)進(jìn)程霸占CPU太久,導(dǎo)致其他進(jìn)程無法執(zhí)行
從微觀上看,一個(gè)CPU同一個(gè)時(shí)刻只能執(zhí)行一個(gè)線程命令
進(jìn)程太多,CPU太少
通過“并發(fā)”的方式,讓CPU快速調(diào)度,微觀上仍然是串行,但調(diào)度上極快,宏觀上就感覺是多個(gè)進(jìn)程齊頭并進(jìn)
二、為什么要有線程
首先, "并發(fā)編程" 成為 "剛需".
單核 CPU 的發(fā)展遇到了瓶頸. 要想提高算力, 就需要多核 CPU. 而并發(fā)編程能更充分利用多核 CPU 資源. 有些任務(wù)場(chǎng)景需要 "等待 IO", 為了讓等待 IO 的時(shí)間能夠去做一些其他的工作, 也需要用到并發(fā)編程.
其次, 雖然多進(jìn)程也能實(shí)現(xiàn) 并發(fā)編程, 但是線程比進(jìn)程更輕量.
創(chuàng)建線程比創(chuàng)建進(jìn)程更快.
銷毀線程比銷毀進(jìn)程更快.
調(diào)度線程比調(diào)度進(jìn)程更快.
三、認(rèn)識(shí)線程與進(jìn)程的區(qū)別
如果把一個(gè)進(jìn)程看作是一個(gè)工廠,線程就是工廠中的若干流水線
線程其實(shí)包含在進(jìn)程中
一個(gè)進(jìn)程可能有多個(gè)線程
每一個(gè)線程都有一段自己要執(zhí)行的邏輯(命令),每一個(gè)線程都是一個(gè)獨(dú)立的“執(zhí)行流”
同一個(gè)進(jìn)程中的很多線程之間,是共享一些資源
四、Linux中的線程
1,內(nèi)核態(tài)與用戶態(tài)
假如你去銀行存款,得在窗口和柜員交互
存款的過程:
1、先和柜員溝通,要存多少錢,存在那個(gè)賬戶上
2、把卡和錢交給柜員
以上都是能感知的到動(dòng)作,相當(dāng)于代碼在用戶態(tài)執(zhí)行
3、柜員拿到東西在電腦上操作
以上是用戶感知不到的,相當(dāng)于代碼在內(nèi)核態(tài)執(zhí)行
用戶態(tài):權(quán)限相對(duì)比較小,只能進(jìn)行一些低風(fēng)險(xiǎn)的操作
內(nèi)核態(tài):比用戶態(tài)高很多
2,PCB描述線程
內(nèi)核只認(rèn)識(shí)PCB
一個(gè)線程和一個(gè)PCB對(duì)應(yīng)
一個(gè)進(jìn)程可能有多個(gè)PCB
這三個(gè)PCB就對(duì)應(yīng)了java.exe這個(gè)進(jìn)程的三個(gè)線程,內(nèi)核中也把這若干從屬同一個(gè)進(jìn)程稱為“線程組”,類似于MySql中的多對(duì)一
五、多種類型
以一個(gè)比較形象的例子,吃蘋果,100蘋果分著吃
線程:分配資源,房間+桌子
進(jìn)程:調(diào)度讓小朋友去吃蘋果
1,單進(jìn)程單線程
2,多進(jìn)程單線程
3,單進(jìn)程多線程
4,多進(jìn)程多線程
5,進(jìn)程中線程分析
一個(gè)線程中最多有多少個(gè)線程
1,CPU的個(gè)數(shù)有關(guān)
2,和線程執(zhí)行的任務(wù)的類型也有關(guān)
CPU密集型:程序一直在執(zhí)行計(jì)算任務(wù)
IO密集型:主要進(jìn)行輸入輸出的操作
多個(gè)線程去搶奪一個(gè)資源可能造成線程不安全
一個(gè)線程如果出現(xiàn)拋出異常,并且沒有很好的處理這個(gè)異常,整個(gè)進(jìn)程就會(huì)被終止,其他線程無法工作
到此這篇關(guān)于圖解分析Javaweb進(jìn)程與線程的文章就介紹到這了,更多相關(guān)Javaweb 進(jìn)程 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot定時(shí)任務(wù)Scheduled重復(fù)執(zhí)行操作
這篇文章主要介紹了Springboot定時(shí)任務(wù)Scheduled重復(fù)執(zhí)行操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09淺談關(guān)于Mybatis的mapper-locations配置問題
MyBatis 是一款優(yōu)秀的半自動(dòng)的ORM持久層框架,它支持自定義 SQL、存儲(chǔ)過程以及高級(jí)映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作,需要的朋友可以參考下2023-05-05Springmvc如何實(shí)現(xiàn)向前臺(tái)傳遞數(shù)據(jù)
這篇文章主要介紹了Springmvc如何實(shí)現(xiàn)向前臺(tái)傳遞數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07詳解SpringCloud微服務(wù)架構(gòu)之Hystrix斷路器
本篇文章主要介紹了詳解SpringCloud微服務(wù)架構(gòu)之Hystrix斷路器,Hystrix是一個(gè)庫,通過添加延遲容差和容錯(cuò)邏輯來幫助您控制這些分布式服務(wù)之間的交互,有興趣的可以了解一下2018-01-01Spring核心容器之ApplicationContext上下文啟動(dòng)準(zhǔn)備詳解
這篇文章主要介紹了Spring核心容器之ApplicationContext上下文啟動(dòng)準(zhǔn)備詳解,ApplicationContext 繼承自 BeanFactory ,其不僅包含 BeanFactory 所有功能,還擴(kuò)展了容器功能,需要的朋友可以參考下2023-11-11SpringBoot在RequestBody中使用枚舉參數(shù)案例詳解
這篇文章主要介紹了SpringBoot在RequestBody中使用枚舉參數(shù)案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09IDEA SpringBoot項(xiàng)目配置熱更新的步驟詳解(無需每次手動(dòng)重啟服務(wù)器)
這篇文章主要介紹了IDEA SpringBoot項(xiàng)目配置熱更新的步驟,無需每次手動(dòng)重啟服務(wù)器,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04