12 [虛擬化] 進程抽象;fork,execve,exit

12 [虛擬化] 進程抽象;fork,execve,exit

南京大學操作系統課蔣炎巖老師網絡課程筆記。

視頻:https://www.bilibili.com/video/BV1N741177F5?p=12
講義:http://jyywiki.cn/OS/2021/slides/8.slides#/

本講概述

回到“操作系統是管理程序運行的軟件”

  • 操作系統中的進程
    • 程序 = 狀態機 (M,R)
    • 操作系統 = 多個狀態機
  • 進程管理API
    • fork:狀態機的復制
    • execve:狀態機的重置
    • exit

再次強調,一定要深入理解:程序(進程)就是一個狀態機

操作系統中的進程

復習:應用程序

應用程序 = 代碼 + 數據(文件) = 狀態機

  • a.out, bash, ls ,grep
  • gcc(cc1, as, collect2, ld)
  • xedit, vscode

復習:操作系統

操作系統是管理多個應用程序執行的軟件。

  • 應用視角:操作系統就是一組系統調用
  • 硬件視角:操作系統就是個狀態機(C程序)

理解“最小”操作系統:

如果硬件提供一些機制(如虛擬存儲來虛擬化內存M和寄存器R,即(M,R))使得各個“線程”不能訪問其他“線程”、操作系統的內存,就得到了虛擬化的“進程”,仿佛獨占CPU運行。注意:這里是將運行在操作系統上的各個程序(進程)看做了是運行在操作系統這個大程序(進程)上的一些”線程“。

操作系統:狀態機的虛擬化

操作系統“模擬”了其中所有程序的狀態機

  • 這就是“虛擬化”
  • 程序仿佛自己獨占CPU運行,但它獨占的只是CPU的一部分,其他部分它“看不見”。

進程:運行的程序。任意時刻,進程都可以看做是狀態機的狀態。

操作系統在終端以后,可以選擇將進程(狀態機)調度到CPU上運行。而進程執行系統調用,會使用指令(syscall)等回到操作系統。

“操作系統是一個中斷處理程序”

  • 被動的中斷:硬件(時鐘、I/O設備、NMI,)
  • 主動的中斷:系統調用

操作系統運行的兩種模式

  • 用戶態(ring 3):應用程序運行在用戶態
  • 內核態(ring 0):操作系統運行在內核態

二者的切換如上面所述:

  • 中斷、系統調用:用戶態 -> 內核態
  • 操作系統調度:內核態 -> 用戶態

就是這樣的切換,使得我們的應用程序(在用戶態)實現了虛擬化,同時操作系統仿佛就是一個中斷處理程序。

操作系統課的三種調用

  • 進程(狀態機)管理

    fork, execve, exit:進程(狀態機)的創建、改變和刪除

  • 存儲(地址空間)管理

    mmap:對進程虛擬地址空間的一部分進行映射

    brk:虛擬地址空間管理

  • 文件(數據對象)管理

    open, close:文件訪問管理

    read, write:數據管理

    mkdir, link, unling:目錄管理

fork() 狀態機管理:創建狀態機

如果需要創建狀態機,我們需要什么樣的API?

UNIX的答案:fork()

  • 做一份狀態機的完整的復制(內存M,寄存器現場R)
  • 父進程返回子進程的PID,子進程返回0

fork bomb

fork bomb代碼解析:

:(){:|:&};:  # 一行版本的fork bomb:(){				 # 格式化一下: | : &
};:fork(){			 # 這其實在bash中定義了一個函數,bash允許以冒號作為標識符fork | fork &
}; fork

父子進程、進程樹

因為狀態機是復制的,因此總能找到”父子關系“。

因此有了進程樹(pstree),如下:

