Chinaunix首页 | 论坛 | 博客
  • 博客访问: 124904
  • 博文数量: 28
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 396
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-16 19:17
个人简介

永远年轻,永远热泪盈眶!

文章分类
文章存档

2016年(6)

2015年(3)

2014年(19)

我的朋友

分类: LINUX

2014-08-16 20:08:29

一、进程

1.什么是进程    驻留内存,

    执行的程序:代码->资源(内存,文件)->CPU

    进程有很多数据维护:进程状态/进程的属性

    所有进程属性采用的结构体维护->树性数据结构

        ps 察看进程常见属性

        top 察看系统进程执行状况

        pstree(ptree)

        kill 向进程发送信号

        kill  -s 信号 进程id

        kill -l 显示进程能接受的所有信号

    知道进程有很多属性:ps可以察看的属性

                #ulimit -a

2.创建进程        (后两项由系统配置)

    1.代码?加载到内存?分配CPU时间片?

        代码由独立的程序存在.

    2.进程有关的创建函数

        int system(const char*filename);

            建立独立进程,拥有独立的代码空间,内存空间

            等待新的进程执行完毕,system才返回.(阻塞)

                新进程的返回值与system返回值有关系。

                任何进程的返回值:不要超过255。一个字节。

            system的返回值中8-15存放返回码


      子进程:被创建进程。

      父进程:相对被创建者的进程。

        popen:创建子进程

            在父子进程之间建立一个管道

  

        exec系列函数:

            execl   execlp 

        替换当前进程的代码空间中的代码数据

        函数本身不创建新的进程。

        int  execl(const char*path,const char *arg,....);

            第一个参数:替换的程序,

            第二个参数....:命令行

        命令行格式:命令名  选项参数

        命令行结尾必须空字符串结尾


        体会:是否创建新的进程?没有

        体会execl的参数的命令行的格式

     体会execlexeclp的区别(execl认识当前路径)

         execlp 使用系统的搜索路径

         体会execl替换当前进程的代码

        fork

            pid_t  fork();

        //1.(是否)创建进程,YES

        //2.新进程的代码是什么:克隆父进程的代码

             而且克隆了执行的位置.

        //3.在子进程不调用fork所以返回值=0;

        //4.父子进程同时执行.

 

3.应用进程

        使用fork创建新的进程有什么应用价值呢?

        使用fork实现多任务.(Unix系统本身是不支持线程)

            1.进程

            2.线程

            3.信号

            4.异步

            5.进程池与线程池


    1.父子进程的关系

        独立的两个进程

        互为父子关系

     2.问题:

         2.1.父进程先结束?

           子进程就依托根进程init:孤儿进程

           孤儿进程没有任何危害.  

         2.2.子进程先结束?

             子进程会成为僵死进程.

             僵死进程不占用内存,CPU.但在进程任务管理树占用一个节点.

             僵死进程造成进程名额资源浪费(太多会影响新进程的创建,有名额           

                          限制).  所以父进程中要处理僵死进程.

    3.僵死进程使用wait回收。

    4.父进程怎么知道子进程退出?

            子进程结束通常会向父进程发送一个信号:SIGCHLD

    5.父进程处理子进程退出信号

            signal(int sig,void(*fun)(int));

        向系统注册:只要sig信号发生,系统停止进程,并调用函数fun

        当函数执行完毕,继续原来进程   软中断

        5.1.实现处理函数

        5.2.使用signal邦定信号与函数(父进程中注册)  


    6.父子进程的资源访问  (很重要)

        6.1.内存资源

        6.2.文件资源


    说明:子进程克隆整个内存区域,

    (虚拟地址一样)但内存区域指向不同的物理空间

    尽管克隆,但内存(内存资源)独立。不能相互访问.

    (子进程的数据空间,堆栈空间都会从父进程得到一份拷贝,映射到不同的物理内存)

    多进程实现多任务,进程之间的数据交换是大问题.(IPC)

    Inter-Process Commucation

                    映射内存(mmap): (父子进程之间)

    MAP_SHARED:映射到同一物理内存(可实现数据交换)

    MAP_PRIVATE:映射到不同的物理内存(私有不行).


    结论:

    进程的数据交换,基于两种方式

    (共享)内存:有序/无序:mmap

     文件:有序(管道,socket)/无序:普通文件

          (本质)基于(同一)内核对象:文件.内存.队列

        (每个进程维护一个文件描述符表)


阅读(1292) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~