分散式系統之五:程序/執行緒
本博文主要講訴核心作業系統的程序、執行緒等
程序
一個程序由一個執行環境和一個或多個執行緒組成。
執行環境:
資源管理的基本單位,它是一個程序的執行緒所能訪問的由本地核心管理的資源集合,可以提供保護而不被外部執行緒訪問。包含:
1. 一個地址空間:是一組虛擬記憶體的集合,由核心提供,包含一個固定的、包含程式程式碼的不可更改的正文區域;一個堆,能向高位擴充套件;一個棧,能向地位擴充套件。
2. 執行緒同步和通訊資源,如訊號量和通訊介面(例如套接字)
3. 高階資源,如開啟的檔案和視窗
建立新程序:
由作業系統提供的一個不可分割的操作。例如,UNIX的fork系統呼叫建立一個新的程序,它的執行環境是從其呼叫程序拷貝得來的;UNIX的exec系統呼叫是將呼叫程序轉化為執行一個指定名字的程式的程式碼的程序。
在分散式系統中,新程序的建立過程可以被劃分為兩個獨立的方面:
1. 選擇目標主機
2. 建立執行環境(和一個初始執行緒)
選擇目標主機:(策略問題)
1. 轉移策略決定是新程序是在本機執行還是轉移給其他機器,是根據本機節點的負載來決定。可以是確定的(節點A轉移到節點B),也可以是非確定的(節點A隨機轉移到B~E之間的任何節點)。
2. 定位策略決定是選擇哪個節點來駐留被轉移的程序,這取決於節點的相對負載情況、機器的體系結構和它是否擁有某些特殊資源。
建立執行環境:(兩種方式)
1. 當地址空間是一個靜態定義的格式時,地址空間區域可根據指定了地址空間區域範圍的列表來建立,然後地址空間區域由一個可執行檔案程序初始化或者零填滿。
2. 根據一個已存在的執行環境來定義地址空間。例如UNIX fork操作:新建立的子程序共享父程序的正文區域,同時,它的堆和棧區域在大小上(以及初始內容)是父程序的拷貝。
執行緒
優點:
1. 增加操作間併發執行程度
2. 執行緒的建立和管理開銷比程序少
3. 共享一個執行環境,也就是說更容易共享資源
4. 執行緒間的切換代價低。
執行緒的建立:
為執行緒的棧分配一個區域併為處理器中的暫存器、執行緒執行狀態(初始值可以是SUSPENDED或RUNNABLE),以及優先順序提供一個初始值。
執行緒程式設計:(java)
1. Thread(ThreadGroup
2. setPriority(int newPriority),getPriority()設定和返回執行緒的優先順序
3. run()如果執行緒的目標物件有run()方法,執行緒執行其目標物件的run()方法,否則它執行自己的run()方法,(Thread實現Runnable)。
4. start()將執行緒的SUSPENDED狀態轉換為RUNNABLE狀態。
5. sleep(long millisecs)將執行緒轉換為SUSPENDED狀態,並持續指定的時間
6. yield()進入READY狀態並呼叫排程程式
7. destroy()銷燬程式
8. join(long millisecs)呼叫程序阻塞指定的時間,知道thread終止為止
9. interrupt()中斷thread,使其從導致它阻塞的方法(如sleep())返回。
10. wait(long millisecs, int nanosecs)阻塞呼叫執行緒,直到呼叫object的notify()或notifyAll()方法喚醒執行緒,或者執行緒被中斷,又或者阻塞了指定的時間為止。
11. notify(),notifyAll()分別喚醒一個或多個在object上呼叫的wait()方法的執行緒。
執行緒同步:
共享物件並用於執行緒協調和合作。因為執行緒並沒有靜態(類)變數或物件例項變數的私有拷貝。
Java提供了synchronized關鍵字以便程式設計師為執行緒的協調指定監視器。程式設計師可以指定完整的方法,也可以指定任意程式碼塊作為屬於某個物件的監控器。監視器可以保證同一時刻最多隻有一個執行緒在執行。
Java允許通過任何作為條件變數的物件來阻塞或喚醒執行緒。需要阻塞以等待某一條件的執行緒呼叫一個物件的wait()方法。所有的Java物件都實現這一方法,因為它屬於Java的根Object類。另外一個執行緒呼叫notify()方法來為至多一個等待該物件的執行緒接觸阻塞狀態,也可以呼叫notifyAll()方法為所有等待該物件的執行緒接觸阻塞狀態。這兩個方法也屬於Object類。
由於博主知識有限,如有誤,請指正點評,歡迎交流
相關推薦
分散式系統之五:程序/執行緒
本博文主要講訴核心作業系統的程序、執行緒等 程序 一個程序由一個執行環境和一個或多個執行緒組成。 執行環境: 資源管理的基本單位,它是一個程序的執行緒所能訪問的由本地核心管理的資源集合,可以提供保護而不被外部執行緒訪問。包含: 1. 一個地址空間:是一組虛擬記憶體的集合,由核心提供,
Spring Boot教程十五:多執行緒
實際的開發應該開發過程中,經常需要使用到多執行緒,而且大多時候需要獲取到每個執行緒執行的結果,然後再執行剩下的業務邏輯。具體實現如下; pom檔案引用: <dependency> <groupId>com.go
分散式學習之五:redis分步式鎖
前言 分散式鎖一般有三種實現方式:1. 資料庫樂觀鎖;2. 基於Redis的分散式鎖;3. 基於ZooKeeper的分散式鎖。本篇部落格將介紹第二種方式,基於Redis實現分散式鎖。雖然網上已經有各種介紹Redis分散式鎖實現的部落格,然而他們的實現卻有著各種各樣的問題,本
有關對耗時很大迴圈進行並行化優化的探討之三:並行執行緒越多執行就會越快嗎?
在.net framework4.0以後,出現了並行程式設計的概念,使用 Parallel.For(0, N, i =>{ ... },很容易就可以實現我們自定義的並行化迴圈操作,在並行迴圈體中,還可以操作外部的變數,這個特性是很多其他語言所沒有的,當
Java學習之道:多執行緒——讓小球動起來(一)
在講執行緒之前,我們先來談談程序。在我接觸電腦的一段時間後,開始發現當開啟工作管理員後,會有一個程序的顯示,下面的映像名稱裡有很多的可執行檔案。這些可執行檔案有的是系統預設的,有的是我們開啟的,他們都會佔用一定記憶體。 知道了程序,那麼什麼是執行緒呢?執行緒就是執行中程式
【Java併發程式設計】之八:多執行緒環境中安全使用集合API(含程式碼)
在集合API中,最初設計的Vector和Hashtable是多執行緒安全的。例如:對於Vector來說,用來新增和刪除元素的方法是同步的。如果只有一個執行緒與Vector的例項互動,那麼,要求獲取
JAVA併發程式設計(五):建立執行緒的第三種方式:實現Callable介面
眾所周知建立執行緒的方式有兩種:1.繼承Thread類。2.實現Runnable介面。從jdk1.5開始,提供了另一種建立執行緒的方式。今天我們就來看看這第三種方式:實現Callable介面 一、Callable與Runnable 我們直接來看一個使用C
多工處理方式之二:多執行緒
### 執行緒的理解 - 1、作業系統能夠進行**運算排程**的最小單位,即**程式執行的最小單位** - 2、程序負責程式所必須的資源分配**(文字區域、資料區域、堆疊區域)**,**一個程序**中也經常需要同時做多件事,即要**同時執行多個‘子任務’,這些子任務即執行緒**。 > 執行緒是每一個
多程序與多執行緒(五)--Linux 執行緒模型的比較:LinuxThreads 和 NPTL(轉)
當 Linux 最初開發時,在核心中並不能真正支援執行緒。但是它的確可以通過 clone() 系統呼叫將程序作為可排程的實體。這個呼叫建立了呼叫程序(calling process)的一個拷貝,這個拷貝與呼叫程序共享相同的地址空間。LinuxThreads 專案使用這個呼叫來完全在使用者空間模擬對執行緒的支援
作業系統(6)程序---程序概念:程序控制、程序狀態、三狀態模型、掛起模型;執行緒概念:使用者執行緒、核心執行緒、輕權執行緒
文章目錄 1:程序相關概念 1. 程序的概念 2. 程序控制塊 3. 程序狀態 4. 三狀態程序模型(就緒、執行、阻塞/等待) 5. 掛起程序模型 2:程序控制
Windows網路程式設計(五):多執行緒訊息處理
對於服務端來說,呼叫accept()函式同意客戶端連線的請求後,需要處理完與這個客戶端的通訊後回到accept()繼續等待下一個客戶端的連線,如果一個客戶端請求連線時服務端並沒有在accept()處等待,客戶端是無法成功連上服務端的,因此併發客戶端連線的服務端必然是多執行緒的。 服務
python網路基礎之程序,執行緒,協程
程序,協程,執行緒的一些總結 # 1.程序:作業系統分配資源的基本單元,multiprocess模組提供了Process類來代表一個程序物件,這個物件可以理解為是一個獨立的程序,可以執行另外的事情 # 建立程序時,只需要傳入一個執行函式和函式的引數,建立一個 Process 例項,用
胡八一之Java(八):多執行緒
多執行緒的優勢:多程序執行需要獨立的記憶體空間,而多執行緒可以共享記憶體,從而提高了執行緒的執行效率。 建立執行緒一般使用兩種方式: 1、繼承Thread類: import java.io.IOException; public class Test extends
Java之程序執行緒之間的區別和聯絡
執行緒是什麼?程序是什麼?二者有什麼區別和聯絡? 執行緒是CPU獨立執行和獨立排程的基本單位; 程序是資源分配的基本單位; 兩者的聯絡: 程序和執行緒都是作業系統所執行的程式執行的基本單元。 區別: 程序具有獨立的空間地址,一個程序崩潰後,在保護模
shell 指令碼: 多執行緒判斷多個程序是否存在,不存在則重啟
shell 預熱 shell 中變數用 $ 區別 在shell指令碼中變數賦值等號前後不能有空格,有空格會被認為是命令 str='測試' echo $str arr=('test1' 'test2' 'test3') # 陣列, 每個元素間以空格隔開 echo
程序執行緒基礎之fork函式的使用
fork是Linux中比較重要的一個函式 他從已經存在的程序中建立一個新的程序 新的程序稱為子程序,原程序稱為父程序 子程序基本是父程序的一個複製品 #include <unistd.h> #include <stdio.h> #incl
Objective-C Runtime 執行時之五:協議與分類
Objective-C中的分類允許我們通過給一個類新增方法來擴充它(但是通過category不能新增新的例項變數),並且我們不需要訪問類中的程式碼就可以做到。 Objective-C中的協議是普遍存在的介面定義方式,即在一個類中通過@protocol定義介面,在另外
.Neter玩轉Linux系列之五:crontab使用詳解和Linux的程序管理以及網路狀態監控
基礎篇 實戰篇 一、crontab使用詳解 概述:任務排程:是指系統在某個時間執行的特定的命令或程式。 任務排程分類: (1)系統工作:有些重要的工作必須周而 復始地執行。 (2)個別使用者工作:個別使用者可能希望執 行某些程式。
iOS開發之再探多執行緒程式設計:Grand Central Dispatch詳解
Swift3.0相關程式碼已在github上更新。之前關於iOS開發多執行緒的內容釋出過一篇部落格,其中介紹了NSThread、操作佇列以及GCD,介紹的不夠深入。今天就以GCD為主題來全面的總結一下GCD的使用方式。GCD的歷史以及好處在此就不做過多的贅述了。本篇部落格會通過一系列的例項來好好的總結一下GC
學習進度:記錄執行緒,迴圈檢視當前執行的程序
import threading # 匯入執行緒模組 import time def demo1(): for temp in range(5): # 建立整數列表,迴圈5次 print("-----demo1---%d---" % temp)