《操作系統》OS學習(十):進程控制

進程切換(上下文切換):

  • 定義:暫停當前運行進程,從運行狀態變成其他狀態,調度另一個進程從就緒狀態變成運行狀態
  • 要求:切換前,保存進程上下文;切換后,恢復進程上下文;快速切換
  • 進程存儲的生命周期的信息:寄存器(PC,SP,...);CPU狀態;內存地址空間

進程控制塊PCB:內核的進程狀態記錄

  • 內核為每個進程維護了對應的進程控制塊PCB
  • 內核將相同狀態的進程的PCB放置在同一隊列

進程控制塊結構:

  • 進程標識信息
  • 進程狀態信息
  • 進程占用的資源(存儲資源、內核堆棧等)
  • 保護現場用的內容
  • 當前進程在哪個隊列

其中內存地址空間結構中會包含:有哪些內存塊及地址空間,第一級頁表起始地址,置換相關結構

進程創建:

  • Windows進程創建API:CreateProcess
  • Unix進程創建系統調用:fork/exec。fork()把一個進程復制成兩個進程,父子進程有各自的PID;接下來的exec()用新程序來重寫當前進程,PID不改變。

空閑進程創建

當用戶代碼執行完之后,系統將在空閑進程中執行。

第一個內核線程的創建:

fork()的開銷:

  • 對子進程分配內存
  • 復制父進程的內存和CPU寄存器到子進程里
  • 開銷昂貴

99%調用fork是為了接下來調用exec,考慮到fork()操作中內存復制是沒有作用的,子進程可能會關閉打開的文件和連接,因此考慮將其合并到一個調用中,于是出現了vfork()。

vfork():

  • 創建進程時,不再創建一個同樣的內存映像,而是當調用exec()時才開始復制,而要被覆蓋或者關閉的資源不再進行復制
  • 一些時候稱為輕量級fork()
  • 子進程應該幾乎立刻調用exec()
  • 現在使用Copy on Write(COW)技術

進程加載exec

  • exec調用成功時:是相同的進程,運行了不同的程序
  • exec()允許一個進程加載一個不同段程序,并在MAIN執行,(_start)
  • 允許一個進程指定參數的數量argc和字符串參數數字argv
  • 允許進程指定不同的控制流,OS中可指定不同的應用程序,即調用成功=相同進程,運行的是不同的程序!
  • Code(代碼段)stack(堆棧)heap(堆)等完全重寫

進程等待與退出:

父進程等待子進程:

1. wait()系統調用用于父進程等待子進程的結束

  • 子進程結束時通過exit()向父進程返回一個值
  • 父進程通過wait()接受并處理返回值

2. wait()系統調用的功能

  • 有子進程存活時,父進程進入等待狀態,等待子進程的返回結果。當某子進程調用exit()時,喚醒父進程,將exit()返回值作為父進程中wait的返回值
  • 有子進程調用exit()而父進程還未調用wait()處理時,子進程被稱為僵尸進程。如果此時父進程調用wait()則直接處理并返回
  • 無子進程或無子進程存活時,wait()也是立刻返回

3. exit()用于進程的有序終止

  • 進程結束執行時調用exit(),完成進程資源回收。

4.?exit()系統調用的功能

  • 將調用參數作為進程的結果返回
  • 關閉所有打開的文件等占用資源
  • 釋放內存
  • 釋放大部分進程相關的內核數據結構
  • 檢查是否父進程是存活的:如果父進程存活,保留結果的值直到父進程用wait()處理,進入僵尸狀態;如果父進程不存活,則子進程為孤兒進程,直接釋放所有數據結果,進程結束
  • 清理所有等待的僵尸進程

其他進程控制系統調用

  • 優先級控制:nice()指定進程的初始優先級;unix系統中進程優先級會隨執行時間而衰落
  • 進程調試支持:ptrace()允許一哥進程控制另一個進程的執行;設置斷點和查看寄存器
  • 定時:sleep()可以讓進程在定時器的等待隊列中等待指定。

為什么要讓父進程等?而不是直接結束?

