zoukankan      html  css  js  c++  java
  • 11.进程控制理论

    11.进程控制理论

    进程:进程是一个具有一定独立功能的应用程序的运行。一个没有运行起来的程序不能叫做一个进程,只有运行起来的程序才会产生一个进程。

    进程的特点:

    1. 动态性
    2. 并发性
    3. 独立性
    4. 异步性

    进程的状态:

    当我们运行一个程序的时候,该程序就处于就绪状态。由于程序的运行需要资源,例如内存、硬盘的空间等。所以cpu会发出I/O请求。如果此时正有程序在运行,正在使用这些资源。就会得不到满足,会导致进程进入阻塞状态。当资源请求满足的时候,再次进入就绪状态。等待cpu的调度,在执行的过程中,如果一个进程在系统规定的一个时间片内没能执行完,他会再次进入就绪状态,再次等待cpu调度。如此循环,知道程序运行完。

    进程ID:

    进程的ID(PID):系统给每一个进程的唯一标识,是一个数字。

    父进程的ID(PPID)。

    启动进程的用户ID(UID)。

    进程的互斥:

    进程互斥是指当有若干进程都要使用某一资源时,但该资源在同一时刻最多允许一个进程使

    用,这时其他进程必须等待,直到占用该资源者释放了该资源为止。

    临界资源:

    在操作系统中,在某一时刻,只允许一个进程访问的资源叫临界资源。

    临界区:

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

    进程的同步:

    一组进程按一定的顺序执行的过程称为进程间的同步.具有同步关系的这组进程称为合作进程,最为有名的是生产者和消费者进程.

    进程的调度:

    按一定算法,从一组待运行的进程中选出一个来占有cpu运行。

    常见的调度算法:

    1. 先来先服务
    2. 短进程优先
    3. 高优先级优先
    4. 时间片轮转法

    调度的时机:

    1. 抢占式调度
    2. 非抢占式调度

    死锁:

    多个进程因竞争资源而形成一种僵局,导致这些进程都无法继续往前执行。

    下面我们来看获取进程的函数:

    获取进程ID的函数是:getpid。

    查看该函数的信息:man 2 getpid:

    NAME

    getpid, getppid - get process identification

    SYNOPSIS

    #include <sys/types.h>

    #include <unistd.h>

    pid_t getpid(void);

    pid_t getppid(void);

    DESCRIPTION

    getpid() returns the process ID of the calling process. (This is often

    used by routines that generate unique temporary filenames.)

    getppid() returns the process ID of the parent of the calling process.

    ERRORS

    These functions are always successful.

    CONFORMING TO

    POSIX.1-2001, 4.3BSD, SVr4.

    NOTES

    Since glibc version 2.3.4, the glibc wrapper function for getpid()

    caches PIDs, so as to avoid additional system calls when a process

    calls getpid() repeatedly. Normally this caching is invisible, but its

    correct operation relies on support in the wrapper functions for

    fork(2), vfork(2), and clone(2): if an application bypasses the glibc

    wrappers for these system calls by using syscall(2), then a call to

    getpid() in the child will return the wrong value (to be precise: it

    will return the PID of the parent process). See also clone(2) for dis-

    cussion of a case where getpid() may return the wrong value even when

    invoking clone(2) via the glibc wrapper function.

    SEE ALSO

    clone(2), fork(2), kill(2), exec(3), mkstemp(3), tempnam(3), tmp-

    file(3), tmpnam(3), credentials(7)

    COLOPHON

    This page is part of release 3.22 of the Linux man-pages project. A

    description of the project, and information about reporting bugs, can

    be found at http://www.kernel.org/doc/man-pages/.

    获取进程ID的函数getpid。该函数的返回值是调用该函数的进程的ID。需要的头文件:

    <sys/types.h> <unistd.h>

    该函数没有参数。返回值是调用该函数的进程的ID。

    实例getpid.c:

    #include <sys/types.h>

    #include <unistd.h>

    #include <stdio.h>

    void main(){

        int id = 0;

        id = getpid();

        printf("process's ID %d ",id);

    }

    运行的结果:

    上面中,生成的getpid就是一个程序,当我们没有去运行的时候,他就是一个程序。当我们运行起来的时候他就变成了一个进程。进程的ID时时刻刻都在发生变化。

  • 相关阅读:
    工欲性能调优,必先利其器(2)- 火焰图
    工欲性能调优,必先利其器(1)
    关于烂代码的那些事(上)
    HTTP 返回码中 301 与 302 的区别
    HTTP 状态码 301 和 302 详解及区别——辛酸的探索之路
    HTTP 状态码之:301、302 重定向
    记一次获得 3 倍性能的 go 程序优化实践,及 on-cpu / off-cpu 火焰图的使用
    Coloring Flame Graphs: Code Hues
    StackOverflow 创始人关于如何高效编程的清单
    Spring Bean的生命周期(非常详细)
  • 原文地址:https://www.cnblogs.com/FORFISH/p/5188653.html
Copyright © 2011-2022 走看看