【操作系統和計網從入門到深入】(二)進程

前言

在這里插入圖片描述
這個專欄其實是博主在復習操作系統和計算機網絡時候的筆記,所以如果是博主比較熟悉的知識點,博主可能就直接跳過了,但是所有重要的知識點,在這個專欄里面都會提到!而且我也一定會保證這個專欄知識點的完整性,大家可以放心訂閱~

進程相關概念

文章目錄

  • 前言
  • 進程相關概念
    • 1. 基本理念
    • 2. 進程的描述
      • 2.1 為什么需要pcb
      • 2.2 什么是pcb
    • 3. 查看進程
    • 4. 在程序中pid
    • 5. 父進程是什么
    • 6. 創建子進程
        • 創建進程的時候,OS要干嘛?
        • cpu的運行隊列 run_queue
    • 7. 進程狀態
    • 8. 狀態優先級
    • 9. 環境變量
    • 10. 地址空間
      • 10.1 什么是地址空間
      • 10.2 地址空間是如何設計的
      • 10.3 擴展內容(比較難理解)
      • 10.4 為什么要有地址空間的三個理由
        • 10.4.1 理由一
        • 10.4.2 理由二
        • 10.4.3 理由三
      • 10.5 重新理解掛起

1. 基本理念

重要理論:先組織再描述:struct結構體

在操作系統內部,一定存在大量的數據結構和算法

2. 進程的描述

2.1 為什么需要pcb

為了描述每一個進程,Linux內核會給每一個進程創建一個結構體:PCB

PCB結構體包含了該進程的屬性!

struct PCB
{// 屬性數據,進程全部的屬性數據,如pid// ... struct PCB* next;struct PCB* prev;
};

對進程的管理,變成了對進程PCB結構體鏈表的增刪查改!

什么是進程:進程=對應的代碼數據+進程對應的PCB結構體

2.2 什么是pcb

在linux中,叫task_struct

里面會有這些內容。

是一個雙鏈表!

3. 查看進程

表頭也可以帶上

ps axj | head -1 && ps axj | grep myproc

top命令也可以查看進程

Linux系統下存在一個目錄記錄進程的信息。

/proc # 這個目錄下都是進程的信息

在這個目錄下,都是進程的屬性。

我們可以看下里面的信息。

事實上,/proc目錄是動態的,多一個進程就會多一個目錄,少一個進程就會少一個目錄。

4. 在程序中pid

在程序中如何獲得pid呢?

getpid() // 這是我們人生中第一個系統調用接口

5. 父進程是什么

ps axj 一下,發現父進程是bash

bash是shell命令行外殼程序

很熟悉了這些。

6. 創建子進程

fork

fork()

返回值:

  • fork失敗,返回-1
  • fork成功:給父進程返回子進程的pid,給子進程返回0

為什么會有兩個返回值呢?不是只能返回一個嗎?后面再說。

我們簡單寫一個代碼。

第二個為什么被執行了兩次?

因為不加判斷,父進程和子進程都會執行。

復習到后面就會知道,創建子進程的時候,這份代碼是被復制了的!

所以第二句打印語句,父子進程共享。

我們加上一個判斷,就能把子進程和父進程分開來!

創建進程的時候,OS要干嘛?

本質,創建一個新的task_struct,然后這里里面的字段,有一些是復制父進程的,有一些事自己的。

cpu的運行隊列 run_queue

進程調度本質上就是調度程序,在run_queue里面挑選一個task_struct來執行!

但是這個運行隊列也不是按一般順序的,這個是調度程序決定的!

7. 進程狀態

具體可以看博客。

進程狀態|操作系統|什么是pcb|什么是僵尸進程 |什么是孤兒進程 【超詳細的圖文解釋】【Linux OS】_pcb結構體-CSDN博客

后臺運行一個進程

./test & 

8. 狀態優先級

狀態優先級 = 老的優先級 + nice值

PRI就是優先級,越小越先執行

NI就是nice值

9. 環境變量

比較熟了,不再贅述。

要改可以用export

但是要記得把之前的帶上

注意,環境變量的組織方式是一個字符指針數組

可以用程序打印所有環境變量。

