LinuxProcess - juedaiyuer/researchNote GitHub Wiki

#Linux高级程序设计-进程#

  • 资源管理基本单元,执行的代码段

  • 一个进程可以创建多个进程,一个进程可以执行多个代码段

  • 程序在磁盘上,而一个进程是加载到内存执行的程序段,有生命周期,创建,执行,退出,等待

  • task_struct 结构体维护进程的资源,kernel

  • volatile long state 状态

  • struct mm_struct *mm 与存储相关,描述了在用户空间中,代码段,数据段,堆栈,mmap等涉及到的所有内存信息

  • struct files_struct* files 打开文件列表 ; 成员struct fils* fd_array[NR_OPEN_DEFAULT] 文件描述符列表

-ps aux | less

  • 读写的速率限制,CPU造成了大量的空闲,让cpu在各个执行单元中不停的跳转,当某个进程需要等待其它资源,CPU转而执行其它进程

运行状态

  1. 就绪状态:除了CPU资源外,其它资源都已经获取
  2. 等待状态:可中断状态;不可中断
  3. 停止状态
  4. 僵死状态:用户资源已经回收,PCB内核资源没有回收

##API应用##

fork/vfork

用户空间

实际执行的操作是将程序的代码段,数据段,BSS段从磁盘加载到内存,并且申请堆栈空间

内核空间

为这个进程分配唯一的PID标识,同时在内核中为这个进程申请进程控制块PCB,初始化相关信息,在运行中涉及打开的文件,关联的终端,安装信号状态等系列信息

父进程创建子进程,在子进程中,替换了原有进程的代码段和数据段,转而执行新代码.execl

进程退出

  1. kill -9(信号) pid
  2. 显示执行exit系列函数
  3. main函数体尾;exit是系统函数,退出这个进程;return 是C/C++关键字,退出函数
  • getpid 获取当前进程号

##在进程中运行新代码##

  1. execX 系列函数
  • 指示新程序的位置是使用路径还是文件名

  • 文件: $PATH环境变量所描述的路径中搜索该程序

  • 参数:[1]参数列表 ; [2]argv[]数据

    int execl(const char *path, const char *arg, ...); //最后一个参数必须是空指针 int execle(const char *path, const char *arg, ..., char * const envp[]); //最后一个参数必须指向一个新的环境变量 ...

##Linux特殊进程##

守护进程Daemon

  • Linux下的大多数服务器程序就是通过守护进程实现的,httpd
  • 启动脚本启动,/etc/rc.d
  • 利用inetd超级服务器启动,telnet
  • 由cron命令定时启动,终端nohup命令

##管道##

IPC

  • 同主机进程间数据交互机制:无名管道(PIPE),有名管道(FIFO),消息队列(Message Queue),共享内存(share memory)

无名管道

  • 循环队列的方式,应用程序只能使用系统调用来访问
  • 单向的
  • 读写管道使用的是read,write系统调用