系统就要为每个线程安排一定的CPU时间片。它通过一种循环方式为线程提供时间片(称为:量程),造成一种假象,仿佛所有线程都是同时运行的一样。
当创建一个进程时,系统会自动创建它的第一个线程,成为主线程。然后,该线程可以创建其他的线程或者进程。
进程:它是执行中程序的一个实例;程序总是运行在某个进程的上下文中。每个进程都有自己独立的地址空间。每次用户通过shell输入一个可执行文件的名字运行一个程序或在windows下通过鼠标双击一个可执行文件时,系统会创建一个新的进程。
程序:它是代码和数据的集合;程序可以作为目标模块存在于磁盘上,或者做为段存在于地址空间中。
上下文:是由程序正确运行所需要的状态组成的。这个状态包含存放在存储器中的程序代码和数据,它的栈,它的通用目的寄存器的内容,程序计数器(PC),环境变量以及打开文件描述符的集合。
进程的优点:每个进程都有自己独立的地址空间,这样一来一个进程就不会不小心覆盖另一个进程的虚拟存储器。基于进程的多任务处理的特点是允许你的计算机能同时运行两个或更多的程序,进程共享cpu时间,系统负责进程的切换。
进程的缺点:独立的地址空间是进程共享状态信息变得困难。另外,线程间的切换和通讯开销很大。
线程:一个线程就是运行在一个进程上下文中的一个逻辑流。每个线程都有自己的线程上下文,包括唯一的整数线程id,栈,栈指针,程序计数器,通用目的寄存器。所有运行在一个进程中的线程共享该进程的整个虚拟地址空间。
线程执行模型:每个进程开始生命周期时都是单一线程,称为“主线程”,在某一时刻主线程创建一个对等线程。如果主线程停滞则系统就会切换到其对等线程。
线程优点:线程的上下文要比进程的上下文小的多,所以线程的上下文切换要比进程的上下文切换要快。
线程不像进程按照严格的父子关系来组织。和一个进程相关的线程组成一个对等线程池,一个线程可以杀死其任意对等线程。每个线程都能读写相同的共享数据。
线程缺点:由于数据共享会带来同步问题,进而会导致死锁的产生。死锁在语言层面上不能解决,需要一个对程序的良好设计来避免死锁。
Linux中进程,线程
可执行文件由指令和数据组成。进程就是在计算机上运行的可执行文件针对特定的输入数据的一个实例,同一个可执行程序文件如果操作不同的输入数据就是两个不同的进程。
线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享其所附属的进程的所有的资源,包括打开的文件、页表(因此也就共享整个用户态地址空间)、信号标识及动态分配的内存等等。线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一物理内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
Linux在核外采用1:1线程模型,即用一个核心进程(轻量进程)对应一个线程,将线程调度等同于进程调度,交给核心完成,而其它诸如线程取消、线程间的同步等工作,都是在核外线程库中完成的。因此可以把进程看作一组线程,这组线程拥有相同的线程组号(TGID),这个TGID就是这组线程序所附属的进程
