进程线程的定义
1.进程定义:
**进程:**资源分配的最小单位。(内核)
进程(process)是一个可并发执行的程序在某数据集上的一次运行。
程序是进程的一个组成部分,是进程的执行文本,而进程是程序的执行过程。
从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。
(!!!并且进程同样拥有优先级的判断,执行高优先级。)
注意:实现进程互斥与同步的手段有多种,其中,信号量是最早出现的进程同步机制。因其简洁有效,信号量被广泛地用来解决各种互斥与同步问题。P,S原语操作!!!
信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。
用P、V操作实现进程互斥
两步走即可实现进程的互斥:
- 定义一个互斥信号量,并初始化为 1
- 把对于临界资源的访问置于 P 操作和 V 操作之间
2. 线程定义:
**线程:**程序执行的最小单位。线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。
线程是参与系统调度的最小单位。它被包含在进程之中,是进程中的实际运行单位。一个线程指的是进程中一个单一顺序的控制流(或者说是执行路线、执行流),一个进程中可以创建多个线程,多个线程实现并发运行,每个线程执行不同的任务
互斥锁,条件变量等
线程则使用互斥锁进行加锁和解锁,pthread_mutex_xxx,相应的和进程在思想上一定的相似之处。类似于阻塞等待终止等
3.区别
进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。
(1)线程共享内存空间;进程的内存是独立的;
(2)同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现(无法直接交流);
(3)创建新进程很简单;创建新进程需要对其父进程进行一个克隆;(fork()一个又何妨)
(4)一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程(不能控制或操作其他进程);
(5)改变主线程(如优先权),可能会影响其他线程;改变父进程,不影响子进程。
(6)调度:线程作为分配和调度的基本单位,进程作为拥有资源的基本单位
(7)并发性:不同进程之间可以并发执行,同一进程内的线程也可以并发执行
(8)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的系统资源
(9)系统开销:在创建和撤销进程的时候,系统都要分配和回收资源,导致系统的明显大于创建和撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式的下不会对其他进程造成影响,而线程只是进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死后就等于整个进程死掉,所以多进程程序要比多线程程序健壮,但是在进程切换的时候消耗的资源较大,效率差。
根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。(就像是不同树枝,每个树枝上的叶子存在于相同的树枝,共享一个树枝。)
总结:多线程执行效率高; 多进程耗资源,安全。
4.同
线程也有就绪、阻塞和运行三种基本状态
都要不免死锁的问题
5.二者的关系
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;
(2)资源分配给进程,同一进程内的所有线程共享该进程的所有资源;
(3)线程在执行过程中需要协作同步。不同进程中的线程之间要利用消息通信的方法实现同步;
(4)处理机分配给线程,即真正在处理机上运行的是线程;
(5)线程是进程的一个执行单元,也是进程内的可调用实体。
6.进程的优点与缺点
优点:
1)顺序程序的特点:具有封闭性和可再现性;(更加安全可靠)
2)程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提高了系统的效率和系统的资源利用率。
缺点:
1)操作系统调度切换多个线程要比切换调度进程在速度上快的多。
2)进程间内存无法共享,通讯也比较麻烦。线程之间由于共享进程内存空间,所以交换数据非常方便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。(给人一种供不应求的感觉,产20个面包,但总是吃25个)
7.线程的优点和缺点
优点:
1)它是一种非常"节俭"的多任务操作方式。(损耗或者需求更少,更利于多进程交互信息时的流畅)
在Linux系统下:
启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码 段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据。
而启动一个线程 所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。当然,在具体的系统上,这个数据可能 会有较大的区别;
2)线程间方便的通信机制,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;
3)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;(对于在cpu上,进程中线程的数目受到控制一方面是对cpu的保障,一方面是最大利用了线程的优势,分配合理)
4)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
缺点:
1)调度时, 要保存线程状态,频繁调度,需要占用大量的机时;
2)程序设计上容易出错(线程同步问题)。因为有时分复用,要处理同步问题也是一个难点。