概述
进程是资源分配的基本单位,进程由线程组成。
线程是系统执行调度的基本单位,线程隶属于进程。
为何引入线程
1、进程在同一时间只能干一件事,比如我们在上课的时候,往往要耳朵听课,手记笔记,脑子思考,如果套用进程的机制,那么我们听课的时候也不能记录笔记,更不能思考。
2、当进程某个操作阻塞时,整个进程就会挂起,也就是说当老师讲课时需要思考的时候,我们也还只能听课,不能思考也不能记录笔记
线程与进程的区别
1、进程是资源分配的基本单位,线程是系统执行调度的基本单位
2、每个进程都有独立的内存地址空间,互不影响,每个线程都共享同一进程的内存空间
3、当一个进程崩溃时,由于地址空间是独立的,所以不会影响其他进程,当一条线程出现问题时,整个进程就会有问题
4、线程可以看做是进程内部的执行路径,当路径只有一条的时候,就称为单线程,多条则为多线程
5、创建线程要比创建进程快,在创建和回收进程的时候,系统都要为之分配和回收资源,导致系统的开销明显大于线程的开销
进程间通信
管道及有名管道:
管道用于具有亲缘关系的父子进程之间的通信;有名管道除了具有管道的功能,还允许无缘进程之间的通信
信号:
在软件层次上对中断机制的一种模拟,用于通知进程有某件事要发生
消息队列:
消息的链接表,具有写权限的进程可以向消息队列中写入消息,具有读权限的进程可以从消息队列中读取消息。
共享内存:
多个进程访问同一块内存区域,不同进程之间可以看到对方对数据的更新
Socket:
网络中不同机器之间的网络通信
线程间通信
信号量(允许多个线程在同一时间访问统一资源):
我们可以看个例子:假设车是线程,停车场是内存空间。有一个停车场内只能容纳5个车,所以每进去一辆车就在门卫处拿一个牌号,因为只有5个牌号,所以当停车场停够5辆车的时候,其余车就不能进入,只能在外面排队等待。只有当停车场内一个车出来的时候,把车牌归还给门卫,此时在外面排队的进去一个车。这样做保证了多个线程之间不冲突。
互斥:
把停车场的例子换成停车场内只能容纳一个车。我停时,你就不能停。
临界区:
任何时刻只允许一个线程对共享资源进行操作,其他线程要访问共享资源都会被挂起,当临界区中的线程离开时,其他线程可以抢占
线程间通信的目的主要是用于线程同步,所以没有像进程中交换数据的通信机制
多线程同步和互斥的区别
同步就是线程之间的一种制约关系,一个线程的执行依赖于另一个线程的消息,一个线程只有得到另一个线程的消息时可以被唤醒,否则应该等待。
互斥是当一个线程访问共享资源的时候,任何时刻只允许一个线程去使用,其他要使用该资源的线程必须等待,只要占用该资源的线程释放该资源。
因此互斥可以看做一种特殊的同步。
举个例子:
一个全局变量,只要当主线程修改了这个变量后,下一个才可以访问,此时就需要同步两个线程;
一个线程在访问全局变量的时候另一个线程不能访问这个变量,这就是互斥。
线程安全
多线程的程序是可预期的,和单线程运行结果一样,那么就说明是安全的
参考
版权声明:本文为博主原创文章,转载请注明出处。