线程与进程之间的关系和区别

线程共享的环境包括:进程代码段,进程的公有数据(利用这些数据,线程很容易实现相互间的通讯),进程打开的文件描述符,信号的处理器进程的当前目录和进程用户ID与进程组ID。

进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:

1.线程ID。2.寄存器组的值。3.线程的堆栈(堆栈是保证线程独立运行所必需的)。4.错误码的返回值。5.线程的信号屏蔽码(但所有的线程都共享同样的信号处理器)。6.线程的优先级

在一个进程的线程共享堆区,而进程中的线程各自维持自己堆栈。

在 windows 等平台上,不同线程缺省使用同一个堆,所以用 C 的 malloc (或者 windows 的 GlobalAlloc)分配内存的时候是使用了同步保护的。如果没有同步保护,在两个线程同时执行内存操作的时候会产生竞争条件,可能导致堆内内存管理 混乱。比如两个线程分配了统一块内存地址,空闲链表指针错误等。

  Symbian 的线程一般使用独立的堆空间。这样每个线程可以直接在自己的堆里分配和释放,可以减少同步所引入的开销。当线程退出的时候,系统直接回收线程的堆空间,线程内没有释放的内存空间也不会造成进程内的内存泄漏。

  但是两个线程使用共用堆的时候,就必须用 critical section 或者 mutex 进行同步保护。否则程序崩溃时早晚的事。如果你的线程需要在共用堆上无规则的分配和释放任何数量和类型的对象,可以定制一个自己的 allcator,在 allocator 内部使用同步保护。线程直接使用这个 allocator 分配内存就可以了。这相当于实现自己的 malloc,free。但是更建议你重新审查一下自己的系统,因为这种情况大多数是不必要的。经过良好的设计,线程的本地堆应该能够满足大多数对象的需 求。如果有某一类对象需要在共享堆上创建和共享,这种需求是比较合理的,可以在这个类的
new 和 delete 上实现共享保护。

进程是资源分配的基本单位,线程是系统调度的基本单位。

平时我们写的程序都是作为线程运行的;进程可以看做是包括一系列线程和资源的统称;一个进程至少包括一个

线程(主线程,进入main函数时产生的);在其中可以创建其它线程,也可以不创建。

同一进程间的线程究竟共享哪些资源呢,而又各自独享哪些资源呢?

共享的资源有

a. 堆  由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)

b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的

c. 静态变量 虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的

d. 文件等公用资源  这个是共享的,使用这些公共资源的线程必须同步。Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。

独享的资源有

a. 栈 栈是独享的

b. 寄存器  这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC

进程的三种状态及转换

进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态。

 就绪(Ready)状态

当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

 执行(Running)状态

当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。

 阻塞(Blocked)状态

正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

1:就绪->执行, 当前运行进程阻塞,调度程序选一个优先权最高的进程占有处理机;

2:执行->就绪, 当前运行进程时间片用完;

3:执行->阻塞,当前运行进程等待键盘输入,进入了睡眠状态。

4:阻塞->就绪,I/O操作完成,被中断处理程序唤醒。

进程的执行状态分为:核心态和用户态,两者的主要区别就是在于进程能否获取计算机的所有资源(核心态可以,用户态则受到限制)。凡是涉及到计算机根本运行的事情都应该在内核态下执行,而中断、时钟日期、存储映象图都属于系统级的资源,对这些资源的修改则都必须在核心态,但是读取则没有强制要求。

进程的组成:进程有PCB(进程控制块)、有关程序段、和该程序段对其进行操作的数据结构集组成。

创建进程的必须步骤:

1.申请空白PCB(进程控制块)

2.为新进程分派资源

3.初始化PCB

4.将新进程插入就绪队列

进程于线程的主要区别:

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一
个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程 序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

线程和进程的区别联系:

1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。

2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

两者都可以提高程序的并发度,提高程序运行效率和响应时间。

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:

1、速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。

2、资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。

3、同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内

时间: 2024-08-01 13:13:20

线程与进程之间的关系和区别的相关文章

