進程概念

進程


進程概念

爲了使程序併發的執行,並且對併發執行的程序加以描述和控制,人們引入了進程的概念,進而提高了硬件設備的利用率與系統的吞吐量。

進程:是指在系統中作爲系統資源分配的基本單位,由機器指令、數據和堆棧組成,是一個獨立運行的活動實體。

操作系統用於描述和管理進程的一個數據結構,稱爲進程控制塊(Process Control Block, PCB);

進程實例:由程序段, 相關的數據段, 和PCB;
創建進程:實際上是創建相應的PCB, 操作系統分配相配套的資源;
銷燬進程:實際上就是釋放進程佔有的資源,回收PCB;

Linux下:

PCB是task_struct結構體;

在本人linux系統下task_struct定義在
/usr/src/kernels/2.6.32-431.el6.i686/include/linux路徑下的sched.h文件

這裏寫圖片描述

task_struct 描述信息分類:

  • 標示符 : 描述本進程的唯一標識符,用來區別其他進程。
  • 狀態 :任務狀態,退出代碼,退出信號等。
  • 優先級 :相對於其他進程的優先級。
  • 程序計數器:程序中即將被執行的下一條指令的地址。
  • 內存指針:包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針。
  • 上下文數據:進程執行時處理器的寄存器中的數據。
  • I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表。
  • 記賬信息:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。
  • 其它信息;

通過系統調用獲取進程ID

  • PID :進程ID
  • PPID:父進程ID

這裏寫圖片描述

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>


int main()
{
    printf("pid :%d\n", getpid);
    printf("ppid :%d\n", getppid);

    return 0;
}

這裏寫圖片描述

通過系統調用創建進程

這裏寫圖片描述
函數調用成功 父進程返回子進程ID, 子進程返回0
失敗返回-1

#include <stdio.h>
#include <unistd.h>



int main()
{
    pid_t id = fork();
    if(id < 0)
    {   
        perror("fork");
        return 1;
    }   
    else if(id == 0)  //child
    {   
       while(1)
       {   
       sleep(1);
       printf("I am child ID : %d, father ID : %d\n", getpid(), getppid() );
       }   
    }   
    else        //father
    {   
      while(1)
      {   
       sleep(1);    
       printf("I am father ID : %d, father ID : %d\n", getpid(), getppid());
      }   
    }   
    return 0;
}

這裏寫圖片描述

可以看到兩個進程間是交替運行的。

fork() 創建出來的進程,父子進程代碼共享,數據各自開闢空間, 各有一份(寫實拷貝)。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
    int data = 10;
    pid_t pid;
    if((pid = fork()) < 0)
    {
        perror("fork");
        return 1;
    }
    else if(pid == 0)
    {
       //child
     while(1)
     {
         sleep(1);
         printf("child data : %d, pid = %d, ppid = %d\n",\
                         data, getpid(), getppid());

     }
    }
    else
    {
    //father
      while(1)
      {
       sleep(1);
       printf("father data: %d, pid = %d, ppid = %d\n", data,\
                       getpid(), getppid());
      }
    }
    return 0;
}

這裏寫圖片描述

進程狀態

linux下進程狀態
這裏寫圖片描述

這裏寫圖片描述

  • R運行狀態(running):並不意味進程一定在運行中,它表明進程要麼是在運行中要麼在運行隊列中。
  • S睡眠狀態(sleeping):意味進程在等待某件事情的完成(有時也叫可中斷睡眠(interruptible sleep))。
  • D磁盤休眠狀態(Disk sleep)有時叫作不可中斷睡眠狀態(uninterruptible sleep), 通常這個狀態的進程會等待IO的結束。
  • T停止狀態(stopped) : 可以通過發送SIGSTOP信號給進程停止(T)進程,可以通過發送SIGCONT信號讓進程繼續運行。
  • X死亡狀態(dead): 這個狀態只是一個返回狀態,你不會在任務列表裏看到這個狀態。

進程優先級

CPU分配資源的先後順序 ,就是指進程的優先級(priority)

ps -l 命令
這裏寫圖片描述

PRI:表示進程優先級
NI:代表進程nice值

PRI值越小,表示權限越高。
PRI與NI關係:
PRI(new) = PRI(old) + nice

  • nice 取值範圍-19~20, 一共40個級別。

修改進程優先級命令:
nice/renice/top

nice: 啓動進程前設定進程nice值
  nice -n -3   ./a.out
  設置進程nice爲-3
renice: 進程已存在時設定進程nice值
  renice -3 -p   2455  
  設置進程pid爲2455的nice值爲-3
top: 進程已存在時設定進程nice值
  top
  進入top後輸入 r ——> 輸入進程pid  -->輸入 nice 值 

歡迎各位,批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章