當進程執行完畢退出后,幾乎所有資源都回收到OS中。但有個資源很難回收,就是PCB,PCB是代表進程存在的唯一標識,OS要依據PCB執行回收。這個功能由父進程完成。

?

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

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

相關文章

日志管理

1、錯誤日志配置 錯誤日志屬于核心功能模塊的參數 worker_processes 1; error_log /data/logs/nginx/error.log error; #一般配置這一行即可 events {worker_connections 1024; }語法規則:error_log file level 錯誤的日志級別有[debug|info|notice|warn|err…

GCC 命令選項使用詳解

GCC 命令行詳解[轉帖] 1、gcc包含的c/c編譯器 gcc、cc、c、g gcc和cc是一樣的,c和g是一樣的,一般c程序就用gcc編譯,c程序就用g編譯 2、gcc的基本用法 gcc test.c這樣將編譯出一個名為a.out的程序 gcc test.c -o test這樣將編譯出一個名為t…

mvn 打包_Spark源碼打包編譯的過程

前言上篇文章介紹了下 安裝sbt環境 啟動scala項目安裝SBT環境運行Scala項目為什么要弄這個 因為我本來是想對spark源碼編譯部署spark是用scala語言編譯的spark源碼https://gitee.com/pingfanrenbiji/sparkspark提供的編譯方式編譯的前提是將所有的依賴包都下載下來而資源包管理…

審計日志功能監控

背景:公司的審計日志經常出現不記錄命令的情況,但是又無法監控到審計功能是否正常。所以我們思路是,每天從CMDB服務器 ssh登錄到每一臺主機。如果審計功能正常,則一定會在auditlog.info文件中有登錄的記錄。如果24小時內這個文件沒…

清華大學《操作系統》(十一):處理機調度

一、處理機調度概念 進程切換(上下文切換):切換CPU的當前任務,從一個進程/線程到另一個,保存當前在PCB/TCB中的執行上下文,讀取下一個的上下文 CPU調度:從就緒隊列中挑選一個進程/線程作為CPU…

通過純css實現圖片居中的多種實現方式

html結構&#xff1a; 1 <div class"demo" style"width: 800px;height: 600px; border:1px solid #ddd"> 2 <img src"default.jpg" width"400" height"300"/> 3 </div> 實現img位于外層div的居中顯示…

GCC 命令行詳解

作者&#xff1a; www.linuxfans.org mozilla 1。gcc包含的c/c編譯器 gcc,cc,c,g,gcc和cc是一樣的&#xff0c;c和g是一樣的&#xff0c;(沒有看太明白前面這半句是什 么意思:))一般c程序就用gcc編譯&#xff0c;c程序就用g編譯 2。gcc的基本用法 gcc test.c這樣將編譯出一個…

Java網絡編程從入門到精通(5):使用InetAddress類的getHostName方法獲得域名

該方法可以得到遠程主機的域名&#xff0c;也可以得到本機名。getHostName方法的定義如下&#xff1a; publicString getHostName() 下面是三種創建InetAddress對象的方式&#xff0c;在這三種方式中&#xff0c;getHostName返回的值是不同的。 1&#xff0e;使用getLocalHost方…

猿輔導python面試_猿輔導面試經歷—個人感受

今天參加了猿輔導的二面&#xff0c;無數槽點&#xff0c;不知道是不是很多公司都是這樣&#xff0c;但是我還是忍不住要逼逼叨。6月10號&#xff0c;我向猿輔導投了簡歷&#xff0c;想做招聘邀約專員這個崗位&#xff0c;然后hr加了我的微信&#xff0c;要了一份簡歷之后通知我…

對稱加密與非對稱加密

&#xff08;一&#xff09;對稱加密&#xff08;Symmetric Cryptography&#xff09; 對稱加密是最快速、最簡單的一種加密方式&#xff0c;加密&#xff08;encryption&#xff09;與解密&#xff08;decryption&#xff09;用的是同樣的密鑰&#xff08;secret key&#xff…

清華大學《操作系統》(十二):臨界區與鎖

