进程

来源:互联网 发布:寻艺电视剧网络播放量 编辑:程序博客网 时间:2024/05/21 14:54
一.操作系统
     1.操作系统是应用程序和硬件之间的插入的一层软件,所有应用程序对硬件的操作都要通过操作系统。任何计算机都包含一个基本的程序集合,称为操作系统
    2. 内核: 是操作系统最基本的部分,主要负责管理系统资源( 通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及IO设备
     3.操作系统的目的是与硬件交互,管理所有的硬件资源,同时为用户程序(应用)提供良好的执行环境
     4.Linux操作系统


二、进程
     进程是操作系统对一个正在运行的程序的一种抽象,担当分配系统资源(cpu时间、内存)的实体
     进程的两个基本元素时程序代码(可能被执行相同程序的其他进程共享)和代码相关联的数据集,进程是一种动态描述。(进程在内存中因一些策略或者调度需求,处于各种状态)
    
     1.进程的描述
     广义上,所有进程的信息被放在一个叫做进程控制块(pcb)的数据结构中,可以理解为进程属性的集合。
     
     2.进程控制块
     每个进程在内核中都有一个进程控制块(PCB)来维护进程相关信息。在Linux内核的进程控制块是task_struct结构体
        ①task_struct是什么
          task_struct是 Linux的一种数据结构,它被装载到RAM里并包含进程的信息,每个进程都把它的信息放到task_struct里。
        ②task_struct包含什么
          标识符:描述一个进程的唯一标识符,用来区别其他进程
          状态:任务状态,退出代码,退出信号等
          优先级:相对于其他进程的优先级
          程序计数器:程序中即将被执行的下一条指令的地址
          内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块指针(持找到被切出去的线程 )
          上下文数据:进程执行时处理器的寄存器中的数据(保存切换的线程信息 )
          I/O状态信息:包括显示I/O请求,分配给进程I/O设备和进程使用的文件列表
          记账信息:包括处理器的时间总和,使用时钟数总和,时间限制,记账号等
    
     应用程序就是二进制文件,进程将程序加载到内存,操作系统为该进程分配整套数据结构,所有运行的在操作系统里的进程都以task_struct链表的形式存在内核里

     3.进程标示符
     进程id(PID)
     父进程id(PPID )
     
     4.进程位置
     1.进程内存映像
          Linux下的C程序生成主要分为四个步骤组成
          预编译-->编译-->汇编-->链接
          编译器gcc经过预编译、编译。汇编3个步骤将源程序文件转换成目标文件,如果程序有多个目标文件或者程序中使用了库函数,则编译器还需要将所有的目标文件以及库文件连接起来,最后生成可执行文件。
          程序转为进程通常需要以下步骤
          *内核为该进程分配进程标识符PID以及其他所需资源
          *内核将程序读入内存,将程序分配内存空间
          *内核为该程序保存PID自己相应的状态信息,把进程放到运行队列中等待执行,程序转化为进程之后就可以被操作系统的跳读程序执行
          
     内存映像是指内核在内存中如何存放可执行程序文件。将程序转化为进程的过程中,操作系统将可执行程序从硬盘复制到内存中
     进程内存布局分为四个不同的段
     *文本段,包含程序源指令,是共享和只读的
     *数据段,包含静态变量,在程序开始执行前,内核将此段中的数据初始化为0或空指针
     *堆,动态开辟的空间
     *栈,动态增长与收缩的段,保存本地变量
     

     2.进程映像的位置依赖于使用的内存管理方案
     3.可执行程序与进程内存映像的不同之处
        a.可执行程序位于磁盘而内存映像位于内存
        b.可执行程序没有堆栈,因为程序被加载到内存中才会分配堆栈
        c.可执行程序虽然也有未初始化数据段但它并不被存储位于磁盘中可执行文件中
        d.可执行程序时静态的,不变的,而内在映像随着程序的执行时动态变化的,比如数据段随着程序的执行要存储新的变量值,栈在函数调用时也是不断变化的
    
      5环境变量
     环境变量是一组字符串,如下图
     
     libc中定义的全局变量environ指向环境变量表,environ中没有包含任何头文件,所以在使用时用extern声明。
     父进程的环境变量和shell环境变量是相同的,父进程在调用fork创建子进程时会把自己的环境变量也复制给子进程

     6.进程状态
     R(running)     运行,表明进程要么是在运行中要么是在运行队列里
     S(sleeping)     睡眠,表明进程在等待事件完成(是可中断睡眠)
     D(disk sleep)  不可中断睡眠,磁盘休眠状态,这个状态的进程通常需要等IO的结束
     T(stopped)     停止,可以通过发送SIGSTOP来停止进程,这个进程可以通过发送SIGCONT信号让进程来继续运行
          kill -SIGSTOP<pid>
          kll -SIGCONT<pid>

     t(tracing stop)
     X(dead)       死亡状态,是内核运行的do_exit()函数返回状态,这个状态仅是一个返回状态,不会再任务列表里看到这个状态
     Z(zomie)     僵尸进程状态,当进程在父进程没有使用wait()或waitip系统调用,没有读取到子进程退出的返回代码时会产生僵尸状态,僵尸进程会终止状态保持在进程表中,若父进程一直存在儿不调用wait,该僵尸进程无法回收,等到父进程退出后进程被init回收
          让其他进程获取到这个进程结束的原因,这个僵尸进程是进程已经不在了代码不再执行,不过pcb还在(保存状态及原因)
     
     7.进程优先级
     进程cpu资源分配即进程优先级,优先级高的进程有优先执行的权利,配置进程优先权对多任务环境Linux十分重要,可以改善系统性能,还可以把进程运行到指定的cpu上,这样,把不重要的进程安排到某个cpu上,可以大大改善整体性能
     
     UID:代表执行者身份
     PID:代表进程代号
     PPID:这个进程是由哪个进程发展衍生来的,即父进程代号
     PRI:这个进程可被执行的优先级,其值越小越早被执行
     NI:代表进程的nice值,表示进程可被执行的优先级的修正数值,加入nice值后,PRI(new)=PRI+nice,这样,当nice值为负值时,程序的优先级值变小,优先级变高,越快被执行
        1.进程优先级修改  nice和renice修改
          ①一开始执行程序就指定nice值
          nice -n -5 ./test
          ②调整已存在进程的nice:renice
          renice -5 -p 5200    将PID为5200的进程nice值设为-5
          ③用top命令更改以存在进程的nice
          top
          #进入top后按 r -->输入进程PID-->输入nice值
ps:
     权限:权限不同于优先级,优先级表示获取资源的能力大小,而资源表示有没有获取资源的能力
          getlimit和setlimit函数用于获取或设置进程的资源限制,资源限制通常是由进程0建立的,有每个后序进程继承,更改资源限制时,注意
          ①进程的软限制值只能小于或等于硬限制值
          ②任意进程都可以降低其硬件限制值,但是它必须大于或等于其软限制值,这种操作对于普通用户是不可逆的
          ③只有超级用户进程可以提高硬限制值
     8.创建进程
     创建一个进程有两种方法,fork()和execve(),它们都是系统调用,但是运行方式不同
        ①fork():要创建一个子进程可以执行fork()系统调用,然后子进程得到父进程的数据段、栈段和堆区的一份拷贝,子进程可以修改这些内存段,但是文本段是子进程和父进程共享的内存段,不能被子进程修改,创建成功子进程返回1,父进程返回子进程PID,创建失败返回-1
        ②execve():创建一个新进程,这个系统调用会销毁所有的内存段去重新创建一个新的内存段。execve()需要一个可执行文件或者脚本作为参数。
          fork和execve创建的进程都是运行进程的子进程

          孤儿进程:一个父进程退出,然而它的一个或多个子进程还在运行,那么这个子进程将成为孤儿进程,孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作
    
     9.进程终止
     进程终止有8种,
     1.main函数返回,return
     在除了main函数以外的函数不表示进程退出,当main函数调用return表示进程退出
     2,exit
     _exit和_Exit可以立即进入内核,exit需要先做一些清理(调用执行各终止处理程序,关闭所有标准IO流),再进入内核,三个函数所带的整形参数称为终止状态或退出状态,如果:①调用这些函数不带参数②main函数中的return语句无返回值③main函数没有申明返回类型为整形,则进程终止状态是未定义的。main函数返回一个整形值与该值调用exit是等价的
     3.atexit--->进程退出时调用
0 0
原创粉丝点击