最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

linux應用軟件編程之多任務(進程)詳解

 更新時間:2025年08月15日 09:31:01   作者:Twinkle175  
文章介紹了進程與多任務的概念,涵蓋進程定義、狀態(tài)(運行、就緒、等待、僵尸等)、調(diào)度算法及資源回收機制,并列舉了ps、top、kill等系統(tǒng)命令和fork、exit等編程方法,說明如何創(chuàng)建、管理及終止進程

一、多任務概述

1.定義:

讓系統(tǒng)具備同時處理多個任務的能力

2.實現(xiàn)過程

  • 多進程
  • 多線程
  • 進程間通信

二、進程概述

1.定義

一個正在運行的程序稱為一個進程,其運行過程中需要消耗內(nèi)存和CPU。

2.程序和進程的區(qū)別

                       程序                                                                                        進程

靜態(tài)的數(shù)據(jù)集合,存儲在硬盤空間                    是一個程序動態(tài)執(zhí)行的過程,需要消耗內(nèi)存和CPU

程序運行起來可以產(chǎn)生進程                               進程具備動態(tài)生命周期,從產(chǎn)生到調(diào)度再到消亡

一個程序可以產(chǎn)生多個進程                               一個進程中也可執(zhí)行多個程序

3.進程的產(chǎn)生

進程產(chǎn)生時,操作系統(tǒng)都會為其分配0-4G的虛擬內(nèi)存空間。操作系統(tǒng)內(nèi)存區(qū)如下圖所示:

(1)內(nèi)核: 1 文件管理;2. 進程管;3. 內(nèi)存管理。

(2)棧區(qū):1.保存局部變量;2.函數(shù)的形參和返回值;3.保存函數(shù)的調(diào)用關(guān)系(保護現(xiàn)場和恢復現(xiàn)場)。

(3)堆區(qū):1. 由開發(fā)人員手動分配;2. 使用完要手動釋放。

(4)數(shù)據(jù)區(qū):

  • data段:1. 已初始化的全局變量 ;2. 已初始化的靜態(tài)變量。
  • bss段:1.未初始化的全局變量 ; 2. 未初始化的靜態(tài)變量(static)-->bss段初始時按位清0。
  • 字符串常量區(qū):保存字符串常量   "hello world"

(5)文本區(qū):1. 存放指令代碼   ;2. 存放常量。

4.進程的調(diào)度

  • CPU:

由于CPU數(shù)據(jù)處理速度快,因此是“宏觀并行,微觀串行”。

  • cpu調(diào)度算法

1、時間片輪詢算法

2、先來先服務,后來后服務(任務隊列)

3、短作業(yè)優(yōu)先調(diào)度

4、高優(yōu)先級先執(zhí)行,低優(yōu)先級后執(zhí)行

5.進程的狀態(tài)

  • 操作系統(tǒng)的三態(tài)圖:

  • Linux操作系統(tǒng)的進程狀態(tài):

  • 各進程狀態(tài):

1.運行態(tài)(用戶運行態(tài)、內(nèi)核運行態(tài))     R

正在執(zhí)行,且被CPU任務調(diào)度所執(zhí)行的進程    

2.就緒態(tài)    R

正在執(zhí)行,沒有CPU任務調(diào)度執(zhí)行的進程(只缺少cpu)

3.可喚醒等待態(tài)    S

也稱為睡眠態(tài),阻塞等待資源的進程

4.不可喚醒等待態(tài) D

不想被CPU任務調(diào)度所打斷的進程任務可以設(shè)置為不可喚醒等待態(tài)       

5.暫停態(tài)    T

被暫停執(zhí)行的進程        

6.僵尸態(tài)    Z

進程執(zhí)行結(jié)束,空間沒有被回收        

7.結(jié)束態(tài)    X

進程執(zhí)行結(jié)束,空間被回收

6.進程的消亡

  • 進程執(zhí)行結(jié)束(進程退出)
  •  回收進程資源空間

