进程、线程概念性问题

任务概念task

         任务是由软件完成的一个活动,是一系列达到某种共同目的的操作。一个任务既可以由一个进程实现,也可以作为一个线程来实现。

 

进程概念 process

  进程是表示资源分配的基本单位又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、IO设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。 

 在MacWindows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。

线程概念tread

  线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。例如,假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程。假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务;在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。这样,操作系统则把每一个请求――工资单报表和新输人的数据查询表示为数据库进程中的独立的线程。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性

进程和线程的关系

1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。

3)处理机分给线程,即真正在处理机上运行的是线程。

4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

引入线程的好处

1)易于调度。

2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

3)开销少。创建线程比创建进程要快,所需开销很少。。

4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。

多线程技术

         多线程应用程序将程序划分为多个独立的任务,每个任务由一个线程处理。多线程处理可以同时运行多个线程。

多线程技术的优点

(1)多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;

(2)当前没有进行处理的任务时可以将处理器时间让给其它任务;

(3)占用大量处理时间的任务可以定期将处理器时间让给其它任务;

(4)可以随时停止任务;

(5)可以分别设置各个任务的优先级以优化性能。

 是否需要创建多个线程取决于各种因素。在以下情况下,最适合采用多线程处理:

(1)耗时或大量占用处理器的任务阻塞用户界面操作;

(2)各个任务必须等待外部资源 (如远程文件或 Internet连接)

多线程技术的缺点

1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。

(2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。

(3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。

(4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。

为什么不使用多进程?

较之进程,线程轻便、价廉,启动速度快,退出比较快,对系统资源的冲击比较小。

如果使用多进程,最困难的问题是如何把窗口句柄交给另一个进程。在Win32中,句柄只在其诞生地(进程中)才有意义。这是一种安全警戒,避免某个进程有意无意地危及到另一个进程的资源。

为了分享窗口句柄,你必须明明白白地产生该句柄的一个副本,并且可以被其他进程使用。在一个多线程程序中,所有线程都可以使用这个窗口的句柄,因为句柄和线程生活在同一个进程中。

 如果两个线程分属不同的进程,那它们通常没有办法共享任何内存。不同进程间如果要通讯,唯有依赖特别的设计,使之拥有共享内存(shared memory)。

如果两线程属于同一进程,它们将共享所有的内存(包括全局变量、静态变量),很容易就实现了线程之间的通讯。

Note:主要是资源共享问题