操作系統八股文

一.進程和線程的區別

1.本質區別和所屬關系是什么?

進程是資源調度以及分配的基本單位。

線程是CPU調度的基本單位。

一個線程屬于一個進程,一個進程可以擁有多個線程。

2.地址空間和內存

進程擁有獨立的虛擬地址空間。

線程沒有獨立的地址空間;線程有棧,程序計數器(PC),本地存儲(LS) 等少量獨立空間。

系統會為每個進程分配不同的內存空間

系統不會為線程分配內存,線程所使用的資源來自所屬的進程資源。

3.并發性和健壯性

進程的并發性較低。

線程的并發性較高。

對于單個CPU,系統會把CPU運行時間劃分為多個時間段,再將時間段分配給各個線程執行。

在切換效率上,進程切換效率低,線程切換效率高,都會涉及到上下文的切換。

一個進程崩潰不會影響其他進程。

一個線程崩潰可能會導致整個進程崩潰 。

進程隔離性更強一些。

?二.操作系統中進程和線程的切換過程

1.進程由哪幾個部分構成?

task_struct

進程的地址空間? =? 代碼段___數據段___棧區____堆區

?2.上下文由哪幾個部分組成?

用戶級上下文

系統級上下文 = __進程標識符信息__進程現場信息__進程控制信息__系統內核棧

寄存器上下文(硬件上下文) = __CPU各寄存器的內容___進程的現場信息

?3.何時發生切換?

主動? ?=? 系統調用,產生軟中斷。

被動? ?=? 時間中斷

靠中斷來完成切換

4.現場信息存儲在哪里?

程序計數器(PC),寄存器,堆棧,進程/線程控制塊(PCB)

?5.進程/線程切換過程

保存當前進程的硬件上下文,修改當前進程的PCB,狀態由運行態變為就緒態或者阻塞態,加入相關隊列,調度另外一個進程,修改被調度進程的PCB,狀態變為運行態,把當前進程的存儲管理數據改為被調度進程的存儲管理信息(頁表,cache,TLB)__(這一小段線程沒有__線程不具備虛擬地址空間__共享進程的虛擬地址空間),恢復被調度進程的硬件上下文,讓PC指向新的進程代碼。

?三.系統調用的整個流程

1.系統調用是什么?干嘛的?

系統調用是內核給用戶程序提供的編程接口,內核具有最高的權限,可以直接訪問所有資源,用戶只能訪問受限制的資源,不能直接訪問內存,網絡,磁盤等硬件資源。

?大致的流程 = 應用程序--->函數庫---->系統調用--->內核

靠中斷使程序從用戶態切換到內核態或者從內核態切換到用戶態?

2.系統調用是否引起進程或者線程切換??

不會必然切換:很多系統調用(如getpid()gettimeofday()等)只是簡單地獲取信息,執行很快,不會導致進程或線程切換。

可能導致切換:如果系統調用涉及阻塞操作(如read()write()accept()sleep()等),當前進程或線程因為等待I/O或資源而被阻塞,操作系統會把它掛起,調度其他進程或線程運行,這時就會發生切換。

主動讓出CPU:有些系統調用(如sched_yield()sleep())會主動讓出CPU,也會導致切換。

?3.系統調用引起中斷上下文切換

系統調用一定會引起用戶態到內核態的中斷上下文切換,但是否會引起進程或線程的切換,要看系統調用是否導致阻塞或主動讓出CPU。

4.系統調用的流程?

用戶態發起系統調用
應用程序通過調用庫函數(如C語言的read()write()等)發起系統調用請求。

陷入內核態
庫函數內部會使用特定的指令(如x86上的syscallint 0x80)觸發軟中斷或陷入,CPU從用戶態切換到內核態。

保存現場
CPU會保存當前用戶態的寄存器等現場信息,確保系統調用返回后能恢復原來的執行狀態。

內核處理系統調用
操作系統根據系統調用號找到對應的內核服務例程,執行相應的內核代碼,完成所需的操作(如文件讀寫、進程管理等)。

返回用戶態
系統調用執行完畢后,內核將結果返回給用戶程序,并通過特定的指令(如sysret)切換回用戶態,恢復之前保存的現場。

