1. 程式人生 > >Unix程序和執行緒管理

Unix程序和執行緒管理

Unix程序和執行緒管理

一,程序

1,什麼是程序

在最初的單處理器系統中,系統中的多道程式按照一定規則切換而實現多工處理,後來發現多個程式併發導致系統資源被共享,為了描述和管理程式對共享資源的使用情況,就提出了程序的概念。所以可以知道程序就是系統分配和管理資源的單位,打個不恰當的比喻,可以把系統比作老闆,員工比作程序,老闆發工資是按人頭髮的,計算的是每個人應得多少錢。

程序的定義眾說紛紜,但含義基本類似,我看過一本說上給的定義是:程序是一個具有一定獨立功能的程式或程式段在一組資料集合上的一次動態執行過程。

2,程序的描述

程序具有動態性,獨立性,併發性等特徵。程序中含有執行任務的程式、程序執行中表現的各種狀態、程式執行中使用的資料及在某一時間點上各個暫存器中保留的資訊。

為了便於程序的管理,在作業系統內部要建立程序的資料描述資訊,程序的描述資訊和程序實體構成了程式的結構,其中包括:

  • 1)程序控制塊(PCB)

    PCB中包括了程序描述資訊、控制資訊、程序使用資源情況、處理器現場保護結構等。

    PCB是程序動態特徵的集中體現,作業系統是從程序PCB的資訊感知程序的存在的,所以一個程序的PCB是常駐記憶體的,後兩部分在程序未被排程時會儲存在外存中。

  • 2)程式段

    包含了程序的程式程式碼。

  • 3)資料結構集

    是程序執行時要訪問的工作區和資料物件。

3,程序控制的基本概念

  • 1)原語

    原語是完成特定功能的程式段,其執行具有不可分割、不可間斷、不可併發等原子特性。作業系統中包括如程序建立、程序撤銷、程序阻塞、程序喚醒等原語。

  • 2)臨界區

    是指在共享某個資源時不予許程序交叉執行的一段程式,具有這種特性的資源稱為臨界資源。

  • 3)程序互斥

    即某個共享資源不允許多個程序交叉執行。

  • 4)程序同步

    在一組併發程序中,由於直接制約關係而相互發送訊息、協同工作的過程稱為程序同步。

  • 5)訊號量

    對臨界區中的共享資源設定的一種管理變數,該變數可以描述共享資源被使用和釋放的狀態。分為公有訊號量和私有訊號量,公有訊號量被所有併發程序共享,私有訊號量被多個相互制約的程序共享。

4,程序建立

使用系統呼叫fork()來完成,該函式呼叫失敗時返回-1,成功時在父程序中返回子程序的pid,在子程序中返回0。

這句話的意思不好理解,需要了解fork()函式的原理,fork()的原理就是把父程序的所有資源都複製一遍,並給複製出來的程序重新分配pid就是子程序了。並且複製出來的程序狀態(變數的值、程式碼執行到的位置。。。)也和父程序執行到fork()這個語句是一樣。所以fork()函式在父程序和子程序中都會返回一次。如果你在fork()後列印pid到螢幕會有兩個值,分別是兩個程序執行的結果。

程式碼如下:

int pid=fork();
printf("%d\n",&pid);

那麼這兩行程式碼的執行結果就可能是下面這樣的:

3198
0

fork系統呼叫完成的工作步驟如下

  • 1)為子程序在程序表中分配一個空閒的proc結構
  • 2)賦給子程序唯一的程序標識(pid)
  • 3)複製父程序上下文的邏輯副本(這時對父程序中可用於共享的部分,如程序的正文段,並不是真正進行復制操作,而只是增加共享區的引用計數)
  • 4)增加與父程序相關聯的檔案表和索引節點表的引用數
  • 5)分別對父子程序返回pid(父程序返回大於0的整數,子程序返回0)

5,程序終止

通過系統呼叫exit()來終止正在執行的程序,這時程序會釋放其所佔有的資源,如開啟的所有檔案、釋放程序上下文佔用的記憶體等,但該程序的proc仍保留在記憶體中,直到下一輪排程來臨時才完成程序表項的調整。

  • 孤兒程序

    是指父程序已終止,而子程序還未終止的程序。Unix系統中孤兒程序由1號程序(init程序)來收養,因此所有孤兒程序的父程序都是1號程序。還規定,所有成為孤兒程序的程序都會變成後臺程序。

  • 僵死程序

    指已經完成任務等待父程序將其回收的程序,在Unix中由父程序使用wait()系統呼叫進行回收。

