目录
概念
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
进程的特征
-
动态性
-
并发性
-
独立性
-
异步性
线程的特征
-
轻型实体
-
独立调度和分派的基本单位
-
可并发执行
-
共享进程资源
注意:
在linux中系统的眼中不存在进程线程,在其看来线程只是是一个轻量的进程而已。
线程与线程、进程间的关系
-
一个线程可以创建和撤销另一个线程; 同一个进程中的多个线程之间可以并发执行.
-
进程在执行过程中拥有独立的内存单元,而该进程的多个线程共享内存,从而极大地提高了程序的运行效率。
-
每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
linux和win下进程栈空间大小
在很多现代操作系统中,一个进程的(虚)地址空间大小为4G,分为系统(内核?)空间和用户空间两部分,系统空间为所有进程共享,而用户空间是独立的,一般WINDOWS进程的用户空间为2G,linux下用户空间3G。
一个进程中的所有线程共享该进程的地址空间,但它们有各自独立的(/私有的)栈(stack),Windows线程的缺省堆栈大小为1M,linux或macOS下可用(ulimit -s命令查看)一般默认8M。
线程切换及栈空间的位置
线程切换的时候实际上切换的是一个可以称之为线程控制块的结构(TCB),里面保存所有将来用于恢复线程环境必须的信息,包括所有必须保存的寄存器集,线程的状态等。
线程栈的空间开辟在所属进程的堆区,线程与其所属的进程共享进程的用户空间,所以线程栈之间可以互访。线程栈的起始地址和大小存放在pthread_attr_t 中,栈的大小并不是用来判断栈是否越界,而是用来初始化避免栈溢出的缓冲区的大小(或者说安全间隙的大小)
栈是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe的。操作系统在切换线程的时候会自动的切换栈。
进程简说
进程就是程序的一次执行。
进程是为了在CPU上实现多道编程而发明的一个概念。
事实上我们说线程是进程里面的一个执行上下文,或者执行序列,显然一个进程可以同时拥有多个执行序列,更加详细的描述是,舞台上有多个演员同时出场,而这些演员和舞台就构成了一出戏,这出戏就是进程,而戏中每个演员就类比线程,舞台是地址空间,这个舞台上的所有演员构成了一出戏(这个同一个地址空间里面的所有线程就构成了进程)。
线程管理
将线程共有的信息存放在进程控制块中,将线程独有的信息存放在线程控制块中。
线程间共享资源与独享资源
一般的评价标准是:如果某些资源不独享会导致线程运行错误,则该资源就由每个线程独享,而其他资源都由进程里面的所有线程共享。
线程共享资源 | 线程独享资源 |
地址空间 | 程序计数器 |
全局变量 | 寄存器 |
打开的文件 | 栈 |
子进程 | 状态字 |
闹铃 |
|
信号及信号服务程序 |
|
记账信息 |
|