用戶程序繼續執行
用戶程序獲得系統調用的返回值,繼續后續的執行。

四.后臺進程有什么特點??

1.前臺進程是什么?有什么用?

運行在前臺的進程,終端是該進程的控制終端,終端關閉(SIGHUP),進程退出。

可接受終端輸入,并可以在終端輸出。

?2.后臺進程是什么?有什么用?

運行在后臺的進程,若在終端運行,終端關閉,進程可能退出。

不可以接受終端輸入,可以在終端輸出。

3.前后臺程序切換?

Ctrl + Z:可以將當前前臺運行的程序掛起,轉為后臺暫停狀態。

fg:用于將后臺的程序切換回前臺繼續運行。

bg:讓已經掛起的后臺程序在后臺繼續運行。

&:在命令末尾加上&,可以讓程序直接在后臺運行。

nohup:用于忽略SIGHUP信號,通常配合&一起使用,保證程序在終端關閉后依然運行。

Ctrl + D:用于斷開當前終端的session,相當于退出登錄。

?4.守護進程

?后臺進程的延申,脫離終端的后臺進程。

5.如何成為守護進程?

fork子進程令父進程退出,讓子進程被init進程接管,成為孤兒進程。

setsid()建立新的進程會話,使守護進程成為會話首進程,從而脫離與終端的關聯。

打開/dev/null,把0,1,2重新定向到/dev/null。

五.進程間通信有哪幾種方式

1.管道

單根管道是半雙工的,通常用于父子進程之間,通過pipe文件速度慢,容量有限。

2.FIFO?(有名/命名管道)

FIFO(First In First Out)有名管道是一種用于進程間通信(IPC)的機制。與匿名管道不同,有名管道有一個路徑名,存在于文件系統中,通常通過mkfifo命令或mkfifo()系統調用創建。

3.消息隊列?

消息的連接表存儲在內核當中,獨立于進程,容量有限。

消息隊列的流程主要包括通過msgget創建隊列,使用msgsnd發送消息,msgrcv接收消息,最后用msgctl管理或刪除隊列。?

4.共享內存?

多個進程共享的一塊存儲區,最快的一種IPC方式,需要和信號量配合使用。

共享內存的接口使用流程主要包括通過shmget創建共享內存,shmat掛載到進程地址空間,進程間讀寫數據,最后用shmdt分離和shmctl刪除共享內存。?

5.信號?

信號是一種軟中斷,處理方式是忽略/捕獲/默認動作。

?6.信號量

信號量是一個計數器,主要用于進程/線程之間的同步和互斥。

?7.socket套接字

不局限于是否在同一個機器上。

?六.操作系統中進程調度策略

1.什么是進程調度?

調度對象

線程和進程相對于操作系統而言都是任務(task_struct)。

線程又稱為共享用戶虛擬地址空間的進程。

包含多個線程的進程稱之為線程組。

只有一個線程的進程稱為進程。

沒有用戶虛擬地址空間的進程稱之為內核線程。

用于絕對由誰(哪個或者哪幾個)獲得處理器的執行權?

進程狀態

就緒 -->|進程調度| 運行
運行 -->|時間片用完| 就緒

運行 -->|io請求| 阻塞
阻塞 -->|io就緒| 就緒

?調度時機

主動調度(系統調用等待某個資源)。

周期調度(系統進程不主動讓出,內核依靠周期時鐘來搶占調度)。

喚醒搶占,創建新進程搶占,內核搶占。

2.進程調度有哪些算法??

先來先服務(FCFS)

從就緒隊列中存在時間最長的進程執行調度。

?短作業優先(SJF)

從就緒隊列中選擇估計運行時間最短的任務執行調度

高響應比優先?

FCFS和SJF的綜合;綜合考慮等待時間和估計運行時間來選擇執行調度。

時間片輪轉調度

?適用分時系統,為任務分配時間片,執行完時間片后放入就緒隊列。

優先級調度?

從就緒隊列中選擇優先級最高的若干任務執行調度。

優先級用來描述運行的緊迫程度。

多級反饋隊列?