三、進程相關(guān)的命令

  • 父進程:產(chǎn)生子進程的進程稱為父進程
  • 子進程:父進程產(chǎn)生出來的新進程即為該父進程的子進程

1. ps  -aux

查看進程相關(guān)參數(shù):PID、狀態(tài)、CPU占有率、內(nèi)存占有率

  • USER:創(chuàng)建者
  • PID:進程的ID號
  • %CPU:CPU占有率
  • %MEM:內(nèi)存占有率
  • TTY:當前進程所關(guān)聯(lián)的終端
  • STAT:當前進程的狀態(tài)值(帶“+”號表示前臺進程,不帶“+”號表示后臺進程)
  • START TIME:進程創(chuàng)建的時間
  • COMMAND:進程的名稱(init進程是操作系統(tǒng)啟動的第一個進程)
ps -aux | grep ./a.out
  • |:管道 :前面命令的輸出作為后面命令的輸入
  • grep:字符串查找:在輸入中查找和后面字符串相關(guān)的數(shù)據(jù)        

 

2. top

動態(tài)查看進程的相關(guān)參數(shù):CPU占有率、內(nèi)存占有率

——按照CPU、內(nèi)存占有率的高低進行排列的

  • PR、NI:表示進程的優(yōu)先級,值越小,優(yōu)先級越高
  • TIME+:進程運行的時間

3. ps -ef查看該進程的ID和父進程ID

4. pstree查看進程的產(chǎn)生關(guān)系

pstree -p

查看進程的產(chǎn)生關(guān)系(有PID號)

pstree -sp  進程PID號

查看某個指定的進程的產(chǎn)生關(guān)系

5.kill

kill -信號的編號/信號的名稱  PID

向進程發(fā)送信號,讓進程的狀態(tài)發(fā)生變化

由第一張圖片中可以看出20429進程一開始是在R+運行狀態(tài),執(zhí)行kill相關(guān)命令,其進程被殺死。

結(jié)束一個進程的三種表示形式:

kill -9 PID
kill -SIGKILL PID
killall -9  進程名稱
kill -l

查看系統(tǒng)支持的信號

  • 9——SIGKILL——殺死信號
  • 19——SIGSTOP——暫停態(tài)信號
  • 18——SIGCONT——喚醒信號

+前臺進程后臺進程

6. jobs查看當前終端的后臺進程

7.fg

[ fg 后臺進程編號]

讓后臺進程切換成前臺進程

四、進程相關(guān)的編程

1.實現(xiàn)進程的步驟

進程創(chuàng)建 :   fork()

  • getpid():獲取當前進程自己的PID號
  • getppid():獲取當前進程父進程的PID號

進程調(diào)度:操作系統(tǒng)完成

進程消亡:

  • 1.進程退出:return、exit()相關(guān)函數(shù)
  • 2.回收資源空間:wait()、waitpid()

2.進程創(chuàng)建函數(shù)

pid_t fork(void);

功能:通過拷貝父進程產(chǎn)生一個新的子進程

  • 子進程完全拷貝父進程0-3G的虛擬內(nèi)存空間
  • 子進程拷貝父進程PCB(進程控制塊)塊中的部分內(nèi)容:PID不拷貝

返回值:

  • >0:父進程 ,是子進程的PID號
  • ==0:子進程
  • -1 :出錯

3.示例程序

使用fork函數(shù)創(chuàng)建新進程,

  • 父進程打印自己的PID和自己子進程的pid
  • 子進程中打印自己的PID和父進程的PID
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc , const char *argv[])
{
    
    pid_t pid = fork();

    if(pid > 0)
    {   
       
        while(1)
        {   
            printf("I am father pid = %d sonpid = %d \n",getpid(),pid);
            sleep(1);
        }
    }
    else if(0 == pid)
    {   
        
        while(1)
        {

            printf("I am son pid = %d ppid = %d \n",getpid(),getppid());
            sleep(1);
        }
    }
    else
    {
        perror("fork error");
    }

    return 0;
}

