一、进程与线程的区别?
1,进程
是资源分配的最小单位;线程
是程序执行的最小单位,也是处理器调度的基本单位。
2,进程有独立的地址空间
,启动一个进程系统就会为它分配地址空间,建立数据表来维护代码段,堆栈段和数据段;线程共享进程中的数据,使用相同的地址空间
。
3,进程通信需要以IPC的方式(Inter-Process Communication,进程间通信);线程共享全局变量,静态变量等数据,通信更为方便。
4,进程切换消耗的资源大,效率低,但多进程程序更健壮,一个进程死掉并不会对另外一个进程造成影响;多线程程序只要有一个线程死掉,整个进程也跟着死掉了。
二、进程之间的通信方式?
-
无名管道( pipe )
:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。 -
有名管道(named pipe)
:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。 -
高级管道(popen)
:将另一个程序当做一个新的进程在当前程序中启动,则它算是当前程序的子进程。 -
信号( sinal )
:信号通常是系统定义(SIGKILL等),用于通知接收进程某个事件已经发生。 -
信号量( semophore )
:信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。 -
消息队列( message queue )
:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 -
共享内存( shared memory )
:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存有一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式。 -
套接字( socket )
:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
三、多线程用到的锁?
-
互斥锁
:为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线程和一个任务队列。任何是一个线程都要使用互斥锁互斥访问任务队列,以避免多个线程同时访问任务队列以发生错乱。 -
条件锁
:某一个线程因为条件为满足使可以使用条件变量是程序处于阻塞状态。常见就是在线程池中,起初没有任务时任务队列为空,此时线程池中的线程因为“任务队列为空”这个条件处于阻塞状态。一旦有任务进来,就会以信号量的方式唤醒一个线程来处理这个任务。 -
自旋锁
:从“自旋锁”的名字也可以看出来,如果一个线程想要获取一个被使用的自旋锁,那么它会一致占用CPU请求这个自旋锁使得CPU不能去做其他的事情,直到获取这个锁为止,这就是“自旋”的含义。当发生阻塞时,互斥锁可以让CPU去处理其他的任务;而自旋锁让CPU一直不断循环请求获取这个锁。 -
读写锁
:读写锁也叫共享-独占锁。当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。写独占、读共享。读写锁非常适合于对数据结构读的次数远大于写的情况。