这里我将学习的进程与线程分为三个大部分
1.进程创建:使用fork创建子进程,execve执行新程序。
2.进程通信:匿名管道、有名管道、共享内存、消息队列、信号
3.线程管理:线程创建、终止、同步(互斥锁、读写锁、条件变量等)
要想进一步了解系统的底层原理可以去看操作系统相关的知识,了解了解进程线程的内存模型,以及进程线程在系统上的工作原理。这里有一篇不错的文章
https://zybtree.github.io/2020/08/10/进程-线程模型/
进程创建
使用 fork 创建子进程
• fork 的作用:fork 是 Linux 系统中用于创建子进程的系统调用。调用 fork 后,父进程会复制一份自己的地址空间给子进程,子进程从 fork 返回处开始执行。这里涉及到写时复制
• 返回值:
• -1:创建失败。
• 0:在子进程中返回。
• > 0:在父进程中返回子进程的 PID。
• 代码示例:
1 |
|
使用 execve 执行新程序
• execve 的作用:execve 用于替换当前进程的地址空间为新的程序,并执行该程序。调用成功后,原程序的代码和数据被新程序替换。这也意味着该进程的pid保持不变
• 代码示例:
1 |
|
进程通信
匿名管道
• 匿名管道的特点:半双工通信,只能用于有亲缘关系的进程间通信。同时保持一个读一个写的原则
• 代码示例:
1 |
|
有名管道
• 有名管道的特点:允许无亲缘关系的进程间通信,通过文件系统中的特殊文件实现。
• 写进程代码示例:
1 |
|
• 读进程代码示例:
1 |
|
共享内存
• 共享内存的特点:多个进程共享同一块内存区域,是最快的进程间通信方式。
• 代码示例:
1 |
|
消息队列
• 消息队列的特点:允许进程通过消息队列发送和接收消息,支持无亲缘关系的进程间通信。
• 消费者代码示例:
1 |
|
• 生产者代码示例:
1 |
|
信号量
信号量机制由信号量 和P, V操作两部分组成, 信号量是一个特殊的变量, 是进程传递的一个整数数值,只能被两个标准原语所访问,及p(wait操作)操作, v(signal操作)操作。P是阻塞原语,V是唤醒原语。P对信号量值-1后, 小于0则执行阻塞操作。反之V +1后, 大于等于零时不执行唤醒操作,小于0则唤醒一个等待进程,继续执行
• 无名信号量
通过共享内存的方式实现进程间的通讯
1 |
|
• 有名信号量
比起通过共享内存的方式会简单很多
1 |
|
• 经典案例
通过创建两个信号量来控制进程或线程的执行顺序
1 |
|
信号
• 信号的特点:用于通知进程发生了某种事件,是一种异步通信方式。
• 代码示例:
1 |
|
说些什么吧!