文档详情

linux-多进程多线程及其同步.docx

发布:2025-05-12约2.95万字共39页下载文档
文本预览下载声明

Linux多进程、多线程及网络编程指南

进程

进程〔多进程〕

线程〔多线程〕

进程间通信

并发程序的同步

socket网络编程

1

1、进程

1.1进程定义

进程是程序在计算机上的执行活动,是一个运行着一个或多个线程的地址空间和这些线程所需要的系统资源,其中包括程序代码、数据、变量、翻开文件的文件描述符、和环境。

1.2进程的五种状态

在五状态进程模型中,进程状态被分成以下五种状态。进程在运行过程中主要是在就绪、运行和阻塞三种状态间进行转换。创立状态和退出状态描述进程创立的过程和进程退出的过程。

1)运行状态(Running):进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。

2)就绪状态(Ready):进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。

3)阻塞状态(Blocked):当进程由于等待I/O操作或进程同步等条件而暂停运行时,它处于阻塞状态。

4)创立状态(New):进程正在创立过程中,还不能运行。操作系统在创立状态要进行的工作包括分配和建立进程控制块表项、建立资源表格(如翻开文件表)并分配资源、加载程序并建立地址空间表等。

5)退出状态(Exit):进程已结束运行,回收除进程控制块之外的其他资源,并让其他进程从进程控制块中收集有关信息(如记帐和将退出代码传递给父进程)。

进程三种状态的转换如下图:

就绪执行

就绪

执行

等待

时间片到

因等待时间发生而唤醒

因等待时间发生而睡眠

调度到

进程三种状态的转换关系

1.3进程的结构

Linux系统是一个多进程的系统,进程间有并行性、互不干扰等特点。通俗的说进程间是别离的任务,拥有各自的权力和责任,每个进程运行在各自独立的虚拟地址空间,一个进程发生了异常,它也不会影响到系统中的其他进程。

Linux进程包含三个段:数据段、代码段、堆栈段。

数据段:存放的是全局变量、常数、static定义的静态变量和动态分配的数据〔malloc函数取得的空间〕等。

代码段:存放的是程序代码的数据。

堆栈段:存放的是子程序的返回地址、子程序的参数以及程序的局部变量。

1.4进程的执行模式

当一个任务〔进程〕执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态〔或简称为内核态〕。此时处理器处于特权级最高的〔0级〕内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,那么称其处于用户运行态〔用户态〕。即此时处理器在特权级最低的〔3级〕用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。在内核模式下运行的进程可以执行机器的特权指令,并且此时该进程的运行不受用户的干扰,即使是root用户也不能干扰内核模式下程序的运行。

进程上下文和中断上下文

处理器总处于以下状态中的一种:

1、内核态,运行于进程上下文,内核代表进程运行于内核空间;

2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;

3、用户态,运行于用户空间。

1.4

1.4创立新进程

通过fork调用创立一个新进程,这个系统调用复制当前进程在系统表中创立一个新的表项,新表项中的许多属性与当前进程是相同的。新进程与原进程几乎一样,但还是有不同之处。父子进程的异同:

继承属性

差异

真实的用户ID和组ID,有效用户ID和组ID

进程组ID

SESSIONID

所翻开文件及文件的偏移量

控制终端

设置用户ID和设置组ID标记位

根目录与当前工作目录

文件缺省创立的权限掩码

可访问的内存段

环境变量及其他资源分配

进程ID

父进程ID

子进程运行的时间记录

父进程对文件的锁

fork和exec函数族结合在一起使用就是创立新进程所需要的一切了,值得注意的是exec函数执行之后原进程之后的代码将不会被执行。

创立一个新进程也可以使用vfork,但vfork并不完全拷贝父进程的数据段而是和父进程共享数据段。这是因为vfork函数是与exec函数族相连,创立执行另一个程序的新进程。并且调用vfork对于父子进程的执行次序有限制,调用vfork时,父进程被挂起,子进程运行至调用exec函数族或调用exit时解除这种状态。而fork是不会阻塞调用进程的,父子进程的执行顺序是不确定的。

1.5

1.5僵尸进程

显示全部
相似文档