进程间同步
信号量
fork() vfork() clone()
进程的四要素:
(1)有一段程序供其执行(不一定是一个进程所专有的),就像一场戏必须有自己的剧本。
(2)有自己的专用系统堆栈空间(私有财产)
(3)有进程控制块(task_struct)(“有身份证,PID”)
(4)有独立的存储空间。
缺少第四条的称为线程,如果完全没有用户空间称为内核线程,共享用户空间的称为用户线程。
fork、v_fork、clone底层都是do_fork,追踪发现底层使用的是sys_clone
- fork
- 父进程fork之后创建子进程,子进程复制父进程的所有资源,子进程的代码段、数据段、堆栈都是指向父进程的物理空间,但此时仅仅是子进程的虚拟地址空间和父进程指向的物理地址空间建立了映射关系,并没有真正复制
- 由于fork()后会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,处于效率考虑,linux中引入了“写时复制技术-Copy-On-Write”
- 若两个进程一直只是读数据,则子进程一直不会复制,直到任一进程进行写操作