時間片和優先級的綜合。

動態調整任務的優先級和時間片的大小,從而兼顧多方面的系統目標。

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

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

相關文章

【uniapp】小程序中input輸入框的placeholder-class不生效

解決方法 1.去掉scoped <style></style> 2.額外寫一組style </style lang"scss" scoped> </style> <style> ::v-deep .textarea-placeholder { font-size: 24rpx; font-weight: 400; …

大模型訓練與推理顯卡全指南:從硬件選型到性能優化

在人工智能技術飛速發展的今天&#xff0c;大型語言模型(LLM)已成為推動行業進步的核心動力。然而&#xff0c;訓練和部署這些“數字巨人”需要強大的計算基礎設施作為支撐&#xff0c;其中GPU的選擇直接決定了模型開發的效率與成本。本文將全面剖析當前主流GPU型號在大模型訓練…

Linux Docker的環境配置與簡單使用

參考資料 Windows Docker Desktop設置中文【Docker 】Docker Desktop for Windows&#xff08;WSL 2&#xff09;安裝WSL 2 上的 Docker 遠程容器入門 目錄 一. 環境配置1.1 安裝WSL1.2 安裝配置 Docker Desktop1.3 VS Code 插件安裝1.4 下載項目&#xff0c;配置Dockerfile 二…

函數指針與指針函數:本質區別與高級應用

目錄 一、概念本質解析 1. 函數指針&#xff08;Function Pointer&#xff09; 2. 指針函數&#xff08;Pointer Function&#xff09; 二、函數指針深度剖析 1. 基礎用法示例 2. 高級應用&#xff1a;回調函數 3. 函數指針數組 三、指針函數深入探討 1. 基礎實現模式 …

【python】基于pycharm的海康相機SDK二次開發

海康威視二次開發相機管理 這段代碼基于python開發的&#xff0c;用了opencv的一些庫函數。實現了一個完整的海康機器人相機管理工具&#xff0c;支持多相機連接、參數配置、圖像采集和實時顯示功能。目前USB相機測試無誤&#xff0c;除了丟一些包。 1. 主要類結構 HKCameraM…

HTTP 協議各個主要版本的功能特點、核心原理、使用場景總結

我們來系統總結一下 HTTP 協議各個主要版本的功能特點、核心原理&#xff08;用圖示輔助說明&#xff09;以及典型使用場景。 核心演進目標&#xff1a; 提升性能、安全性、效率和靈活性。 1. HTTP/0.9 (1991) - 遠古雛形 功能特點: 極其簡單&#xff1a; 只支持 GET 方法。無…

Linux編程:3、進程通信-信號

一、進程通信概述 &#xff08;一&#xff09;進程通信的目的 在企業開發中&#xff0c;一個項目常常需要多個進程共同協作&#xff0c;而這些進程之間需要進行通信&#xff08;交換信息&#xff09;以便協作。本章內容主要圍繞信號講解&#xff0c;其它進程通信的常用方式請…

深度解析Vue.js組件開發與實戰案例

一、Vue.js組件化思想 Vue.js的核心思想之一就是組件化開發。組件系統是Vue的一個重要概念,它允許我們使用小型、獨立和通常可復用的組件構建大型應用。在Vue中,組件本質上是一個擁有預定義選項的Vue實例。 1.1 為什么需要組件化 代碼復用:避免重復造輪子,提高開發效率可…

TensorFlow 2.0 與 Python 3.11 兼容性

TensorFlow 2.0 與 Python 3.11 兼容性 TensorFlow 2.0 官方版本對 Python 3.11 的支持有限&#xff0c;可能出現兼容性問題。建議使用 TensorFlow 2.10 或更高版本&#xff0c;這些版本已適配 Python 3.11。若需強制運行&#xff0c;可通過以下方式解決依賴沖突&#xff1a; …

MyBatisPlus 全面學習路徑

MyBatisPlus 全面學習路徑 學習目錄 第一部分&#xff1a;MyBatisPlus 基礎 MyBatisPlus 簡介與核心特性快速入門與環境搭建核心功能&#xff1a;BaseMapper 與 CRUD 接口條件構造器&#xff08;Wrapper&#xff09;詳解ActiveRecord 模式主鍵策略與通用枚舉 第二部分&…

React16,17,18,19更新對比

文章目錄 前言一、16更新二、17更新三、18更新四、19更新總結 前言 總結react 16&#xff0c;17&#xff0c;18&#xff0c;19所更新的內容&#xff0c;并且部分會涉及到原理講解。 一、16更新 1、在16.8之前更新&#xff0c;還是基于class組件的升級和維護更新。并且更新了一…

【git】有兩個遠程倉庫時的推送、覆蓋、合并問題

當你執行 git pull origin develop(或默認的 git pull)時,Git 會把遠端 origin/develop 的提交合并到你本地的 develop,如果遠端已經丟掉(或從未包含)你之前在私庫(priv)里提交過的改動,那這些改動就會被「覆蓋」,看起來就像「本地修改沒了」。 要解決這個問題,分…

Spring Boot 集成國內AI,包含文心一言、通義千問和訊飛星火平臺實戰教程

Spring Boot 集成國內AI&#xff0c;包含文心一言、通義千問和訊飛星火平臺實戰教程 一、項目結構二、添加Maven依賴三、配置API密鑰 (application.yml)四、配置類1. AI配置類 (AiProperties.java)2. 啟用配置類 (AiConfig.java) 五、服務層實現1. 文心一言服務 (WenxinService…

Elastic Search 學習筆記

1. Elasticsearch 是什么&#xff1f;有哪些應用場景&#xff1f; Elasticsearch 整體原理流程&#xff1f; Elasticsearch 是一個為海量數據提供近實時搜索和分析能力的分布式搜索引擎&#xff0c;廣泛應用于全文檢索、日志分析和大數據處理場景中。 Elasticsearch 整體原理…

動態規劃之斐波那契數(一)

解法一&#xff1a;遞歸 class Solution { public:int fib(int n) {if(n<2) return n;return fib(n-1)fib(n-2);} }; 解法二&#xff1a;dp class Solution { public:int fib(int N) {if (N < 1) return N;int dp[2];dp[0] 0;dp[1] 1;for (int i 2; i < N; i) {…

如何設置爬蟲的訪問頻率?

設置爬蟲的訪問頻率是爬蟲開發中的一個重要環節&#xff0c;尤其是在爬取大型網站&#xff08;如1688&#xff09;時&#xff0c;合理的訪問頻率可以避免對目標網站造成過大負擔&#xff0c;同時也能降低被封禁的風險。以下是一些常見的方法和建議&#xff0c;幫助你合理設置爬…

前端面試六之axios

一、axios簡介 Axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;用于瀏覽器和 Node.js 環境。在瀏覽器端&#xff0c;Axios 的底層實現是基于原生的 XMLHttpRequest&#xff08;XHR&#xff09;。它對 XHR 進行了封裝&#xff0c;增加了 Promise 支持、自動轉換 JSON 數據…

模板方法模式Template Method Pattern

模式定義 定義一個操作中算法的骨架&#xff0c;而將一些步驟延遲到子類中&#xff0c;模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟 類行為型模式 模式結構 AbstractClass&#xff1a;抽象類ConcreteClass&#xff1a;具體子類 只有類之間的繼…

【行云流水AI筆記】游戲里面的強化學習使用場景

強化學習在游戲中的應用已從早期的棋類博弈擴展到現代復雜游戲的全流程優化&#xff0c;以下是結合最新技術進展的核心應用場景及典型案例&#xff1a; 一、競技游戲的策略突破 1. 策略博弈類游戲 代表案例&#xff1a;AlphaGo/AlphaZero&#xff08;圍棋&#xff09;、Alph…

使用Python和PyTorch框架,基于RetinaNet模型進行目標檢測,包含數據準備、模型訓練、評估指標計算和可視化

下面是一個完整的實現方案,使用Python和PyTorch框架,基于RetinaNet模型進行目標檢測,包含數據準備、模型訓練、評估指標計算和可視化。 import os import numpy as np import matplotlib.pyplot as plt import torch import torchvision from torchvision.models.detection…