Linux进程

1.进程的概念

	1.程序:是一段存放在外存中代码的集合(静态的)
    2.进程:是一个程序动态执行的过程,包括创建、调度、消亡(动态的)

程序 ----加载到内存去运行— 进程
进程是 程序运行的实体
进程运行需要消耗两个主要资源:
cpu+内存

进程和程序的区别(5点)

1)程序是永存,进程是暂时的
2)进程有程序状态的变化,程序没有
3)进程可以并发,程序无并发
4)进程与进程会存在竞争计算机的资源
5)一个程序可以运行多次,变成多个进程
一个进程可以运行一个或多个程序

2.进程的创建

进程创建后,操作系统为进程分配独立的0-4G虚拟空间
进程是 操作系统资源分配的 最小单位。

进程创建后的空间

进程空间包括:

1.文本区(.text)
		存储代码和指令
	
2.数据区
		(1)字符串常量区(只读常量区)
			.rodata 
		(2)未初始化静态变量/全局变量(bss段)
			.bss
		(3)已初始化静态变量/全局变量(数据段)
			.data
	
3.系统数据段
		
		(1)堆区(手动管理)
			程序员手动管理区域
			程序员负责申请(malloc)释放(free)
		(2)栈区(1.局部变量 2.函数的形参和返回值 3.函数调用保护现场)
			操作系统管理区域
			操作系统负责申请释放
						
	4.内核区域
	    (1)CPU管理
		(2)内存管理
		(3)文件系统管理
		(4)硬件设备管理
		(5)进程管理

在这里插入图片描述

3.进程的调度(进程执行)

保障多个任务能同时执行

	宏观并行
		多个任务同时向下执行
	微观串行
		CPU在多个任务中快速切换,保障多个任务同时向下执行

	
进程调度算法(由CPU自己管理):
	1.先来先执行,后来后执行
	2.短作业优先
	3.高优先级调度算法
	4.时间片轮转调度算法(时间片轮训)


	
	时间片:CPU在一个任务中执行的一段时间

	PCB块(进程控制块): 一个结构体, process control block
	
	PCB块保存内容:
	1.PID,进程标识符
	2.当前工作路径
	3.进程打开的文件列表,文件描述符
	4.进程状态,优先级等
	5.cpu调度现场信息保护等

4.进程的状态

1.运行态(用户运行态、内核运行态) 	R
  正在执行,且被CPU任务调度所执行的进程
	
2.就绪态	R
  正在执行,没有CPU任务调度执行的进程(只缺少cpu)
	
3.可唤醒等待态	S
  也称为睡眠态,阻塞等待资源的进程
	
4.不可唤醒等待态 D
  不想被CPU任务调度所打断的进程任务可以设置为不可唤醒等待态
	
5.暂停态	T
  被暂停执行的进程
	
6.僵尸态    Z
  进程执行结束,空间没有被回收
	
7.结束态    X
  进程执行结束,空间被回收

5.进程相关命令

1.ps -aux    查看进程状态
2.ps -aux|grep a.out 查看指定进程状态
3.ps -ef 查看当前时刻进程信息
  PID:进程的ID号(唯一)
  PPID:父进程的ID号
4.pstree   查看进程关系
  pstree -p  查看所有进程关系及pid号
  pstree -sp +进程ID号    查看某一进程关系
  kill 、killall  给进程发送一个信号
5.kill -9 + 进程PID
  kill -9 +进程名
  kill -l   查看信号
1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
		 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
		11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
		16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
		21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
		26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
		31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
		38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
		43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
		48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
		53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
		58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
		63) SIGRTMAX-1	64) SIGRTMAX
6.jobs         查看当前终端下的后台执行任务
7.fg 编号      让一个后台执行的任务放到前台执行

6.进程创建关系

父子进程:
		父进程:创建新进程的进程称为新进程的父进程
		子进程:被创建的进程称为原进程的子进程
	内核进程
	systemd进程(1)
	所有进程任务

7.进程相关接口

1. fork(一次调用,会返回两次)
   pid_t fork(void);
   子进程先运行还是父进程先运行,顺序不确定。变量不共享
   子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同
   
功能 :
   	  1.通过该函数可以从当前进程中克隆一个同名新进程。
	  2.克隆的进程称为子进程,原有的进程称为 父进程。
	  3.子进程是父进程的完全拷贝。
	  4.子进程的执行过程是从fork函数之后执行
	  
参数: 
	  缺省
返回值:
	  失败:-1 
	  成功:
	  	  父进程:返回子进程的PID
	      子进程:返回0
2.getpid
  pid_t getpid(void);
  
功能:   获得调用该函数进程的pid		
参数:    缺省	
返回值:  进程的pid

3.getppid 
  pid_t getppid(void);
 功能:    获得调用该函数进程的父进程pid号
 参数:    缺省
 返回值:  返回父进程id号	

