Linux进程和线程的基础与管理

作者&投稿:产咽 (若有异议请与网页底部的电邮联系)
~

一.进程的基本概念

程序是为了完成某种任务而设计的软件,比如vi是程序。什么是进程呢? 进程就是运行中的程序。一个运行着程序,可能有多个进程。比如Web服务器是Apache服务器,当管理员启动服务后,可能会有好多人来访问,也就是说许多用户同时请求httpd,Apache服务器将会创建多个httpd进程来对其进行服务。

首先我们看看进程的定义。进程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机程序。进程作为构成系统的基本细胞,不仅是系统内部独立运行的实体,而且是独立竞争资源的基本实体。了解进程的本质,对于理解、描述和设计操作系统有着极为重要的意义。了解进程的活动、状态,也有利于编制复杂程序。

二.进程的属性

进程的定义:一个进程是一个程序的一次执行的过程;程序是静态的,它是一些保存在磁盘上的可执行的代码和数据集合;进程是一个动态的概念,它是Linux系统的基本的调度单位。

一个进程由如下元素组成:

程序读取的上下文,它表示程序读取执行的状态。    程序当前执行的目录。    程序服务的文件和目录。    程序访问的权限。    内存和其他分配给进程的系统资源。    

Linux进程中最知名的属性就是它的进程号(Process Idenity Number,PID)和它的父进程号(Parent Process ID,PPID)。PID、PPID都是非零正整数。一个PID唯一地标识一个进程。一个进程创建新进程称为创建了子进程(Child Process)。相反地,创建子进程的进程称为父进程。所有进程追溯其祖先最终都会落到进号为1的进程身上,这个进程叫做init进程,是内核自举后第一个启动的进程。init进程扮演终结父进程的角色。因为init进程永远不会终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程它在衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们的父进程。如果执行一下ps-af命令,可以列出许多父进程ID为1的进程来。Linux提供了一条pstree命令,允许用户查看系统内正在运行的各个进程之间的继承关系。直接在命令行中输入pstree即可,程序会以树状结构方式列出系统中正在运行的各进程之间的继承关系。

三.理解Linux下进程的结构

Linux中一个进程在内存里有三部分数据,就是“数据段”、“堆栈段”、“代码段”。基于I386兼容的中央处理器,都有上述三种段寄存器,以方便操作系统的运行,如下图所示。

               

   代码段

               

   数据段

               

   堆栈段

代码段是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。而数据段则存放程序的全局变量、常数及动态数据分配的数据空间。堆栈段存放的就是子进程的返回地址、子程序的参数及程序的局部变量。堆栈段包含在进程控制块PCB(Process Control Block)中。PCB处于进程核心堆栈的底部,不需要额外分配空间。

四.进程状态

现在我们来看看,进程在生存周期中的各种状态及状态的转换。下面是Linux系统的进程状态模型的各种状态。

用户状态:进程在用户状态下运行的状态。    内核状态:进程在内核状态下运行的状态。    内存中就绪:进程没有执行,但处于就绪状态,只要内核调度它,就可以执行。    内存中睡眠:进程正在睡眠并且进程存储在内存中,没有被交换到SWAP设备。    就绪且换出:进程处于就绪状态,但是必须把它换入内存,内核才能再次调度它运行。    睡眠且换出:进程正在睡眠,且被换出内存。    被抢先:进程从内核状态返回用户状态时,内核抢先于它做了上下文切换,调度了另一个进程。原先这个进程就处于被抢先状态。    僵死状态(zombie):进程调用exit结束,进程不再存在,但在进程表项中仍有记录,该记录可由父进程收集。    

现在我们从进程的创建到退出来看看进程的状态转化。需要说明的是,进程在它的生命周期里并不一定要经历所有状态。

五.Linux进程的创建

fork函数在Linux下产生新的进程的系统调用,这个函数名是英文中“分叉”的意思。为什么取这个名字呢? 因为一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就“分叉”了,所以这个名字取得很形象。fork的语法如下所示:

