Linux进程与线程

0.进程与线程

每个进程都有一个地址空间和一个控制线程。如果一个进程中有多个控制线程,那么就是多线程的情况。进程是资源分配的最小单位,线程是CPU调度的最小单位。

进程与线程的区别(或者说在已经有进程的情况下,为什么还需要线程):

1.多线程可以表达为在相同地址空间下的程序并行执行,多进程可以表达为在不同地址空间下的程序并行执行。

2.线程比进程要更加轻量级,线程的创建、销毁、切换都快于进程。线程用于做正事的时间多,CPU利用率高。具体在上下文切换方面,线程的调度需要切换上下文,进程的调度在切换上下文之前,需要切换到新的地址空间(对于linux,线程和进程的最大区别就在于地址空间)。

3.线程之间的数据共享较简单,进程之间的数据共享较复杂。

每个线程所私有的东西:程序计数器、堆栈、寄存器(结合“线程是CPU调度的最小单位”就很好理解了,切换线程时,以上三样都需要保存起来以便下次恢复现场)。同个进程下线程之间共享的东西:地址空间、全局变量、打开文件。

1. 进程创建

每个进程都有一个进程ID,用非负整数pid_t来表示。比如进程0代表调度进程,进程1代表init进程。
pid_t fork(void);
我们可以使用fork()函数创建一个新的进程,fork()函数比较特殊,一次调用两次返回。在父进程中,它会返回子进程ID(非负整数);在子进程中,它会返回0。我们可以通过fork()的返回值来判断当前环境在父进程还是子进程。
在fork()之后,子进程获得父进程数据空间和堆栈的拷贝,他们只是值一样,存储空间并不共享。在父进程中打开的文件描述符,在子进程中也是打开的,而且父子进程操作的是同一个文件。所以fork()函数之后,文件是共享的,数据是拷贝的

一个进程内的所有信息对同一个进程内的线程都是共享的,包括可执行代码的程序、程序的全局内存、堆内存、栈以及文件描述符。

2. 进程间通信

管道、FIFO、消息队列、信号量、共享存储

原文地址:https://www.cnblogs.com/season-peng/p/6759513.html