第二章C 进程的通信与线程PPT课件
- 格式:ppt
- 大小:595.50 KB
- 文档页数:33
进程和线程1.进程和线程程序是什么?QQ.exe,PowerPoint.exe进程:是⼀个正在执⾏中的程序(程序启动,进⼊内存,即资源分配的基本单位)。
每⼀个进程执⾏都有⼀个执⾏顺序。
该顺序是⼀个执⾏路径,或者叫⼀个控制单元。
线程:就是进程中的⼀个独⽴的控制单元,是⽐进程更⼩的执⾏单位。
线程只是⼀种为单⼀处理器分配执⾏时间的⼿段(程序执⾏的基本单位,⽐如程序中有main线程,执⾏a=2+3,还有其他分叉的线程)程序是如何运⾏的?CPU读指令 PC(program counter存储指令地址),读数据Register,计算ALU,回写 --> 下⼀条指令线程如何进⾏调度?linux线程调度器(OS)操作系统 在APP中启动的线程是需要经过操作系统帮你在CPU上调度的,操作系统管理哪个线程扔到哪个CPU⾥⾯去,⽐如说,操作系统说下个线程该你了,操作系统就负责扔指令到PC⾥⾯去,扔数据到register⾥⾯去 在Java中,new Thread.start()这样就起了JVM线程线程切换的概念是什么?ContextSwitch CPU保存现场,执⾏新线程,恢复现场,继续执⾏原线程这样的⼀个过程 当我们执⾏T1的时候,T1的内容会装到CPU中,当我们执⾏T2的时候,T1的内容会从CPU中⼀到cache中 因此线程数量不是越多越好,如果线程特别多的时候,会把时间浪费在切换上⾯线程在控制着进程的执⾏。
⼀个进程中⾄少有⼀个线程。
线程的四个状态:运⾏,就绪,挂起,结束。
线程的作⽤:就是⽤来执⾏代码的。
2.什么是多线程? 多线程是指⼀个进程在执⾏过程中可以产⽣多个线程,这些线程可以同时存在,同时运⾏,⼀个进程可能包含了多个同时执⾏的线程。
如,迅雷下载,可以下载多个任务,就是多线程。
3.创建多线程的第⼀种⽅式:继承Thread类。
(1)定义类继承Thread类 (2)覆写Thread 类中的run()⽅法 ⽬的:将⾃定义代码存储在run⽅法,让线程运⾏。
进程和线程的通信方式一、进程和线程通信方式的概述哎呀,宝子们,今天咱们来唠唠进程和线程的通信方式哈。
进程呢,就像是一个个独立的小世界,而线程就像是小世界里的小居民。
它们之间要是想交流沟通,那可有不少办法呢。
二、共享内存通信方式共享内存就像是住在公寓里,大家共用一个大客厅一样。
进程或者线程可以把一些数据放在这个共享的内存区域里,这样其他的进程或者线程就能访问到这些数据啦。
不过呢,这就像大家共用客厅一样,得注意别互相干扰,得有一些规则来保证数据的完整性和一致性。
比如说,得有一些同步机制,像信号量啥的,来防止大家同时修改数据,搞得一团糟。
三、管道通信方式管道通信就像是传声筒一样。
一个进程或者线程把数据通过管道传给另一个。
有匿名管道和命名管道之分呢。
匿名管道就像是只有两个小伙伴知道的秘密传声筒,只能在有亲缘关系的进程之间用,比如说父子进程。
而命名管道就不一样啦,它像是有个名字的传声筒,不同的进程只要知道这个名字,就可以通过这个管道来通信啦。
四、消息队列通信方式消息队列就像是一个信箱。
进程或者线程把消息放到这个队列里,就像把信投到信箱里一样。
其他的进程或者线程可以从这个队列里取消息。
这样的好处是,发送和接收的进程或者线程不需要同时运行,就像你可以在白天把信投到信箱,收信的人晚上再去取一样。
而且消息队列还能对消息进行排序,按照一定的顺序来处理消息。
五、信号通信方式信号就像是一种特殊的小暗号。
一个进程或者线程可以给另一个发送信号,来通知它发生了什么事情。
比如说,一个进程结束了,它可以给相关的进程发个信号,就像打个招呼说“我干完啦,你看着办”。
接收信号的进程可以根据信号来做出相应的反应,不过这种通信方式能传递的信息比较有限,就像是简单的暗号,不能传递很复杂的内容。
六、套接字通信方式套接字通信就比较高大上啦,它就像是给进程或者线程开了个网络接口一样。
可以让不同主机上的进程或者线程进行通信。
这就像你和远方的小伙伴通过网络聊天一样。
线程和进程的通信方式哎,说到线程和进程的通信方式,这事儿可真不是三言两语能说清的。
咱们先从最基本的概念开始聊起吧。
首先,得明白啥是进程和线程。
进程,简单说,就是运行中的程序,它有自己的内存空间,操作系统通过进程来管理程序的运行。
线程呢,就像是进程里的小分队,它们共享进程的资源,但是每个线程都有自己的执行路径。
好了,既然知道了进程和线程,咱们就得聊聊它们之间怎么通信了。
这事儿,其实挺复杂的,因为它们通信的方式多种多样,每种方式都有它自己的适用场景。
比如说,进程间通信(IPC),最常见的有管道、消息队列、信号、共享内存和套接字。
这些方式,各有千秋。
比如管道,它简单,但是只能用于有亲缘关系的进程间通信,就是说,它们得是父子关系。
消息队列呢,它更灵活,可以跨进程通信,但是处理起来稍微复杂点。
共享内存,这个速度快,因为它直接在内存里共享数据,但是得处理好同步问题,不然容易出现数据不一致的情况。
信号,这个速度快,但是只能传递有限的信息,而且处理起来比较复杂。
套接字,这个就更灵活了,不仅可以在本机通信,还能跨网络通信。
线程间通信呢,因为它们共享相同的内存空间,所以相对简单点。
它们可以直接通过共享变量来通信,但是得注意同步问题,不然容易出现竞态条件。
除了共享变量,还可以用信号量、互斥锁这些同步机制来保证线程安全。
举个例子,比如说你正在做一个多线程的程序,需要几个线程共同完成一个任务。
这时候,你可能会用到互斥锁来保证数据的一致性。
比如,你有一个全局的计数器,每个线程都需要更新这个计数器。
如果没有互斥锁,可能会出现两个线程同时更新计数器的情况,导致计数器的值不正确。
这时候,互斥锁就派上用场了,它能保证每次只有一个线程能更新计数器。
再比如,你可能会用到条件变量来控制线程的执行顺序。
比如,你有一个线程负责生产数据,另一个线程负责消费数据。
如果没有条件变量,可能会出现生产者线程生产了数据,但是消费者线程还没准备好消费的情况。