Linux 之程序概念:>>
基本概念:>> 一.描述程序: 'PCB -- {描述程序}' Linux 下這個結構的名字叫做 task_struct 1.什麼是程序? :程序就是執行起來的一個程式 ,站在作業系統的角度下程序就是一個 PCB ,在 Linux 系統下用 結構體 task_struct 描述程序 ****Linux 下關於程序的命令{ :ls /proc/ '包含所有程序資訊' 以程序 id 命名 ,ps aux '檢視所有程序' ,ps -ef | grep exe '檢視可執行程式 exe 的程序' ,head -n 50 | tail -n 1 ,top 'Linux 下檢視資源管理器 動態重新整理' ps -l '檢視程序優先順序'{ :PRI '優先順序' ,NI 'nice 值' 調整優先順序的引數 'PRI 與 nice 相加' ,UID 執行者的身份 ,PRI 值越小優先順序更高 PRI(new) = PRI(old) + nice }; nice -n 5 ./main renice -n 10 -p 666 '設定優先順序' pe -efl top '修改已存在程序的 nice 值' echo $PATH '檢視系統環境變數' export '宣告變數' export MYVALUE = 1; env unset MYVALUE '幹掉環境變數' 刪除 檢視環境變數{ :env ,set }; }; ****Linux 下關於程序的函式{ #include <unistd.h> '系統呼叫' :getpid() '獲取程序 ID ' 返回型別 'pid_t' ,fork() '建立程序' *##*fork() 的返回值 '做子程序與父程序的分流'{ pid_t pid = fork(); if(pid < 0){ return -1; } else if(pid == 0){ '子程序' } else{ '父程序' } ,pid '子程序 ID' ppid '父程序 id' 作業系統以父程序為模板建立子程序 ,父子程序程式碼段相同 ,但是書據各自獨有 fork 的返回值起到分流的作用 通過 fork 的返回值來進行判斷哪個是父程序 ,哪個是子程序 對於父程序來說返回值是子程序 id 對於子程序返回的是 0 值 出錯沒有子程序 返回值 -1 '複製的是 PCB' 記憶體指標 } }; 二.程序狀態:{ R(running)/* 0 */ S(sleeping)/* 1 */ D(disk sleep)/* 2 */不可中斷睡眠狀態,喚醒方式特殊 T(stopped)/* 4 */睡眠狀態,停止狀態 Z(zombie)/* 32 */殭屍狀態 };'程序狀態略看' 殭屍程序: 產生原因: 0.子程序先於父程序退出 1.子程序退出為了儲存自己退出的原因 ,因此這個退出後資源不會被完全釋放 ,等待父程序來獲取推出狀態,然後釋放紫子程序所有資源 2.假如父程序沒有關心子程序的退出 ,那麼這個時候這個退出的子程序將成為一個殭屍程序 ,佔據著系統資源而不釋放 危害:資源洩露,正常程序可能無法建立 孤兒程序 '後臺執行'
三.程序優先順序.
互動式程序:
****如何將一個程序繫結在某個 CPU 核心上執行{程序獨佔 CPU 核心}'
資料 拷貝到 暫存器'
每個 CPU 核心可以獨自執行
批處理程序:
競爭性,獨立性,並行,併發
環境變數:>
PATH
echo $PATH '列印環境變數'
環境變數具有全域性性;
程式地址空間:
+---------------------------+
+---------------------------+
| |
+---------------------------+
| 命令列引數環境變數 |
+---------------------------+
| 棧區 |
+---------------------------+
| \/ |
+---------------------------+
| 共享區 |
+---------------------------+
| /\ |
+---------------------------+
| 堆區 |
+---------------------------+
| 未初始化全域性資料區 |
+---------------------------+
| |
| 初始化全域性資料段 |
+---------------------------+
| 程式碼段 |
+---------------------------+
+---------------------------+
程序地址空間:>> 虛擬地址空間
頁表:
:記錄虛擬地址空間與實體地址之間的對映關係
$$$$****程序排程佇列:{
:CPU 如何排程;
,排程的是什麼
,排程 PCB
,排程佇列裡面存放著 結構體:
}
****Makefile 文件替換
all:fork
main:main.c
gcc $^ -o [email protected]
fork:fork.c
gcc $^ -o [email protected]
:nums/main/fork/g
有關程式碼:
#include <stdio.h>
#include <unistd.h>
/*
namespace N
{
int value = 100;
}
*/
//int value = 100;
int main()
{
int value = 100;
pid_t pid = fork();
if(pid < 0)
{
printf("create child process failed!!\n");
return -1;
}
else if(pid == 0)
{
//子程序
printf("this is child!!! %d\n", getpid());
}
else
{
//父程序
printf("this is parent!!! %d\n", getpid());
}
while(1){
printf("pid:%d neihoua!!!:%d\n", getpid(), value);
sleep(1);
}
printf("Hello world\n");
return 0;
}
main.c
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid = getpid();
printf("current process id:%d\n", pid);
while(1)
{
sleep(1);
}
printf("Hello world\n");
return 0;
}