• Linux进程控制理论及几种常见进程间通信机制


    1. Linux进程控制理论

    ① 进程是一个具有一定独立功能的程序的一次运行活动(动态性、并发性、独立性、异步性)。

      进程的四要素:

      (1)有一段程序供其执行(不一定是一个进程所专有的),就像一场戏必须有自己的剧本。
           (2)有自己的专用系统堆栈空间(私有财产)
           (3)有进程控制块(task_struct)(“有身份证,PID”)
           (4)有独立的存储空间。

      缺少第四条的称为线程,如果完全没有用户空间称为内核线程,共享用户空间的称为用户线程

    ② 经典进程三态:阻塞、就绪、执行

    备注:在同一时刻CUP运行的只有一个进程

    ③ 进程ID(PID):标识进程的唯一数字;父进程ID(PPID);启动进程的用户ID(UID)

    ④ 进程互斥:当有若干进程都要使用某一共享资源时,任何时候最多允许一个进程使用,其它要使用该资源的进程必须等待,知道占用该资源的进程释放了该资源为止

    ⑤ 临界资源:操作系统中将一次只允许一个进程访问的资源称为临界资源

    ⑥ 临界区:进程中访问临界资源的那段代码称为临界区。为实现对临界资源的互斥访问,应保证诸进程互斥的进入各自的临界区

    ⑦ 进程同步:一组并发进程按一定顺序执行的过程称为进程间的同步

    ⑧ 进程调度:按一定算法,从一组待运行的进程中选出一个来占有CPU运行

    (1)调度方式:抢占式(A正在运行,B就绪,B优先级高,直接运行B)和非抢占式(A正在运行,B就绪,B优先级高,等A运行完再运行B)

    (2)调度算法:先来先服务, 短进程优先, 高优先级优先,时间片轮转

    ⑨ 死锁:多个进程因竞争临界资源而形成的一种僵局

    ⑩ 获取ID

      pid_t getpid(void);  //获取本进程ID

      pid_t getppid(void);  //获取父进程ID

    ⑪ 进程创建:

      pid_t fork(void);  //创建子进程

      fork被调用一次,却返回两次,他可能有三种不同的返回值

      (1)在父进程中,fork返回新创建的子进程的PID

      (2)在子进程中,fork返回0

      (3)如果出现错误,fork返回一个负值

      注:fork后的代码由两个进程运行,即两个进程共享一段代码,但会拷贝一份数据,即子进程的数据空间、堆栈空间都会从父进程得到一份拷贝,而不是共享

    ⑫ 进程创建的另一个函数:

      pid_t vfork(void)

    ⑬ exec函数族:用被执行的程序替换调用它的程序

    ⑭system函数:运行一条命令

    (1)system原型:int system(const char* command);

    (2)system简单实现:

    int system(const char * cmdstring)
    {
        pid_t pid;
        int status;
        
        if(cmdstring == NULL)
        {
            return (1); //如果cmdstring为空,返回非零值,一般为1
        }
        
        if((pid = fork()) < 0)
        {
            status = -1; //fork失败,返回-1
        }
        else if(pid == 0)
        {
            execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
            _exit(127); // exec执行失败返回127,注意exec只在失败时才返回现在的进程,成功的话现在的进程就不存在啦~~
        }
        else //父进程
        {
            while(waitpid(pid, &status, 0) < 0)
            {
                if(errno != EINTR)
                {
                    status = -1; //如果waitpid被信号中断,则返回-1
                    break;
                }
            }
        }
        
        return status; //如果waitpid成功,则返回子进程的返回状态
    }

    ⑮进程等待

      (1)pid_t wait(int* status);

      (2)pid_t waitpid((pid_t pid, int * status, int options);

    2. Linux进程间通讯(无名管道和有名管道、信号、消息队列、共享内存、信号量、套接字)

  • 相关阅读:
    Shell使用
    从一道面试题谈linux下fork的运行机制
    老了,问题定位难了,xml编码解析
    javacc
    C++概述
    Notepad++中设置Windows、Unix、Mac三种行尾换行符格式间的转换
    玩转html5(一)-----盘点html5新增的那些酷酷的input类型和属性
    Java Drp项目实战—— 环境搭建
    cocos2d-x游戏开发 跑酷(八) 对象管理 碰撞检測
    电话拨号盘(带触摸振动反馈)
  • 原文地址:https://www.cnblogs.com/wulei0630/p/9480474.html
Copyright © 2020-2023  润新知