关于线程和进程的一些小结

一、线程和进程的区别

1.每个程序至少有一个进程,每个进程至少有一个线程。

2.进程之间的内存空间是独立的,而同一个进程的线程之间的内存是共享的。所以线程切换更快。


二、进程间通信

1.管道,包括无名管道(父子线程之间),有名管道(任意两个线程,半双工)

2.内存共享

3.套接字


三、死锁

在内存共享的时候,为了避免出现多个进程(线程)同时写的情况,需要对读写进行同步,比如加锁。而假设有这样一个场景:线程1和2都要锁定内存A和B,而线程1先锁定了A,继续锁定B的时候发现B已经被线程2锁定了,同样的,线程2只锁定了B却无法锁定A,两个线程都在等待对方放弃资源,结果造成了死循环,也就是死锁。

避免死锁的主要方法有:

1.规定加锁顺序,比如在刚才的例子中,必须先锁定A锁定B,就不会出现锁到一半后面的被锁了的情况。

2.添加加锁超时。一旦发现加锁等待超过一定时间,则放弃本次加锁。


四、IO多路复用

阻塞:当线程对一个流进行读写的时候,该流还没有准备好,则线程被暂时挂起,进入睡眠,称为阻塞。

非阻塞:当流没有准备好时,线程不进入睡眠,而是每隔一段时间对流进行询问,称为非阻塞。由于时间间隔内,线程可以做其他事情(比如询问另一个流),所以非阻塞可以同时处理多个流。

select /poll代理:一般阻塞模式下只能对一个流进行读写,使用select 或poll可以实现同时对多个流进行读写,全部流不可用时,线程阻塞,只要有一个以上的流可以用,select /poll就会唤醒线程,线程轮询所有流,找到可以访问的流并进行读写。

epoll:poll的加强版,即event-poll,与poll类似,当所有流不可用时线程阻塞,当有流可用时唤醒线程,不同的是线程不需要轮询所有的流,epoll会将可用的流放入一个链表中,线程只需要在可用的流中选择合适的流进行读写。epoll的原理是将轮询任务放到内核线程中,不需要用户线程去轮询。同时epoll使用了mmap技术,实现了内存共享,不需要每次都将文件从内核拷贝到用户空间。epoll分为LT和ET两种工作模式,即水平触发和边缘触发,水平触发下只要有一个文件描述符就绪,内核就会一直向用户发出通知;而边沿触发下,只有在文件描述符从未就绪变为已就绪时才会向用户发出通知。


参考文章:

阻塞、非阻塞、异步、同步以及select/poll和epoll

epoll 或者 kqueue 的原理是什么?

socket阻塞与非阻塞,同步与异步、I/O模型

Linux下的进程间通信-详解


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值