Linux高級編程:進程(一)

1、進程

1.1什么是進程:進行中的程序(正在運行中的程序)-process過程

? ? ? ? 程序的一次執行過程 - 進程

? ? ? ? hello.c --? 程序源代碼

? ? ? ? a.out? ?--? 可執行程序

1.2程序和進程的關系:

????????程序<------>進程

1.3進程怎么來的:

? ? ? ? 程序->加載到內存(運行起來了)-->進程

1.4總結:

進程 ---動態---內存

程序---靜態----硬盤

1個程序可以對應一個或多個進程

1.5為什么需要進程

時間片輪轉

若要保存上次程序運行到哪了,則需記錄-程序的執行狀態

則需要進程這個概念了

描述和記錄,正在運行中的程序的相關信息。

進程的調度(操作系統,上下文的切換)(讓它看起來程序在并發運行,其實每個程序只能運行一小會,且(單核)cpu每次只執行一個程序)

進程的執行特點:微觀串行,宏觀并行。

最核心的目的:提高效率。

1.6進程的組成:

1、

程序 = 代碼 + 數據

bss --- 未初始化的數據 |

data --- 初始化了的數據 | 靜態區 | ---數據

text --- 正文段(代碼段)

bss -- 未初始化? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 棧

----? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 堆

data -- 已初始化? ? ? --------------./a.out------------>? ? ? ? ? ? ? bss

----? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????????????????????????? ? ?data? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

text -- 代碼段? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?text

//linux系統下,程序的內存布局? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //進程的實體

靜態區

字符串常量區

代碼段? //c語言標準的內存布局

進程 -----

pcb---是一個結構體? ? Process Control Block

進程 = pcb塊 + 各個段(棧 | 堆 | bss | data | text)

1.7進程的生命周期:

通用三態模型:

linux系統下的狀態模型:

1.8觀察進程的命令:

1、top命令? :觀察進程? //類似任務管理器

2、ps

man ps /state

進程狀態代碼:

D    uninterruptible sleep (usually IO)
R    running or runnable   (on run queue) ---就緒隊列中
S    interruptible sleep   (waiting for an event to complete)
T    stopped(暫停態), either by a job control signal or because it is being traced.
*W    paging (not valid since the 2.6.xx kernel)
*X    dead (should never be seen)Z    defunct ("zombie") process, terminated but not reaped(收尸) by its parent.

查看進程相關信息

1.就緒態、運行態 R

2.睡眠態、等待態

????????可喚醒等待態 S

????????不可喚醒等待態 D

3.停止態 T

4.僵尸態 Z

5.結束態

ps aux | grep 進程名 (pid號)? //當前進程的id號 及 狀態

此命令可以察看所有同名文件

ps -eLf?| grep 進程名 (pid號)? ?//可查看父進程id號

ppid(parent? process id)//父進程id

3、pstree

pstree -sp id號 //是兩個命令合起來 {pid號(如果不寫表示查看全部的)}

查看進程關系

init(1) (1號進程最早出現的一個進程)---- gnome-terminal(xxxx)----bash(xxxx)

4、kill

kill PID

kill 信號編號(-數字) 進程ID

發送信號+PID對應的進程,默認接收者關閉

kill -9 進程PID號 //殺死程序

kill -l //查看信號列表

killall 信號編號 程序名字

5、 fork()

????????pid_t fork();? ? ? 叉子
?? ?一次調用,會返回兩次。
?? ?子進程先運行和是父進程先進程,順序不確定。
?? ?變量不共享。
?? ?
?? ?子進程復制父進程的0到3g空間和父進程內核中的PCB,但id號不同。
?? ?
?? ?功能:通過該函數可以從當前進程中克隆一個同名新進程。
?? ??? ? ?克隆的進程稱為子進程,原有的進程稱為 父進程。
?? ??? ? ?子進程是父進程的完全拷貝。
?? ??? ? ?子進程的執行過程是從fork函數之后執行。
?? ??? ? ?
?? ??? ? ?子進程與父進程具有相同的代碼邏輯。