6,exec系統呼叫

前面說fork會複製父程序,即父子程序會執行同一份程式碼,當然你可以根據父子程序的fork返回值不同的特點有條件語句使父子程序執行不同的程式碼,但是Unix提供了更為直接和方便的方法。

當用戶呼叫exec系統呼叫後,作業系統會引數中指明的一個可執行程式的複本將呼叫程式的正文段和資料段進行覆蓋,然後使用提供的引數去執行這段新程式碼。

實驗

/*
cp.c檔案,功能是複製一個檔案,原始碼如下
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc,char *argv[]){

    int fd1,fd2,n;
    char buf[512];
    if(argc<=2){
        printf("ERR\n");exit(1);
    }

    fd1=open(argv[1],0);//read only
    fd2=creat(argv[2],0644);

    while((n=read(fd1,buf,512))>0) write(fd2,buf,n);

    close(fd1);
    close(fd2);

    return 0;
}

使用gcc -o cp cp命令編譯以上程式碼,得到可執行檔案cp,執行結果如下:

/*
exec.c檔案原始碼如下
*/
#include <stdio.h>
#include <unistd.h>

int main(){
    printf("One\n");
    
    //execl("/bin/ls","ls",NULL);
    execl("./cp","","a.c","aa.c",NULL);
    
    printf("Two\n");
    perror("err");
    return 0;
}

execl是exec的一種擴充套件形式,用法差不多,execl的第一個引數是可執行檔案的路徑,最後是一個字元指標陣列表示執行程式的環境,一般預設用0就行,中間的用來傳遞給可執行檔案的引數

執行結果:

相關推薦

Unix程序執行管理

Unix程序和執行緒管理 一,程序 1,什麼是程序 在最初的單處理器系統中,系統中的多道程式按照一定規則切換而實現多工處理,後來發現多個程式併發導致系統資源被共享,為了描述和管理程式對共享資源的使用情況,就提出了程序的概念。所以可以知道程序就是系統分配和管理資源的單位,打個不恰當的比喻,可以把系統比作老闆,員

程序執行——Python中的實現

一、程序(Process)     程序是一個實體。每一個程序都有它自己的地址空間,一般情況下,包括文字區域(text region)、資料區域(data region)和堆疊(stack region)。文字區域儲存處理器執行的程式碼;資料區域儲存變數和程序執行期間使用的動

