b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Linux下C语言开发(多任务编程之任务、进程、线程)

电脑杂谈  发布时间:2019-06-20 00:04:07  来源:网络整理

c/c++线程池_线程池c_c 多线程 多任务

当硬件操作完成,进程被恢复执行,而协调这个过程的就是进程间的通信机制。而管道只支持线程通信,因为他操作的地址是固定的,一端写入一端写出,跨进程是需要拷贝数据到目标进程的。在android中,broadcastreceiver是一套用来实现组件之间的通信机制,它是基于消息发布和订阅机制,可以用在不同线程之间组件的通信,也可以跨进程进行组件间通信。

多任务处理是指用户在同一时间内运行多个应用程序,每个应用程序被称做一个任务。Linux就是一个支持多任务的操作系统,它比单任务系统的功能增强了许多。当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一个任务提供服务。由于任务调度机制保证了不同的任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。多任务系统中有3个功能单位:任务、进程和线程,下面分别进程介绍。

要分析同步问题,首先需要分清进程与线程之间的区别,分别理解在操作系统中进程与线程的表达,然后需要理解文件在内核中的表现形式,最后还需要理解系统中read和write方法的整个执行流程,这样才能一点点的分析需要执行同步的场景。4、进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调 度的一个独立单位. 线程是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程 自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)但是 它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程。1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程),线程是进程的基本执行单元,一个进程(程序)的所有任务都程中执行。

进程是一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度的基本单位(个人理解:系统好比是一个大型的任务,由多个进程(可执行文件)构成,而资源分配和资源调度分别都是一个进程,所以进程是系统进行资源分配和调度的基本单位)。一次任务的运行可以并发激活多个进程,这些进程相互合作来完成该任务的一个最终的目标。

进程具有并发性、动态性、交互性、独立性和异步性等主要特性

如果调用了exec,则内核则会为这个进程的pcb加载可执行文件(注:程序和进程是两个完全不同的概念,前者是静态概念,指一个可以被解释的指令集合。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本。程序和进程的区别在于:程序是指令集合. 它是进程运行的静态描述文本。

Linux系统中包括以下几种类型的过程:

进程不但包括程序的指令和数据,而且包括程序计数器和处理器的所有寄存器以及存储临时数据的进程堆栈,因此正在执行的进程包括处理器当前的一切活动。

因为Linux是一个多进程的操作系统,所以其他的进程必须等到系统将处理器使用权分配各自己之后才能运行。当正在运行的进程等待其他的系统资源时,Linux内核将取得处理器的控制权,并将处理器分配给其他正在等待的进程,它按照内核中的调度算法决定处理器分配给哪个进程。

内核将所有进程存放在双向循环链表(进程链表)中,其中链表的头是init_task描述符。链表的每一项都是类型为task_struct,称为进程描述符的结构,该结构包含了与一个进程相关的所有信息,定义在<include/linux/sched.h>文件中。task_struct内核结构比较大,它能完整地描述一个进程,如进程的状态、进程的基本信息、进程标识符、内存相关信息、父进程相关信息、与进程相关的终端信息、当前工作目录、打开的文件信息、所接收到的信号信息等。

下面详细讲解task_struct结构中最为重要的两个域:state(进程状态)和pid(进程标识符,即进程号)。

1)进程状态,Linux中的进程有以下几种状态

创建一个task.c文件,task.c文件内容如下:

保存后,输入gcc task.c -o task编译生成二进制代码task,输入./task运行task进程

打开另一个终端,输入ps -aux查看进程状态:(ps -axjf可查看进程有哪些子进程,ps -e 也 可以查到进程的状态,但只显示进程的PID、TTY、TIME和CMD)

线程池c_c/c++线程池_c 多线程 多任务

ps工具标识进程的5中状态码:

D 不可中断 uninterruptible sleep (usually IO)

R 运行 runnable (on run queue)

S 中断 sleeping

T 停止 traced or stopped

Z 僵尸 a defunct ("zombie") process

注:其它状态还包括W(无驻留页),<(高优先级进程),N(低优先级进程),L(内存锁页)

