进程与线程
进程 | 线程 |
---|---|
Process | Thread |
一段程序执行的实例 | 一个进程的执行 |
资源分配的基本单元 | CPU调度的基本单元 |
进程控制块PCB、程序段、数据段 | 线程控制块TCB、堆栈、寄存器及共享进程所有资源 |
进程间相互独立 | 同一进程内各线程共享资源,不同进程线程不可见 |
进程间通讯IPC | 读进程数据段 |
调度慢 | 调度快 |
程序与进程
程序是数据与指令的集合,是静态的,可永久存在;进程是程序在处理机上的一次执行过程,是动态的,具有一定的生命周期。
总结
程序加载到内存中,并且被系统分配资源后,称为进程;而进程只是资源的集合体,它的执行依赖于线程,线程是CPU的调度对象。
线程出现的原因
1 在许多应用中同时发生着多种活动,某些活动有时会被阻塞,通过将这些应用分解成多个线程的执行,程序的设计会变得简单;
2 进程是资源的拥有者,由于其在创建、撤销与切换伴随着大量数据的操作,若要实现同时执行多个不同操作,其对空间时间消耗很大,所以引入了轻量级的线程(Light Weight Process, LWP)也称为线程(Thread);
3 线程的运行都是占用了CPU的,对于性能来说并未增强,但是若果操作伴随着I/O处理(CPU速度远大于I/O速度),此时多线程的允许彼此的重叠进行,从而加快了应用的执行速度。
创建
进程 | 线程 | 描述 |
---|---|---|
fork | pthread_create | 创建 |
exit | pthread_exit | 退出 |
父子进程
父进程使用fork()函数创建一个子进程。若成功,子进程返回0,父进程返回子进程标记;否则,返回-1。
在创建过程中,子进程会完全拷贝父进程的资源,每个进程都启动一个从代码的同一位置开始的线程,另个线程同时执行。
进程的状态
进程三种基本状态
-运行态 running,占有CPU;
-就绪态 ready,由于其他进程占有CPU,处于等待状态;
-阻塞态 blocked,等待某种事件的触发,否则不能运行;
进程的切换如下