[操作系統]進程和線程

目錄

1.什么是進程

1.1進程控制塊抽象

1.2 CPU 分配 —— 進程調度(Process Scheduling)

1.3內存分配 —— 內存管理(Memory Manage)

1.4進程間通信(Inter Process Communication)

2.線程

?2.1概念

2.2為什么要有線程

2.3線程和進程的區別

2.4 Java線程和操作系統線程的關系

3.使用Java代碼來實現多線程程序

3.1.繼承Thread類來實現

3.2實現Runnalbe接口

3.3匿名內部類創建Thread子類對象

3.4匿名內部類創建Runnable類對象

3.5?多線程的優勢-增加運行速度


1.什么是進程

? 每個應用程序運行于現代操作系統上的時候,操作系統會提供一種抽象,好像系統上只有這個程序在運行,所有的硬件資源都是這個程序在使用。這種假象是通過抽象了一個進程的概念來完成的,進程可以說是計算機科學最重要和最成功的概念之一。

進程是操作系統對一個正在運行的程序的一種抽象,換言之,可以把進程看做程序的一次運行過程;同時,在操作系統內部,進程又是操作系統進行資源分配的基本單位.

1.1進程控制塊抽象

? ?計算機內部要管理任何現實事物,都需要將其抽象成一組有關聯的、互為一體的數據。在 Java 語言中,我們可以通過類/對象來描述這一特征.

// 以下代碼是 Java 代碼的偽碼形式,重在說明,無法直接運行
class PCB {
// 進程的唯一標識 —— pid;
// 進程關聯的程序信息,例如哪個程序,加載到內存中的區域等
// 分配給該資源使用的各個資源
// 進度調度信息
}

? ? 這樣,每一個 PCB 對象,就代表著一個實實在在運行著的程序,也就是進程。
操作系統再通過這種數據結構,例如線性表、搜索樹等將 PCB 對象組織起來,方便管理時進行增刪查改的操作.


1.2 CPU 分配 —— 進程調度(Process Scheduling)

? 為了便于討論和理解,我們大部分的場景下假設是單CPU單核的計算機。
操作系統對CPU資源的分配,采用的是時間模式 —— 不同的進程在不同的時間段去使用 CPU 資源。

1.3內存分配 —— 內存管理(Memory Manage)

? 操作系統對內存資源的分配,采用的是空間模式 —— 不同進程使用內存中的不同區域,互相之間不會干擾。
?

1.4進程間通信(Inter Process Communication)

? ?如上所述,進程是操作系統進行資源分配的最小單位,這意味著各個進程互相之間是無法感受到對方存在的,這就是操作系統抽象出進程這一概念的初衷,這樣便帶來了進程之間互相具備”隔離性
? (Isolation)“。
? 但現代的應用,要完成一個復雜的業務需求,往往無法通過一個進程獨立完成,總是需要進程和進程進行配合地達到應用的目的,如此,進程之間就需要有進行“信息交換“的需求。進程間通信的需求就應運而生。
目前,主流操作系統提供的進程通信機制有如下:
1. 管道
2. 共享內存
3. 文件
4. 網絡
5. 信號量
6. 信號
?其中,網絡是一種相對特殊的 IPC 機制,它除了支持同主機兩個進程間通信,還支持同一網絡內部非同一主機上的進程間進行通信.
?

2.線程

?2.1概念

一個線程就是一個'執行流',每個線程之間都可以按照順序執行自己的代碼,多個線程之間'同時'執行著多份代碼

舉個例子,比如我現在要去搬家,我一個人忙不過來,喊了張三和李四一起來.然后我們三個人一人負責一件事,我負責搬家電,張三負責開車,李四負責收拾.但是本質上我們三個人是辦的搬家這一件事.

?此時我們就可以把這種情況稱為多線程,將一個大任務分解成不同的小任務,交給不同執行流分別執行,其中張三和李四是我叫來的,所以我一般被稱為主線程.

2.2為什么要有線程

?

? ?首先 , " 并發編程 " 成為 " 剛需 ".
單核 CPU 的發展遇到了瓶頸 . 要想提高算力 , 就需要多核 CPU. 而并發編程能更充分利用多核 CPU
資源 .
有些任務場景需要 " 等待 IO", 為了讓等待 IO 的時間能夠去做一些其他的工作 , 也需要用到并發編

? 其次 , 雖然多進程也能實現 并發編程 , 但是線程比進程更輕量 .
創建線程比創建進程更快 .
銷毀線程比銷毀進程更快 .
調度線程比調度進程更快? ?


2.3線程和進程的區別

進程是包含線程的.每個進程至少有一個線程存在,即主線程。
進程和進程之間不共享內存空間 . 同一個進程的線程之間共享同一個內存空間 .
進程是系統分配資源的最小單位,線程是系統調度的最小單位。

2.4 Java線程和操作系統線程的關系