每列对应关系:

USER:进程所有者

PID:进程ID

%CPU:占用CPU的使用率

%MEM:占用内存的使用率

VSZ:占用虚拟内存大小

RSS:占用内存大小

TTY:终端次要装置号码

STAT:进程状态

START:进程启动时间

c/c++线程池_线程池c_c 多线程 多任务

TIME:进程消耗cup时间

COMMAND:命令的名称和参数

它们之间的转换关系如图所示:

内核可以使用set_task_state和set_current_state宏来改变指定进程的状态和当前执行进程的状态。

2)进程标识符

Linux内核通过唯一的进程标识符PID来标识每个进程。PID存放进程描述符的pid字段中,新创建的PID通常是前一个进程的PID加1,不过PID的值有上限(最大值 = PID_MAX_DEFAULT - 1,通常为32767),我们可以在终端输入 vim /proc/sys/kernel/pid_max 来确定该系统的进程数上限。

当系统启动后,内核通常作为一个进程的代表。一个指向task_struct的宏current用来记录正在运行的进程。current经常作为进程描述符结构指针的形式出现在内核代码中,例如,current->pid表示处理器正在执行进程的PID。当系统需要查看所有的进程时,则调用for_each_process()宏,这将比系统搜索数组的速度要快得多。

在Linux中获得当前进程的进程号(PID)和父进程号(PPID)的系统调用函数分别为getpid()和getppid()。

测试代码:

测试结果:

输入 ps -axjf 命令查看所有进程与父进程

线程池c_c/c++线程池_c 多线程 多任务

我们在次输入ps -aux命令查看所有进程,可以得知父进程为bash

1)进程的创建和执行

先说说用getmodulehandle函数获取.此方法需要用createremotethread函数在远程进程中创建线程,让该线程调用kernel32.dll中的getmodulehandle函数.但是只这样还不行.因为getmodulehandle函数需要以dll模块文件名做参数.既然是远程线程调用getmodulehandle函数.还需要先把dll模块文件名写入目标进程的地址空间中.最后用createremotethread函数创建线程执行getmodulehandle函数来获取dll句柄。进程池生成了3个子进程,通过循环执行8次worker函数,进程池会从子进程1开始去处理任务,当到达最大进程时c 多线程 多任务,会继续从子进程1开始。当pid等于0时,说明该进程为子进程,那么让它执行某些指令,比如说使用exec库函数(library function)读取另一个程序文件,并在当前的进程空间执行 (这实际上是我们使用fork的一大目的: 为某一程序创建进程)。

要注意的是,Linux中的fork()函数使用的是写时复制页的技术,也就是内核在创建进程时,其资源并没有被复制过来,资源的复制仅仅只有在需要写入数据时才发生,在此之前只是以只读的方式共享数据。写时复制技术可以使Linux拥有快速执行的能力,因此这个优化是非常重要的。

2)进程的终止

进程终结也需要做很多繁琐的收尾工作,系统必须保证回收进程所占的资源,并通知父进程。Linux首先把终止的进程设置为僵尸状态,这时,进程无法投入运行,它的存在只为父进程提供信息,申请死亡。父进程得到信息后,开始调用wait函数族,最后终止子进程,子进程占用的所有资源被全部释放。

Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该地址空间是大小为4GB的线性虚拟空间(当然是指32位系统),用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可以使用比实际物理内存更大的地址空间。

我们可以通过命令getconf LONG_BIT 来查询当前自己的系统是多少位的?

我的安装的UbuntKylin是64位的,即实际内存最大可能达到2^64 = 128GB。(2^10 = 1kb,2^30 = 1GB)。

4GB的进程地址空间会被分出两部分:用户空间与内核空间。用户地址空间是从0~3GB(0xC0000000),内存地址空间占据3GB~4GB。用户进程通常情况下只能访问用户控件的虚拟地址,不能访问内核空间的虚拟地址。只有用户进程使用系统调用(代表用户进程在内核执行)时可以访问内核空间的虚拟空间。每当进程切换时,用户空间就会跟着变化;而内核空间有内核负责映射,它并不会跟着进程改变而改变,是固定的。内核空间地址有自己对应的页表c 多线程 多任务,用户进程各自用不同的页表。每个进程用户空间都是完全独立、互不相干的。进程的虚拟内存地址空间如图所示:

