虛擬地址空間(下)進程地址空間(上)

一.關于頁表組成

1.權限(rwx)

作用:如1.讓代碼區變成只讀的 2.寫時拷貝的實現:子進程創建時其頁表指向的父進程代碼和數據權限都是只讀的,子進程試圖修改,觸發錯誤,系統開始寫時拷貝。

來源:1.可執行程序本身已經包含了區域權限信息,代碼區不可寫等

2.真實地址是否存在的位(isexits)

作用:節省內存空間:

1.分批加載::系統創建進程先加載進程對應磁盤內一部分數據,將頁表記錄位記錄不存在,等進程使用這部分虛擬地址對應的數據時,再從磁盤加載到指定物理地址位置。2.掛起操作。

二.關于mm_struct初始化時怎么分配各區域的大小

1.可執行程序在編譯時,各個區域已經確定,直接給mm_struct初始化,(程序內申請空間實質是擴大程序記錄的堆的大小(也就是虛擬空間的大小),給mm_struct,操作系統在需要用的時候再開辟空間),執行時mm_struct給操作系統實時開辟

三.進程地址空間(上)

再談創建進程:

寫時拷貝

是什么:創建子進程,子進程實際指向的代碼和數據和父進程相同,修改時再拷貝,互不干擾。

實現:創建子進程時,頁表所有位置權限位設為只讀,一旦子進程和父進程任意一方對共同數據進行寫入,觸發缺頁中斷,系統監測是不是需要寫時拷貝,是,將數據拷貝一份,修改頁表指向,修改權限。互不干擾。

再談進程終止

1.進程正常退出:看進程退出碼判斷運行結果是否正常(return 0,return -1...)

2.進程意外終止:OS提前用信號終止了進程(訪問非法等)。看退出信號判斷情況:退出碼為0則沒收到信號,退出信號判斷進程是否提前退出了,提前退出原因是什么(kill就是給進程信號,退出進程),正常退出了看退出結果是否正確看退出碼

再談進程等待:

回收等待的進程:子進程結束了,就要將退出信號和退出碼存入PCB并等待,直到父進程回收

回收系統調用:

pid_t wait(int *status);進程一直等待,直到有它的子進程退出,

接收退出狀況status(若不接受可傳入空指針),返回退出進程的pid,失敗時返回?-1,并設置?errno?以指示錯誤原因。

pid_t waitpid(pid_t pid,int *status, int options);進程等待一次,若沒退出

pid為要等待的子進程(傳入-1為任意),options為0為阻塞等待,WNOHANG非阻塞等待

status:

兩個判斷status情況的宏:bool WIFEXITED(int status)如果進程正常退出則返回真

int WEXITSTATUS(int status).如果正常退出,提取退出碼

進程替換

不是創建新進程,是在原進程的基礎上替換新的可執行程序的代碼和數據(堆棧重新初始化),PCB不換!

創建一個已有可執行程序為基礎的進程,可以先創建一個子進程,再進程替換(bash也是這么做的,只需要全部寫時拷貝再替換)

補充:

1.readelf -s 可執行程序名

看可執行程序的各個區域大小

2.野指針實質是頁表內沒有對應映射,操作系統不給訪問,運行錯誤

3.為什么要用虛擬地址空間

-->1.虛擬地址空間+頁表保護內存

--->2.讓進程以統一視角看物理內存:加載各個區里的物理地址不必連續,虛擬地址連續,進程不必分別管理一塊一塊。作用:讓代碼數據可以加載到內存的任意地址處,頁表映射尋找效率高O(1)。

---->3.進程管理和內存管理在系統層面解耦合:進程創建只需創建數據結構,其余的代碼加載,進程需要的內存操作(申請空間),操作系統可以先騙過進程,等到使用的時候再真進行內存操作。兩者具有滯后性,可以更好的省內存,省資源。

4.環境變量為什么一直能被進程看到

進程虛擬地址空間內就有環境變量表

5.1. 打印錯誤的代碼

#include <errno.h>

變量int errno最近函數的錯誤碼,(依賴于最近的函數內是否設置了錯誤碼,fopen,fork都設置了)

#include <string.h>

?char *strerror(int errnum);根據錯誤碼返回錯誤原因字符串

(標準C庫的功能)

5.2. 退出代碼

#include<cstdlib>

