Linux 線程和進程

今天在寫應用層程序的時候,按照IPNC的指導手冊,要想調用某個函數,首先要初始化這個模塊。原話如下:

Before we start to use the GetAVData, we have to initial the message driver and setup the memory for tranferring the encoded data。

        void Init_Interface(int Msg_id)
        {
                int qid;
                if(ApproDrvInit(Msg_id))
                        exit(1);
                        
                if(func_get_mem(&qid)) 
                {
                        ApproDrvExit();
                        exit(1);
                }
        }

要求在Process中調用這個初始化函數,並且在一個Process中只能調用一次,受到去年看的《Linux內核設計與實現》這本書的影響,書中有這麼一句話“對Linux而言,線程只不過是一種特殊的進程罷了”。就想當然的以爲線程和進程是一樣的了,其實兩者還是有差別的。以本代碼爲例,在ApproDrvInit()這個函數中,會以Msg_id對全局變量gProcId進行賦值,但是線程之間是共享數據區的,如果想當然的在需要用到這個的時候就調用一次,那麼全局變量就面目全非了。

用戶進程擁有 進程描述符、PID、進程正文段、核心堆棧 、用戶空間的數據段和堆棧

用戶線程擁有進程描述符、PID、進程正文段、核心堆棧,同父進程共享用戶空間的數據段和堆棧
用戶線程也可以通過exec函數族擁有自己的用戶空間的數據段和堆棧,成爲用戶進程。

由於線程之間是共享存儲區的,所以IPC通信在這裏就顯得有點多餘了,一般只需要用全局變量就行了,程序裏面還用到共享存儲,不知道是怎麼想的。

IPNC整個控制層都是以進程的IPC通信來寫的,不知道是不是損失了線程的優勢呢?不過結構上倒是沒有錯的,理解上終於又更深了一步。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章