python 學習第二十二天(程序執行

程序 程序就是一個程式在一個數據集上的一次動態執行過程。 程序一般由程式、資料集、程序控制塊三部分組成。 我們編寫的程式用來描述程序要完成哪些功能以及如何完成; 資料集則是程式在執行過程中所需要使用的資源; 程序控制塊用來記錄程序的外部特徵,描述程序的執行變化過程,系統可以利

CPU的核、程序執行

轉自https://www.cnblogs.com/-new/p/7234332.html   一、CPU與核心 物理核 物理核數量=cpu數(機子上裝的cpu的數量)*每個cpu的核心數 虛擬核 所謂的4核8執行緒,4核指的是物理核心。通過超執行緒技術,用一個物理核模擬

程序執行的區別?什麼時候用程序?什麼時候用執行?----看到好的複製到自己的園子裡哈哈 程序執行的區別?什麼時候用程序?什麼時候用執行

程序和執行緒的區別?什麼時候用程序?什麼時候用執行緒?   答:首先得知道什麼是程序什麼是執行緒? 我的理解是程序是指在系統中正在執行的一個應用程式;程式一旦執行就是程序,或者更專業化來說:程序是指程式執行時的一個例項。 執行緒是程序的一個實體。 程序——資

程序執行及Linux下的程式設計

程序和執行緒及Linux下的程式設計 一、概述 程序和執行緒網路上有一堆解釋,我不喜歡抄襲,也不喜歡套用太教科書的說法。就以我自己的理解來說說程序和執行緒吧,當然自己的理解肯定不是很嚴謹,但是理解起來應該會比教科書快一點。程序和執行緒都可以認為是併發執行程式,但是隻有多處理器下的多執行緒

程序執行概念

1、程序 (1)一次程式的執行; (2)系統進行資源分配和排程的獨立單位; 例如:windows資源管理器裡面的.exe 2、執行緒 (1)程序中獨立執行的子任務 3、區別 (1)程序可以包含多個執行緒; 例如QQ.exe包含資料傳輸執行緒、下載執行緒等 4、多執行緒的

理解作業系統之程序執行

在作業系統中,設定了程序和執行緒的概念去描述程式併發執行邏輯。本文屬於研究程序和執行緒的入門級文章。 主要從以下五個方面介紹程序以及執行緒的相關概念。 程序和執行緒的定義 作業系統中對程序和執行緒的描述 程序的多層排程 程序/執行緒之間的同步機制 程序/執行緒之間的通訊機制 如何避

現代作業系統:程序執行總結

多程序 程序是資源(CPU、記憶體等)分配的基本單位,它是程式執行時的一個例項。程式執行時系統就會建立一個程序,併為它分配資源,然後把該程序放入程序就緒佇列,程序排程器選中它的時候就會為它分配CPU時間,程式開始真正執行。 Linux系統函式fork()可以在父程序中建立一個子程序,

現代作業系統:第二章 程序執行

作業系統中最核心的概念就是程序,這是對正在執行的程式的抽象。 程序是作業系統資源分配的基本單位,而執行緒是任務排程和執行的基本單位。 2.1 程序 作業系統最核心的概念就是程序,它是對正在執行的程式的一個抽象,也可以理解為對處理器的抽象。即使可用的CPU可用,但是依然可以支援多程

linux檢視程序所有子程序執行

linux檢視程序所有子程序和執行緒 原文連線:https://blog.csdn.net/uestczshen/article/details/74091892    問題: 我的程式在其內部建立並執行了多個執行緒,我怎樣才能在該程式建立執行緒後監控其中單個執行緒?

【筆記】程序執行的概念異同

一、程序 1.程序就是一個正在執行的程式。程序是作業系統分配資源的最小單位。 2.程序的缺點: (1)程序佔有系統資源; (2)程序的切換給作業系統帶來了額外的開銷; (3)建立新程序會把父程序的資源複製一份到子程序,如果建立多個程序,會佔用大量資源; (4)程序間的資料共享

圖說程序執行

程序(process)和執行緒(thread)是作業系統的基本概念,但是它們比較抽象,不容易掌握。 1.計算機的核心是CPU,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。   2.假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其他車間

三、程序執行、協程在python中的使用

三、程序和執行緒、協程在python中的使用   1、多程序一般使用multiprocessing庫,來利用多核CPU,主要是用在CPU密集型的程式上,當然生產者消費者這種也可以使用。多程序的優勢就是一個子程序崩潰並不會影響其他子程序和主程序的執行,但缺點就是不能一次性啟動太多程序,會嚴重影響系統的資源排程

1.0-併發程式設計-程序執行簡介

程序程序是資源(CPU、記憶體等)分配的基本單位,它是程式執行時的一個例項。程式執行時系統就會建立一個程序,併為它分配資源,然後把該程序放入程序就緒佇列,程序排程器選中它的時候就會為它分配CPU時間,程式開始真正執行。 執行緒執行緒是程式執行時的最小單位,它是程序的一個執行流,是CPU排程和分派的基本單位,

零碎筆記之程序執行

android程序和執行緒 建構函式將Looper和Handler以及MessageQueue三者相互關聯起來   建立一個執行緒訊息佇列的步驟: 1.Looper.prepare() 2.new Handler()  (handleMessage)

面試問題:程序執行的區別是什麼?

進 程和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程

程序執行的區別複習

根本區別:程序是作業系統資源分配的基本單位,而執行緒是任務排程和執行的基本單位   簡言之:   程序就是一個應用程式在處理機上的一次執行過程,它是一個動態的概念,而執行緒是程序中的一部分,程序包含多個執行緒在執行。   執行緒是指程序內的一個執行單元,也是程

python中的程序執行

什麼是程序(process)? 程式並不能單獨執行,只有將程式裝載到記憶體中,系統為它分配資源才能執行,而這種執行的程式就稱之為程序。程式和程序的區別就在於:程式是指令的集合,它是程序執行的靜態描述文字;程序是程式的一次執行活動,屬於動態概念。 在多道程式設計中,我們允許多個程式

關於(程序執行)的總結

關於程序和執行緒的總結 程序: 代表就是一個軟體執行,例如工作管理員中程序會有QQ的執行狀態 執行緒: 代表的就是QQ這個軟體同時傳送多個訊息和接收多個訊息 例項程序的物件: Thread wina = new Thread(); 多執行緒作為Java中很重要的一個知識點,在此還是有