線程是操作系統中的概念. 操作系統內核實現了線程這樣的機制, 并且對用戶層提供了一些 API 供用戶使用(例如 Linux 的 pthread 庫).
Java 標準庫中 Thread 類可以視為是對操作系統提供的 API 進行了進一步的抽象和封裝

3.使用Java代碼來實現多線程程序

3.1.繼承Thread類來實現

package demo;class MyThread extends Thread{@Overridepublic void run() {while (true){System.out.println("這是線程運行的代碼");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class Test {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();while (true){System.out.println("main函數");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

使用Javabin自帶的jconsole來觀察線程

?上圖是一個main線程

3.2實現Runnalbe接口

package demo1;
class MyThread implements Runnable{@Overridepublic void run() {System.out.println("Runable");}
}public class Test {public static void main(String[] args) {Thread myThread = new Thread(new MyThread());myThread.start();}
}

3.3匿名內部類創建Thread子類對象

package demo2;public class Test {public static void main(String[] args) {Thread thread = new Thread(){@Overridepublic void run() {System.out.println("匿名內部類創建子類對象");}};}
}

3.4匿名內部類創建Runnable類對象

package demo3;public class Test {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("匿名內部類創建Runnable類對象");}};}
}

3.5lambda表達式創建Runnable子類對象

package demo4;public class Test {public static void main(String[] args) {Thread runnable = new Thread(() -> {System.out.println("hello");});}
}

3.5?多線程的優勢-增加運行速度

可以觀察多線程在一些場合下是可以提高程序的整體運行效率的。
使用 System.nanoTime() 可以記錄當前系統的 納秒 級時間戳.
serial 串行的完成一系列運算. concurrency 使用兩個線程并行的完成同樣的運算.
?

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

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

相關文章

論文閱讀 Forecasting at Scale (二)

最近在看時間序列的文章,回顧下經典 論文地址 項目地址 Forecasting at Scale 3.2、季節性 3.3、假日和活動事件3.4、模型擬合3.5、分析師參與的循環建模4、自動化預測評估4.1、使用基線預測4.2、建模預測準確性4.3、模擬歷史預測4.4、識別大的預測誤差 5、結論6、致…

【Python】重磅!這本30w人都在看的Python數據分析暢銷書更新了!

Python 語言極具吸引力。自從 1991 年誕生以來,Python 如今已經成為最受歡迎的解釋型編程語言。 【文末送書】今天推薦一本Python領域優質數據分析書籍,這本30w人都在看的書,值得入手。 目錄 作譯者簡介主要變動導讀視頻購書鏈接文末送書 pan…

【計算機方向】通信、算法、自動化、機器人、電子電氣、計算機工程、控制工程、計算機視覺~~~~~合集!!!

◆本文為大家梳理了近期可投的EI國際會議,涵蓋計算機各個學科方向,均可EI檢索 本期EI會議匯總合集涵蓋領域:計算機視覺、物聯網、算法、通信、智能技術、人工智能、人機交互、機器人、電子電氣等眾多領域! 本期所推薦的EI會議有…

ros2不同機器通訊時IP設置

看到這就是不同機器的IP地址,為了避免在路由器為不同的機器使用DHCP分配到上面的地址,可以設置DHCP分配的范圍:(我的路由器是如下設置的,一般路由器型號都不一樣,自己找一下) 防火墻設置-----&…

Leetcode—13.羅馬數字轉整數【簡單】

2023每日刷題(三十七) Leetcode—13.羅馬數字轉整數 算法思想 當前位置的元素比下個位置的元素小,就減去當前值,否則加上當前值 實現代碼 int getValue(char c) {switch(c) {case I:return 1;case V:return 5;case X:return 1…

elasticsearch 8安裝

問題提前報 max virtual memory areas error max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 如果您的環境是Linux,注意要做以下操作,否則es可能會啟動失敗 1 用編輯工具打開文件/etc/sysctl.conf 2 …

wpf使用CefSharp.OffScreen模擬網頁登錄,并獲取身份cookie

目錄 框架信息&#xff1a;MainWindow.xamlMainWindow.xaml.cs爬取邏輯模擬登錄攔截請求Cookie獲取 CookieVisitorHandle 框架信息&#xff1a; CefSharp.OffScreen.NETCore 119.1.20 MainWindow.xaml <Window x:Class"Wpf_CHZC_Img_Identy_ApiDataGet.MainWindow&qu…

selinux-policy-default(2:2.20231119-2)軟件包內容詳細介紹(2)

接前一篇文章&#xff1a;selinux-policy-default&#xff08;2:2.20231119-2&#xff09;軟件包內容詳細介紹&#xff08;1&#xff09; 4. 重點文件內容解析 &#xff08;1&#xff09;control/postist文件 文件內容如下&#xff1a; #!/bin/sh set -e# summary of how th…

22LLMSecEval數據集及其在評估大模型代碼安全中的應用:GPT3和Codex根據LLMSecEval的提示生成代碼和代碼補全,CodeQL進行安全評估

LLMSecEval: A Dataset of Natural Language Prompts for Security Evaluations 寫在最前面主要工作 課堂討論大模型和密碼方向&#xff08;沒做&#xff0c;只是一個idea&#xff09; 相關研究提示集目標NL提示的建立NL提示的建立流程 數據集數據集分析 存在的問題 寫在最前面…

力扣算法練習BM45—滑塊窗口的最大值

題目 給定一個長度為 n 的數組 num 和滑動窗口的大小 size &#xff0c;找出所有滑動窗口里數值的最大值。 例如&#xff0c;如果輸入數組{2,3,4,2,6,2,5,1}及滑動窗口的大小3&#xff0c;那么一共存在6個滑動窗口&#xff0c;他們的最大值分別為{4,4,6,6,6,5}&#xff1b; 針…

使用Python畫一棵樹

&#x1f38a;專欄【不單調的代碼】 &#x1f354;喜歡的詩句&#xff1a;更喜岷山千里雪 三軍過后盡開顏。 &#x1f386;音樂分享【如愿】 &#x1f970;歡迎并且感謝大家指出我的問題 文章目錄 &#x1f339;Turtle模塊&#x1f384;效果&#x1f33a;代碼&#x1f6f8;代碼…

【tomcat】java.lang.Exception: Socket bind failed: [730048

項目中一些舊工程運行情況處理 問題 1、啟動端口占用 2、打印編碼亂碼 ??&#xfffd;&#xfffd; 13, 2023 9:33:26 &#xfffd;&#xfffd;&#xfffd;&#xfffd; org.apache.coyote.AbstractProtocol init &#xfffd;&#xfffd;&#xfffd;&#xfffd;: Fa…

五毛QQ項目記

問題與挑戰&#xff1a;某公司為了實現某馬總造福全人類&#xff0c;紅旗插遍全球的宏偉目標&#xff0c;為應對后續用戶量激增的問題。特別安排了一次針對全體用戶的秒殺活動&#xff1a;于XXXX年XX月XX日XX時XX分XX秒開始的秒殺五毛錢一百個QQ幣的活動。每個賬戶僅限一次&…

oracle面試相關的,Oracle基本操作的SQL命令

文章目錄 數據庫-Oracle〇、Oracle用戶管理一、Oracle數據庫操作二、Oracle表操作1、創建表2、刪除表3、重命名表4、增加字段5、修改字段6、重名字段7、刪除字段8、添加主鍵9、刪除主鍵10、創建索引11、刪除索引12、創建視圖13、刪除視圖 三、Oracle操作數據1、數據查詢2、插入…

ubuntu 20.04如何切換gcc/g++/python的版本

ubuntu 20.04如何切換gcc/g/python的版本 1 安裝gcc/g/python2 設置gcc/g/python的備選項3 選擇當前系統要使用的gcc/g/python版本3.1 切換gcc/g/python版本3.2 切換示例 當系統同時存在gcc-9以及gcc-10時該如何切換讓當前的系統gcc版本指向gcc-9或是gcc-10呢&#xff1f;g也同…

Connect-The-Dots_2

Connect-The-Dots_2 一、主機發現和端口掃描 主機發現&#xff0c;靶機地址192.168.80.148 arp-scan -l端口掃描 nmap -A -p- -sV 192.168.80.148開放端口 21/tcp open ftp vsftpd 2.0.8 or later 80/tcp open http Apache httpd 2.4.38 ((Debian)) 111/tcp …

循環隊列詳解!!c 語言版本(兩種方法)雙向鏈表和數組法!!

目錄 1.什么是循環隊列 2.循環隊列的實現&#xff08;兩種方法&#xff09; 第一種方法 數組法 1.源代碼 2.源代碼詳解&#xff01;&#xff01; 1.創造隊列空間和struct變量 2.隊列判空 3.隊列判滿&#xff08;重點&#xff09; 4.隊列的元素插入 5.隊列的元素刪除 …

GIT實踐與常用命令---回退

實踐場景 場景1 回退提交 在日常工作中&#xff0c;我們可能會和多個同事在同一個分支進行開發&#xff0c;有時候我們可能會出現一些錯誤提交&#xff0c;這些錯誤提交如果想撤銷&#xff0c;可以有兩種解決辦法:回退( reset )、反做(revert) keywords&#xff1a;reset、rev…

2023軟件測試的4個技術等級,你在哪個級別?

最近&#xff0c;我們討論了軟件測試工程的的分級&#xff0c;大家都貢獻了自己的想法&#xff0c;對于大家來說&#xff0c;軟件測試人的分級其實也代表了我們的進階方向&#xff0c;職業發展。總體來說&#xff0c;測試工程師未來發展有三個方向&#xff1a; 技術精英 行業專…