計算機-編程相關

在 Linux 中、一切都是文件、硬件設備是文件、管道是文件、網絡套接字也是文件。

for

https://juejin.cn/post/6844904103437582344

fork 進程的一些問題

fork 函數比較特殊、一次調用會返回兩次。在父進程和子進程都會返回。

每個進程在內核中都是一個 taskstruct 結構、fork 的時候、內核把內核中原來的 task_struct 拷貝了一份

還創建了一個全新的地址空間和堆棧

在這里插入圖片描述

進程的地址空間沒有拷貝,子進程和父進程是在共享內存空間的。都是映射到同一個物理內存頁上的

在這里插入圖片描述

內核把這些頁面都設置成只讀、如果你們是讀的話、不會有問題、但是有一方嘗試寫入、就會觸發異常。內核發現異常后再分配一個新的頁面讓你們分開使用。這個就是寫時復制。

在這里插入圖片描述

線程的棧

線程的棧默認是 8M、實際上一開始分配給棧并不是那么大的空間。會按需自動增大。直到大于 8M 就會棧溢出。

進程間如何通信

信號

信號時 Linux 上的一種軟中斷通信機制、可以向制定進程發送通知。總共有 64 種信號、不過信號只能作為通知使用。沒辦法傳輸數據。

socket 套接字

網絡通信使用。可以將連接的地址設置為 127.0.0.1 作為本地計算機通信。這樣子的話、不需要經過網卡、因為 127.0.0.1 是本地回環地址,數據在協議棧就轉發。 但是抓包可以抓到、因為在虛擬的回環網卡lo上抓到。

匿名管道

單向。滿了會阻塞

需要有親緣關系的進程繼承指揮才能通信。

命名管道

只要指明管道名稱就能通信。不需要進程間有關系。

消息隊列

共享內存

IO 多路復用

自己寫了一個 web 服務進程。監聽某個端口、如何處理客戶端的連接請求。(單線程 while 去接受處理客戶端連接請求)

當客戶連接成功之后、但是一直不傳輸數據、線程會一直卡在那里、并且沒法再處理其他客戶的連接請求了

多線程去應對

每一個連接過來都去創建一個新的線程去處理。

select 模型

越來越多的連接過來了、線程越來越多、終于頂唔住了。。。。

I/O 多路復用

有個叫 select 的函數、你把文件描述符批量傳給他,平時他阻塞在那里、只要其中有一個有消息來、它就會返回,你這個時候去檢查睡來消息,并去處理就行了。

select 函數是怎么做到的?

它會遍歷所有的文件描述符、把你掛入與這些文件描述符相關聯的設備等待隊列中、如何交出執行權進入阻塞,等后面這些設備來消息、然后通過回調函數通知你。把你喚醒。

但是 select 函數底層時使用位圖數組來存儲要管理的文件描述符的、容量有上線。最多只能同時處理 1024 個文件描述符。

poll

但是 poll 和 select 一樣。慢!!

為啥慢?

1、 每次返回后不告訴程序到底是哪一個文件描述符有消息、需要程序一個個遍歷。耽擱了不少時間

2、每次調用他們的時候、都要把所有的文件描述符從用戶態地址空間拷貝到內核中,這樣子經常拷貝也費時間。

epoll

epoll 這個多路復用模型、不需要每次拷貝全部的數據、只需要增減就行。因為它內部采用紅黑樹來管理監聽的文件描述符,所以查找起來很快。而且它內部還有一個隊列、所有就緒的文件描述符都會進入中國隊列。程序不再需要遍歷所有的文件描述符去找來消息的那個了。

像訪問內存一樣讀寫文件

在這里插入圖片描述

因為磁盤太慢了、所以在內核空間中給每一個要讀取的文件建立一個數據結構。里面記錄了已經緩存的文件數據塊信息。從硬盤讀過來的數據就緩存到內存。并記錄到這個數據結構中。

以后讀取文件的時候、先通過這個數據結構去查詢、查到就直接拷貝給應用、查不到才去找磁盤要。

CPU的局部性原理在這里也適用。

在寫文件的時候是先寫到這個緩存里面、并不會立即同步刷到磁盤的、這時候突然斷電、緩存的數據就會丟掉了。

sync 函數、只要你調用它、就會馬上進行同步、寫入硬盤。

內存映射文件

讀取文件時需要進行兩次拷貝、第一次從磁盤拷貝到內核的緩存頁中、第二次把它從緩存中拷貝到應用程序的緩沖區中。