systemd─┬─ModemManager───2*[{ModemManager}]├─NetworkManager─┬─dhclient│                └─2*[{NetworkManager}]├─accounts-daemon───2*[{accounts-daemon}]├─acpid├─avahi-daemon───avahi-daemon├─boltd───2*[{boltd}]├─colord───2*[{colord}]├─cron├─cups-browsed───2*[{cups-browsed}]├─cupsd───dbus├─dbus-daemon├─gdm3─┬─gdm-session-wor─┬─gdm-x-session─┬─Xorg───{Xorg}│      │                 │               ├─gnome-session-b─┬─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]│      │                 │               │                 │             │             ├─ibus-engine-sim───2*[{ibus-engine-
...

進程樹的存在,是我們用fork()復制創造子進程,所得到的一個很自然的結果。

例程1

猜猜會打印出什么呢?(提示:可以試著畫一下狀態機,線程樹)

#include <unistd.h>
#include <stdio.h>int main(){pid_t pid1 = fork();pid_t pid2 = fork();pid_t pid3 = fork();printf("Hello World from (%d, %d, %d)\n", pid1, pid2, pid3);
}

例程2

猜猜會打印出什么呢?

#include <unistd.h>
#include <stdio.h>#define N 2
int main(){for (int i=0; i<N; i++){fork();printf("Hello\n");}
}

還是可以逐步畫一下程序的狀態機,

gcc test.c
./a.out

輸出結果應該是6。

有趣的是,如果我們將輸出重定向到管道,再通過wc -l命令打印出行數,這時會輸出8,這不禁令我們大為驚奇。

為什么會這樣呢?這其實是因為printf函數將內容直接輸出到標準輸出stdout時是直接輸出的,會按照我們的理解打印出6個Hello。但是如果要重定向到管道(或文本文件等),printf則會將要輸出的內容先放置到緩沖區,到最后一起打印,在本例中,由于我們fork()創建進程的時候,會將全部的內存M和寄存器現場R復制一份,導致每次fork()時,緩沖區也被完整地復制,最后我們每個進程的緩沖區有2個Hello,最后共有四個進程,故會有8個Hello。(也可以重定向到文本文件中試一下,確實是有8個Hello)。這恰好進一步驗證了我們所說的fork()是對整個(M,R)的完整復制。

可以嘗試理解一下N=3時正常打印和重定向打印會有多少個Hello。筆者認為分別是 ∑i=1N2i\sum_{i=1}^N2^ii=1N?2i2N×N2^N\times N2N×N

機器永遠是對的,計算機系統的世界沒有魔法,一切都是按部就班地進行的

execve() 狀態機管理:替換狀態機(執行)

只有fork新建還不夠,我們還需要能夠執行別的程序。

UNIX的答案:execve

execve(filename, argv, enpv)

  • 執行名為filename的程序
  • 分別傳入參數argv(v)和環境變量enpv(e)

這剛好對應了main函數的參數:

int main(int argc, char** argv, char** enpv){// ...
}

關于main函數的參數:Linux中 C++ main函數參數argc和argv含義及用法

execve可以看作狀態機的重置。

環境變量

環境變量即應用程序執行的環境。

  • 使用env命令來查看
    • PATH:可執行文件的搜索路徑
    • PWD:當前路徑
    • HOME:home目錄
    • DISPLAY:圖形輸出
    • PS1:shell的提示符
  • export:告訴shell在創建子進程時設置環境變量

PATH環境變量

PATH環境變量是可執行文件的搜索路徑

還記得gcc的strace結果嗎

[pid 28369] execve("/usr/local/sbin/as", [“as”, “–64”, …
[pid 28369] execve("/usr/local/bin/as", [“as”, “–64”, …
[pid 28369] execve("/usr/sbin/as", [“as”, “–64”, …
[pid 28369] execve("/usr/bin/as", [“as”, “–64”, …

這個搜索順序恰好是PATH環境變量中指定的順序:

$ PATH="" /usr/bin/gcc fork-demo.c
gcc: error trying to exec ‘as’: execvp: No such file or directory
$ PATH="/usr/bin/" gcc fork-demo.c

在gcc被execve時,將環境變量PATH傳給gcc,它就會按照其順序來搜索可執行文件的路徑。

計算機系統里沒有魔法,機器永遠是對的

exit() 狀態機管理:終止狀態機

有了fork,execve,我們可以自由地創建、執行程序(狀態機)了,還缺一個銷毀狀態機的函數

UNIX的答案:exit

  • 銷毀當前狀態機,并允許有一個返回值
  • 子進程終止會通知父進程(之后會講)

問題是一個進程(狀態機)中有多個線程啊。

結束程序執行的三種方法

exit的幾種寫法,它們是不同的:

  • exit(0) - stdlib.h中聲明的libc函數
    • 它會調用atexit
  • _exit(0) - glibc中的syscall wrapper
    • 執行exit_group系統調用,終止整個進程(所有線程)
    • 不會調用atexit
  • syscall(SYS_exit, 0)
    • 執行exit系統調用終止當前線程
    • 不會調用atexit

最起碼要區分好庫函數(應用程序的一部分)和系統調用

可以用strace觀察各種結束方式的執行。

Fork-Exec vs. Spawn

我們既然fork創建了一個子進程,那我們絕大多情況下肯定是要execve執行這個進程的,也就是說fork后面幾乎一定會跟著execve,那為什么不直接把它們合成一個系統調用 spawn(path, argv, enpv) 呢?即spawn = fork + execve

實際上,fork + execve是一個非常優雅的實現,因為要考慮到進程可以持有操作系統中的對象,這使fork、execve、exit還要涉及到操作系統的對象的管理。

例如,在上面用到過的管道技術中:

./a.out | wc -l

其中./a.out持有了操作系統中的對象——管道的寫口,而wc -l則持有了管道的讀口,從而能夠將前者的輸出作為后者的輸入。而如果./a.out這個進程(狀態機)需要fork一個子進程,那么這個子進程就可以自然地復制拿到父進程的全部(M,R)。這樣,對于操作系統中的對象——管道,子進程就持有了其寫口。

Take aways and Wrap-up

虛擬化

  • 程序 = 狀態機
  • 操作系統 = 狀態機的管理者
    • 用硬件(物理狀態機)實現多個并發執行的虛擬狀態機
    • API:fork,execve,exit

Ref:

http://jyywiki.cn/OS/2021/slides/8.slides#/

https://www.bilibili.com/video/BV1N741177F5?p=12

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

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

相關文章

計算機應用與基礎實踐怎么考,自考計算機基礎應用科目筆試和實踐性考試怎么考...

自考計算機基礎應用科目筆試和實踐性考試怎么考&#xff1f; 報考自考的考生有些專業的考生會在自己的課程科目中發現計算機基礎應用不僅有理論知識考試還有實踐性考試&#xff0c;那么自考計算機基礎應用科目的筆試和實踐性考試怎么考&#xff1f;自考計算機基礎應用科目筆試怎…

14 [虛擬化] 虛存抽象;Linux進程的地址空間

14 [虛擬化] 虛存抽象&#xff1b;Linux進程的地址空間 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻&#xff1a;https://www.bilibili.com/video/BV1N741177F5?p14 講義&#xff1a;http://jyywiki.cn/OS/2021/slides/10.slides#/ 本講概述 程序 狀態機&#xff1b;…

瀏覽器是指在用戶計算機上,自考《網頁設計與制作》測試題及答案

自考《網頁設計與制作》測試題及答案學習是一個不斷積累的過程&#xff0c;為幫助考生們更好地復習《與制作》科目知識點&#xff0c;以下是搜索整理的一份自考《網頁設計與制作》測試題及答案&#xff0c;供參考練習&#xff0c;希望對大家有所幫助!想了解更多相關信息請持續關…

Ubuntu 18.04 安裝OpenCV C++

Ubuntu 18.04 安裝OpenCV C 構建并安裝 僅構建核心模塊 # 更新并安裝依賴 # 更新并安裝依賴 sudo apt update && sudo apt install -y cmake g wget unzip# 下載并解壓包 wget -O opencv.zip https://github.com/opencv/opencv/archive/master.zip unzip opencv.zip…

html計算x的y,HTML5畫布:旋轉時計算x,y點

我開發了一個HTML5 Canvas應用程序&#xff0c;它涉及到讀取一個xml文件&#xff0c;該文件描述了需要在畫布上繪制的箭頭&#xff0c;直形和其他形狀的位置。的XML布局的HTML5畫布&#xff1a;旋轉時計算x&#xff0c;y點實施例&#xff1a;如果對象被旋轉它涉及計算一個點的位…

(2021) 20 [虛擬化] 進程調度

(2021) 20 [虛擬化] 進程調度 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p20 講義&#xff1a;http://jyywiki.cn/OS/2021/slides/11.slides#/ 背景 — 機制與策略分離 機制&#xff1a;一個通用的、可定制…

計算機組裝過程英文版,計算機組裝與維護試題及答案(國外英文資料).doc

計算機組裝與維護試題及答案(國外英文資料)計算機組裝與維護試題及答案(國外英文資料)(1) choiceIn the following equipment, the input device is (b)A. b. b. c. c. c. d. d.In Windows 98, the combination of CTRL Alt Del is (c)A. cold start b. heat start c. interr…

make命令及makefile

make命令及makefile 轉自&#xff1a;https://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者&#xff1a; 阮一峰 日期&#xff1a; 2015年2月20日 代碼變成可執行文件&#xff0c;叫做編譯&#xff08;compile&#xff09;&#xff1b;先編譯這個&#…

局域網中計算機網絡密碼查看,Win10怎么查看電腦上已知的wifi網絡密碼

方法一&#xff1a;網絡和共享中心查詢1、在Windows 10桌面最左下角的【Windwos開始圖標上右鍵】&#xff0c;在彈出的菜單中點擊打開【網絡連接】&#xff0c;如下圖所示。2、在打開的網絡連接設置中&#xff0c;雙擊已經連接的【無線網絡名稱】&#xff0c;在彈出的【WLAN狀態…

(2021) 22 [持久化] 1-Bit的存儲

(2021) 22 [持久化] 1-Bit的存儲 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p22 講義&#xff1a;http://jyywiki.cn/OS/2021/slides/12.slides#/ 背景 回顧 操作系統是什么&#xff1f;一組對象 一組API…

計算機一級試題論述,計算機一級考試理論題及答案要點

計算機一級考試IT1必做題[1]. 著名的計算機科學家尼.沃思提出了________。A&#xff0e;數據結構&#xff0b;算法程序B&#xff0e;存儲控制結構C&#xff0e;信息熵D&#xff0e;控制論[2]. 下面有關掃描儀的敘述中&#xff0c;錯誤的是________。A&#xff0e;分辨率是掃描儀…

(2021) 23 [持久化] I/O設備與驅動

(2021) 23 [持久化] I/O設備與驅動 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p23 講義&#xff1a;http://jyywiki.cn/OS/2021/slides/13.slides#/ 背景 很多人 (你們的同學們、家長們) 都有一個認識&…

計算機考研計劃時間,2019計算機考研時間安排:復習時間規劃

隨著考研競爭越來越激烈&#xff0c;考研復習一定要做好規劃&#xff0c;每天的時間要做好管理&#xff0c;分清輕重緩急&#xff0c;這樣才能高效率復習。管理的5個原則&#xff0c;大家抓緊調整個人復習。小編還為大家精心準備了計算機考研復習資料還有計算機考研報考指導助力…

(2021) 24 [持久化] 文件系統API

(2021) 24 [持久化] 文件系統API 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p24 講義&#xff1a;http://jyywiki.cn/OS/2021/slides/14.slides#/ 背景 回顧 硬件視角&#xff1a;持久化的“層層抽象” 物…

計算機輔助應用的縮寫有什么,計算機輔助設計的英文縮寫是什么

2008-10-09是什么的英文縮寫?BOBO......頭型里的.....其實"BOBO頭"準確的名稱應該是BOB頭。它是娃娃頭的一種。BOB頭有許多變種&#xff0c;標準的類似于櫻桃小丸子的發型&#xff0c;專業發型師把它稱為BOB。最初是由巴黎發型師Antoine 在1909年發明&#xff0c;但…

Linux中的硬鏈接和軟鏈接

Linux中的硬鏈接和軟鏈接 節選自南大蔣炎巖老師操作系統網絡課程筆記&#xff1a;(2021) 24 [持久化] 文件系統API 硬&#xff08;hard&#xff09;鏈接 UNIX文件指針 在UNIX中&#xff0c;文件和目錄完全不是同一個概念&#xff0c;雖然我們平時看著它們仿佛并列地躺在某個…

計算機win10開機音樂,大師傳授win10系統電腦開機總是自動播放音樂的方案

今天小編分享一下win10系統電腦開機總是自動播放音樂問題的處理方法&#xff0c;在操作win10電腦的過程中常常不知道怎么去解決win10系統電腦開機總是自動播放音樂的問題&#xff0c;有什么好的方法去處理win10系統電腦開機總是自動播放音樂呢&#xff1f;今天本站小編教您怎么…

Linux中的tty、pts、pty等概念辨析

Linux中的tty、pts、pty等概念辨析 基本概念 tty、pty、pts、ptmx tty&#xff08;終端設備的統稱&#xff09;&#xff1a;tty一詞源于Teletypes&#xff0c;或teletypewriters&#xff0c;原來指的是電傳打字機&#xff0c;是通過串行線用打印機鍵盤通過閱讀和發送信息的東…

(2021) 25 [持久化] 文件系統實現:FAT和UNIX文件系統

(2021) 25 [持久化] 文件系統實現&#xff1a;FAT和UNIX文件系統 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻&#xff1a;https://www.bilibili.com/video/BV1HN41197Ko?p25 講義&#xff1a;http://jyywiki.cn/OS/2021/slides/15.slides#/ 背景 回顧 應用眼中的文件…

用計算機模擬地球誕生,計算機模擬顯示早期金星或像地球一樣宜居

雖然金星的綽號是“地球的邪惡孿生化身”&#xff0c;但它和地球上的一切都不同&#xff1a;灼熱、干燥并且被有毒煙云籠罩。不過&#xff0c;就在10億或20億年前&#xff0c;這兩個任性的“兄弟”可能更加相似。最新的計算機模擬顯示&#xff0c;早期的金星看上去和地球很像&a…