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

进程之间可以切换,以便轮流占用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命令查看当前目录的典型用法如下:

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. int main(int arg, char **args)
  4. {
  5. char *argv[]={"ls","-al", NULL};
  6. char *envp[]={,NULL};
  7. execve("/bin/ls",argv,envp);
  8. }

Linux下的进程与线程(一)—— 进程概览的更多相关文章

  1. Linux下c开发 之 线程通信(转)

    Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...

  2. Linux下c开发 之 线程通信

    Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...

  3. linux下多进程的文件拷贝与进程相关的一些基础知识

    之前实现了用文件IO的方式能够实现文件的拷贝,那么对于进程而言,我们是否也能够实现呢? 答案是肯定的. 进程资源: 首先我们先回想一下,进程的执行须要哪些资源呢?其资源包含CPU资源,内存资源,当然还 ...

  4. Linux下使用两个线程协作完成一个任务的简易实现

    刚解决了之前的那个Linux下Pthread库的问题,这次就来使用两个线程来协作,共同完成一个求和的任务. 打一下基础吧 本次需要使用到的知识点有: lpthread,编译的时候用到,相当于一个声明的 ...

  5. python---基础知识回顾(十)进程和线程(进程)

    前戏:进程和线程的概念 若是学过linux下的进程,线程,信号...会有更加深刻的了解.所以推荐去学习下,包括网络编程都可以去了解,尤其是对select,poll,epoll都会有更多的认识. 进程就 ...

  6. linux下pthread_cancel无法取消线程的原因【转】

    转自:http://blog.csdn.net/huangshanchun/article/details/47420961 版权声明:欢迎转载,如有不足之处,恳请斧正. 一个线程可以调用pthrea ...

  7. linux下pthread_cancel无法取消线程的原因

    一个线程能够调用pthread_cancel终止同一进程中的还有一个线程,可是值得强调的是:同一进程的线程间,pthread_cancel向还有一线程发终止信号.系统并不会立即关闭被取消线程,仅仅有在 ...

  8. linux下svn使用及查看杀掉进程

    ps –aux ubuntu下安装subversion客户端: sudo apt-get install subversion svn正在checkout时候无法退出操作,shift+ctrl+t新建 ...

  9. 浅析linux 下shell命令执行和守护进程

    执行shell脚本有以下几种方式 1.相对路径方式,需先cd到脚本路径下 [root@banking tmp]# cd /tmp [root@banking tmp]# ./ceshi.sh 脚本执行 ...

  10. 学习笔记:Linux下共享内存的方式实现进程间的相互通信

    一.常用函数 函数系列头文件 #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> ft ...

随机推荐

  1. Coursera DeepLearning.ai Logistic Regression逻辑回归总结

    既<Machine Learning>课程后,Andrew Ng又推出了新一系列的课程<DeepLearning.ai>,注册了一下可以试听7天.之后每个月要$49,想想还是有 ...

  2. ASP.NET CORE的Code Fist后Models更改了怎么办?

    上次我写到MVC的code fist后,自动生成数据库并自动生成web页面了 点击打开链接 那么随着项目需求的逐步明确,model变化了怎么办呢?其实和上次一样的,有两条关键的语句要记住 Add-Mi ...

  3. httpclient的get带参不带参post带参不带参的简单应用

    一,基础的的应用 1.1,get的无参请求 @Test public void doGet() throws Exception { //创建一个httpclient对象 CloseableHttpC ...

  4. 6个重要的.NET概念: - 堆栈,堆,值类型,引用类型,装箱和拆箱(转)

    今天在Code Project上面看到一篇文章<6 important .NET concepts: - Stack, heap, Value types, reference types, b ...

  5. Java虚拟机的锁优化

    1 锁偏向.当现成请求一个对象锁时,如果获得锁,则该对象锁进入偏向模式,当该线程再次请求该对象的锁时,无需再做任何同步操作. 可通过在Java虚拟机中开启参数-XX:+UseBasedLock开启偏向 ...

  6. Luogu345: [POI2007]POW-The Flood

    题意 见luogu Sol 贪心 从小到大枚举高度,把小于等于这一高度的相邻格子用并查集合并 那么这个集合内的所有格子都一定可以由这个集合内的一个最低点抽完水 那么合并之后(一定要在合并之后) 判断这 ...

  7. [BZOJ2049] [SDOI2008] Cave 洞穴勘测 (LCT)

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...

  8. SQL基础教程读书笔记-3

    5 复杂查询 5.1 视图 1.表和视图的区别表:保存的是实际的数据视图:保存的是SELECT语句.从视图读取数据时,视图会在内部执行该SELECT语句并创建出一张临时表. 2.视图的优点① 无需保存 ...

  9. OSI模型和TCP/IP协议族(三)

    TCP/IP协议族 TCP/IP协议族的开发要比OSI模型更早,因此TCP/IP协议族的分层结构无法准确地与OSI模型一一对应.原始的TCP/IP协议族定义为建立再硬件基础上的四个软件层,不通过目前T ...

  10. java web需要好好掌握的一些东西

    这是一些需要好好的复习的东西 本来存了个文档  怕整丢了  就在这里保存一下 java 基础 重点关注集合 如list hashmap等使用(有时间多看看hashmap的实现原理  问的比较多)多线程 ...