13 | 进程间的同步互斥、资源共享与通讯-笔记

互斥、同步、资源共享以及通讯等原语。

对比图:


需求角度:

他们之前的协同有何不同:

早期:系统只有进程这种执行体

之后进程的执行体(线程 协程)

如何在一个进程中启动另一个进程?

1. 创建子进程

2. 让Shell配合进行某种操作


Unix使用了fork 机制

Windows使用了CreateProcess

IOS不支持创建子进程

它的操作过程:

不创建多个实例 永远是单例模式

A进程需要调用B进程的能力,只需要基于 URL Scheme 去打开它

URL Scheme 的概念:

https://www.qiniu.com/

 ftp://e...

https 和 ftp 就是 scheme

一个软件可以声明自己实现了某种scheme,例如微信的weixin://

调用方式:

 UIApplication.openURL("weixin://...") 


调用完成之后都会直接跳转到微信

通过该机制,我们能够实现支付宝和微信支付能力的额对接

这种机制不是IOS发明的,而是浏览器的拓展机制

Windows 和 Linux 的桌面也支持

例如:windows 的ShellExecute


同步与互斥

读写锁

信号量

等待组

条件变量


锁,语义上和进程没什么不同,只是在标识互斥资源上不同

windows name

linux 共享内存

IOS 路径

进程会意外挂掉,因此比较不稳定 且没有那么多操作原语.如果进程执行任务时候意外挂掉,且存在进程锁的情况下,会导致锁没有得到正常释放。另一个等待进程会一直挨饿


资源共享

两个进程再怎么隔离,只要有中间人,就可以通讯

进程间可共享的资源是:

1. 剪切板

2. 文件系统

文件系统天然就是共享的资源  一个进程创建了一个文件 那么其他进程也可以访问到

许多操作系统中将文件系统概念抽象成“一切皆文件” 

文件间协同:

文件

文件锁

管道

共享内存


共享内存: 虚拟内存机制的自然结果,之前讲到过内存分页和文件系统进行的数据的保存与恢复

虚拟内存与磁盘文件建立关系,本来就存在。

Linux:

func Map(addr unsafe.Pointer, len int64, prot, flags int, fd int, off int64) unsafe.Pointer
func Unmap(addr unsafe.Pointer, len int64)


IOS

软件被装到了一个沙箱(Sandbox)里面,不同进程间的存储完全隔离


剪切板:

不是正常的进程间的通讯方式,因为剪切板只有一个,一个进程分享数据上去,其他的的数据就会被覆盖掉。

相反容易被恶意程序利用,比如写个木马脚本监听剪切板的内容


收发消息

还有其他通讯机制吗?

有,基于网络。很重要的一个事实是:这些进程同在一台机器上,同一个局域网中


套接字作为网络通讯的抽象,本身就具备强大的通讯方式,确实没有之一,进程间通过套接字进行通讯的方式,也是极其自然的选择。

UNIX

UNIX域,通过name进行寻址,而不是ip:port这种方式

Windows

Windows 不支持 UNIX域,但是NamePipe也不是那么简单

它更像是一个管道服务器,客户端链接上来,会分配一个独立的管道给服务器和客户端,进行正常的通讯

架构上我们学到了?

创新性的系统往往具备颠覆性

IOS的启发:

软件启动,一个进程实例就够了。

大部分进程间的协同都是多余的。


当然服务端的视角和=客户端还是不同的





有疑问、勘误、请您在下方留言,感谢您的支持 ღ( ´・ᴗ・` )!

感谢您阅读,这篇文章归 极客点子版权所有.
如果转载,请注明出处: 极客点子版权所有(/page/950.html) 知识共享许可协议
本网站使用 创作共用 归属 - 非商业用途 - 共享4.0国际许可协议的相同方式 许可.

关于作者:

    作者:

    reverse()

    简介:

    nodejs 全栈工程师 、作家、github 开源爱好者
    研究方向:数据分析、 深度学习、 服务器架构、 系统原理

    著作:

    最爱的编程语言:

    Javascript
    Python