注意:

1. 子進程完完整整拷貝父進程0-3G虛擬內(nèi)存空間。

2. 父子進程棧區(qū)、數(shù)據(jù)區(qū)、文本區(qū)、堆區(qū)完全獨立,數(shù)據(jù)不共享

3. 要想共享數(shù)據(jù),需要使用進程間通信方式實現(xiàn)

例如以下程序:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc , const char *argv[])
{
    
    pid_t pid = fork();
    int num = 0;
    if(pid > 0)
    {   
       num = 100;
        while(1)
        {   
            printf("I am father pid = %d sonpid = %d  num = %d\n",getpid(),pid,num);
            sleep(1);
        }
    }
    else if(0 == pid)
    {   
        num = 1000;
        while(1)
        {

            printf("I am son pid = %d ppid = %d num = %d\n",getpid(),getppid(),num);
            sleep(1);
        }
    }
    else
    {
        perror("fork error");
    }

    return 0;
}

運行結(jié)果如下:

3.進程退出函數(shù)

(1)main中return

#include <stdio.h>
#include <stdlib.h>
int fun()
{
	return 0;
}
int main(int argc, const char *argv[])
{

	int i = 15;
	while (i--)
	{
		printf("PID = %d\n", getpid());
		sleep(1);
	}

	return 0;
}

 (2) exit ()、_exit() :結(jié)束一個進程

  • exit (0) : 正常退出
  • exit (非0) :由于進程產(chǎn)生了某種問題,需要主動退出進程
#include <stdio.h>
#include <stdlib.h>
int fun()
{
	exit(0);
	return 0;
}
int main(int argc, const char *argv[])
{

	fun();
	
	printf("hello world\n");
	return 0;
}

4.回收資源空間:

wait()、waitpid()

僵尸進程:進程退出后,但其資源空間未被父進程回收

如何避免僵尸進程產(chǎn)生:

1.  子進程退出后,父進程及時為其回收資源空間

2.  讓該進程成為一個孤兒進程,結(jié)束時被操作系統(tǒng)中的系統(tǒng)進程回收

孤兒進程:父進程先消亡,其對應的子進程成為一個孤兒進程,會被系統(tǒng)進程所收養(yǎng)