寫的時候也是同理。

把文件的數據緩存頁映射到用戶態地址空間、這樣用戶態地址空間的緩沖區和緩存頁就能映射到同一個物理內存頁。

在這里插入圖片描述

再進一步的話就是

在進程的地址空間劃分一塊區域和文件內容簡歷映射關系、等到應用程序訪問這部分區域的時候、會發生缺頁中斷錯誤、這時我們把數據從硬盤讀取到緩存頁中、再把緩存頁和進程中缺頁中斷的頁面關聯起來。

這樣子對應用無感。不用再使用 read、write、fseek 這樣麻煩地讀寫文件。

在這里插入圖片描述

這個 api 叫 mmap 內存映射文件。

協程

A:Java 線程執行阻塞函數時被操作系統掛起、切換到別的線程。

B:線程切換是否需要成本?如果大量線程頻繁切換、成本又當如何?

A:如果擔心這個問題、那就不用阻塞函數、通過異步回調進行。

B:異步回調確實不用阻塞、不過它有兩點不好、其一就是割裂了原來的業務代碼、其二就是回調地獄。

協程

線程可以在執行函數遇到阻塞后,保存執行的上下文、轉而執行別處到代碼。待阻塞請求完成后、再回去繼續執行。

線程是有操作系統統一調度管理的。那么在一個線程中、同樣可以抽象出多個執行流、由線程來統一調度管理、這線程智商抽象的執行流就是協程。

在這里插入圖片描述

線程時操作系統在調度管理、那線程里抽出來的執行流、也就是協程、該怎么調度管理?

OS 通過時鐘中斷和系統調用進入內核來剝奪線程的執行權、那線程如何剝奪協程的執行權來實現調度管理?

協程:協作式程序。它會主動交出執行權。

Java19 已經支持了虛擬線程(協程)、或者使用第三方協程框架 Quasar

https://zhuanlan.zhihu.com/p/425978232

https://book.douban.com/subject/36428782/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14030.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ECMAScript、BOM與DOM:網頁開發的三大基石

在深入Web開發的世界時,有三個核心概念構成了理解網頁如何工作以及如何與之交互的基礎:ECMAScript、BOM(Browser Object Model),以及DOM(Document Object Model)。本文旨在簡要介紹這三個概念&a…

Thingsboard規則鏈:Entity Type Switch節點詳解

在物聯網(IoT)領域,隨著設備數量的爆炸式增長和數據復雜性的增加,高效、靈活的數據處理機制變得至關重要。作為一款先進的物聯網平臺,ThingsBoard提供了強大的規則鏈(Rule Chains)功能&#xff…

第四節 Starter 加載時機和源碼理解

tips:每個 springBoot 的版本不同,代碼的實現存會存在不同。 上一章,我們聊到 mybatis-spring-boot-starter; 簡單分析了它的結構。 這一章我們將著重分析 Starter 的加載機制,并結合源碼進行分析理解。 一、加載實際…

問題與解決:element ui垂直菜單展開后顯示不全

比如我這個垂直菜單展開后,其實系統管理下面還有其他子菜單,但是顯示不出來了。 解決方法很簡單,只需要在菜單外面包一層el-scrollbar,并且將高度設置為100vh。

Laravel 11 PHP8

一直都是用laravel 7 左右的,現在要求將項目升級到laravel 11 和使用PHP8,隨手記錄一些小問題,laravel 11的包是領導給的,沒有使用composer 安裝,所以我也不確定和官方的是否一致 遇到這問題 可以這樣 env 中默認的數…

基于若依的旅游推薦管理系統(spring boot+vue+mybatis+Ajax)

一、項目目的 隨著社會的高速發展,人們生活水平的不斷提高,以及工作節奏的加快,旅游逐漸成為一個熱門的話題,因為其形式的多樣,涉及的面比較廣,成為人們放松壓力,調節情緒的首要選擇。 傳統的旅…

上位機圖像處理和嵌入式模塊部署(mcu的按鍵輸入)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】 做技術的同學,大部分都會把精力放在技術本身,卻忽視了學的東西有什么實際的用途。就拿gpio來說,一般我們點燈也…

正確認識IP地址和子網掩碼的聯系

IP地址和子網掩碼是計算機網絡中兩個非常重要的概念,它們共同確定了設備在局域網中的地址以及該地址所屬的子網,只要兩者結合,就能確定唯一地址IP66_ip歸屬地在線查詢_免費ip查詢_ip精準定位平臺。 IP地址是用于標識計算機網絡中的每臺設備的…