void exit(int i);讓進程直接退出,通過正常退出機制終止進程,設置退出碼i。且刷新緩沖區(緩沖區是語言級別的概念,語言編譯了維護,不是操作系統的)

_exit(int i);系統調用,退出不刷新緩沖區

exit語言封裝了_exit。

6.數據段(Data Segment)?中的數據在?進程創建之前?就已經存在了。具體來說,這些數據是在?程序編譯和鏈接時?確定的,并存儲在可執行文件中。當程序啟動時,操作系統會加載可執行文件,并將數據段的內容映射到進程的地址空間中。

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

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

相關文章

【區塊鏈 + 航運物流】豐溯 - 區塊鏈溯源平臺 | FISCO BCOS 應用案例

豐溯是順豐科技推出的區塊鏈溯源平臺&#xff0c; 采用 FISCO BCOS 底層開源框架&#xff0c; 為農副食品、 冷鏈生鮮等企業客戶及消費 者提供關鍵流通節點的溯源信息服務&#xff0c;形成從源頭到消費者端全鏈路透明的信息鏈。 在商貿消費領域&#xff0c; 溯源一直是保障產品…

iwebsec-SQL數字型注入

1.判斷是否存在漏洞 添加and 11發現正常顯示&#xff0c;添加and 12無回顯條目&#xff0c;則存在sql注入漏洞 2.因為有回顯&#xff0c;嘗試union聯合注入&#xff0c;使用order by判斷出有3個字段 3.使用union聯合注入查看回顯位&#xff0c;發現3三個字段均有回顯&#xff…

藍橋杯每日五題第一日

藍橋杯每日5題 問題一 班級活動 1.班級活動 - 藍橋云課 問題描述 小明的老師準備組織一次班級活動。班上一共有 nn 名 (nn 為偶數) 同學&#xff0c;老師想把所有的同學進行分組&#xff0c;每兩名同學一組。為了公平&#xff0c;老師給每名同學隨機分配了一個 nn 以內的正…

STM32 —— 嵌入式系統、通用計算機系統、物聯網三層架構

目錄 一、嵌入式系統的概念 二、通用計算機系統與嵌入式系統的比較 用途 硬件 軟件 性能與功耗 開發與維護 三、嵌入式系統與物聯網的關系 四、物聯網的三層架構 1. 感知層&#xff08;Perception Layer&#xff09; 2. 網絡層&#xff08;Network Layer&#xff09; …

卡碼網25題——掌握ACM輸入輸出方式(15 至 18)

刷題小記&#xff1a; 本期涉及ACM模式下棧和鏈表的構建與使用&#xff0c;值得學習。 卡瑪網15.神秘字符&#xff08;卡瑪網15.神秘字符&#xff09; 題目分析&#xff1a; 若給定2行字符串&#xff0c;其中第一個串的長度為偶數&#xff0c;現要求把第二個串插入到第一個…

前端字段名和后端不一致?解鎖 JSON 映射的“隱藏規則” !!!

&#x1f680; 前端字段名和后端不一致&#xff1f;解鎖 JSON 映射的“隱藏規則” &#x1f31f; 嘿&#xff0c;技術冒險家們&#xff01;&#x1f44b; 今天我們要聊一個開發中常見的“坑”&#xff1a;前端傳來的 JSON 參數字段名和后端對象字段名不一致&#xff0c;會發生…

python中使用單例模式在整個程序中只創建一個數據庫連接,節省資源

示例代碼&#xff1a; from loguru import logger from pymongo import MongoClient from pymongo.errors import ConnectionFailurefrom llm_engineering.settings import settingsclass MongoDatabaseConnector:_instance: MongoClient | None Nonedef __new__(cls, *args,…

AI小白的第六天:必要的數學知識(一)

在學習的過程中&#xff0c;不管是上代碼還是理論學習&#xff0c;其中都摻雜了一些數學知識。俗話說“磨刀不誤砍柴工”&#xff0c;而我已經“誤了砍柴功”了&#xff0c;現在變成了“亡羊補牢&#xff0c;為時不晚”。 線性代數 線性代數是數學的一個分支&#xff0c;主要…

【Linux】Bash是什么?怎么使用?

李升偉 整理 什么是 Bash&#xff1f; Bash&#xff08;Bourne Again Shell&#xff09;是一種 命令行解釋器&#xff08;Shell&#xff09;&#xff0c;廣泛用于 Unix 和 Linux 操作系統。它是 Bourne Shell&#xff08;sh&#xff09; 的增強版&#xff0c;提供了更多的功能…