复制代码

   

代码如下:

#include unistd.h

   #include sys/types.h

   pid_t fork();

在Linux网络编程中经常用到fork()系统调用。例如在一个客户机/Web服务器构建的网络环境中,Web服务器往往可以满足许多客户端的请求。如果一个客户机要访问Web服务器,需要发送一个请求,此时由服务器生成一个父进程,然后父进程通过fork()系统调用产生一个子进程,此时客户机的请求由子进程完成。父进程可以再度回到等待状态不断服务其他客户端。原理如下图所示。

有一个更简单的执行其他程序的函数system,参数string传递给一个命令解释器(一般为sh)执行,即string被解释为一条命令,由sh执行该命令。若参数string为一个空指针,则检查命令解释器是否存在。该命令可以和同命令行下的命令形式相同,但由于命令作为一个参数放在系统调用中,应注意编译时对特殊意义字符的处理。命令的查找是按PATH环境变量的定义执行的。命令所生成的后果一般不会对父进程编程造成影响。返回值:当参数为空指针时,只有当命令解释器有效时返回值为非零。若参数不为空指针,返回值为该命令的返回状态(同waitpid())的返回值。命令无效或语法错误则返回非零值,所执行的命令被终止。其他情况则返回-1.它是一个较高层的函数,实际上相当于在shell下执行一条命令,除了system之外,系统调用exec来执行一个可执行文件,来代替当前进程的执行映像。系统调用exit的功能是终止发出调用的进程。sleep函数调用用来指定进程挂起的秒数。wait函数族用来等待和控制进程。poppen函数和system函数类似,区别是它用管道方式处理输出。

父进程和子进程的关系是管理和被管理的关系,当父进程终止时,子进程也随之而终止。但子进程终止时,父进程并不一定终止。比如httpd服务器运行时,我们可以杀掉其子进程,父进程并不会因为子进程的终止而终止。

六.进程的管理

1.启动进程

输入需要运行的程序的程序名,执行一个程序,其实也就是启动了一个进程。在Linux系统中,每个进程都具有一个进程号(PID),用于系统识别和调度进程。启动一个进程有两个主要途径:手工启动和调度启动,后者是事先进行设置,根据用户要求自动启动。由用户输入命令,直接启动一个进程便是手工启动进程。但手工启动进程又可以分为很多种,根据启动的进程类型不同;性质不同,实际结果也不一样。

(1)前台启动

前台启动是手工启动一个进程的最常用的方式。用户键入一个命令“df”,就已经启动了一个进程,而且是一个前台的进程。这时候系统其实已经处于多进程状态。有许多运行在后台的、系统启动时就已经自动启动的进程正在悄悄运行着。有的用户在键入“df”命令以后赶紧使用“ps -x”查看,却没有看到df进程,会觉得很奇怪。其实这里因为df这个进程结束太快,使用ps查看时该进程已经执行结束了。如果启动一个比较耗时的进程,例如在根命令下运行:find,然后使用ps aux查看,就会看到在里面有一个find进程。

(2)后台启动

直接从后台手工启动一个进程用得比较小一些,除非是该进程甚为耗时,且用户也不急着需要结果。假设用户要启动一个需要长时间运行的格式化文本文件的进程,为了不使整个shell在格式化过程中都处于“瘫痪”状态,从后台启动这个进程是明智的选择。

2.进程调度

当需要中断一个前台进程的时候,通常使用Ctrl+C组合键。但是对于一个后台进程,就不是一个组合键所能解决的了,这时就必须使用kill命令。该命令可以终止后台进程。至于终止后台进程的原因有很多,或许是该进程占用的CPU时间过多;或许是该进程已经挂死。这种情况是经常发生的。kill命令的工作原理是:向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。

七.Linux的第一个进程:init