进程与线程之间的关系和区别 及 CPU调度

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 进程和线程的关系: (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程. (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源. (3)处理机分给线程,即真正在处理机上运行的是线程. (4)线程在执行过程中,需要协作同步.不同进程的线程间要利用消息通信的办法实现同步.

线程与进程之间的通讯方式

1.认识线程和进程: 1.1什么是线程:线程是系统执行任务调度的最小单位,一个进程可以只包含一个线程此时线程也可以理解为进程,当然也可以拥有多个线程,线程之间可以实现资源共享以及通讯什么是进程:系统资源分配的最小单位线程和进程区别:实际上,进程不是同时运行的,对于一个 CPU 而言,某个时间段只能运行一个程序,也就是只能执行一个进程.操作系统会为每个进程分配一段有限的 CPU 使用时间,CPU 在这段时间内执行某个进程,然后会在下一段时间切换到另一个进程中去执行.为什么会分进程和线程,进程一次切

求解?表空间,表,用户这三者之间的 关系与区别?

发表于: 2012-02-11 16:40:58 小弟初学oracle,但是在表空间,用户,表这三者之间的关系,有点模糊,希望大牛指导下! 更多0分享到:       对我有用[0] 丢个板砖[0] 引用 | 举报| 管理 回复次数:21 关注 dengnanyi 一棵老松树 本版等级: #1 得分:0回复于: 2012-02-11 16:55:59 表空间:一个数据库划分为一个或多个逻辑单位,该逻辑单位称为表空间(TABLESPACE).一个表空间可将相关的逻辑结构组合在一起.表:表(tabl

Socket ,WebSocket Ajax 之间的关系与区别

最近参与了一个 局域网聊天的项目.用到了 WebSocket.这里简单介绍一下. Socket与 WebSocket 简单说 Socket 与WebSocket 之间的关系 就和 Java 与Javascript关系一样.没关系. Socket 是 TCP/IP 协议中 传输层与应用层的传输数据用的编程接口.   WebSocket 是 基于HMTL5中浏览器 与 服务器之间 异步通信的方法. WebSocket 与 Ajax Ajax 是 利用 JS和XML,实现网页局部刷新的技术,只能单向从

进程/线程/堆/栈之间的关系

进程线程针对系统而言的和数据结构无关.进程是一段代码,是操作系统资源分配基本概念.是调度和运行的基本单位,进程可以有多个任务每个任务是一个线程: 堆栈针对的是数据结构.栈是右进右出函数变量.局部变量都属于栈,堆是树形结构类似于字典的目录对象数组都属于堆,线程中会用到栈和堆. 原文地址:https://www.cnblogs.com/wangdadada/p/12323125.html

UIView的alpha、hidden和opaque属性之间的关系和区别

转自:http://blog.csdn.net/wzzvictory/article/details/10076323 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/10076323 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! UIView的这几个属性让我困惑了好一阵子,通过翻看官方文档和stackoverflow等网上资源,对它们有了一定理解,现分

python中线程、进程和协程的区别

进程是资源分配的单位 线程是操作系统调度的单位 协程,又称微线程,纤程,协程的切换只是单纯的操作CPU的上下文,资源很小,效率高 进程切换需要的资源很最大,效率很低 一个程序至少有一个进程,一个进程至少有一个线程 线程执行开销小,但不利于资源的管理和保护:而进程正相反 通俗描述 有一个老板想要开个工厂进行生产某件商品(例如剪子) 他需要花一些财力物力制作一条生产线,这个生产线上有很多的器件以及材料这些所有的 为了能够生产剪子而准备的资源称之为:进程 只有生产线是不能够进行生产的,所以老板的找个工

shell编程概念介绍及变量定义--关于脚本运行与shell进程之间的关系

shell是用户与内核进行交互操作的一种接口,目前最流行的shell称为bash shell shell也是一门编程语言<解释型的编程语言>,即shell脚本<就是用 linux 的 shell 命令编程> 一个系统可以存在多个shell,可以通过 cat/etc/shells 命令查看系统中安装的shell,不同的shell 可能支持的命令语法是不相同的 基本格式 代码写在普通文本文件中,通常以 .sh为后缀名 例vi hello.sh: #!/bin/bash      ##表

CGI,FastCGI和PHP-FPM之间的关系和区别

什么是CGI?早期的web server只可以处理简单的静态web文件,但是随着技术的发展出现动态语言如PHP,Python.PHP语言交给PHP解析器进行处理,但是处理之后如何和web server进行通信呢?为了解决不同的语言处理器与web server之间的通讯,出现了CGI协议.只要按照CGI协议编写程序,就可以实现与语言解析器与web server之间的通讯.CGI协议虽然解决了语言解析器和seb server之间通讯的问题,但是它的效率很低.因为web server每收到一个请求都会