多進程并發運行&#xff0c;導致多個進程間有資源共享&#xff0c;比如CPU、內存&#xff0c;因此存在不確定性和不可重現&#xff0c;可能導致多次運行結果不一致。因此操作系統需要利用同步機制在并發執行的同時&#xff0c;保證一些操作是原子操作。 互斥是指一個進程占用了…

gcc生成靜態庫和動態庫

gcc生成靜態庫和動態庫一、庫文件簡介簡單地說&#xff0c;庫&#xff08;Library&#xff09;就是一組已經寫好了的函數和變量、經過編譯代碼&#xff0c;是為了能夠提高開發效率和運行效率而設計的。庫分為靜態庫&#xff08;Static Library&#xff09;和共享庫&#xff08;…

python 流式計算框架_流式計算的三種框架:Storm、Spark和Flink

我們知道&#xff0c;大數據的計算模式主要分為批量計算(batch computing)、流式計算(stream computing)、交互計算(interactive computing)、圖計算(graph computing)等。其中&#xff0c;流式計算和批量計算是兩種主要的大數據計算模式&#xff0c;分別適用于不同的大數據應用…

清華大學《操作系統》(十八):管程于信號量

信號量與管程也是進程間通信的方式。信號量是與鎖在同一層級實現的&#xff0c;是操作系統提供的一種協調共享資源訪問的方法。信號量由操作系統管理&#xff0c;操作系統作為管理者地位是高于進程的。 一、信號量 1、信號量&#xff08;semaphore&#xff09;&#xff1a;是操…

Iptalbes自動封殺暴力破解(Qmail郵件系統)者的IP地址

今天發現Qmail郵件系統的maillog里面有大量的“user not found”信息&#xff0c;通過下面的日志不難發現&#xff0c;是來自同一IP的很多不同的用戶連接Qmail郵件系統認證失敗的信息。黑客試圖通過這種方式來破解Qmail郵件系統的用戶名和密碼&#xff0c;從而來發送大量的垃圾…

安裝Postman

在web和移動端開發時&#xff0c;常常會調用服務器端的restful接口進行數據請求&#xff0c;為了調試&#xff0c;一般會先用工具進行測試&#xff0c;通過測試后才開始在開發中使用。 這里介紹一下如何在chrome瀏覽器利用postman應用進行restful api接口請求測試。 因為&#…

python紅樓夢詞頻統計_用 Python 分析《紅樓夢》(2)-阿里云開發者社區

6 詞頻統計完成分詞以后&#xff0c;詞頻統計就非常簡單了。我們只需要根據分詞結果把片段切分開&#xff0c;去掉長度為一的片段(也就是單字)&#xff0c;然后數一下每一種片段的個數就可以了。這是出現次數排名前 20 的單詞&#xff1a;(括號內為頻數)可以跟之前只統計出現次…

清華大學《操作系統》(二十):死鎖和進程通信

一、死鎖 死鎖&#xff1a;一組阻塞的進程&#xff08;兩個或多個&#xff09;&#xff0c;持有一種資源&#xff0c;等待獲取另一個進程所占有的資源&#xff0c;而導致誰都無法執行。 可重復使用的資源&#xff1a; 在一個時間只能一個進程使用&#xff0c;且不能被刪除。…

python操作redis實例_Java,php,Python連接并操作redis實例

1、Java連接并操作redis在Eclipse里新建一個java project&#xff0c;導入jedis-*.jar包。示例代碼&#xff0c;其他對應的操作類型見&#xff1a;http://my.oschina.net/u/2391658/blog/705069import redis.clients.jedis.Jedis;//示例代碼public class RedisTest {public sta…

java: cannot execute binary file 如果遇到這個錯,一般是操作系統位數出問題了。

[roottestserver usr]# java/jdk1.6.0_12/bin/java-bash: java/jdk1.6.0_12/bin/java: cannot execute binary file后來檢驗&#xff0c;檢查了一段時間&#xff0c;沒有問題&#xff0c;最后有高人提示經驗證&#xff0c;是64位版本移到32位上。本文轉自 jxwpx 51CTO博客&…