定义:是程序的一次动态执行,是计算机进行资源分配和调度的一个基本单位。
特征:动态性、并发性、独立性、异步性、结构性。
进程通信指进程之间的信息交换,因为进程是系统分配资源的基本单位,因此进程拥有的内存地址空间相互独立,为保证安全,一个进程无法直接访问另一个进程的资源。
为两个进程设立一个共享存储区,两个进程需要互斥(通过PV操作)的访问共享空间。
共享存储分为 基于数据结构 和 基于存储区 两种
基于数据结构:只能放固定数据结构的数据,速度慢,限制多,是一种低级通信方式
基于存储区:数据形式由进程控制,是高级通信方式
管道通信只能使用半双工,一段时间内只能单向通信。管道就是内存中的缓冲区,缓存区未满时不能读数据,缓冲区未空不能写数据。当写入方将缓冲区写满后,读入方才能开始读,只有读入方将缓冲区读空以后,缓冲区才能重新被写入数据。
管道满时,写进程的write()调用将被阻塞,管道空时,读进程的read()调用将被阻塞
对于管道来说,两个读进程之间,两个写进程之间,读进程与写进程之间都是互斥的。
两个写进程可能会覆盖写入以及乱序写入
由于管道中的数据在读进程读取之后便丢失了(这与文件不同,文件读取不改变文件里的值),因此两个读进程一起读的话可能会导致错误(想读的已经被读走了,只能读不该读的了)
进程间通过 “发送消息”、“接受消息”这两个 原语 来进行数据交换
类似与邮件,有一个消息信箱作为进程间消息的中转站,进程要先将消息发送到信箱中去,进程收到消息后将消息挂到消息队列上
消息类似于网络报文,分为消息头和消息体两部分。消息头包括 发送进程id,接受进程id,消息类型,消息长度等(和计网完全类似)
注意:
共享存储方式中,两个进程必须互斥的访问共享空间
管道通信方式,一个管道只能实现半双工通信,要想实现全双工通信,需要设置两个管道(两个缓冲区)
线程是CPU调度的一个基本的单位,一个进程可以有多个线程。线程没有自己的资源,它只和其他线程共享进程资源。进程的调度同步等操作由操作系统完成,而线程既能由操作系统完成,也可由用户程序控制。
线程状态转换图