init是Linux系统执行的第一个进程,进程ID为1,是系统所有进程的起点,主要用来执行一些开机初始化脚本和监视进程。Linux系统在完成核内引导以后就开始运行init程序,init程序需要读取配置文件/etc/inittab。Inittab是一个不可执行的文本文件,它由若干行命令所组成。

在RHEL 4系统中,inittab配置文件的内容如下所示:

复制代码

   

代码如下:

#

   #inittab

   #

   #

   #author

   #

   #Default runlevel.the runlevels used by rhs are:

   #0 - halt (do not set initdefault to this)

   #1 - single user mode

   #2 - multiuser,without nfs (the same as 3, if you do not haver networking)

   #3 - full multiuser mode

   #4 - unused

   #5 - X11

   #6 - reboot (do not set initdefault to this)

   #

   //表示当前缺省运行级别为5,启动系统进入图形化界面

   id:5:initdefault:

   //启动时自动执行/etc/rc.d/rc.sysinit脚本

   #system initialization.

   si::sysinit:/etc/rc.d/rc.sysinit

   10:0:wait:/etc/rc.d/rc 0

   11:1:wait:/etc/rc.d/rc 1

   12:2:wait:/etc/rc.d/rc 2

   13:3:wait:/etc/rc.d/rc 3

   14:4:wait:/etc/rc.d/rc 4

   //当运行级别为5时,以5为参数运行/etc/rc.d/rc脚本,init将等待其返回

   15:5:wait:/etc/rc.d/rc 5

   16:6:wait:/etc/rc.d/rc 6

   //在启动过程中允许按[ctrl-alt-delete]重启系统

   #trap ctrl-alt-delete

   ca::ctrlaltdel:/sbin/shutdown -t3 -r now

   #

   ..................................

   #

   //在运行级别2、3、4、5以上ttyX为参数执行/sbin/mingetty程序,打开ttyX终端用于用户登录,如果进程退出则再次运行mingetty程序

   #run gettys in standard runlevels

   1:2345:respawn:/sbin/mingetty tty1

   2:2345:respawn:/sbin/mingetty tty2

   3:2345:respawn:/sbin/mingetty tty3

   4:2345:respawn:/sbin/mingetty tty4

   5:2345:respawn:/sbin/mingetty tty5

   6:2345:respawn:/sbin/mingetty tty6

   //在级别5上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行

   x:5:respawn:/etc/x11/prefdm -nodaemon

   #run xdm in runleverl 5

Inittab配置文件每行的基本格式如下。

   id:runlevels:action:procees

其中某些部分可以为空,下面我们逐一介绍。

1.id

1~2个字符,配置行的惟一标识,在配置文件中不能重复。

2.runlevels

配置行适用的运行级别,在这里可填入多个运行级别,比如12345或者35等。

Linux有7个运行级别:

0:关机

   1:单用户字符界面

   2:不具备网络文件系统(NFS)功能的多用户字符界面

   3:具有网络功能的多用户字符界面

   4:保留不用

   5:具有网络功能的图形用户界面

   6:重新启动系统

3.action

init有如下几种行为,如下表所示。

init行为

               

   行为

               

   描述

               

   respawn

               

   启动并监视第4项指定的process,若process终止则重启它

               

   wait

               

   执行第4项指定的process,并等待它执行完备

               

   once

               

   执行第4项指定的process

               

   boot

               

   不论在哪个执行等级,系统启动时都会运行第4项指定的process

               

   bootwait

               

   不论在哪个执行等级,系统启动时都会运行第4项指定的process,且一直等它执行完备

               

   off

               

   关闭任何动作,相当于忽略该配置行

               

   ondemand

               

   进入ondemand执行等级时,执行第4项指定的process

               

   initdefault

               

   系统启动后进入的执行等级,该行不需要指定process

               

   sysinit

               

   不论在哪个执行等级,系统会在执行boot及bootwait之前执行第4项指定的process

               

   powerwait

               

   当系统的供电不足时执行第4项指定的process,且一直等它执行完备

               

   powerfailnow

               

   当系统的供电严重不足时执行第4项指定的process

               

   ctrlaltdel

               

   当用户按下ctrl+alt+del 时执行的操作

               

   kbrequest

               

   当用户按下特殊的组合键时执行第4项指定的process,此组合键需在keymaps文件定义

