• Linux下的进程与线程(一)—— 进程概览


    进程是操作系统分配资源的基本单位.线程是操作系统进行运行和调度的基本单位.

    进程之间可以切换,以便轮流占用CPU,实现并发.一般进程运行在用户模式下,只能执行指令集中的部分指令.

    当进程进行上下文切换的时候,需要从用户模式转变为内核模式.

    用户模式转为内核模式的方法有系统调用(异常),中断,故障.下面一个一个解释:

    系统调用(在CS:APP这本书里,系统调用是异常的一种):实际上是一种代理请求的方式,是进程申请使用操作系统提供的服务程序来完成工作.一些常用的系统调用函数有fork,sleep,read,write等.本质上,系统调用是使用中断来完成的.

    中断:异步发生,是来自处理器外部的I/O设备信号的结果.比如,读写硬盘完成后,会产生响应的中断.当某个进程运行了较长时间,也会产生中断,此后由内核切换进程.

    故障:这个很好理解,比如除法错误,缺页错误等,不严谨地说,故障和错误有些类似.

    在内核模式下,进程可以执行指令集中的任何指令,访问系统中存储器的任何位置.

    当切换到另一个进程之后,进程再次进入用户模式.

    进程:

    进程的创建:

    Linux下创建进程的函数是fork,fork函数有以下特点:

    1. 调用一次,返回两次.返回到父进程的值是子进程的pid(process id),返回到子进程的值是0
    2. 并发执行.父进程和子进程的执行顺序不固定.
    3. 地址空间内容相同,但相互独立.

    进程的状态:

    从程序员角度看,进程一直处于以下三种状态之一:

    1. 运行,在此状态下可调度
    2. 停止(非终止),进程被挂起,在此状态下不可调度.进程收到SIGSTOP等信号时进入此状态.当收到SIGCONT信号后结束此状态,然后继续运行.
    3. 终止,进程永远停止了.有三种原因进入此状态:(1)收到了停止信号,(2)从主程序返回(比如调用了return),(3)调用exit函数

    进程的终止:

    子进程终止后,由父进程负责回收.若不回收,则占用系统资源.

    若父进程在回收子进程之前就终止了,内核会安排init进程(pid = 1)来回收

    回收进程使用函数waitpid,wait(waitpid的简单版本)

    进程的回收是一个较为复杂的问题,这个会在以后的文章中继续探讨.

    关于execve函数

    在Linux的Shell和Web服务器中,广泛使用了fork函数和execve函数。一般使用fork函数创建一个新进程,然后在这个进程的上下文中使用execve函数加载并运行一个新程序。

    execve函数的原型如下

    int execve(const char *filename, const char *argv[], const char *envp[])

    其中,filename 指示要运行的可执行文件,argv为参数列表(argv[0]为可执行目标文件的名字), envp为环境信息

    一个使用execve函数代替ls命令查看当前目录的典型用法如下:

    #include<stdio.h>
    #include<unistd.h>
    int main(int arg, char **args) 
    { 
    char *argv[]={"ls","-al", NULL}; 
    char *envp[]={0,NULL};
    execve("/bin/ls",argv,envp);
    }
  • 相关阅读:
    WPF中更改键盘默认指令小结
    WPF自己喜欢用的数据验证方式
    重写Windows基类,自定义WPF窗口,实现改回车键为TAB
    用CSS控制表格的框格线
    获取当前鼠标的坐标
    SQL 中的转义字符
    資料站點
    jquery 弹出浮层(div) + 遮蔽层
    Jquery放大镜插件[JMagazine]使用参数简介
    邏輯題 交通事故篇
  • 原文地址:https://www.cnblogs.com/geeklove01/p/7929677.html
Copyright © 2020-2023  润新知