第一種獲取方式:

第二種獲取方式:

略。不常用,其實第一種也不常用,第三種才常用。

main函數的第三個參數,也就是環境變量參數,是從哪里來的?

一般都是父進程中繼承下來的

10. 地址空間

10.1 什么是地址空間

我們在所有的語言里面提到的地址的概念,本質上都是一個虛擬地址,而不是物理地址。

頁表映射,現在只知道大概,不知道細節,所以這一節簡單復習一下。

這個結構是可以用代碼進行驗證的。

// 驗證地址空間的棧結構
int g_unval;     // 未初始化的全局變量
int g_val = 100; // 已經初始化的全局變量
int main(int argc, char *argv[], char *env[])
{printf("code addr: %p\n", main);              // 代碼塊位置printf("init global addr: %p\n", &g_val);     // 初始化全局變量printf("uninit global addr: %p\n", &g_unval); // 未初始化全局變量char *heap_memory = (char *)malloc(10);printf("heap addr: %p\n", heap_memory); // 堆上的空間printf("stack addr: %p\n", &heap_memory); // 棧上的空間for (int i = 0; i < argc; i++){printf("argv[%d]: %p\n", i, argv[i]);}for (int i = 0; env[i]; i++){printf("env[%d]: %p\n", i, env[i]);}return 0;
}

10.2 地址空間是如何設計的

其實就是給各個進程畫餅。

先描述后組織!

如果我們可以直接訪問物理內存的話,其實是特別不安全的。

所以我們構建了映射機制。

如何理解地址的劃分? — 其實就是一個簡單的struct結構體就行了。

struct myroom
{int __start;int __end;
};

其實地址空間的各個區域,也是通過這個方式進行劃分的。

struct addr_room {int code_start; int code_end;int init_start; int init_end;int uninit_start; int uninit_end;int heap_start; int heap_end; //...其他屬性
}

現在我們又可以知道,task_struct里面的又一個字段了! — mm_struct* mm

地址空間和頁表(用戶級)是每一個進程都私有一份的,只要保證,每一個進程的頁表,映射的是物理內存的不同區域,我們就能做到,進程之間不會互相干擾進程的獨立性。

回答一個遺留問題:return兩個不同的值是怎么回事?

Return會被執行兩次

Return的本質不就是對值進行寫入嗎? – 此時發生了寫時拷貝!

所以兩個進程各自其實在物理內存中,有屬于自己的變量空間!只不過是在用戶層面用同一個變量(虛擬地址!)來標識了!

10.3 擴展內容(比較難理解)

10.4 為什么要有地址空間的三個理由

10.4.1 理由一

可以有效保護物理內存,禁止非法映射

10.4.2 理由二

因為有地址空間的存在,因為有頁表的映射,我們的物理內存中,是不是可以對未來的數據進行任意位置的加載?

當然可以!

首先,物理內存的分配,可以和進程管理完全解耦!

所以我們newmalloc的時候都是申請虛擬地址空間。

緊接著一個問題:如果我們申請了物理空間,但是又不馬上使用,是不是造成了空間的浪費呢?當然是的!

所以事實上,OS是非常聰明的,你雖然malloc了100個字節,但是我可以一個都不給你!

而你去訪問或者使用這100個字節的事哦呼,下面的物理地址空間的相關管理算法才把這個100字節分給你,再讓你訪問!但是你上層是0感知的!

這個叫做延遲分配的策略!

那么,OS是如何知道,一些內存空間雖然在虛擬上給了,但是物理上還 沒給呢?這里有個技術叫做 —— 缺頁中斷!(后面我們再完善這個概念)

10.4.3 理由三

因為物理內存中理論上可以任意位置加載,那么是不是物理內存中的幾乎所有的數據和代碼在內存是亂序的?

但是,因為頁表的存在,它可以進行映射!

那么是不是在進程視角所有的內存分布, 都可以是有序的?

是的! 地址空間+頁表的存在可以將內存的分布有序化!

比如說:

我一個進程看到的,是一個連續的0-ffff的地址,但是事實上,在物理上,這個可能是分散的,分塊的哦!

