linux进程那些事(一) ---- 进程基础知识杂谈

下文整理了linux进程相关的知识点,都比较实用。对于一些基本的介绍我都省略,只收录我觉得最有价值的部分。不过各个知识点有时候看起来没什么相关性,跳跃性比较强,所以我称之为“杂谈”。

1.如何在linux上启动一个daemon进程?如何停止一个daemon进程?为什么要fork两次?
linux平台上,我们应该fork父进程两次以启动一个后台服务进程。原因是为了保证daemon进程完全脱离terminal。具体细节请参考下面两篇文章
http://thelinuxjedi.blogspot.com/2014/02/why-use-double-fork-to-daemonize.html
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap11.html#tag_11_01_03
退出daemon进程的方法有很多,下面列举两个常用的方法。
a.通过某个信号量实现后台服务停止。后台进程可以起一个线程睡眠在该信号量上,用户可以通过一条命令修改信号量唤醒该线程,从而触发后台服务退出。
b.通过配置文件实现后台服务停止。后台服务可以设一个计时器不断检查该配置文件,然后根据配置决定是否退出。
2.linux进程间通信机制有哪些?

Linux进程通信机制及使用场景
进程通信机制 特点 使用场景
Domain socket与消息机制 Domain socket与消息机制都可以用来进程之间传递消息,个人觉得两者在功能上没什么大区别,具体选用哪种方式看个人习惯 适合进程间传递控制消息
信号量与锁 信号量与锁都可以用来保护共享资源,实现对共享资源的原子操作 原子操作,保护共享资源
管道 管道的本质是文件,一个进程在文件的一端写,另一个进程在文件的另一端读 适合大量数据传输
共享内存 共享内存的本质是将同一块物理内存映射到不同进程的地址空间,所以对共享内存的访问性能极高,但是共享内存不考虑冲突以及竞争的问题,所以可能需要和其他通信机制比如锁结合使用 适合低延时场景,例如需要直接操作显存的场景
信号 信号也是进程间常用的通信方式,但是信号经常被用于内核与进程通信,或者管理员通过系统命令管理进程的场景。在应用开发中以上列举的几种方式已经足够,一般不需要使用信号。常用的信号有SIGKILL,SIGCHLD,SIGALRM,SIGINT 内核与进程通信,或者管理员通过系统命令管理进程的场景
     

3.Linux进程的堆和栈
运行 cat /proc/[pid]/maps 我们可以看到每个进程的内存空间,其中栈空间是在高地址,堆空间是在低地址,有趣的是栈地址是从高地址向低地址生长,堆地址是从低地址向高地址生长,为什么会这样呢?首先这是平台相关的,有的平台是反过来的,堆从高地址向低地址生长,栈从从低地址向高地址生长;其次,不管在什么平台堆和栈都是从内存的两头向中间生长,这么做的目的是为了有效地利用内存,如果不这么做的话堆和栈有可能会overlap。具体参考下文:
https://stackoverflow.com/questions/4560720/why-does-the-stack-address-grow-towards-decreasing-memory-addresses
4.Linux的文件锁有Mandatory和Advisory两种模式,两种有何区别?使用场景是什么?
Advisory lock比较特别,linux并不会真正对被Advisory lock锁住的文件加锁。但只要相关的各个进程遵守Advisory lock,那么文件依然可以在这些进程之间被Advisory lock保护。不过,除了这些遵守Advisory lock以外的其他进程依然可以无视Advisory lock,随意访问和修改文件。所以,Advisory lock其实是一种进程间的“君子协议”,遵守这个协议的进程就能在锁的保护下访问文件。
Mandatory lock由内核强制执行,一旦文件被锁所有其他进程都不能访问,这种锁类似windows下的文件锁。但是这种锁可能导致很多非常难解决的竞争问题。linux对Mandatory lock的支持很有限,并且这个feature很可能在未来的linux版本中被移除。所以Linux建议开发者使用Advisory lock。更多细节参考:
https://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt
http://man7.org/linux/man-pages/man2/fcntl.2.html
 

猜你喜欢

转载自blog.csdn.net/tassardge/article/details/85019232