进程概述
一.linux进程
linux是一个多用户,多任务的操作系统.
多用户:多个用户可以在同一时间使用计算机;
多任务:linux可以同时同时执行几个任务,可以在还未执行完一个任务时又执行另一个任务.
进程:进程是一个动态的实体,是程序的一次执行过程.进程是操作系统资源分配的基本单位.简单的说,进程是运行中的程序
a.进程和程序的区别
1.进程是动态的,程序是静态的
2.进程是运行中的程序,程序是一些保存在硬盘上可执行的代码
b.线程
1.在进程内部划分了多个线程,线程是比进程更小的能独立运行的基本单位
2.线程基本上不用系统资源,它与同属一个进程的其他线程共享进程的全部进程拥有的全部资源。
3.进程在执行过程中拥有独立的内存单元,其内部的线程共享这些内存。
4.一个线程可以创建和撤销另一个线程,同一个进程中的多个线程可以并行执行。
linux下可以通过ps 或 pstree查看当前系统的进程。
c.进程标识
linux操作系统中,每个进程都是通过唯一的进程ID标识的。
进程ID是一个非负数。
获取进程各种标识符的函数表
d. linux进程的结构
3个部分:
代码段:存放程序的可执行代码
数据段:存放程序的全局变量,常量,静态变量.
堆栈段:1.堆用于存放动态分配的内存变量
2.栈用于函数调用,存放着函数的参数,函数内部定义的局部变量
e.linux运行状态
1.运行状态:R(runnable) 进程正在运行或在运行队列中等待运行
2.可中断等待状态:S(sleep) 进程正在等待某个事件完成,等待过程中可以被信号或定时器唤醒
3.不可中断等待状态:D(uninterruptible) 进程也在等待某个事件完成,在等待中不可以被信号或定时器唤醒,必须等待直到等待的事件发生
4.僵死状态:Z(zombile) 进程已终止,但进程描述符依然存在,直到父进程调用wait()函数后释放
5.停止状态:T(traced or stopped) 进程因为收到SIGSTOP , SIGSTP , SIGSTP , SIGTIN , SIGTOU 信号后停止运行或者该进程正在被跟踪(调试程序时,进程处于被跟踪状态)
二. 进程控制
1.主要系统调用
>fork: 用于创建一个新进程
>exit: 用于终止进程
>exec: 用于执行一个应用程序
>wait: 将父进程挂起,等待子进程终止
>getpid: 获取当前进程的进程ID
>nice: 改变进程的优先级
三.进程的内存映像
1.linux下C程序的生成分为:预编译,编译,汇编,链接
2.程序转化为进程:
内核将程序读入内存,为程序分配内存空间
内核为该程序分配进程描述符(PID)和其他所需资源
内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行.程序转化为进程后就可以被操作系统的调度程序调度执行了
3.进程的内存映像
进程的内存映像是指内核在内存中如何存放可执行程序完文件,操作系统将可执行程序由硬盘复制到内存中
linux下程序映像的一般布局
从内存的低地址到高地址依次如下:
>代码段:即二进制机器代码,代码段是只读的,可被多个进程共享
>数据段:存储已被初始化的变量,包括全局变量和已被初始化的静态变量
>未被初始化数据段:存储未被初始化的静态变量,它也被称为bss段
>堆:用于存放程序运行中动态分配的变量
>栈:用于函数调用,保存函数的返回地址,函数的参数,函数内部定义的局部变量
另外,高地址还存储了命令行参数和环境变量
4.可执行程序和内存映像的区别:
>1.可执行程序位于磁盘中,内存映像位于内存中
>2.可执行程序没有堆栈,因为程序被加载到内存中才会分配堆栈
>3.可执行程序虽然也有未初始化数据段但他并不被储存在位于磁盘中的可执行文件中
>4.可执行程序是静态的,不变的,而内存映像随着程序的执行是在动态变化的