但是我進程需要知道這些嗎?根本不需要care,我只知道,我用的是0-ffff的連續的地址就行了,底層是怎么樣的,我根本不需要知道!

10.5 重新理解掛起

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

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

相關文章

高通平臺開發系列講解(USB篇)MBIM協議詳解

文章目錄 一、MBIM協議二、MBIM 消息類型三、基本控制消息構成3.1、MBIM OPEN MSG FORMAT3.2、MBIM CLOSE MSG FORMAT3.3、MBIM_COMMAND_MSG3.4、MBIM_COMMAND_DONE3.5、MBIM_INDICATE_STATUS_MSG四、MBIM Message(UUID+CID)4.1、UUID_BASIC_CONNECT

頻率、概率

頻率 在相同的條件下進行試驗&#xff0c;假設試驗進行了次&#xff0c;其中隨機事件A發生了次&#xff0c;那么就稱為隨機事件A發生的頻率。 概率 假設隨機試驗E的樣本空間是S&#xff0c;對于其中每個隨機事件&#xff0c;都對應了一個實數&#xff0c;把這個實數稱為隨機…

網絡游戲APP備案|游戲

網絡游戲APP備案|游戲 網絡游戲備案分析需要備案原因&#xff08;個人看法&#xff09;對小公司對大公司 總結 網絡游戲備案分析 相信做網絡游戲的伙伴們在23年都收到了各個平臺的公告&#xff0c;網絡游戲需要進行APP的備案。也就是說網路游戲現在安卓平臺也不是你想上架測試…

中國降冰片烯行業研究與投資預測報告(2024版)

內容簡介&#xff1a; 降冰片烯&#xff08;Norbornene&#xff0c;NB&#xff09;也稱降莰烯&#xff08;Norcamphene&#xff09;&#xff0c;是一種橋環烴。降冰片烯是一種常溫白色透光的結晶。降冰片烯易升華&#xff0c;沸點96℃&#xff0c;熔點44-46℃&#xff0c;閃點…

酶聯免疫抗體試劑——博邁倫生物

酶聯免疫抗體試劑是一種廣泛應用于生物醫學研究領域的實驗工具&#xff0c;其在檢測、分析和診斷等方面發揮著重要作用。本文將從酶聯免疫抗體試劑的基本原理、應用領域、優勢特點以及未來發展趨勢等方面進行詳細闡述。 基本原理 酶聯免疫抗體試劑是一種利用酶標記的抗體與特…

a1隨筆小思--家書

師夷長技以自強 不應該只學西方的技術&#xff0c;更應該傳承我們中華的五千年的先人智慧。 修心養性 藏器于身 子曰:“可與言而不與之言&#xff0c;失人&#xff1b;不可與言而與之言&#xff0c;失言。知者不失人&#xff0c;亦不失言。” 孔子說:“可以跟他交談&#xf…

051:vue項目webpack打包后查看各個文件大小

第050個 查看專欄目錄: VUE ------ element UI 專欄目標 在vue和element UI聯合技術棧的操控下&#xff0c;本專欄提供行之有效的源代碼示例和信息點介紹&#xff0c;做到靈活運用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安裝、引用&#xff0c;模板使…

什么是sql的謂詞下推

SQL的謂詞下推&#xff08;Predicate Pushdown&#xff09;是一種數據庫查詢優化技術&#xff0c;它將查詢中的過濾條件&#xff08;謂詞&#xff09;盡可能地“下推”到查詢計劃中更早的階段執行。這意味著&#xff0c;系統嘗試在處理和轉換數據之前先應用這些過濾條件&#x…

Oracle merge into using on when then 用法

merge into using on when then 是 Oracle 數據庫合并數據表的一種操作&#xff0c; MERGE INTO target_table a USING source_table b ON (a.col1 b.col1 and a.col2 b.col2) WHEN MATHED THEN update set a.col3 b.col3 WHEN NOT MATHED THEN insert (a.col1,a.c…

Linux壓縮和解壓命令

Linux系統中壓縮包的后綴有.zip、.gz、.bz2、.xz等&#xff0c;后綴不同表示壓縮方式不同。 1.打包命令 tar tar命令用于備份文件的命令&#xff0c;該命令可打包多個文件或目錄&#xff0c;也可將被打包的文件與目錄從包中還原。 tar 選項 包名 {參數} 包名是指打包的文…

