理解Unix进程

来源:互联网 发布:java if语句中并列条件 编辑:程序博客网 时间:2024/05/22 03:31
1)进程:Unix之本 
    所有代码都是在进程中执行的,像邮件客户端,QQ,浏览器等。

2)进程皆有标识
    所有进程都有一个自己唯一的标示符(pid),对内核来说它仅仅是个数字而已,不提供进程的任何信息。PID可用来与操作系统之间进行信息的交叉参考,例如日志文件中的pid。

3)进程皆有父
    每个进程都有对应的父进程(ppid),万物皆为进程,进程之间衍生就像“鸡生蛋,蛋生鸡”的模式。ppid在检测守护进程时有用。

4)进程皆有文件描述符
   文件描述符代表打开的文件,就像pid代表运行的进程一样,万物皆为文件,包括设备、套接字、管道等。描述符代表资源,当衍生出一个子进程时,文件描述符之间资源共享。每个进程都有三个打开的资源:标准输入(STDIN)、标准输出(STDOUT)、标准错误(STDERR)。

5)进程皆有资源限制
   文件描述符代表打开的资源,资源未关闭时,文件描述符一直处于递增状态,所以内核为进程施加了某些资源限制,一般情况下不需要修改。

6)进程皆有环境
   所有进程都从其父进程处继承环境变量。环境变量对于特定进程而言是全局性的,经常作为一种将输入传递到命令行程序中的通用方法。

7)进程皆有参数
   所有进程都可以访问名为ARGV的特殊数组,它是一个参数向量或数组,保存了命令行中传递给当前进程的参数。

8)进程皆有名
   系统中每一个进程都有名称,可以在变量$PROGRAM_NAME中获得当前进程的名称,并可通过其修改名称。

9)进程皆有退出码
   退出码为0的进程被认为是顺利结束,它其实也是一种通信途径。

10)进程皆可衍生
    调用fork的进程称为父进程,新创建的进程称为子进程,子进程继承父进程所占用内存中的所有内容。

11)孤儿进程
    弃子:父进程结束后,子进程安然无恙,涉及到守护进程和脱离终端会话的进程。

12)友好的进程
    写时复制(CoW):将实际的内存复制操作推迟到真正需要写入的时候。

13)进程可待
   有一个衍生出多个并发子进程的进程,这个进程看管着子进程,确保他们能够保持响应,并对子进程的退出做出回应,等等。

14)僵尸进程
   等待终有果:内核会将已退出的子进程的状态信息加入队列,所以即便子进程退出很久后父进程才响应Process.wait,依然可以获取它的状态信息。
  任何已经结束的进程,如果她的状态信息一直未能被读取,那么他就是一个僵尸进程。

15)进程皆可获得信号
   捕获SIGCHLD:内核会提醒父进程它的子进程何时退出。
  并发:信号投递是不可靠的,同一个信号在极短的时间内可能被多次接收到,就会出现子进程结束而父进程不知。
   信号来自何方:信号是由一个进程发送到另一个进程,借用内核作为中介。
   捕获一个信号有点像使用一个全局变量,可能把其他代码依赖的东西修改了。进程可在任何时候接受信号,它们是异步的。kill可用来发送信号。

16)进程皆可互通
   管道:是一个单向数据流,打开一个管道,一个进程拥有管道的一端,另一个进程拥有另一端。读写异步,写时读关闭,读时写关闭。共享管道:无名管道(父子进程)和命名管道(非父子进程)。
   流和消息的区别:流(无开始和结束的概念,使用分隔符),消息(使用数据报通信)。
   Unix套接字:双向通信,用于在同一台物理主机中进行通信的套接字,比TCP套接字快很多,适合于IPC。
   远程IPC:可使用TCP套接字实现,也可远程过程调用。

   系统中任意两个进程皆可互通,通过为进程命名,可以同任何在命令行中查看你的程序的用户进行通信。还可以使用退出码给所有期待运行结果的进程发送成功?失败的消息。

17)守护进程
   Web服务器或数据库服务器属于常见的守护进程,一直在后台运行响应请求,不受终端用户控制。
   首个进程:当内核被引导时,产生一个叫init的进程,ppid=0,pid=1;
   逐步将进程变为守护进程:exit if fork;
   进程组:每一个进程都属于某个组,每一个组都有唯一的整数ID,进程组是一个相关进程的集合,通常是父进程与其子进程。终端接收信号,并将其转发给前台进程组中的所有进程。
    会话组:它是进程组的抽象。终端只能够分配给会话领导。
    创建守护进程之前考虑此进程需要一直保持响应吗?如果答案为否,则可考虑后台作业系统或定时任务。否则守护进程是个很好的选择。

18)生成终端进程
    fork+exec:fork创建一个新进程,然后用exec把这个进程变成其他想要的进程。

   


    
    
0 0
原创粉丝点击