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通信来写的,不知道是不是损失了线程的优势呢?不过结构上倒是没有错的,理解上终于又更深了一步。

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