4.process

Process为init执行的进程,这些进程都保存在目录/etc/rc.d/rcX中,其中的X代表运行级别,rc程序接收X参数,然后运行/etc/rc.d/rc.X下面的程序。使用如下命令可以查看/etc/rc.d目录内容。

复制代码

   

代码如下:

#ls –l /etc/rc.d/

   total 112

   drwxr-xr-x 2 root root 4096 3/15 14:44 init.d

   -rxwr-xr-x 1 root root 2352 2004-3-17 rc

   drwxr-xr-x 2 root root 4096 3/15 14:44 rc0.d

   drwxr-xr-x 2 root root 4096 3/15 14:44 rc1.d

   drwxr-xr-x 2 root root 4096 3/15 14:44 rc2.d

   drwxr-xr-x 2 root root 4096 3/15 14:44 rc3.d

   drwxr-xr-x 2 root root 4096 3/15 14:44 rc4.d

   drwxr-xr-x 2 root root 4096 3/15 14:44 rc5.d

   drwxr-xr-x 2 root root 4096 3/15 14:44 rc6.d

   -rxwr-xr-x 1 root root 2200 2004-3-17 rc.local

   -rxwr-xr-x 1 root root 2352 2004-3-17 rc.sysinit

   …………

使用如下命令查看/etc/rc.d/rc5.d的内容。

复制代码

   

代码如下:

#ls –l /etc/rc.d/rc5.d

这些文件都是符号链接,以S打头的标识启动该程序,而以K打头的标识终止该程序,后面的数字标识执行顺序,越小越先执行,剩下的标识程序名。系统启动或者切换到该运行级别时会执行以S打头的程序,系统切换到该运行级别时会执行以K打头的程序。

这个目录下的程序可通过chkconfig程序进行管理,当然这个目录下的程序需要符合一定规范,如果了解shell编程,可以查看这些符号链接所指向的程序的源码。

init也是一个进程,和普通的进程具有一样的属性。比如修改了/etc/inittab,想让修改马上生效,可通过运行“kill-SIGHUP 1”来实现,也可通过运行“init q”来实现。

八.Linux的线程简介

1.Linux线程的定义

线程(thread)是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。在两个普通进程(非线程)间进行切换时,内核准备从一个进程的上下文切换到另一个进程的上下文要花费很大的开销。这里上下文切换的主要任务是保存老进程CPU状态并加载新进程的保存状态,用新进程的内存映像替换进程的内存映像。线程允许你的进程在几个正在运行的任务之间进行切换,而不必执行前面提到的完整的上下文。另外本文介绍的线程是针对POSIX线程的,也就是Pthread。也因为Linux对它的支持最好,相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。也可以将线程和轻量级进程(LWP)视为等同的,但其实在不同的系统/实现中有不同的解释,LWP更恰当的解释为一个虚拟CPU或内核的线程。它可以帮助用户态线程实现一些特殊的功能。Pthread是一种标准化模型,它用来把一个程序分成一组能够同时执行的任务。

2.什么场合使用Pthread,即线程

(1)在返回前阻塞的I/O任务能够使用一个线程处理I/O,同时继续执行其他处理任务。

   (2)在有一个或多个任务受不确定性事件,比如网络通信的可获得性影响的场合,能够使用线程处理这些异步事件,同时继续执行正常的处理。

   (3)如果某些程序功能比其他的功能更重要,可以使用线程以保证所有功能都出现,但那些时间密集型的功能具有更高的优先级。