(守護類的進程)

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, const char *argv[])
{
	pid_t pid = fork();
	if (pid > 0)
	{
	
		while (1)
		{
		
			printf("I am father : pid = %d, sonpid = %d\n", getpid(), pid);
			sleep(1);
		}
	}
	else if (0 == pid)
	{
		int i = 15;
		while (i--)
		{
			printf("I am son : pid = %d, ppid = %d\n", getpid(), getppid());
			sleep(1);
		}
	}
	else
	{
		perror("fork error");
	}
	return 0;
}
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, const char *argv[])
{
	pid_t pid = fork();
	if (pid > 0)
	{
		int i = 10;	
		while (i--)
		{
		
			printf("I am father : pid = %d, sonpid = %d\n", getpid(), pid);
			sleep(1);
		}
	}
	else if (0 == pid)
	{
		int i = 20;
		while (i--)
		{
			printf("I am son : pid = %d, ppid = %d\n", getpid(), getppid());
			sleep(1);
		}
	}
	else
	{
		perror("fork error");
	}
	return 0;
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Linux下SFTP用戶權(quán)限設(shè)置條件及實現(xiàn)命令

    Linux下SFTP用戶權(quán)限設(shè)置條件及實現(xiàn)命令

    SFTP賬號是基于SSH賬號的,其擁有的權(quán)限是比較大的,今天主要教大家如何進行SFTP用戶權(quán)限設(shè)置,感興趣的你可不要錯過了哈,希望本文知識可以幫助到你
    2013-02-02
  • Linux安裝yum時出現(xiàn)apt-get?install?E:?無法定位軟件包問題解決

    Linux安裝yum時出現(xiàn)apt-get?install?E:?無法定位軟件包問題解決

    這篇文章主要介紹了Linux安裝yum時出現(xiàn)apt-get?install?E:?無法定位軟件包問題解決的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-12-12
  • Linux中配置DNS全過程

    Linux中配置DNS全過程

    本文詳細介紹了DNS(域名系統(tǒng))的工作原理,包括域名解析的定義、作用以及解析方式,同時,文章還講解了如何搭建DNS服務,包括配置主DNS和輔助DNS,通過配置DNS,可以將域名映射到IP地址,以便于人們記憶和訪問互聯(lián)網(wǎng)上的資源
    2025-12-12
  • 詳解Linux iptables常用防火墻規(guī)則

    詳解Linux iptables常用防火墻規(guī)則

    IPTABLES 是與最新的 3.5 版本 Linux 內(nèi)核集成的 IP 信息包過濾系統(tǒng)。這篇文章主要介紹了Linux iptables常用防火墻規(guī)則,需要的朋友可以參考下
    2019-07-07
  • Linux系統(tǒng)實現(xiàn)關(guān)機的常用命令

    Linux系統(tǒng)實現(xiàn)關(guān)機的常用命令

    在Linux系統(tǒng)中,關(guān)機可以通過多種命令實現(xiàn),具體取決于你的需求(如立即關(guān)機、定時關(guān)機、安全關(guān)機等)以及使用的系統(tǒng)管理工具(如systemd或SysVinit),以下是常用的關(guān)機方法,需要的朋友可以參考下
    2026-02-02
  • CentOS設(shè)置上網(wǎng)代理全過程

    CentOS設(shè)置上網(wǎng)代理全過程

    該文章詳細介紹了在CentOS 7.0系統(tǒng)上設(shè)置代理服務器的過程,包括設(shè)置全局代理、yum代理、wget代理以及配置Docker HTTP代理的步驟
    2025-12-12
  • Win8.1 + CentOS7 雙系統(tǒng) U盤安裝(超詳細教程)

    Win8.1 + CentOS7 雙系統(tǒng) U盤安裝(超詳細教程)

    這篇文章主要介紹了Win8.1 + CentOS7 雙系統(tǒng) U盤安裝(超詳細教程),非常具有實用價值,需要的朋友可以參考下。
    2017-01-01
  • ubuntu24.04設(shè)置靜態(tài)IP地址的方法教學

    ubuntu24.04設(shè)置靜態(tài)IP地址的方法教學

    這篇文章主要為大家詳細介紹了使用ubuntu24.04設(shè)置靜態(tài)IP地址的相關(guān)方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-05-05
  • 一文詳解Linux下如何在vim里使用異步編譯和運行

    一文詳解Linux下如何在vim里使用異步編譯和運行

    這篇文章主要介紹了如何在Linux的vim編輯器中使用異步編譯和運行C++程序,具體功能包括在vim中直接構(gòu)建和運行單個文件或整個項目,使用快捷鍵如F9、F10、F7、F8和F6進行操作,此外,提到了使用兩個vim插件來實現(xiàn)這些功能,并提供了必要的配置文件和命令信息
    2025-10-10
  • 阿里云Centos配置iptables防火墻教程

    阿里云Centos配置iptables防火墻教程

    這篇文章主要為大家詳細介紹了阿里云Centos配置iptables防火墻教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評論

调兵山市| 英吉沙县| 万山特区| 贵州省| 剑阁县| 石嘴山市| 集安市| 墨竹工卡县| 化隆| 峡江县| 旌德县| 张家港市| 宣城市| 海宁市| 通州区| 云浮市| 尼玛县| 广水市| 洪湖市| 平遥县| 琼海市| 孟津县| 沁阳市| 镇宁| 治县。| 财经| 凤阳县| 马龙县| 邢台市| 花垣县| 涞源县| 仙居县| 通城县| 冕宁县| 清涧县| 三都| 麻城市| 田东县| 瓦房店市| 济源市| 南阳市|