?? ?返回值:int 類型的數字。
?? ??? ??? ?在父進程中:成功 返回值是子進程的pid號 >0
?? ??? ??? ??? ??? ??? ?失敗 返回-1;
?? ??? ??? ?在子進程中:成功 返回值 0
?? ??? ??? ??? ??? ??? ?失敗 無

代碼示例:
int main()
{pid_t pid = fork();if(pid < 0){perror("fork fail");return -1;}if(pid >0 ){printf("father---\n");}else if (pid == 0 ){printf("child---\n");}
}

輸出:

代碼解釋:

?父子進程獨立操作。

練習:
1、父子進程都死循環。

? ? ? ? a.結束父進程,查看當前系統中父子進程的狀態

????????b.結束子進程,查看當前系統中父子進程的狀態

#include<stdio.h>
#include<unistd.h>int main(int argc, const char *argv[]){pid_t pid = fork();if(pid < 0){perror("fork fail");return -1;}if(pid >0 ){while(1){printf("father---\n");}                                                                                    }else if (pid == 0 ){while(1){printf("child---\n");}}return 0;}                                                                  

?a.結束父進程? ? //子進程成為后臺進程,孤兒進程 --- 子進程還在,父進程不在。(init收養子進程。以前的版本)

b.結束子進程? ?//子進程結束,父進程還在?父進程沒有去收尸 ---子進程呈僵尸態,若此時結束父進程,則子進程的實尸體被系統收養,但系統發現子進程已死則直接銷毀回收,不然僵尸態(戶口信息)會占用內存。

?2、

自己分別定義一個 static的變量 static int a = 0; 全局變量 int b = 1; 堆區 int *p = (int *)malloc(sizeof(int)); *p = 2; (做修改)父進程中 做加1的操作 ,子進程中做加2的操作 分別打印,查看效果! 同時可以查看一下父子進程的關系(pstree) 父子進程的狀態!

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>int b = 1;int main(int argc, const char *argv[])
{static int a = 0;int *p = (int *)malloc(sizeof(int));*p = 2;pid_t pid = fork();if(pid < 0){perror("fork fail");return -1;}//父進程獨立代碼while(1){if(pid > 0){printf("father a = %d\n",a++);printf("father b = %d\n",b++);printf("father p = %d\n",(*p)++);}//子進程獨立代碼else if(pid == 0){printf("child a = %d\n",a++);printf("child b = %d\n",b++);printf("child p = %d\n",(*p)++);}sleep(1);}return 0;
}

?? 父子進程之間不會影響,誰先運行的順序由操作系統決定,盡可能公平、高效

?

3、面試題:

一次fork生成幾個進程??

他們之間的關系是什么樣的? //生成1個一共有兩個

如果兩次fork同時前后執行,會生成幾個進程? //共有(4)個進程

他們之間的關系如何表示,

有多少個子進程,

有沒有孫進程?有

4、fork()&&fork()|| fork() 總共有幾個進程?

有5個進程

5、

fork();

fork();

fork();? 一共有幾個進程?? //? 2^n個進程

?6、動態生成子進程,并打印輸出各自進程的pid號
#include<stdio.h>
#include<unistd.h>int main(int argc, const char *argv[]){pid_t pid = fork();if(pid < 0){perror("fork fail");return -1;}if(pid >0 ){while(1){printf("father---%d\n",getpid());}                                                                                    }else if (pid == 0 ){while(1){printf("child---%d\n",getpid());}}return 0;}                                                                  

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718134.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718134.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718134.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

http 協議深入介紹

一&#xff0c;http 相關概念 &#xff08;一&#xff09;關鍵名詞 1&#xff0c;互聯網 是網絡的網絡&#xff0c;是所有類型網絡的母集 2&#xff0c;因特網 世界上最大的互聯網網絡。即因特網概念從屬于互聯網概念。習慣上&#xff0c;大家把連接在因特網上的計算機都成…