以上三点可以归纳为:在检查程序中潜在的并行性时,也就是说在要找出能够同时执行任务时使用Pthread。上面已经介绍了,Linux进程模型提供了执行多个进程的能力,已经可以进行并行或并发编程,可是纯种能够让你对多个任务的控制程序更好、使用资源更少,因为一个单一的资源,如全局变量,可以由多个线程共享。而且,在拥有多个处理器的系统上,多线程应用会比用多个进程实现的应用执行速度更快。

3.Linux进程和线程的发展

1999年1月发布的Linux 2.2内核中,进程是通过系统调用fork创建的,新的进程是原来进程的子进程。需要说明的是,在2.2.x版本中,不存在真正意义上的线程(thread)。Linux中常用的线程Pthread实际上是通过进程来模拟的。也就是说Linux中的线程也是通过fork创建的,是“轻”进程。Linux 2.2只默认允许4096个进程/线程同时运行。高端系统同时要服务上千个用户,所以这显然是一个问题,它一度是阻碍Linux进入企业级市场的一大因素。

2001年1月发布的Linux 2.4内核消除了这个限制,并且允许在系统运行中动态调整进程数上限。因此,进程数现在只受制于物理内存的多少。在高端服务器上,即使安装了512MB内存,现在也能轻而易举地同时支持1万6千个进程。

2003年12月发布的2.6内核,进程调度经过重新编写,去掉了以前版本中效率不高的算法。以前,为了决定下一步要运行哪一个任务,进程调度程序要查看每一个准备好的任务,并且经过计算机来决定哪一个任务相对来更为重要。进程标识号(PID)的数目也从32000升到10亿。内核内部的大改变之一就是Linux的线程框架被重写,以使NPTL(Native POSIX Thread Library)可以运行于其上。对于运行负荷繁重的线程应用的Pentium Pro及更先进的处理器而言,这是一个主要的性能提升,也是企业级应用中的很多高端系统一直以来所期待的。线程框架的改变包含Linux线程空间中的许多新的概念,包括线程组、线程各自的本地存储区、POSIX风格信号,以及其他改变。改进后的多线程和内存管理技术有助于更好地运行大型多媒体应用软件。

4.总结

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在对称处理器的计算机上运行,而进程则可以跨机器迁移。另外,进程可以拥有资源,线程共享进程拥有的资源。进程间的切换必须保存在进程控制块PCB(Process Control Block)中。同一个进程的多个线程间的切换不用那么麻烦。最后一个实例来作为本文的结束:当你在一台Linux PC上打开两个OICQ,每一个OICQ是一个进程;而当你在一个OICQ上和多人聊天时,每一个聊天窗口就是一个线程。




Linux进程和线程的基础与管理
Linux进程中最知名的属性就是它的进程号(Process Idenity Number,PID)和它的父进程号(Parent Process ID,PPID)。PID、PPID都是非零正整数。一个PID唯一地标识一个进程。一个进程创建新进程称为创建了子进程(Child Process)。相反地,创建子进程的进程称为父进程。所有进程追溯其祖先最终都会落到进号为1的进程身上...

