精华内容
下载资源
问答
  • 一个进程只能包含一个线程吗
    千次阅读
    2020-06-03 17:06:09

    进程是系统对应用程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发。
    线程是进程的子任务,是cpu进行调度和分配的进本单位,实现进程内部的并发,线程是操作系统可识别的最小执行和调度单位,每个线程都独自占用一个虚拟处理器:独立的寄存器组,指令计数器和处理器状态。每个线程完成独立的任务,但是共享同一片内存空间,打开的文件队列和其他内核资源。

    区别:
    1.一个线程只能属于一个进程,但一个进程可以拥有多个线程,至少有一个线程,线程依赖于进程存在。
    2.进程在运行过程中拥有独立的内存单元,而多个线程共享进程的内存。同一进程中的多个线程共享代码段,数据段,堆区,但是每个线程拥有自己的栈,用来存放临时变量。
    3.进程是操作系统的最小分配单位,线程是最小调度单位。
    4.系统开销:在操作系统进行创建和撤销进程时,需要分配或者回收内存资源,显著的大于线程;在进行进程切换的时候,需要保存当前整个cpu运行环境和创建新的cpu设置,而线程只需要保存少量寄存器内容。
    5.通信:同一进程中的多个线程具有相同的地址空间,因此通信比较容易,比如通过直接读取数据段来进行通信,不过需要进程同步和互斥来保证数据的一致性。
    6.进程不会相互影响,一个线程崩掉,整个进程都会崩。
    7.进程用于多内核,多机分布;线程用于多内核。
    8.进程调试简单方便,但创建撤销开销大;线程调试复杂但开销小,切换速度快。

    进程间通信方式:管道,系统进程通信和套接字
    1.管道可以用于具有亲缘关系的父子进程通信,命名管道还可以用于无亲缘关系的进程间通信。
    普通管道:半双工,具有固定的读端和写端;具有亲缘关系的进程通信;可以被看做是文件,可以使用read和write来读写,但不属于任何文件系统,只是在内核中开辟的一处空间。命名管道有路径名与之关联,属于文件系统;可以用于无亲缘关系的进程通信,它不需要序列化和反序列化,效率比tcp要高,但是比共享内存低。

    2.系统进程通信
    2.1消息队列
    消息队列是消息的链接表,存放于内核中,一个消息队列由消息标识符来标记。具有读权限的进程可以按照一定规则向队列里写信息,具有读权限的进程可以从消息队列读取信息。消息队列克服了信息传输量少,管道只能承载无格式字节流和缓冲区大小受限的缺点。
    1.消息队列是面向记录的,其中的消息具有特定的格式和特定的优先级
    2.消息队里独立于接收和发送进程,进程终止时,消息队列不会被删除
    3.消息队列支持随机读取信息,不需要按先进先出的次序读
    2.2信号量
    信号量是一个计数器,可以用来控制多个进程对共享资源的访问,信号量用来处理进程间的同步和互斥,而不是用来存储通信数据。
    1.信号量用于进程间的同步,如果要存储数据需要结合共享内存。
    2.每次对信号量的PV操作不仅加减1,可以是任意正数
    2.3信号
    用于通知接收进程某个时间已发生
    2.4共享内存
    多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程对共享内存中数据的更新,这种方式依赖于同步操作,比如互斥棒和信号量。
    1.共享内存是速度最快的一种进程通信,因为进程直接对内存访问。
    2.多个进程可以同时操作,所以需要同步
    3.共享内存通常和信号量同时使用,用来处理同步

    3.socket
    socket套接字可以用于不同主机之间的进程通信

    线程间通信方式:
    临界区:通过多线程的串行化来访问公共区域
    互斥量:采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的权限,只有就可以保证公共资源不会被多个线程同时使用。
    信号量:允许多个线程同时去访问同一个资源,一般会有最大线程数;
    事件(信号):通过通知的方式来实现多线程同步,还可以方便的实现多线程优先级比较操作。

    如果只有进程,可以实现并发、并行操作,但是会出现以下问题:
    1.同一时间只能干一件事
    2.如果阻塞,整个进程就会被挂起
    引入线程,提高了进程的并发性。同时一个进程的不同线程也可以运行在不同的核上,提高了cpu的利用率。一个完整的任务可以拆分为几个独立的子任务,有助于改善程序结构。
    并发是指宏观上两个进程在同时运行,但微观上看,是两个进程指令交替运行,每个周期实际上只在运行一条指令,提高了效率
    并行是由多核,一个周期确实有多条指令在各自核上运行,互不影响

    更多相关内容
  • 进程 vs 线程一个进程可以包含多个线程

    万次阅读 多人点赞 2016-09-18 21:15:50
    进程(process)和线程(thread)是操作系统的基本概念,但是...vs 线程 :一个进程可以包含多个线程" title="进程 vs 线程 :一个进程可以包含多个线程" style="border:0px; max-width:602px; height:auto; ma

    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。

    最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。

    1.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。

    2.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

    3.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

    4.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    一个车间里,可以有很多工人。他们协同完成一个任务。

    5.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    线程就好比车间里的工人。一个进程可以包括多个线程。

    6.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

    7.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

    8.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

    9.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。

    10.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。

    不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

    11.

    进程 <wbr>vs <wbr>线程 <wbr>:一个进程可以包含多个线程

    操作系统的设计,因此可以归结为三点:

    (1)以多进程形式,允许多个任务同时运行;

    (2)以多线程形式,允许单个任务分成不同的部分运行;

    (3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

    (完)

    展开全文
  • 进程线程、多线程

    2022-01-22 16:51:29
    线程进程、多线程、守护线程、静态代理模式、线程同步、死锁、Lock锁

    进程、线程、多线程

    一、概念

    1. 进程与线程的关系:一个进程可以包含多个线程
    2. 线程就是独立的执行路径
    3. 在程序运行是,即使没有自己创建线程,后台也会有多个线程,如主线程、gc线程
    4. main()称为主线程,为系统的入口,用于执行整个程序
    5. 在一个进程中,如果开辟了多个线程,线程的运行有调度器安排,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的
    6. 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制
    7. 线程会带来额外的开销,如cpu调度时间,并发控制开销
    8. 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致

    二、线程创建

    方式一:继承Thread类(Thread类其实也实现了Runnable接口)

    1. 自定义线程类继承Thread类
    2. 重写run()方法,编写线程执行体
    3. 创建线程对象,调用start()方法启动线程

    注意:线程开启不一定立即执行,有cpu调度执行

    方式二:实现Runnable接口

    1. 自定义类实现Runnable接口
    2. 重写run()方法,编写线程执行体
    3. 创建线程对象,调用start()方法启动线程

    方式三:实现Callable接口

    1. 实现Callable接口,需要返回值
    2. 重写call()方法,需要抛出异常
    3. 创建目标对象
    4. 创建执行服务:ExecutorService ser=Excutors.newFixedThreadPool(线程个数);
    5. 执行提交:Future result1=ser.submit(实现Callable接口的目标对象t1);
    6. 获得结果:boolean r1=result1.get();
    7. 关闭服务:ser.shutdownNow();

    小结:对比继承Thread类和实现Runnable接口两种方式

    1. 继承Thread类
      • 子类继承Thread类具备多线程能力
      • 启动线程:子类对象.start()
      • 不建议使用:避免OOP单继承的局限性
    2. 实现Runnable接口
      • 实现Runnable接口具备多线程能力
      • 启动线程:new Thread(实现Runnable接口的目标对象).start()
      • 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

    三、守护线程(daemon)

    • 线程分为用户线程和守护线程
    • 虚拟机必须确保用户线程执行完毕
    • 虚拟机不用等待守护线程执行完毕
    • 守护线程如,后台记录操作日志、监控内存、垃圾回收等待…

    四、静态代理模式

    1. 真实对象和代理对象都是要实现同一个接口
    2. 代理对象要代理真实角色
    3. 好处:
      • 代理对象可以做很多真是对象无法做的事情
      • 真实对象专注做自己的事情

    五、线程同步

    1. 由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访问冲突问题,为了保证数据在方法中被访问的正确性,在访问是加入锁机制synchronized ,当一个线程获得对象的排它锁,独占资源,其他线程必须等待,使用后释放锁即可,会存在以下问题:
      • 一个线程持有锁会导致其他需要此锁的线程挂起
      • 在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题
      • 如果一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题
    2. 由于我们可以通过private关键字来保证数据对象只能被方法访问( get()、set() ),所以我们只需要对方法提出一套机制,这套机制就是synchronized关键字,它包括两种用法:
      • synchronized方法
      • synchronized块
    3. synchronized方法控制对“对象”的访问,每个对象对应一把锁,每个synchronized方法必须获得调用该对象的锁才能执行,否则线程会阻塞,方法一旦执行,就独占该锁,直到方法返回才释放锁,后面被阻塞的线程才能获得这个锁,继续执行
      • 缺点:若将一个大的方法申明为synchronized将会影响效率
    4. 同步块:synchronized(Obj){},其中Obj称为同步监视器
      • Obj可以是任何对象,但是推荐使用公共资源作为同步监视器
      • 同步方法中无须指定同步监视器,因为同步方法的同步监视器就是this,就是这个对象本身,或者是class
      • 同步监视器的执行过程:
        • 第一个线程访问,锁定同步监视器,执行其中代码
        • 第二个线程访问,发现同步监视器被锁定,无法访问
        • 第一个线程访问完毕,解锁同步监视器
        • 第二个线程访问,发现同步监视器没有锁,然后锁定并访问

    五、死锁

    1. 产生死锁的四个必要条件:
      • 互斥条件:一个资源一次只能被一个进程使用
      • 请求与保持:一个进程因请求资源而阻塞时,对已获得资源保持不放
      • 不剥夺条件:进程已获得的资源,在未使用完之前,不能去强行剥夺
      • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

    六、Lock(锁)

    1. 概念
      • 从jdk5开始,java提供了更强大的线程同步机制——通过显式定义同步锁对对象来实现同步,同步锁使用Lock对象充当
      • java.util.concurrent.locks.Lock接口是控制多个进程对共享资源进行访问的工具。锁提供了对共享资源的独占空间,每次访问只能有一个线程对Lock对象加锁,线程开始访问共享资源之前先获得Lock对象
      • ReentrantLock(可重入锁)类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以显式加锁、释放锁
    2. synchronized与Lock对比
      • Lock是显式锁(手动开启和关闭锁),synchronized是隐式锁,出了作用域自动释放
      • Lock只有代码块锁,synchronized有代码块锁和方法锁
      • 使用Lock锁,jvm将花费较少的时间来调度线程,性能更好,并且就有较好的扩展性(提供更多子类)
      • 使用优先顺序:Lock>同步代码块(已经进入了方法体,分配了相应资源)>同步方法(在方法体之外)
    展开全文
  • 一个进程可以创建多少线程

    千次阅读 2018-07-18 23:10:23
    理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上最多只能创建2048个线程。如果要创建多于2048的话,必须修改编译器的设置。 #include&lt;windows.h&gt; #include&lt;...

    https://www.cnblogs.com/Leo_wl/p/5969621.html

    理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上最多只能创建2048个线程。如果要创建多于2048的话,必须修改编译器的设置。

    #include<windows.h>
    #include<process.h>
    #include<stdio.h>
    HANDLE hProcess;
    HANDLE hThread;
    
    DWORD WINAPI athread(void)    //线程函数
    {
    	WaitForSingleObject(hProcess, INFINITE);
    	return 0;
    }
    bool createThread(int threadNum)    //参数表示创建的线程数
    {
    	int i;
    	hProcess = GetCurrentProcess();
    	for(i = 0; i < threadNum; i++)
    	{
    		hThread = NULL;
    		hThread = (HANDLE)_beginthreadex(NULL, 0, (unsigned int(__stdcall *)(void *))athread, NULL, NULL, NULL);
    		if(hThread != NULL)
    		{
    			printf("\nThe Number of Thread : %d ", i + 1);
    		}
    		else{
    			printf("\nError : Create Thread Fail.\n");
    			return false;
    		}
    	}
    	return true;
    }
    int main()
    {
    	printf("Test : How much thread a process can create.\n");
    	createThread(4500);
    	getchar();
    	return 0;
    }

    结论:

    一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定,只要虚拟空间足够,那么新线程的建立就会成功。如果需要创建超过2K以上的线程,减小你线程栈的大小就可以实现了。

    展开全文
  • 如何查询一个进程下面的线程数(进程线程区别) https://www.cnblogs.com/kevingrace/p/5252919.html在平时工作中,经常会听到应用程序的进程线程的概念,那么它们两个之间究竟有什么关系或不同呢?一、对比...
  • 【操作系统】第六话·线程进程的(宝ᴗ宝)嘛?

    千次阅读 多人点赞 2022-03-12 15:23:07
    从今天开始,我们将要开启一个新的系列【闪耀计划】,没错!这是今年上半年的一整个系列计划!本专题目的是通过百天刷题计划,通过题目和知识点串联的方式,完成对计算机操作系统的复习和巩固;同时还配有专门的笔记...
  • 线程进程,你真得理解了吗

    万次阅读 多人点赞 2022-05-06 19:05:25
    相信大家面试时一定没少被一个问题刁难,那就是进程线程的区别是什么?这个问题延申开来并不像表面那么简单,今天就来深入一探。 开始前先看一组非常传神的图例,相信可以帮助你更好理解进程线程的概念: 1 ...
  • 1. 什么是进程线程 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。 1.1 百科解释 进程(Process)是计算机中的程序关于某数据集合上的次运行活动,是系统进行资源分配和...
  • 进程线程、协程

    千次阅读 2021-08-28 23:44:33
    进程线程、协程 一、概念与区分 1、进程 进程是程序一次动态执行的过程,是程序运行的基本...一个进程至少包含一个主线程,也可以有更多的子线程。 多个线程共享所属进程的资源,同时线程也拥有自己的专属资源。
  • 进程线程与CPU

    千次阅读 2022-02-21 12:37:35
    关于进程线程及串行、并行等概念,我们很有可能感到混淆难辨,因此将一些相关概念记录在此,以备...本篇博客包含CPU调度、单核与多核、进程线程、串行并行与并发、同步与异步、Python的多线程与多进程、等内容。
  • 一个进程包括由操作系统分配的内存空间,包含一个或多个线程一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。 线程  又称其为轻量级进程...
  • 进程线程详解

    千次阅读 2021-11-14 12:02:56
    本文章是对线程进程的一些总结,同时对多线程也有一个初步的认识,欢迎大家前来一起学习。
  • 进程线程

    万次阅读 多人点赞 2021-03-17 22:50:20
    进程是系统中独立存在的实体,它可以拥有自己独立的资源,每个进程都拥有自己私有的地址空间,在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间 动态性 进程与程序的区别在于,程序只是...
  • 线程进程一--并发和并行

    千次阅读 2022-03-20 11:25:04
    并行,parallel:同一个时间点,不同任务同时进行,互不干扰。 并发,concurrency:需要同时做某些事,强调的是需要处理多项事务,不一定同时进行。 —> 并行解决的是并发需求的一种方式。 —>队列、缓冲区,...
  • 一个进程只能一个线程池,现在还是这样吗? 一个线程池的最大线程数,是由哪些因素来决定的? 以前听说一个线程池最大是1000个线程,现在最多可以多少个线程
  • linux查看进程线程

    千次阅读 2021-05-15 11:29:52
    top -H -p $PID #查看对应进程的那个线程占用CPU过高1、top -H手册中说:-H : Threads toggle加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。2、ps xH手册中说:H Show threads as if they ...
  • 有些时候需要确实进程内部当前运行着多少线程,那么以下几方法值得用。1.根据进程号进行查询:# pstree -p 进程号# top -Hp 进程号2.根据进程名字进行查询:# pstree -p `ps -e | grep server | awk '{print $1}...
  • Java之进程线程

    2021-06-03 09:50:10
    深入理解进程线程 ...进程线程一个进程可以包括多个线程线程间内存共享:一个车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。 同理一个进程的内存空间是共享的,里面的每个线..
  • 进程线程的分配策略【杂记】

    千次阅读 2022-02-08 19:02:33
    进程线程的分配策略【杂记】
  • 进程线程的关系

    千次阅读 2022-06-19 22:01:58
    共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,...2.线程进程的一部分,一个线程只能属于一个进程一个进程可以有多个线程,但至少有一个线程
  • 假定工厂的电力有限,一次只能供给一个车间使用,也就是说,一个车间开工的时候,其他车间都必须停工,背后的含义就是,单个CPU一次只能执行一个任务。 进程就好比工厂里的车间,他代表CPU所能处理的单个任务。...
  • 进程线程和CPU 之间的关系(

    千次阅读 2020-10-31 15:43:15
    今天开始,这专题主要讲解 java 并发编程系列,从操作系统的进程、CPU、线程等底层开始,到java 并发工具类,线程、线程池,并发容器、CAS、AQS等原理、源码和使用均做深入的解析。今天讲进程线程和CPU 之间的...
  • 线程进程一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程...
  • 线程是CPU调度和分派的基本单位,一个进程可以拥有多个线程线程自己基本上不拥有系统资源,只拥有少部分的资源(如程序计数器,一组寄存器和栈)。线程间通信主要通过共享内存,上下文切换很快,资源
  • 进程线程的区别

    千次阅读 2022-02-25 23:39:54
    2.进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈; 3.线程同样具有就绪、阻塞、执行三种基本状态,同样具有状态之间的转换关系; 4.线程能减少并发执行的时间和空间开销; 对于,线程相比...
  • 进程线程的深入理解

    万次阅读 多人点赞 2019-04-25 00:14:40
    进程线程的深入理解,从抽象类比到与原理,阐述了两者的区别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 271,811
精华内容 108,724
热门标签
关键字:

一个进程只能包含一个线程吗