碼界深潛:全面解讀軟件工程的藝術與科學

&#x1f3e1; 基石構筑篇——軟件工程基礎理論及技能 &#x1f522; 編程語言選型與精修 于軟件工程之浩瀚宇宙中&#xff0c;編程語言猶如各色畫筆&#xff0c;每種語言的特性對應不同的創作領域。譬如Java倚仗跨平臺兼容性和強大的面向對象機制&#xff0c;在企業級應用程序…

【大廠AI課學習筆記NO.59】(12)過擬合與欠擬合

擬合就是調整參數和模型&#xff0c;讓結果無限接近真實值的過程。 我們先來了解個概念&#xff1a; 偏差-方差窘境&#xff08;bias-variance dilemma&#xff09;是機器學習中的一個重要概念&#xff0c;它涉及到模型選擇時面臨的權衡問題。 偏差&#xff08;Bias&#xf…

【leetcode熱題】克隆圖

難度&#xff1a; 中等通過率&#xff1a; 25.1%題目鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 題目描述 克隆一張無向圖&#xff0c;圖中的每個節點包含一個 val 和一個 neighbors &#xff08;鄰接點&#xff09;列表 。 解法&#xff1a; 使用一個 map …

centos7單節點部署ceph(mon/mgr/osd/mgr/rgw)

使用ceph建議采用多節點多磁盤方式部署&#xff0c;本文章僅作為單節點部署參考&#xff0c;請勿用于生產環境 使用ceph建議采用多節點多磁盤方式部署&#xff0c;本文章僅作為單節點部署參考&#xff0c;請勿用于生產環境 使用ceph建議采用多節點多磁盤方式部署&#xff0c;…

使用 Grafana 使用JSON API 請求本地接口 報錯 bad gateway(502)解決

一 . 問題&#xff1a; 在用docker部署Grafana 來實現儀表盤的展示&#xff0c;使用到比較多的就是使用JAON API插件調用本地部署的API&#xff0c;比如訪問localhost下的 /test_data 接口&#xff0c;一般我們使用的是http://localhost:8080/test_data&#xff0c; 但是在訪…

C++面試寶典第34題:整數反序

題目 給出一個不多于5位的整數, 進行反序處理。要求: 1、求出它是幾位數。 2、分別輸出每一位數字。僅數字間以空格間隔, 負號與數字之間不需要間隔。如果是負數,負號加在第一個數字之前, 與數字沒有空格間隔。注意:最后一個數字后沒有空格。 3、按逆序輸出各位數字。逆序后…

Flutter混合棧管理方案對比

1.Google官方&#xff08;多引擎方案&#xff09; Google官方建議的方式是多引擎方案&#xff0c;即每次使用一個新的FlutterEngine來渲染Widget樹&#xff0c;存在的主要問題是每個引擎都要有比較大的內存等資源消耗&#xff0c;雖然Flutter 2.0之后的FlutterEngineGroup通過在…

網絡安全: Kali Linux 使用 nmap 掃描目標主機

目錄 一、實驗 1.環境 2. Kali Linux (2024.1) 使用 namp 掃描目標主機 3.Kali Linux (2024.1)遠程登錄 Windows Server 4.Kali Linux (2024.1) 使用crunch字典工具 5.Kali Linux (2024.1)使用hydra密碼工具 6.Kali Linux (2022.3) 通過SSH端口獲取 Ubuntu 密碼 二、問題…

【信息系統項目管理師】--【信息技術發展】--【新一代信息技術及應用】--【區塊鏈】

文章目錄 第二章 信息技術發展2.2 新一代信息技術及應用2.2.4 區塊鏈1.技術基礎2.關鍵技術3.應用和發展 第二章 信息技術發展 信息技術是在信息科學的基本原理和方法下&#xff0c;獲取信息、處理信息、傳輸信息和使用信息的應用技術總稱。從信息技術的發展過程來看&#xff0c…