8.进程的消亡

1.exit(C库函数)
  void exit(int status);
功能:   进程结束 
参数:   进程结束的状态
	    0   EXIT_SUCCESS
	    1   EXIT_FAILURE
返回值:  程序结束没有返回
注:
     1. C库函数,结束之前会清理IO缓冲区
	 2.关闭所有的流及打开的文件
	 3.执行注册的退出清理函数
2._exit
  void _exit(int status);
功能:   进程结束 
参数:   进程结束的状态
返回值: 程序结束没有返回
注:
	1.系统调用,结束之前不会清理缓冲区。
	2.关闭所有打开的流和文件
	3.不执行注册的退出清理函数
3._Exit
  void _Exit(int status);
功能:   进程结束 
参数:   进程结束的状态
返回值: 程序结束没有返回
注:
	1.系统调用,结束之前不会清理缓冲区。
	2.关闭所有打开的流和文件
	3.不执行注册的退出清理函数 
4.atexit
  int atexit(void (*function)(void));
功能:  注册一个进程退出前执行的函数(一般做清理工作)
参数:  function: 函数指针 
返回值:
	   成功返回0
	   失败返回-1 
	
注:   exit()和主函数return之前会调用。

9.进程的回收

1.wait
  pid_t wait(int *wstatus);
功能:    回收子进程空间
参数:    status:   存放子进程结束状态空间首地址
返回值:
	    成功:返回回收到子进程的PID
	    失败:返回-1 
调用wait会有 阻塞等待 

WIFEXITED(status):   检测进程是否正常结束
WEXITSTATUS(status): 获得进程结束时返回的值
WIFSIGNALED(status): 检测进程是否被信号杀死
WTERMSIG(status):    获得杀死进程的信号编号

2.waitpid
  pid_t waitpid(pid_t pid, int *wstatus, int options);
  
功能:回收指定进程的资源
      和wait功能相似,比wait更灵活
参数:pid:
	  <-1 回收指定进程组内的任意子进程 (-100.等待GID=100的进程组中的任意子进程)
	  -1 回收任意子进程,组内外
	  0 回收和当前调用waitpid一个组的所有子进程,组内 
	  > 0 回收指定ID的子进程

wstatus: 子进程退出时候的状态,
  		 如果不关注退出状态用NULL;
options 选项:
  		     0  表示回收过程会阻塞等待
		     WNOHANG 表示非阻塞模式回收资源。
返回值:
	    成功: 返回接收资源的子进程pid
		失败: -1
		设定为非阻塞且没有回收到子进程返回0
		   
	waitpid(0,&status,0)   //默认阻塞  ==wait(&status);
	waitpid(0,&status,WNOHANG); // 非阻塞方式
3.execl
       int execl(const char *path, const char *arg, ...(char*)NULL);
参数:
     path:指向新程序文件的路径名的指针
     arg:传递给新程序的实际参数
     (char*)NULL:标志参数列表的结束。
返回值:
      成功:不会返回
      失败:返回 -1  (并设置 errno 来指示具体的错误原因)

4.execv(v:容器)
       int execv(const char *path, char * argv[]);
 参数:
     path:指定要执行的程序的路径。该路径可以是绝对路径或相对路径
     argv:是一个指向字符指针数组的指针,每个字符指针指向一个命令行参数。(数组的第一个元素 argv[0] 通常是要执行的程序的名称),(数组的最后一个元素必须是 NULL 以标识参数列表的结束)

返回值:
 成功:不会返回
 失败:返回 -1(并设置 errno 以指示错误的类型)
5.execlp(p:环境变量存储的路径)
int execlp(const char *file, const char *arg0,const char *arg1,...const char *argn, /* (char  *) NULL */);
参数:
file:
      要执行的程序的文件名或者路径名。如果filename中不包含路径分隔符(例如/),execlp会在PATH环境变量中搜索与filename匹配的可执行文件
arg1 ,arg2 ,..., argn:
                     分别是要传递给新程序的命令行参数。其中 arg0 是新程序的名称,后续参数依次是传递给新程序的命令行参数。
char(*)NULL:
            标志参数列表的结束
返回值:
		成功:不会返回
		失败:返回 -1(并设置 errno 来指示错误的类型)
6.execvp(p:环境变量存储的路径)(v:容器)
int execvp(const char *file, char *const argv[]);
参数:
    file:
    要执行的程序的文件名或路径名。如果filename中不包含路径分隔符(例如/),execvp会在PATH环境变量中搜索与filename匹配的可执行文件
    argv:是一个指向字符指针数组的指针,每个字符指针指向一个命令行参数。数组的第一个元素 argv[0] 通常是要执行的程序的名称,数组的最后一个元素必须是 NULL 以标识参数列表的结束
返回值:
      成功:不会返回
	  失败:返回 -1(并设置 errno 来指示错误的类型)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值