【Linux】初識程式!!!

doctor_xiong發表於2018-01-15

概念:程式的一個執行例項。
在Linux裡面有專門用來描述程式狀態的結構task_struct,在系統核心裡面。這個通常被稱為PCB,著這個裡面包含著這個程式的所有資訊。
pid:在描述程式的結構體PCB裡面有一個pid,這個是描述程式ID的,通過這個ID就可以用來區分父程式和子程式。

另外,`getpid()`函式用來獲得當前程式的ID,`getppid()`用來當前程式的父程式ID

使用者自定義程式 fork()
當使用者使用fork()時候,呼叫一次,但是返回值有兩個,子程式的返回值是0,父程式的返回值是自己成的ID,即pid。
這個子程式的所有資源都是父程式的副本,但是父程式和子程式自己的資源完全私有,不共享。
即,在建立子程式的時候將父程式的PCB、資料段、堆疊資源複製一份給子程式。

pid_t fork(void);

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

int main()
{
    pid_t pid;
    printf("begin fork()\n");
    pid = fork();
    if(pid == -1)
    {
        perror("fork:");
        exit(1);
    }
    if(pid == 0)
    {
        printf("I'm child\n");
    }
    else
    printf("I'm parent\n");
    return 0;
}

結果
這裡寫圖片描述

可以看到這個程式將子程式和父程式的結果,但是在這裡面子程式和父程式的執行先後順序是不固定的,這個和核心的排程演算法有關。

程式的狀態:
在系統執行每一個進層的時候並不是一次執行所有的程式,而是分片執行的。即將每一個程式都分為很多的片,系統在排程演算法的排程下,每次都只執行一個程式的一部分。因為CPU執行的速度非常快,所以對人的感覺是每次都在執行所有的程式。
這裡寫圖片描述

如圖
這裡寫圖片描述

當一個程式進入死亡狀態之前會有一段殭屍狀態,在殭屍狀態之前會一直佔用該程式的資源,只到父程式獲得該程式的退出碼。如果一個程式裡面殭屍態的程式太多的話,就會佔用太多的資源,甚至可能導致程式崩潰。


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


int main()
{
    pid_t pid;
    printf("begin fork!\n");
    pid = fork();
    if(pid == -1)
    {
        perror("fork():");
        exit(1);
    }
    if(pid > 0)
    {
        printf("sleeping...\n");
        sleep(30);
    }
    else
    {
        printf("child is begin\n");
        exit(0);
    }
    return 0;
}

在程式裡面父程式睡眠,子程式實行後立即退出。在子程式退出父程式睡眠的時間裡面,那麼這個子程式就是進入殭屍狀態。
這個時候如果使用kill -9 殭屍程式號那麼這個kill指令是殺死不了殭屍程式的,因為在殭屍程式裡面的程式已經是一個死程式。所以在程式裡面需要避免存在太多的殭屍程式。

這裡寫圖片描述

檢視程式ps -l
這裡寫圖片描述

UID:當前被執行者身份
PID:當前程式的ID
PPID:當前程式的父程式ID
PRI:程式的優先順序,PRI值越小表示越早被執行
NI:當前程式的nice值

設定nice值:
在程式啟動之前設定nice值:nice -n -5 ./test 將test程式的nice值設定為5
在程式啟動之後設定nice值:renice -5 -p pid 將pid所表示的程式的nice設定為5