Ajax用法總結(包括原生Ajax、Jquery、Axois)

HTTP知識 HTTP(hypertext transport protocol)協議『超文本傳輸協議』,協議詳細規定了瀏覽器和萬維網服務器之間互相通信的規則。 請求報文 請求行: GET、POST /s?ieutf-8...(url的一長串參數) HTTP/1.1 請求頭…

Buzz庫網絡爬蟲實例:快速爬取百度搜索實時熱點

前言 隨著互聯網的發展,信息獲取已經成為了人們日常生活和工作中的重要一環。而在信息獲取的過程中,網絡爬蟲作為一種自動化的數據采集工具,為我們提供了極大的便利。本文將介紹如何利用PHP編寫一個簡單而高效的網絡爬蟲,實現快速…

R實驗 參數檢驗(二)

實驗目的:掌握正態分布和二項分布中,功效與樣本容量之間的關系;學會利用R軟件完成一個正態總體方差和兩個正態總體方差比的區間估計和檢驗。 實驗內容: (習題5.28)一種藥物可治療眼內高壓,目的…

Mac安裝 Intellij IDEA,親測有效M1、M2可用

引言 最近開始學習使用spring boot寫一個簡單的后端項目,使用Intellij IDEA軟件,Intellij IDEA為新用戶提供了30天的免費試用。 方案 1.官網下載Intellij IDEA IntelliJ IDEA – the Leading Java and Kotlin IDE 或者直接網盤連接下載:…

第一份工資

當我拿到我人生的第一份工資時,那是一種難以言表的激動。我記得那個下午,陽光透過窗戶灑在了我的辦公桌上,我看著那張支票,心中滿是欣喜和自豪。那是我獨立生活的開始,也是我對自己能力的一種肯定。 我記得我是如何支配…

SQL注入:pikachu靶場中的SQL注入通關

目錄 1、數字型注入(post) 2、字符型注入(get) 3、搜索型注入 4、XX型注入 5、"insert/update"注入 Insert: update: 6、"delete"注入 7、"http header"注入 8、盲…

C#實現KMP算法,在長字符串中找到第一個符合要求的子字符串

KMP(Knuth-Morris-Pratt)算法是一種高效的字符串搜索算法,它可以在一個文本字符串(Text)中搜索一個詞(Pattern),時間復雜度為O(nm),其中n是文本字符串的長度,…

vite前端UI框架使用詳解(2024-05-24)

Vite(發音同 "veet")是一種新型前端構建工具,能夠顯著提升前端開發體驗。它主要由兩部分組成: 一個開發服務器,它基于原生的ES模塊提供了豐富的內建功能,如速度快到驚人的 模塊熱更新&#xff08…

【Linux安全】Firewalld防火墻

目錄 一.Firewalld概述 二.Firewalld和iptables的關系 1.firewalld和iptables的聯系 2.firewalld和iptables的區別 三.Firewalld區域 1.概念 2.九個區域 3.區域介紹 4.Firewalld數據處理流程 四.Firewalld-cmd命令行操作 1.查看 2.增加 3.刪除 4.修改 五.Firewa…

arping 一鍵檢測網絡設備連通性(KALI工具系列二)

目錄 1、KALI LINUX簡介 2、arping工具簡介 3、在KALI中使用arping 3.1 目標主機IP(win) 3.2 KALI的IP 4、操作示例 4.1 IP測試 4.2 ARP測試 4.3 根據存活情況返回 5、總結 1、KALI LINUX簡介 Kali Linux 是一個功能強大、多才多藝的 Linux 發…

表現層框架設計之使用XML設計表現層

使用XML設計表現層,統一Web Form與Windows Form的外觀。 1.XML(可擴展標記語言) XML(可擴展標記語言)與HTML類似,是一種標記語言。與主要用于控制數據的顯示和外觀的HTML標記不同,XML標記用于定…

PostgreSQL的擴展(extensions)-常用的擴展之pg_rman

PostgreSQL的擴展(extensions)-常用的擴展之pg_rman pg_rman 是 PostgreSQL 社區提供的一個備份和恢復管理工具。它能夠簡化和自動化 PostgreSQL 數據庫的備份和恢復過程,并支持全量備份、增量備份和差異備份。pg_rman 提供了方便的命令行接…