有人能教下我有关linux里面线程的知识吗
.创建线程要比创建进程块很多 .多线程编程时,需要确保调用线程安全的函数 .某个线程中的bug可能会危害进程中所有线程 .每个线程都在征用宿主进程中有限的虚拟地址空间 .在多线程应用中,需要小心使用信号 .除了数据,线程还可以共享文件描述符,信号处置,当前工作目录,以及用户ID和组ID 线程的同步 (1...

linux调度是基于进程还是线程
在LINUX系统之中,被调度的应该是进程。因为只有进程才拥有一个独立的上下文环境,是分配系统资源的最小单位……而线程在SMP体系中加速了执行的效率……在LINUX之中,线程也可称作轻量级进程,它能享有自己的堆栈,线程ID等独立资源,但大多还是要依赖其创建进程,比如地址空间,信号,文件句柄……

linux 查看线程属于哪个进程
X 死进程 (未开启)Z 僵尸进程 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放BSD风格的 < 高优先级(not nice to other users)N 低优先级(nice to other users)L 页面锁定在内存(实时和定制的IO)s 一个信息头 l 多线程(使用 CLONE_THREAD,像NPTL的pthreads的那样)...

进程和线程的区别和linux运行状态查看简单
主从式典型例子:终端控制进程和终端进程。会话式典型例子:用户进程与磁盘管理进程之间的通信。———- 参考书籍:计算机操作系统教程(第 3 版)清华大学出版社张尧学 史美林 张高 在java编程中就经常用到进程和线程的概念。1、线程:程序中单独顺序的控制流 线程本身依靠进程运行,不能独立存在,线程是...

如何理解进程,线程,结合Linux、WinCE、ucOS等
进程与线程的概念与操作系统无关,不过像uC\/OS只有线程的概念,没有进程。Linux与WinCE类的嵌入式系统与PC系统关于进程的概念一样。总结来说,进程就是一个程序运行的实例,也就是程序运行的过程,它包括与该进程有关的环境变量 ,堆栈 ,代码段。而线程是执行程序任务的单位。以C 程序为例,一个拥有...

麻烦解释一下linux下进程和线程有什么区别和联系,linux下多线程和多...
兄弟看到你这么高的分我就找了些资料:也算是对昨天学的知识总结一下吧 一、先说概念不管是windows还是linux下的进程和线程概念都是一样的,只是管理进程和线程的方式不一样,这个是前提,到时候你可别问我windows下进程和线程啊。这个涉及到操作系统原理。下面给你解答。说道进程不得不提作业这个名词 ...

Windows\/Linux下进程相对于线程更安全是因为什么?
多进程下,每个进程都有自己的独立地址空间,进程间的数据空间也相互独立,彼此通信以专门的通信方式进行。而多线程下,同一进程内的线程共享进程的地址空间,一个线程的数据可以直接提供给其他线程使用。有时候,特别是在对临界资源使用时,当临界资源被一个线程占有,如果它终止时不释放占有的临界资源,而...

进程和线程的区别是什么?
1、本质不同 进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元。2、数量不同 同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。3、过程不同 进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它...

【Linux内核|进程管理】0号线程swapper简介
这通常被称为idle状态。这个过程由kernel_init和kernel_execve引导,后者引导用户态的init程序,进一步创建其他进程线程。在概念和初始化阶段,init_task是一个静态结构体,是内核启动的起点。它与task_struct紧密相连,初始化时设置了关键组件,如init_mm内存管理系统、调度器、定时器、...

丹阳市15391942456: Linux 内核的进程是如何管理? -
柳寇赛若: 进程管理负责控制进程对 CPU 的访问,如任务的创建、调度和终止等.任务调度是进 程管理最核心的工作,由 Linux 内核调度器来完成.Linux 内核调度器根据进程的优先级选择最值得运行的进程.一个进程的可能状态有如下几种:(1) 运行...

丹阳市15391942456: linux 下 进程和线程的定义和关系. -
柳寇赛若: 1.进程: 执行中的目标代码,正在运行的程序,它不仅包括目标代码,还有数据、资源、状态和虚拟的计算机.在linux中,最常见的可执行格式是elf.它包括元数据和多个代码和数据段.常见的数据段有data段,text段和bss段,每个段都存放着不同的数据.2:一个进程有一个或多个线程,它是执行进程的目标代码和维护进程状态的,它是进程的最小执行单元.它包含了堆栈,cpu状态和目标代码的位置信息.

丹阳市15391942456: Linux如何进行进程调度?引入线程机制后,进程管理内容包括哪些? -
柳寇赛若: 进程调度的算法有很多,简单来说就是每个进程都有一个自己的时间片,时间到了,就会被挂起,然后系统挑选下一个合适的进程来执行.至于谁合适,那就要看算法了,优先级,是不是饥饿,I/O型还是运算型,都要考虑的.调度算法比较复杂庞大,不是这里说的清楚的.进程切换的过程大概就是保存当前上下文,也就是各种寄存器的状态,包括指令寄存器.然后把下一个进程的上下文加载上来.有了线程机制之后,进程管理主要管理线程之间的数据共享,管理进程地址空间,进程的交换空间.因为这些资源是属于进程的,线程之间是共享的.现代操作系统调度基本是围绕线程进行的,进程更多的是起到资源管理分配的作用.

丹阳市15391942456: Linux中进程和线程的对比与区别 -
柳寇赛若: 线程和进程是另一对有意义的概念,主要区别和联系如下:进程是操作系统进行资源分配的基本单位,拥有完整的进程空间.进行系统资源分配的时候,除了CPU资源之外,不会给线程分配独立的资源,线程所需要的资源需要共享.线程是进程的一部分,如果没有进行显示的线程分配,可以认为进程是单线程的;如果进程中建立了线程,则可认为系统是多线程的.多线程和多进程是两种不同的概念.多线程与多进程有不同的资源共享方式.进程有进程控制块PCB,系统通过PCB对进程进行调度.进程有线程控制块TCP,但TCB所表示的状态比PCB要少的多.

丹阳市15391942456: Linux进程的管理策略是怎样的?
柳寇赛若: [1]中文名等待队列特点进程所组成的队列系统linux系统条件需要其他事件的发生1操作方法2使用案例等待队列操作方法编辑linux中的进程在系统执行的过程中会根据环境的不同而分成不同的状态

丹阳市15391942456: linux操作系统主线程如何创建子线?linux操作系统主线程如
柳寇赛若: 1、根据Linux进程管理的机制,不管是否给子线程传递值,子线程创建完毕后,都会得到执行; 2、主线程和子线程之间可以通过信号量、互斥量等方法进行同步; 网络红人林少瑾解答.

丹阳市15391942456: 线程与进程的关系? -
柳寇赛若: 进程是资源管理的最小单位,线程则是程序执行的最小单位.打个比方,进程是一个细胞,线程就相当于元素.

丹阳市15391942456: Linux如何实现进程管理 -
柳寇赛若: 管理系统进程还是自己派生出来的进程, 是讲述系统的进程管理原理吗?如果是实现自己的进程管理的话,可以采用派生子进程,然后通过消息队列、管道、共享内存区管理子进程 系统的进程实现原理很复杂的

丹阳市15391942456: linux里面,进程与线程到底有什么本质的区别? -
柳寇赛若: 在多进程情况下,每个进程都有自己的独立空间,而多线程情况下,同一进程内的线程共享进程的空间地址.因此,创建一个新的进程时就要耗费时间来为其分配系统资源,而创建一个新的线程花费的时间要少的多 在系统调度方面,由于进程地址空间独立而线程共享地址空间,线程间的切换速度要远远快于进程间的切换 在通信机制方面,进程间数据相互独立,彼此间通信要以专门的通信方式进行,通信时必须经过操作系统,而线程是数据共享的.

丹阳市15391942456: 内核进程管理方法 -
柳寇赛若: 1、支持线程的计算机系统里面,进程作为资源分配的基本单位而存在,线程作为调度的基本单位而存在.线程仅拥有必不可少的一些资源,如:一组寄存器、堆栈信息等等和其他线程共享同一个进程的所有资源.所以,在同一个进程的线程切换时不需要大量的保存和恢复工作,同时由于共享同一个存储空间,不需要更新快表TLB,提高了系统性能. 线程的实现方法有三种:1、用户级线程;2、内核级线程;3、混合线程模型.Linux内核中的进程和线程都用相同的数据结构task_struct表示;线程是特殊的进程,共享同一地址空间、共同合作.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网