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转而执行其它进程
运行状态
- 就绪状态:除了CPU资源外,其它资源都已经获取
- 等待状态:可中断状态;不可中断
- 停止状态
- 僵死状态:用户资源已经回收,PCB内核资源没有回收
##API应用##
fork/vfork
用户空间
实际执行的操作是将程序的代码段,数据段,BSS段从磁盘加载到内存,并且申请堆栈空间
内核空间
为这个进程分配唯一的PID标识,同时在内核中为这个进程申请进程控制块PCB,初始化相关信息,在运行中涉及打开的文件,关联的终端,安装信号状态等系列信息
父进程创建子进程,在子进程中,替换了原有进程的代码段和数据段,转而执行新代码.execl
进程退出
- kill -9(信号) pid
- 显示执行exit系列函数
- main函数体尾;exit是系统函数,退出这个进程;return 是C/C++关键字,退出函数
- getpid 获取当前进程号
##在进程中运行新代码##
- 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命令
##管道##
- 同主机进程间数据交互机制:无名管道(PIPE),有名管道(FIFO),消息队列(Message Queue),共享内存(share memory)
无名管道
- 循环队列的方式,应用程序只能使用系统调用来访问
- 单向的
- 读写管道使用的是read,write系统调用