其中用户空间包括以下几个功能区域:

由于在Linux系统中每一个进程都会有/proc文件系统下与之对应的一个目录(如将init进程的相关信息在/proc/1 目录下的文件中描述,1表示init进程的进程号),因此通过proc文件系统可以查看某个进程的地址空间的映射情况。

测试代码:

c/c++线程池_线程池c_c 多线程 多任务

运行此程序:

输入 size task

text:存放的是代码 data:存放的是初始化过的全局变量或静态变量 bss:存放的是未初始化的全局变量或静态变量

输入命令 cat /proc/3834/maps 其中3834是task的PID

线程在进程的地址空间中,一个进程的中可执行多个线程,每个线程是一个控制流(负责一件事情),多线程的控制流程可以长期并存,操作系统会在各线程之间调度和切换,就像在多个进程之间调度和切换一样。apache是多进程/多线程模型的,它会在启动的时候启动一批进程,作为进程池,当用户请求到来的时候,从进程池中分配处理进程给具体的用户请求,这样可以节省多进程/线程的创建和销毁开销,但是如果同时有大量的请求过来,还是需要消耗比较高的进程/线程切换。类似地,在进行进程切换时,涉及当前执行进程cpu环境的保存及新调度到进程cpu环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

一个进程可以拥有多个线程,每个线程必须有一个父进程。线程不拥有系统资源,它只具有运行所必需的一些数据,如堆栈、寄存器与线程控制块(TCB),线程与其父进程的其他线程共享该进程所拥有的全部资源。要注意的是,由线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都会给其他线程带来影响。由此可知,多线程中的同步是非常重要的问题。在多线程系统中,进程与线程的关系如图所示:

在Linux系统中,线程可以分为以下3种:

用户级线程

lwp还是和前面提到的一样,具有内核线程支持,是内核的调度单元,并且用户线程的系统调用要通过lwp,因此进程中某个用户线程的阻塞不会影响整个进程的执行。其实也有各自的真实pid,但由结构隐藏了,对外的pid为主进程的pid5)线程对操作系统来说就是进程,因此对信号的处理是以进程为单位分发的6)线程总数受限于系统进程数7)系统管理线程的瓶颈:所有线程由管理线程管理8)线程之间的调度是由内核调度器来处理的9)由于计算线程本地数据的方法是基于堆栈地址的位置。在用户空间模拟操作系统对进程的调度,来调用一个进程中的线程,每个进程中都会有一个运行时系统,用来调度线程。

轻量级进程

轻量级进程是内核支持的用户线程,是内核线程的一种抽象对象。每个线程拥有一个或多个轻量级进程,而每个轻量级进程分别被绑定在一个内核线程上。

内核线程

> 进程与线程比较- 进程是资源分配单位,线程是cpu调度单位- 进程拥有一个完整的资源平台,而线程只独享指令流执行的必要资源,如寄存器和栈- 线程具有就绪/等待和运行三种基本状态和状态间的转换关系- 线程可以减少并发执行的时间和空间开销线程的创建与终止时间比进程短同一进程内的线程切换时间比进程短同一进程的各个线程间共享内存和文件资源,可不通过内核直接通信。线程是独立运行和独立调度的基本单位(线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度),线程之间共享进程的数据空间(借此通信)。1:1 模型下,每个用户空间的线程都对应于内核中的一个线程,线程的调度由内核在系统全局范围进行。

缺点:效率低,因为线程在内核态实现,每次线程切换都需要陷入内核,由操作系统进行调度。windbg,微软windows强大的调试器,能够工作于用户模式和内核模式,可以调试windows内核,内核态驱动,系统服务和用户态程序或驱动。内核线程(kernel thread, klt)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-107164-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 程花梅
        程花梅

        加工过程就算有虫卵也会烤熟了

      热点图片
      拼命载入中...