1. 程式人生 > >Linux 之程序概念:>>

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;
}