Qt Creator入門

1.創建項目 選擇創建項目-Application&#xff08;Qt&#xff09;-Qt Widgets Application-修改名稱即可 默認創建有窗口類&#xff0c;myWidget,基類有三種選擇&#xff1a;QWidget&#xff0c;QMainWindow&#xff0c;QDialog 注意&#xff1a; 名稱和創建路徑不能有中文、…

C語言經典代碼練習題

1.輸入一個4位數&#xff1a;輸出這個輸的個位 十位 百位 千位 #include <stdio.h> int main(int argc, char const *argv[]) {int a;printf("輸入一個&#xff14;位數&#xff1a;");scanf("%d",&a);printf("個位&#xff1a;%d\n"…

cls(**dict(data, id=id))靈活地從一個字典生成實例,同時確保某些關鍵字段(如 id)被正確設置或覆蓋

示例代碼&#xff1a; classmethoddef from_mongo(cls: Type[T], data: dict) -> T:"""Convert "_id" (str object) into "id" (UUID object)."""if not data:raise ValueError("Data is empty.")id data.pop…

MyBatis XMLMapperBuilder 是如何將 SQL 語句解析成可執行的對象? 如何將結果映射規則解析成對應的處理器?

1. XMLMapperBuilder 如何將 SQL 語句解析成可執行對象 (MappedStatement): XMLMapperBuilder 解析 <select>, <insert>, <update>, <delete> 等 SQL 語句元素時&#xff0c;并不僅僅是簡單地讀取 SQL 文本&#xff0c;而是要將 SQL 語句和相關的配置…

咖啡點單小程序畢業設計(JAVA+SpringBoot+微信小程序+完整源碼+論文)

?全網粉絲20W,csdn特邀作者、博客專家、CSDN新星計劃導師、java領域優質創作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取項目下載方式&#x1f345; 一、項目背景介紹&#xff1a; 隨著社會的快速發展和…

003-掌控命令行-CLI11-C++開源庫108杰

首選的現代C風格命令行參數解析器! &#xff08;本課程包含兩段教學視頻。&#xff09; 以文件對象監控程序為實例&#xff0c;五分鐘實現從命令行讀入多個監控目標路徑&#xff1b;區分兩大時機&#xff0c;學習 CLI11 構建與解析參數兩大場景下的異常處理&#xff1b;區分三…

【leetcode hot 100 124】二叉樹中的最大路徑和

解法一&#xff1a;&#xff08;遞歸&#xff09;考慮實現一個簡化的函數 maxGain(node)&#xff0c;該函數計算二叉樹中的一個節點的最大貢獻值&#xff0c;具體而言&#xff0c;就是在以該節點為根節點的子樹中尋找以該節點為起點的一條路徑&#xff0c;使得該路徑上的節點值…

譜分析方法

前言 本文隸屬于專欄《機器學習數學通關指南》&#xff0c;該專欄為筆者原創&#xff0c;引用請注明來源&#xff0c;不足和錯誤之處請在評論區幫忙指出&#xff0c;謝謝&#xff01; 本專欄目錄結構和參考文獻請見《機器學習數學通關指南》 ima 知識庫 知識庫廣場搜索&#…

在圖像/視頻中裁剪出人臉區域

1. 在圖像中裁剪人臉區域 import face_alignment import skimage.io import numpy from argparse import ArgumentParser from skimage import img_as_ubyte from skimage.transform import resize from tqdm import tqdm import os import numpy as np import warnings warni…

【軟考-架構】11.3、設計模式-新

?資料&文章更新? GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目錄 項目中的應用設計模式創建型設計模式結構型設計模式行為型設計模式 &#x1f4af;考試真題題外話 項目中的應用 在實際項目中&#xff0c;我應用過多種設計模式來解決不同…

使用Redis如何實現分布式鎖?(超賣)

分布式鎖概念 在多線程環境下&#xff0c;為了保證數據的線程安全&#xff0c;鎖保證同一時刻&#xff0c;只有一個可以訪問和更新共享數據。在單機系統我們可以使用 synchronized 鎖、Lock 鎖保證線程安全。 synchronized 鎖是 Java 提供的一種內置鎖&#xff0c;在單個 JVM …