`
lc52520
  • 浏览: 369067 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

进程和线程【Z】

阅读更多

1、简述进程和线程的异同

答:进程是指运行中的应用程序,每一个进程都有自己独立的内存空间。一个应用程 序可以同时启动多个进程。例如对于IE浏览器程序,每打开一个IE浏览器窗口,就启动了一个新的进程。同样,每次执行JDK的java.exe程序,就启 动了一个独立的Java虚拟机进程,该进程的任务是解析并执行Java程序代码。
    线程是指进程中的一个执行流程,有时也称为执行情景。一个进程可以由多个线程组成,即在一个进程中可以同时运行多个不同的线程,它们分别执行不同的任务。 当进程内的多个线程同时运行时,这种运行方式称为并发运行。许多服务器程序,如数据库服务器和Web服务器,都支持并发运行,这些服务器能同时响应来自不 同客户的请求。
    进程和线程的主要区别在于:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同一块内存和系统资源,比如共享一个对象或者共享已经打开的一个文件。


2、编写多进程/多线程并发的程序时需要注意哪些方面?

答:编写并发的程序时应注意以下问题:
    (1)、线程的优先级:线程的优先级代表该线程的重要程度,当有多个线程同时处于可执行状态并等待获得 CPU 时间时,线程调度系统根据各个线程的优先级来决定给谁分配 CPU 时间,优先级高的线程有更大的机会获得 CPU 时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。
    (2)、线程的阻塞:阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),在Java中人为的对线程进行阻塞时,应注意避免产生死锁。
    (3)、同步对象的恒定性:不要对同步对象重新赋值,举个例子:
           class A implements Runnable{
      Object lock = new Object();

      void run(){
        for(...){
        synchronized(lock){
          // do something
      ...
      lock = new Object();
        }
      }
    }
run函数里面的这段同步代码实际上是毫无意义的。因为每一次lock都给重新分配了新的对象的reference,每个线程都在新的reference同步。所以,一般应该把同步对象声明为final.
    final Object lock = new Object();
使用Singleton Pattern 设计模式来获取同步对象,也是一种很好的选择。
     (4)、跨类的同步对象:但是对于复杂的问题,我们需要把问题分为几个部分来处理,需要几个不同的类来处理问题。这时,就需要在不同的类中,共享同步对象。比如,在生产者和消费者之间共享同步对象,在读者和写者之间共享同步对象。
     如何在不同的类中,共享同步对象。有几种方法实现,
       1、前面讲过的方法,使用static静态成员,(或者使用Singleton Pattern.)
       2、用参数传递的方法,把同步对象传递给不同的类。
       3、利用字符串常量的“原子性”。
     对于第三种方法,这里做一下解释。一般来说,程序代码中的字符串常量经过编译之后,都具有唯一性,即,内存中不会存在两份相同的字符串常量。
     (5)、同步的粒度:线程同步的粒度越小越好,即,线程同步的代码块越小越好。尽量避免用synchronized修饰符来声明方法。尽量使用 synchronized(anObject)的方式,如果不想引入新的同步对象,使用synchronized(this)的方式。而 且,synchronized代码块越小越好。


3、可采用哪些方法提高多进程/多线程并发程序的执行性能?

答:对多进程来说提高并发性能可以通过增加处理器的数量来提高并发性能;
    对多线程来说,为了提高并发性能,应该使同步代码块中包含尽可能少的操作,使得一个线程能尽快释放锁,减少其他线程等待锁的时间。还可以在程序中使用线程池,减少创建和销毁线程的次数,从而提高性能。


4、简述进程和线程的优缺点。

答:进程的优点::①顺序程序的特点:具有封闭性和可再现性;②程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提高了系统的效率和系统的资源利用率。
    进程的缺点:操作系统调度切换多个线程要比切换调度进程在速度上快的多。而且进程间内存无法共享,通讯也比较麻烦。线程之间由于共享进程内存空间,所以交 换数据非常方便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
    线程的优点:1)、它是一种非常"节俭"的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它 的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一 个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。当然,在具体的系统上,这个数 据可能会有较大的区别;2)、线程间方便的通信机制,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而 且方便;3)、使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;4)、改善程序结构。一个既长又复 杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
    线程的缺点:1.调度时, 要保存线程状态,频繁调度, 需要占用大量的机时;2.程序设计上容易出错(线程同步问题)。


5、针对什么样的需求,适合使用进程模式编程,什么样的适合线程?

答:a)当你要求数据安全性和不同任务之间的绝对隔离,或者不同任务之间没有互相访问的需求,使用进程方式
    b)当你不同任务彼此需要经常协同工作,而效率又是考虑重点,需要用多线程,因为跨进程通信是个很开销很大的操作


6、 如何弥补他们的不足?在实际编程中可使用怎样的策略避免他们的缺点所带来的问题?

答:对进程来说,在硬件环境无法改变的情况下,可以将单一进程线程化,即将一个 进程分成多个线程来并发的执行,或者考虑其它的并发模型如多处理、协同例程、基于事件的编程、连续(continuation)、生成器等等(摘自 http://www128.ibm.com/developerworks/cn/linux/server/clinic/part5/index.html  作者Cameron)。
    对线程来说,当前情况下可以采用线程池的方法,减少创建和销毁线程的次数,从而提高性能。

分享到:
评论

相关推荐

    进程线程通信,线程同步,异步,进程通信经典进程间通信.7z

    在计算机科学中,进程线程通信、线程同步与异步以及进程间的通信是操作系统核心概念,对于理解和优化多任务并行处理至关重要。这些概念在软件开发,尤其是并发编程领域中占据着举足轻重的地位。 首先,让我们来探讨...

    易语言源码程序进程和线程基础知识.7z

    在计算机科学领域,进程和线程是操作系统中的两个基本概念,尤其在编程和软件开发中,理解它们至关重要。本文将详细解析易语言源码中涉及的进程与线程的基础知识。 1. 进程(Process): 进程是操作系统资源分配的...

    进程与线程的案例,有同步、前后台线程、线程相关属性、有参线程和无参线程等众多案例

    线程的创建、切换和销毁的开销比进程小,因此在需要并发执行的任务中,通常会使用线程。 在同步方面,线程同步是为了防止多个线程同时访问同一资源,可能导致数据不一致。常见的同步机制包括互斥锁、信号量、条件...

    多进程/线程编程:哲学家问题

    多进程/线程编程:哲学家问题。  设置进程/线程,描述哲学家 ;  随机启动哲学家 ;  显示进程/线程执行状态;  随着线程的执行,更新显示;  编写正确的哲学家程序,设法延迟线程的执行,使之出现死锁;...

    linux操作系统+进程与线程+实验报告及代码+期末复习

    用户可以通过组合键(如Ctrl + Z将进程挂起,Ctrl + D或Ctrl + C结束进程)来控制前台和后台进程。此外,还可以使用`bg`和`fg`命令将后台进程移到前台,或将前台进程放到后台运行。 【创建子进程的函数】 1. `fork...

    MFC线程进度条.7z

    本项目"**MFC线程进度条.7z**"聚焦于在多线程应用中实现一个独立的进度条界面,使得用户可以观察后台处理任务的进度,提升用户体验。以下是对这个主题的详细讲解: 1. **MFC与进度条控件**: MFC提供了一个叫做`...

    易语言源码远程线程挂接DLL.7z

    远程线程挂接DLL(Dynamic Link Library)是Windows操作系统中的一个高级技术,主要用于在进程间共享代码和数据。在易语言中,通过这个技术,开发者可以在一个进程不知情的情况下注入并执行另一个进程中DLL的代码,...

    day24-多线程-设计模式.7z

    首先,我们要理解的是,多线程是指在一个进程中同时执行多个线程,从而使得程序能够同时处理多个任务,提升系统的资源利用率。 1. **简单工厂设计模式**:这是一种创建型设计模式,它提供了一个创建对象的接口,但...

    打通Linux脉络系列:进程、内存与IO111.pdf

    本文详细介绍了Linux操作系统中关于进程、内存与I/O的关键概念和技术细节,包括进程生命周期、进程控制块、PID_MAX、内存泄漏、CPU利用率控制、`fork()`系统调用及其变体、写时拷贝技术、线程实现等方面的内容。...

    C++多线程编程.7z

    这是一本以实践为主的Windows多线程编程指导。主要介绍了C++编程语言的概念和特性,介绍了进程,线程,同步,并发的相关知识,并介绍了.NET框架中的线程,概述了C++/CLI.NET线程对象。

    易语言远程线程源码.7z

    4. **内存管理**:在远程线程中,你可能需要在目标进程中分配和管理内存,这就需要理解内存分配函数,比如`VirtualAllocEx`和`VirtualFreeEx`,以及内存保护属性等。 5. **线程同步与互斥**:在多线程环境中,线程...

    易语言取相同程序不同的进程.7z

    在这个“易语言取相同程序不同的进程.7z”压缩包中,我们推测可能包含了一个或多个易语言编写的程序或者代码示例,它们主要探讨的是如何在易语言中获取并处理同一程序的不同进程。 在操作系统中,进程是程序执行的...

    易语言取线程信息

    易语言取线程信息源码,取线程信息,ShowThdInfo,ZwQuerySystemInformation,LocalAlloc,CopyMemory_SYSTEM_PROCESSES,LocalFree

    Task02多线程矩阵乘法.7z

    该文件的解释详情由本博主上一篇博文说明,代码亲测可用,由于python多线程并行效果不好(解释器原因),这里用Python多进程和java多线程的方法计算矩阵乘法。链接详情:...

    多线程学习笔记,关于创建线程,删除线程等相关指令的应用。

    - **僵死状态(Z):**进程已结束,但父进程尚未调用`wait`或`waitpid`回收其资源。 - **停止状态(T):**进程被调试器暂停或收到特定信号。 5. **线程的创建与销毁**: - **pthread_create**:创建新线程,传入...

    Java线程检测和数据收集工具

    本文将深入探讨如何使用Java提供的工具——`jps`和`jstack`,以及如何通过Shell脚本来定时收集Java进程的线程信息。 首先,`jps`(JVM Process Status)是Java虚拟机进程状况工具,它能够列出正在运行的Java进程ID...

    cpp2029.rar_进程与线程_Dev_C++__进程与线程_Dev_C++_

    标题中的"cpp2029.rar_进程与线程_Dev_C++__进程与线程_Dev_C++_"表明这是一个关于C++编程的...对于进程与线程的深入学习,还需要掌握进程间的通信、同步与互斥、死锁等问题,以及如何在Dev C++环境中进行调试和优化。

    易语言源码创建新进程.7z

    标题中的“易语言源码创建新进程.7z”指的是一个使用易语言编写的源代码,该源代码的目的是用于创建新的进程。在Windows操作系统中,进程是执行中的应用程序,每个程序都至少有一个进程,而一个进程又可以包含多个...

    易语言源码多线程支持模块.7z

    每个线程都有自己的程序计数器、栈和局部变量,它们共享进程的内存空间。 2. **并发执行**:多线程可以让不同的任务在同一时间执行,实际上是在CPU的快速切换下产生的并发效果,让程序看起来像是同时运行。 3. **...

    MFC 多线程.7z

    本篇将围绕"MFC多线程"这一主题,深入探讨如何在MFC环境中创建、管理以及控制线程,旨在帮助开发者理解和掌握多线程编程的基本技巧。 一、MFC线程基础 在MFC中,线程由CWinThread类抽象表示,它是CObject的派生类。...

Global site tag (gtag.js) - Google Analytics