原文地址:网络和操作系统面试相关内容~(二)
1、进程间通信方式?
-
管道:有两种限制,一是半双工的通信,数据只能单向流动,二是只能在具有亲缘关系的进程间使用,进程的亲缘关系通常指的是父子进程关系。
-
信号:是一种比较复杂的通信方式,可在任何时候给某一进程发送,而无需知道该进程的状态。
-
信号量:是一个计数器,可用来控制多个进程对共享资源的访问,常作为一种锁机制,防止某进程正在访问共享资源时,其它进程访问该资源,因此,信号量主要作为进程间以及同一进程内不同线程之间的同步手段。
-
消息队列:是消息的链接表,包括POSIX消息队列和system V消息队列,有足够权限的进程可向队列中添加消息,被赋予读权限的进程则可读走队列中的消息,消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
-
共享内存:是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可访问,共享内存是最快的IPC方式,它是针对其它进程间通信方式运行效率低而设计的,往往与其它通信机制,如信号量,配合使用,来实现进程间的同步和通信。
-
Socket:可用于不同机器间的进程通信。
管道大致可分为两类,匿名管道和命名管道,匿名管道是单向的,只能在有亲缘关系的进程间通信,命名管道以磁盘文件的方式存在,可实现本机任意两进程通信。
2、Linux常用信号?
-
SIGHUP:用户从终端注销,所有已启动的进程都将收到该信号,系统缺省状态下对该信号的处理是终止进程。
-
SIGINT:程序终止信号,程序运行过程中,按Ctrl+C键产生该信号。
-
SIGQUIT:程序退出信号,程序运行过程中,按Ctrl+\\键产生该信号。
-
SIGBUS和SIGSEGV:进程非法访问地址。
-
SIGFPE:计算中出现致命错误,如除零操作,数据溢出等。
-
SIGKILL:用户终止进程执行信号,shell下执行kill -9发送该信号。
-
SIGTERM:结束进程信号,shell下执行kill 进程pid发送该信号。
-
SIGALRM:定时器信号。
-
SIGCLD:子进程退出信号,如其父进程未忽略该信号,也并未处理该信号,则子进程退出后将形成僵尸进程。
3、进程间各通信方式的优缺点?
-
管道:速度慢,容量有限。
-
Socket:任何进程间都可通信,速度慢。
-
消息队列:容量受系统限制,第一次读时,需考虑上次未读的数据。
-
信号量:不能传递复杂消息,只能用来同步。
-
共享内存区:很容易控制容量,速度快,但要保持同步,如一进程写时,另一进程需注意读写问题,相当于线程中的线程安全。
4、进程间的同步方式?
临界区:通过对多线程的串行化来访问公共资源或是一段代码,速度快,适合控制数据访问。
临界区优点:保证在某一时刻只有一个线程能访问数据的简便方法。
临界区缺点:虽然临界区同步速度很快,但只能用来同步本进程内的线程,不可用来同步多个进程中的线程。
互斥量:为协调共同对一个贡献资源的单独访问而设计,互斥量与临界区很相似,但比临界区要复杂,互斥对象只有一个,只有拥有会吃对象的线程才具有访问资源的权限。
互斥量的优点:使用互斥不仅能在同一应用程序不同线程中实现资源的安全共享,也可在不同应用程序间实现对资源的安全共享。
互斥量的缺点:
-
互斥量是可以命名的,可跨进程使用,所以创建互斥量需要的资源更多,如果只为了在进程内部使用的话,使用临界区会带来速度上的优势,还能减少资源占用量。
-
通过互斥量可指定资源被独占的方式来使用,但还有特殊情况通过互斥量就无法处理,如现在一位用户购买了一份三个并发访问许可的数据库系统,可根据用户购买的访问许可数量来决定有多少个线程或进程能同时进行数据库操作,此时利用互斥量则无法完成需求,信号量对象可说是一种资源计数器。
信号量:为控制一个具有有限数量的用户资源而设计,允许多个线程在同一时刻访问同一资源,但需限制在同一时刻访问此资源的最大线程数,互斥量是信号量的一种特殊情况,当信号量的最大资源数=1就是互斥量了。
信号量的优点:适用于对Socket(套接字)程序中线程的同步。
信号量的缺点:
-
必须有公共内存,不能用于分布式操作系统。
-
功能强大,但使用时对信号量的操作分散,且难以控制,读写和维护都很困难,加重编码负担。
-
核心操作P-V分散在各用户程序的代码中,不易控制和管理,一旦错误,后果严重,且不易发现和纠正。
事件:用以通知线程有一些事件已发生,从而启动后继任务的开始。
事件的优点:通过通知操作的方式来保持线程同步,可实现不同线程中的线程同步。
至此,本次分享就结束了,后期会慢慢补充的。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。