3月03日,每日信息差

&#x1f396; 素材來源官方媒體/網絡新聞 &#x1f384; 國產商用飛機C919及ARJ21首次飛抵老撾 &#x1f30d; 北京將打造新一批智能工廠 &#x1f30b; 阿里云將于3月29日停止商標代理服務 &#x1f381; 起亞在美因遠光燈故障召回3.5萬輛Telluride汽車 ? 天涯社區擬5月1日前…

C++——模板詳解

目錄 模板 函數模板 顯示實例化 類模板 模板特點 模板 模板&#xff0c;就是把一個本來只能對特定類型實現的代碼&#xff0c;變成一個模板類型&#xff0c;這個模板類型能轉換為任何內置類型&#xff0c;從而讓程序員只需要實現一個模板&#xff0c;就能對不同的數據進行操…

FPGA-串口接收圖像寫入RAM并讀出在TFT顯示屏上顯示

系統框圖&#xff1a; 需要用到的模塊有&#xff1a; 1&#xff0c;UART_RX(串口接收模塊)&#xff1b; 2&#xff0c;串口接受的數據存放到RAM模塊&#xff1b; 3&#xff0c;RAM IP核&#xff1b; 4&#xff0c;時鐘IP核 &#xff08;TFT顯示屏驅動時鐘的產生&#xff09…

kafka同步副本集及關鍵參數

上篇文章講了副本機制是什么&#xff0c;一文讀懂kafka內部怎么運行的-CSDN博客 這里深挖下同步副本集及里面的關鍵參數。副本會去leader副本拉去數據追加到自己日志中。 我們知道kafka副本的作用是提高系統的高可用。當leader副本掛了時&#xff0c;會從候選副本集中選者一個當…

java-冪等性

冪等性 1.1冪等性定義&#xff1a; 在計算機領域中&#xff0c;冪等&#xff08;Idempotence&#xff09;是指任意一個操作的多次執行總是能獲得相同的結果&#xff0c;不會對系統狀態產生額外影響。在Java后端開發中&#xff0c;冪等性的實現通常通過確保方法或服務調用的結…

設計模式(十四)中介者模式

請直接看原文: 原文鏈接:設計模式&#xff08;十四&#xff09;中介者模式_設計模式之中介模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 前言 寫了很多篇設計模式的…

Ribbon實現Cloud負載均衡

安裝Zookeeper要先安裝JDK環境 解壓 tar -zxvf /usr/local/develop/jdk-8u191-linux-x64.tar.gz -C /usr/local/develop 配置JAVA_HOME vim /etc/profile export JAVA_HOME/usr/local/develop/jdk1.8.0_191 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOM…

npm install 一直在等待sill idealTree buildDeps

最近在整vue的前端項目&#xff0c;npm install的時候一直在等待&#xff0c;記錄下處理過程。 1.檢查當前npm鏡像的地址 輸入命令&#xff1a;"npm config get registry"&#xff0c;如果結果是"https://registry.npmjs.org/"。 更換下地址&#xff0c…

Windows Server 各版本搭建文件服務器實現共享文件(03~19)

一、Windows Server 2003 打開服務器&#xff0c;點擊左下角開始?管理工具?管理您的服務器?添加或刪除角色 點擊下一步等待測試 勾選自定義配置&#xff0c;點擊下一步 選擇文件服務器&#xff0c;點擊下一步 勾選設置默認磁盤空間&#xff0c;數據自己更改&#xff0c;最…

【JavaEE】_Spring MVC 項目傳參問題

目錄 1. 傳遞單個參數 1.1 關于參數名的問題 2. 傳遞多個參數 2.1 關于參數順序的問題 2.2 關于基本類型與包裝類的問題 3. 使用對象傳參 4. 后端參數重命名問題 4.1 關于RequestPara注解 1. 傳遞單個參數 現創建Spring MVC項目&#xff0c;.java文件內容如下&#xff…