git 分支合并

git 分支合并 比如 20231205 分支合并&#xff0c;到main分支上 1&#xff0c;切換到 main分支上 git checkout main2&#xff0c;進行合并 git merge 202312053&#xff0c;如果您希望在合并時保持提交歷史的清晰&#xff0c;您可以使用 rebase 命令&#xff1a; git reba…

javafx-在listview中添加了點擊事件后會執行多次

現象 我在一個按鈕的點擊事件中添加了&#xff0c;點擊事件的監聽如下&#xff0c;就會造成我多次點擊按鈕后&#xff0c;里面打開瀏覽器會執行多次 listviewitemListener new ChangeListener() {Overridepublic void changed(ObservableValue observable, Object oldValue, …

Python基礎期末復習 新手

類是創建實例的模板&#xff0c;而實例則是一個一個具體的對象&#xff0c;各個實例擁有的數據都互相獨立&#xff0c;互不影響。 實例方法是一個普通的函數&#xff0c;類方法和靜態方法都是通過函數裝飾器的方式實現的&#xff1b;實例方法需要傳入self&#xff0c;類方法需…

git強制回滾,遠程強制更新,git pull強制更新

注意&#xff1a;這里是強制回滾&#xff0c;回滾后&#xff0c;之后歷史的就沒有了&#xff0c;慎用。 本地強制回滾 強制回滾到上一個版本 git reset --hard HEAD^強制回滾上上個版本 git reset --hard HEAD^^git log查看版本 git log --prettyonelinegit log --prettyf…

高通平臺開發系列講解(USB篇)MBIM驅動詳解

文章目錄 一、數據結構二、源碼分析三、adroid_mbim創建四、讀寫 /dev/adroid_mbim4.1、讀gsi_ctrl_dev_read4.2、寫gsi_ctrl_dev_write沉淀、分享、成長,讓自己和他人都能有所收獲!?? ??本文主要介紹高通平臺USB網卡MBIM驅動。 一、數據結構 目錄:drivers/usb/gadget/…

【cocotb】【達坦科技DatenLord】Cocotb Workshop分享

https://www.bilibili.com/video/BV19e4y1k7EE/?spm_id_from333.337.search-card.all.click&vd_sourcefd0f4be6d0a5aaa0a79d89604df3154a 方便RFM實現 cocotb_test 替代makefile &#xff0c; 類似python 函數執行

java web系統的常見安全問題

一、背景 java開發的系統在發布到互聯網后都需要進行安全掃描&#xff0c;本文主要總結開發web系統需要注意的與系統安全相關的問題。因為在做需求開發時&#xff0c;很少產品會將系統安全的因素考慮在內&#xff0c;總覺得實現個需求很簡單&#xff0c;就是一些頁面&#xff0…

.Net6.0 Microsoft.AspNetCore.Http.Abstractions 2.20 已棄用

您想要升級 Microsoft.AspNetCore.Http.Abstractions 包&#xff0c;您需要注意以下幾點&#xff1a; Microsoft.AspNetCore.Http.Abstractions 包在 ASP.NET Core 2.2 版本后已經被標記為過時&#xff0c;因為它已經被包含在 Microsoft.AspNetCore.App 框架引用中12。因此&am…

零基礎自學Python的最全時間規劃表

文章目錄 前言第一階段:熟悉Python第二階段:軟件開發第三階段:成為程序員關于Python技術儲備一、Python所有方向的學習路線二、Python基礎學習視頻三、精品Python學習書籍四、Python工具包項目源碼合集①Python工具包②Python實戰案例③Python小游戲源碼五、面試資料六、Python…

產品固件燒寫方案

1、前言 一成熟的量產的嵌入式產品&#xff0c;軟件一般分為BootLoader和App&#xff0c;BootLoader用于啟動校驗、App升級、App版本回滾等功能&#xff0c;BootLoader在cpu上電第一階段中運行&#xff0c;之后跳轉至App地址執行應用程序。 因此&#xff0c;在發布固件的時候&a…