你是否真的懂 [程式的執行順序] 多程式 / 程式池

勺顛顛發表於2020-05-28

扯皮

talk is cheap, show me the code

linux如何執行一個程式

有點廢話【不過前面都是路過,在此重提一下】
linux在執行任何程式之時,都要呼叫execve系統呼叫函式,然後把你的程式和你給的引數以及環境引數扔給程式的入口函式。

入口函式

php【php指令碼依賴php直譯器】直譯器執行,原始碼就是c【真是廢話,誰不知道,用我來逼逼半天】入口函式就是main【如mysql,redis,php,nodejs,python,memcached,apache等】

你是否真的懂多程式
該程式的程式碼,資料容量
你是否真的懂多程式

測試原始碼

不管什麼語言的原始碼【不必在意語言】,道理都一樣的

class demo
{
public:
        demo(int age,char *name):m_age(age),m_name(name){}
        void run();
        void child();
        void parent();
public:
        int m_age;
        char *m_name;
        pid_t pid;
        int num[3];
};

void demo::child()
{
        printf("child run %d==%d=%d\n",getpid(),pid,m_age);
        while(1){
                sleep(1);
                printf("child run %d=%d=%d\n",getpid(),pid,m_age);
                printf("我要訪問demo類成員的資料\n");
                printf("demo::m_name=%s\n",m_name);
                printf("demo::m_age=%d\n",m_age);
                printf("demo::pid=%d\n",pid);
                for(int i=0;i<3;i++){
                        printf("demo::num[%d]=%d\n",i,num[i]);
                }
        }

}

void demo::parent()
{
        printf("parent run %d=%d=%d\n",getpid(),pid,m_age);
        while(1){
                sleep(1);
                printf("parent run %d=%d=%d\n",getpid(),pid,m_age);
                printf("我要訪問demo類成員的資料\n");
                printf("demo::m_name=%s\n",this->m_name);
                printf("demo::m_age=%d\n",this->m_age);
                printf("demo::pid=%d\n",this->pid);
                for(int i=0;i<3;i++){
                        printf("demo::num[%d]=%d\n",this->num[i]);
                }
        }
}
void demo::run()
{
        cout<<"main process "<<getpid()<<" start"<<endl;
        m_age=0;
        for(int i=0;i<3;i++){
                num[i] = i;//父程式可訪問全部的值  123
                pid = fork();//複製之時,子程式是得不到pid的內容的,而父親執行時是返回它自己  所以一直不變
                if(pid>0){
                        continue;
                }
                else if(pid==0){
                        m_age=i+1;
                        break;
                }
        }


}
int main()
{
        demo *obj = new demo(100,(char*)"jack");
        obj->run();
        if(obj->m_age){
                obj->child();
        }else{
                obj->parent();
        }
        return 0;
}

執行圖解

你是否真的懂多程式

多程式父子程式間的程式碼和資料在記憶體空間的圖

只能截個大概,不清晰的可加本人獲取

你是否真的懂多程式

你是否真的懂多程式

PS

麻煩爬蟲大佬爬過去以後,記得標註轉載謝謝。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

只會php crud的渣渣

相關文章