- 进程间通信的方式
- 管道:半双工,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,比如父子进程
- 命名管道:半双工,但允许无亲缘关系的进程间通信
- 消息队列:
- 共享存储:共享内存,映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。是最快的IPC方式,往往与信号量等配合使用来实现进程间的同步与通信。
- 信号量:计数器,可以用来控制多个进程对共享资源的访问,常作为一种锁机制。也可以用于线程之间。
- 套接字:比较特别,可以用于不同机器间的进程通信
- 信号:用于通知接收进程某个事件已经发生
- 线程间通信的方式
- 互斥锁:
- 条件变量:用来让需要等待的线程休眠,条件满足时再唤醒
- 信号量:也可以用于进程间,用于进程间时,要把信号量建立在共享内存上
- 读写锁
- 子进程与父进程有哪些相同哪些不同
- 子进程被fork出来之后,相当于把父进程的地址空间复制了一份,所以父进程打开的文件,子进程也是可以读写的。
- fork在子进程中返回的是0,父进程中返回的是子进程的pid
- 锁没有继承(如果是排他锁的话,继承了就矛盾了)
- 进程跟线程的区别
- 进程是资源分配的最小单位,线程是资源调度的最小单位
- 进程有自己独立的地址空间,线程则共享同一个进程的地址空间
- 创建进程和切换进程的开销很大,线程则相对较小
- 进程中一个线程被线程共享的区域搞崩溃,那其他线程很有可能也会出问题,多进程就没有这个隐患。
- 多进程与多线程各自的优缺点:
- 多进程比较健壮,一个进程崩掉了也没关系
- 多进程难同步且耗费资源
- 父进程kill掉之后:
- 导致僵尸进程
- 导致孤儿进程
- 导致子线程崩掉:如果父进程是当前进程组的首个,进程组又是会话的首个,那就会崩掉
- 主线程kill掉之后:
一般来说主线程结束了,也就意味着进程结束了,那子线程自然也就结束了,但是可以通过detach来分离主线程与父线程,来防止子线程无故退出。 - 上下文切换指什么,在切换什么
上下文指保存上一个线程的CPU寄存器和程序计数器存起来,载入下一个线程的这些东西。 - 中断:
- 有哪些锁
- 死锁的概念及4个条件:
- 两个及以上的资源持有另一进程请求的资源且请求另一进程占据的资源
- 非抢占式:
- 互斥: 资源是互斥的
- 请求与保持:都在请求资源,又不放弃自己有的资源
- 循环等待: