进程:分配系统资源的一种数据结构。
简而言之,就像一个储物箱一样,特点是为了保证安全,一个进程中的指针被设计为不可访问其他进程的地址。就像你的钥匙正常情况下不能随便打开任何一个人的储物箱一样,你只能打开自己的储物箱。如果打开别人的储物箱,不是无意的编码疏忽,就是恶意的攻击其他程序。
线程:分配CPU运行周期的一种数据结构。
线程其实是任务的抽象概念。创建一个线程,相当于告诉CPU我有一个新任务需要你分配时间来处理。多线程和一个线程执行多个任务的区别就在于创建多个线程就是要求cpu要同时处理一些事情,而不是有先后顺序。在unix下其实就没有线程这种概念,就只有任务的概念。一个任务就相当于只有一个线程的进程,任务之间可以组合,可以指明那个任务的内存空间可以共享,来达到类似于多线程的目的。
一个方法需要CPU进行计算,那么这个方法的参数,局部变量等自然就会保存在线程当中,线程这个数据结构中包含了一个栈结构用来保存这些信息,通过入栈出栈来表示先后的执行。可以说,栈是属于线程的。
死锁:一个任务的执行条件永远不满足,一直不唤醒线程所以cpu一直不分配执行时间给这个任务。
活锁:就是不停的花费cpu时间检测这个任务是否能被执行。
无论是死锁还是活锁,我们都要浪费保留了参数,局部变量等这些信息的内存空间。可以看出,活锁比死锁问题更严重,因为除了浪费内存空间外,还浪费了CPU。
进程和线程没有什么组成的关系,两者是不同的抽象概念。进程不是由一个或者当个线程组成。没有线程,进程资源就不能被CPU所利用。所以一个进程至少应该有一个线程,否则要进程又有何用? 在Win32中,进程并不执行什么,它只是占据应用程序所使用的地址空间。简而言之,线程是调用进程内资源的方式。
但一个线程栈的内存地址的范围是什么呢?这个线程栈的地址范围就是在该线程所在的进程所占用地址中的某一块。
以上就是线程和进程的关系。虽然线程栈在进程的地址范围内的一段连续的内存,但是你可以认为线程栈是属于线程的,和进程没有什么关系。栈内保存的数据只是表明了cpu接下来要做的事情。
从某种意义上看,线程可以被视作一个虚拟处理器。每个线程都运行程序中的部分代码,并且表现得好像它与系统中的其他虚拟处理器毫不相干。