理解Unix进程的笔记
Unix编程模型,能力越大,责任越大。web服务器-Spyglass,各种学到的概念。用户空间(userland)和内核。
通信通过系统调用(system call)完成。手册页: 1-命令,2-系统调用,3-C库函数,4-特殊文件。
Process.pid
Process.ppid # 检测守护进程
IO对象,文件描述符的特征,重定向的前提条件
文件描述符是套接字、管道等网络编程的核心所在,也是文件系统的核心所在。
系统调用: open, close, read, write, pipe, fsync, stat等。
Process.getrlimit(:NOFILE) #参数可变,:NPROC-用户允许的最大并发进程数,:FSIZE-最大文件数,:STACK-进程最大的段
个人机器: [1024, 4096] vs [2560, 9223372036854775807]。软限制和硬限制,系统级别的限制-sysctl调用
Process的getrlimit和setrlimit分别对应于getrlimit和setrlimit系统调用。环境变量是包含进程数据的键-值对(key-value pairs)。
VAR=value是bash设置环境变量的方法,可以在Ruby中通过ENV常量来实现,键值对是理解的关键。Ruby中ENV又不完全是Hash数组。
环境变量作为将输入传递命令行程序的通用方法,比命令行解析开销小。C库函数: setenv和getenv
参数: ARGV-参数向量。读取ARGV,解析命令行选项的库-optparse。
Unix程序-固有的方式了解彼此的状态。日志-文件系统,套接字-网络,运行在进程自身上的机制:进程名称,退出码(编码错误信息)。
$PROGRAM_NAME获取并设置当前进程的名称,Resque如何管理进程。
退出码为0表示进程顺利结束,exit和exit!: exit xxx会调用at_exit,abort提供了一种从错误进程中退出的通用方法,raise抛出异常,沿着调用栈向上传递,终结进程,调用at_exit。
衍生是Unix编程中的强大概念,fork多进程-不再是终端控制一切,孤儿进程:守护进程,长期运行的进程;脱离终端会话的进程进行通信。
fork进程:Copy on Write。MRI(GC使用mark-and-sweep算法,垃圾回收算法的问题)或者Rubinius不支持CoW。Ruby企业版(REE)。Ruby 2.0提供CoW友好的垃圾收集器。
fork-exec-wait:执行模型。
Process.wait-返回一个值(pid)和Process.wait2-返回两个值(pid和status)
等待特定的进程: Process.waitpid和Process.waitpid2
实际上,Process.wait和Process.waitpid同一事物的不同名称。
关注子进程是Unix编程模式的核心,看顾进程,master/worker或prefoking。看顾进程的核心: 存在一个衍生多个并发进程的进程,该进程看管这些进程,确保其保持响应,并对子进程的退出做出回应。
具体例子:Unicorn web服务器。Spyglass中的Lookout类。
优点: 兼顾了并发性和可靠性。
即发即弃:将已退出的进程状态信息加入队列,父进程通过Process.wait获取其信息。如果父进程一直不发送Process.wait请求,则浪费内核资源。
分离子进程:Process.detach(pid)生成线程,等待指定的哪个线程退出。确保内核不保留不需要的状态信息。
状态为z或Z+的进程表示僵尸进程-运行结束,但状态信息一直未能被读取。后台排队系统,spawn:通用的进程/线程API,确保正确的分离即发即弃的进程。
Process.detach(pid)通过线程和Process.wait实现。
Process.wait是阻塞调用: 直到子进程结束,调用才返回。繁忙的父进程,Unix信号。
信号的投递是不可靠的
,Process::WNOHANG参数,$stdout
信号是一种异步通信方式,从内核中接受信号时,执行如下的操作: 1.忽略信号 2.执行特定操作,3.执行默认操作
信号来自内核。
接触的Gem包:
- Resque是一个Redis支撑的用于创建后台任务并将其放置到多个队列中进行处理的Ruby库。 根据上面的这段描述,公司网站中使用Redis原因很清楚了。但是,疑问是,只有这点地方用到了Redis?
傲娇的使用Disqus