当前位置:首页 » 操作系统 » linux线程的属性

linux线程的属性

发布时间: 2022-05-25 12:05:18

linux有线程的概念吗

一般情况下。都存在线程的概念,但是实际的内容是被虚拟化的,为的是多进程,多任务等情况的发生,如果一个系统不能多任务,那么可以认为是没有多线程这概念

⑵ linux 程序 进程 线程 区别 求简介 一定采纳 浅白一点

1.程序是一组指令的有序集和
2.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位
3.线程是进程的一个实体,是cpu调度和分配的基本单位,它是比进程更小的能独立运行的基本单位。
具体区别可以查看豆丁网(“linux 程序 进程 线程 区别”)
网络下就有。

⑶ 麻烦解释一下linux下进程和线程有什么区别和联系,linux下多线程和多进程通信的实现方法,请通俗解释

兄弟看到你这么高的分我就找了些资料:也算是对昨天学的知识总结一下吧
一、先说概念不管是windows还是linux下的进程和线程概念都是一样的,只是管理进程和线程的方式不一样,这个是前提,到时候你可别问我windows下进程和线程啊。这个涉及到操作系统原理。下面给你解答。
说道进程不得不提作业这个名词 ,我想兄弟你电脑里不会有一个程序吧对不?当你的系统启动完毕后你看看你的任务管理器里是不是有很多进程呢?那么多程序是怎么调如内存呢?能理解吗?这里要明白程序和进程的关系,程序是你磁盘上的一个文件,当你需要它时进入内存后才成为进程,好比QQ在磁盘上就是一个文件而已,只有进入了内存才成为进程,进程是活动的。QQ要扫描你文件啊,记录你聊天记录啊,偷偷上传个啥东西什么的你也不知道对不,他是活动的。这个能明白吗?
再看作业,这个作业可不是你写作业的那个作业啊。系统一看好家伙你个QQ那么大的家伙你想一下子进入内存啊?没门!慢慢来嘛,系统就把QQ程序分为好几块,这几块不能乱分的,要符合自然结构就是循环啦选择啦这样的结构,你把人家循环结构咔嚓截断了,怎么让人家QQ运行啊?这就是作业要一块一块的进入内存,同时要为作业产生JCB(JOB CONTROL BLOCK)作业控制块,你进入内存不能乱跑啊,要听系统的话,你要是进入系统自己的内存。框一下,内存不能读写 对话框就出来了,严重点直接蓝脸给你!你懂得。这是window下的,linux下直接给你报错!没事了就!所一系统通过jcb控制进程。JCB包含了进程号优先级好多内容,你打开你的windows任务管理器看看进程是不是有好多属性啊?那就是PCB(PRCESS,CONTROL BLOCK)同理作业也包含那些内容只是多少而已。下面写出进程特点:
1、进程是分配计算机资源最小的单位。你想啊人是要用程序干活的吧?你把程序调入内存成了就成了进程,所以说进程是分配资源的最小单位。你在linux下打开终端输入top命令看是不是有好多进程?
2、进程有操作系统为作业产生。有“父进程”产生“子进程”之间是父子关系,并可以继续向下产生“子进程”。还拿QQ来说,你双击QQ.exe。QQ启动了输入账号密码打开主界面了。这时候你要聊天,QQ进程赶紧产生个“儿子”说 “儿子你去陪主人聊天去吧。这样子进程产生了。突然你想看美女要传照片这时候那个”儿子“有”生“了一个”儿子“说”儿子“你去传照片。那个“儿子领到任务去传照片了。这时你想关了QQ,QQ提示你说”你还有个“儿子”和“孙子”还在干活呢你真要结束吗?你蒽了确定。QQ对他“儿子”(你聊天窗口)说:”儿子啊对不起了,主人要关闭我你也不能活啊“咔嚓一下”儿子“死了,儿子死之前对他儿子说:“儿子啊你爷爷不让我活了,你也别活了咔嚓孙子也死了。最后世界安静了。这就是进程的父子关系。能明白吗?记住:进程之活动在内存中。不能使用CPU,只管分配资源。
再说线程:线程也产生在内存中并且在内存中存在相当长的时间,但它的活动区域主要在CPU中,并且运行和灭亡都存在于CPU中,可以这么说,线程是程序中能被系统调度进入CPU中最小程序单位,它能直接使用进程分配的CPU的资源。
还拿QQ来说当你要传文件时QQ总要判断一下文件的扩展名吧,ok这时那个”儿子“赶紧对它爸爸说我需要一个线程判断扩展名QQ赶紧对一个管这个的线程说:”快点去CPU里计算下那个扩展名是什么然后向主人报告计算完了就“死了”消亡了,但是它的线程还在内存中!还等着你下一次传文件然后计算然后消亡!
线程之间是相互独立的。一个在CPU,一个在内存里还能有关系吗对不?CPU在每一个瞬间只能进入一个线程,当线程进入CPU时立即产生一个新的线程,新线程仍停留在内存中,就好比上面那个传文件还会等着你再传文件再计算扩展名。
线程相对线程是独立的,但它在内存中并不是独立的,这就好比你不开QQ能用QQ传输文件吗?它只存在与进程分配的资源中,也就是说计算扩展名这个线程只能停留在QQ这个进程中,不能跑到别的进程里!!相当于程序产生了新的进程和线程,进程向CPU申请资源,再有线程来使用,他们都是为程序服务的只是分工不同!
因为你没提问linux下是怎么管理进程和线程的所以我就不回答了,这个问题我建议你还是看看《笨兔兔的故事》里面讲到了linux是怎么管理进程和线程的。挺幽默的比我说得还好。
你第二个问题说实话我回答不了你!我想你现在连进程和线程还没理解第二个你更理解不了了你说对不?我猜的其实你用C/C++不管是在windows下编程还是在Linux下编程思想都是一样的对吧,如果你理解了在windows下线程间通信,在linux更没问题了!
参考资料:黑客手册2009合订本非安全第一二季244页,245页,328页,329页,398页,399页
浅谈操作系统原理 (一 二三)
ubuntu中文论坛 笨兔兔的故事
http://forum.ubuntu.org.cn/viewtopic.php?f=120&t=267518
希望我的回答你能理解

⑷ linux里面,进程与线程到底有什么本质的区别

线程:是进程中执行的一条路径,是系统调度的最小单位。

进程:是正在运行的程序,是系统分配资源的最小单位。

线程与进程关系

1.一个进程可以有多个线程,一个线程只能属于一个进程。

2.同一个进程下的所有线程共享该进程下的所有资源。

3.真正在处理机上运行的是线程,不是进程,线程是进程内的一个执行单元,是进程内的可调度实体。

Linux线程与进程区别

进程:

优点:多进程可以同时利用多个CPU,能够同时进行多个操作。

缺点:耗费资源(创建一个进程重新开辟内存空间)。

进程不是越多越好,一般进程个数等于cpu个数。

线程:

优点:共享内存,尤其是进行IO操作(网络、磁盘)的时候(IO操作很少用cpu),可以使用多线程执行并发操作。

缺点:抢占资源。

⑸ linux下线程属性常用操作有哪些

LinuxThread的线程机制

LinuxThreads是目前Linux平台上使用最为广泛的线程库,由Xavier Leroy ([email protected]) 负责开发完成,并已绑定在GLIBC中发行。它所实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的 管理在核外函数库中实现。

1.线程描述数据结构及实现限制

LinuxThreads定义了一个struct _pthread_descr_struct数据结构来描述线程,并使用全局数组变量 __pthread_handles来描述和引用进程所辖线程。在__pthread_handles中的前两项,LinuxThreads定义了两个全 局的系统线程:__pthread_initial_thread和__pthread_manager_thread,并用 __pthread_main_thread表征__pthread_manager_thread的父线程(初始为 __pthread_initial_thread)。

struct _pthread_descr_struct是一个双环链表结构,__pthread_manager_thread所在的链表仅包括它 一个元素,实际上,__pthread_manager_thread是一个特殊线程,LinuxThreads仅使用了其中的errno、p_pid、 p_priority等三个域。而__pthread_main_thread所在的链则将进程中所有用户线程串在了一起。经过一系列 pthread_create()之后形成的__pthread_handles数组将如下图所示:

图2 __pthread_handles数组结构

新创建的线程将首先在__pthread_handles数组中占据一项,然后通过数据结构中的链指针连入以__pthread_main_thread为首指针的链表中。这个链表的使用在介绍线程的创建和释放的时候将提到。

LinuxThreads遵循POSIX1003.1c标准,其中对线程库的实现进行了一些范围限制,比如进程最大线程数,线程私有数据区大小等等。在 LinuxThreads的实现中,基本遵循这些限制,但也进行了一定的改动,改动的趋势是放松或者说扩大这些限制,使编程更加方便。这些限定宏主要集中 在sysdeps/unix/sysv/linux/bits/local_lim.h(不同平台使用的文件位置不同)中,包括如下几个:

每进程的私有数据key数,POSIX定义_POSIX_THREAD_KEYS_MAX为128,LinuxThreads使用 PTHREAD_KEYS_MAX,1024;私有数据释放时允许执行的操作数,LinuxThreads与POSIX一致,定义 PTHREAD_DESTRUCTOR_ITERATIONS为4;每进程的线程数,POSIX定义为64,LinuxThreads增大到1024 (PTHREAD_THREADS_MAX);线程运行栈最小空间大小,POSIX未指定,LinuxThreads使用 PTHREAD_STACK_MIN,16384(字节)。

2.管理线程

"一对一"模型的好处之一是线程的调度由核心完成了,而其他诸如线程取消、线程间的同步等工作,都是在核外线程库中完成的。在LinuxThreads 中,专门为每一个进程构造了一个管理线程,负责处理线程相关的管理工作。当进程第一次调用pthread_create()创建一个线程的时候就会创建 (__clone())并启动管理线程。

在一个进程空间内,管理线程与其他线程之间通过一对"管理管道(manager_pipe[2])"来通讯,该管道在创建管理线程之前创建,在成功启动 了管理线程之后,管理管道的读端和写端分别赋给两个全局变量__pthread_manager_reader和 __pthread_manager_request,之后,每个用户线程都通过__pthread_manager_request向管理线程发请求, 但管理线程本身并没有直接使用__pthread_manager_reader,管道的读端(manager_pipe[0])是作为__clone ()的参数之一传给管理线程的,管理线程的工作主要就是监听管道读端,并对从中取出的请求作出反应。

创建管理线程的流程如下所示:
(全局变量pthread_manager_request初值为-1)

图3 创建管理线程的流程

初始化结束后,在__pthread_manager_thread中记录了轻量级进程号以及核外分配和管理的线程id, 2*PTHREAD_THREADS_MAX+1这个数值不会与任何常规用户线程id冲突。管理线程作为pthread_create()的调用者线程的 子线程运行,而pthread_create()所创建的那个用户线程则是由管理线程来调用clone()创建,因此实际上是管理线程的子线程。(此处子 线程的概念应该当作子进程来理解。)

__pthread_manager()就是管理线程的主循环所在,在进行一系列初始化工作后,进入while(1)循环。在循环中,线程以2秒为 timeout查询(__poll())管理管道的读端。在处理请求前,检查其父线程(也就是创建manager的主线程)是否已退出,如果已退出就退出 整个进程。如果有退出的子线程需要清理,则调用pthread_reap_children()清理。

然后才是读取管道中的请求,根据请求类型执行相应操作(switch-case)。具体的请求处理,源码中比较清楚,这里就不赘述了。

3.线程栈

在LinuxThreads中,管理线程的栈和用户线程的栈是分离的,管理线程在进程堆中通过malloc()分配一个THREAD_MANAGER_STACK_SIZE字节的区域作为自己的运行栈。

用户线程的栈分配办法随着体系结构的不同而不同,主要根据两个宏定义来区分,一个是NEED_SEPARATE_REGISTER_STACK,这个属 性仅在IA64平台上使用;另一个是FLOATING_STACK宏,在i386等少数平台上使用,此时用户线程栈由系统决定具体位置并提供保护。与此同 时,用户还可以通过线程属性结构来指定使用用户自定义的栈。因篇幅所限,这里只能分析i386平台所使用的两种栈组织方式:FLOATING_STACK 方式和用户自定义方式。

在FLOATING_STACK方式下,LinuxThreads利用mmap()从内核空间中分配8MB空间(i386系统缺省的最大栈空间大小,如 果有运行限制(rlimit),则按照运行限制设置),使用mprotect()设置其中第一页为非访问区。该8M空间的功能分配如下图:

图4 栈结构示意

低地址被保护的页面用来监测栈溢出。

对于用户指定的栈,在按照指针对界后,设置线程栈顶,并计算出栈底,不做保护,正确性由用户自己保证。

不论哪种组织方式,线程描述结构总是位于栈顶紧邻堆栈的位置。

4.线程id和进程id

每个LinuxThreads线程都同时具有线程id和进程id,其中进程id就是内核所维护的进程号,而线程id则由LinuxThreads分配和维护。

⑹ linux中的线程有哪几种状态

就绪:线程分配了CPU以外的全部资源,等待获得CPU调度
执行:线程获得CPU,正在执行
阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列
挂起:由于终端请求,操作系统的要求等原因,导致挂起。

⑺ linux 线程可以使用进程的哪些资源

Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的。而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出,则最终线程资源耗尽,进程将不再能建立新的线程。
解决这个问题,有2种方式,系统自动释放线程资源,或者由另一个线程释放该线程资源。
注意,在这里,我认为进程运行后,本身,也是一个线程,主线程,主线程和主线程建立的线程共享进程资源。不同于其他线程,在于主线程运行结束后,程序退出,所有程序建立的线程也会退出。
系统自动释放
如果想在线程结束时,由系统释放线程资源,则需要设置线程属性为detach。
代码上,可以这样表示:
pthread_t t;
pthread_attr_t a; //线程属性
pthread_attr_init(&a); //初始化线程属性
pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED); //设置线程属性
::pthread_create( &t, &a, GetAndSaveAuthviewSDRStub, (void*)lp); //建立线程
其他线程释放
另一种方式,则是由另一个线程将该资源释放。
代码上,可以这样表示:
pthread_t t;
::pthread_create( NULL, NULL, GetAndSaveAuthviewSDRStub, (void*)lp);
::pthread_join( t);

⑻ 有人能教下我有关linux里面线程的知识吗

.线程的基本介绍
(1)线程的概述
线程与进程类似,也允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程,同一程序中的所有线程共享同一份全局内存区域,线程之间没有真正意义的等级之分。同一个进程中的线程可以并发执行,如果处理器是多核的话线程也可以并行执行,如果一个线程因为等待I/O操作而阻塞,那么其他线程依然可以继续运行
(2)线程优于进程的方面

argv,environ

主线程栈
线程3的栈
线程2的栈
线程1的栈
共享函数库共享的内存

未初始化的数据段
初始化数据段
文本
.进程间的信息难以共享。由于除去只读代码段外,父子进程并未共享内存,因此必须采用一些进程间通讯,在进程之间交换信息
.调用fork()来创建进程代价相对较高
线程很好的解决了上述俩个问题
.线程之间能够方便,快速的共享信息,只需将数据复制到共享(全局或堆)变量中即可
.创建线程比创建线程通常要快10甚至更多,线程创建之所以快,是因为fork创建进程时所需复制多个属性,而在线程中,这些属性是共享的。
(3)创建线程
启动程序时,产生的进程只有单条线程,我们称之为主线程
#include<pthread.h>
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*start)(void *),void *arg);12

新线程通过调用带有arg的函数开始执行,调用pthread_create()的线程会继续执行该调用之后的语句。
(4)终止线程
可以以如下方式终止线程的运行
.线程调用pthread_exit()
.线程start函数执行return语句并返回指定值
.调用pthread_cancel()取消线程
.任意线程调用了exit(),或者主线程执行了return语句,都会导致进程中的所有线程立即终止
pthread_exit()函数可以终止线程,且其返回值可由另一线程通过调用pthread_join()获得
#include<pthread.h>void pthread_exit(void *retval);12

调用pthread_exit()相当于在线程的start函数中执行return,不同之处在于,pthread_exit()可以在任何地方调用,参数retval指定了线程的返回值
(5)获取线程ID
#include<pthread.h>pthread_t pthread_self(void);12

线程ID在应用程序中主要有如下用途
.不同的pthreads函数利用线程ID来标识要操作目标线程。
.在具体的应用程序中,以特定线程的线程ID作为动态数据结构的标签,这颇有用处,既可用来识别某个数据结构的创建者或属主线程,又可确定随后对该数据结构执行操作的具体线程
函数pthread_equal()可检查俩个线程的ID是否相同
#include<pthread.h>int pthread_equal(pthread_t t1,pthread_t t2);//如果相同返回非0值,否则返回0123

(6)连接已终止的线程
函数pthread_join()等待由thread表识的线程终止
#include<pthread.h>int pthread_join(pthread_t thread,void **retval);//返回0调用成功,否则失败123

如果pthread_join()传入一个之前已然连接过的线程ID,将会导致无法预知的行为,当相同线程ID在参与一次连接后恰好为另一新建线程所重用,再度连接的可能就是这个新线程
若线程未分离,则就应该使用pthread_join()来连接线程,否则会产生僵尸线程
pthrea_join()函数的要点
.线程之间的关系是对等的,所以任意线程都可以调用pthread_join()来连接其他线程
.pthread_join()无法针对任意线程,只能连接单个线程
(6)线程的分离
默认情况下线程都是可连接的,但有时候,我们并不关心线程退出的状态,我们可以调用pthread_detach()并向thread参数传入指定线程的的标识符,将该线程标记为处于分离状态
#include<pthread.h>int pthread_detach(pthread_t thread);//返回0成功,否则失败123

一旦线程处于分离状态,就不能在使用pthread_join()来获取其状态,也无法使其重返可连接状态
(7)在应用程序中如何来选择进程还是线程
.线程之间共享数据很简单,进程间的数据共享需要更多的投入
.创建线程要比创建进程块很多
.多线程编程时,需要确保调用线程安全的函数
.某个线程中的bug可能会危害进程中所有线程
.每个线程都在征用宿主进程中有限的虚拟地址空间
.在多线程应用中,需要小心使用信号
.除了数据,线程还可以共享文件描述符,信号处置,当前工作目录,以及用户ID和组ID
线程的同步
(1)保护共享变量访问:互斥量
线程的主要优势在于能够通过全局变量来共享信息,不过这种共享是有代价的。必须确保多个线程修改同一变量时,不会有其他线程也正在修改此变量,为避免线程更新时共享变量时所出现的问题,必须使用互斥量来确保同时仅有一个线程可以访问某项共享资源
(2)静态分配的互斥锁
互斥锁既可以像静态变量那样分配,也可以在运行时动态分配,互斥量属于pthread_mutex_t类型的变量,在使用之前必须对其初始化。对于静态分配的互斥量而言,可如下例所示,将PTHREAD_MUTEX_INITIALIZER赋给互斥量
pthread_mutex_t = PTHREAD_MUTEX_INITIALIZER;1

1.加锁和解锁互斥量
初始化之后,互斥量处于未锁定状态。函数pthread_mutex_lock()可以锁定某一互斥量
而函数pthread_mutex_unlock()则可以将一个互斥量解锁
#include<pthread.h>int pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_unlock(pthread_mutex_t *mutex);//返回0成功,其他失败1234

要锁定互斥量,在调用pthread_mutex_lock()时需要指定互斥量,如果互斥量当前处于未锁定状态,则该调用将会立即返回,如果该互斥量已被其他线程锁定,那么该调用将会阻塞,直至互斥量被解锁
函数pthread_mutex_unlock()将解锁之前已遭调用线程锁定的互斥量
2.互斥量的性能
通常情况下,线程会花费更多的时间去做其他工作,对互斥量的加锁解锁相对要少的多,因此使用互斥量对大部分程序来说性能并无显着的影响
3.互斥量的死锁
当一个线程需要同时访问多个共享资源时,没个资源由不同的互斥索管理。当超过一个线程加锁同一组互斥量时,就有可能发生死锁。如下图所示
线程A
1.pthread_mutex_lock(mutex1);
2.pthread_mutex_lock(mutex2);
线程2
1.pthread_mutex_lock(mutex2);
2.pthread_mutex_lock(mutex1);
每个线程都成功的锁住一个互斥量,接着试图对以为另一线程锁定的互斥量加锁,就会一直等下去
要避免此类死锁问题,最简单的就是定义互斥量的层级关系

⑼ 在Linux下怎么修改当前线程的优先级

注意:尽量不要修改系统默认优先级

Thread类与线程优先级相关的属性和方法:

MAX_PRIORITY : 线程可以具有最高优先级
MIN_PRIORITY : 线程可以具有的最低优先级
NORM_PRIORITY : 分配给线程的默认优先级
getPriority() : 获得线程的优先级
setPriority() : 修改线程的优先级

java">importjava.util.Scanner;

{

publicstaticThread[]getThreads(){
ThreadGroupgroup=Thread.currentThread().getThreadGroup();
Thread[]threads=newThread[group.activeCount()];
group.enumerate(threads);
System.out.println("线程ID "+"线程名称 "+"线程优先级");
for(Threadthread:threads){
System.out.println(thread.getId()+" "+thread.getName()+" "+thread.getPriority());;

}
returnthreads;

}
publicstaticStringinput(){
Scannersc=newScanner(System.in);
Stringstr=sc.nextLine();
returnstr;
}

(Thread[]threads){
System.out.println("请输入您要修改的线程的ID");
inti=Integer.parseInt(input());
intcount=-1;
for(Threadthread:threads){
if(thread.getId()==i){
System.out.println("请输入您要修改成的优先级别:");
intpriroty=Integer.parseInt(input());
thread.setPriority(priroty);
break;
}else{
count++;
}
}
if(count==threads.length-1){
System.out.println("找不到您要的线程");
}
getThreads();

}
publicstaticvoidmain(String[]args){
modifyPriority(getThreads());
}
}

⑽ linux中线程有哪些属性

线程的资源是共享的,进程的资源是分开的。多个线程同时访问一块资源时一定要注意不能冲突,可以用信号量和锁的思想来解决反问同一个资源问题。

热点内容
html5显示数据库数据 发布:2024-10-27 07:24:20 浏览:335
传奇电脑服务器多少钱 发布:2024-10-27 07:14:28 浏览:516
巴麻美学姐解压密码 发布:2024-10-27 07:13:01 浏览:106
华为云侧服务器 发布:2024-10-27 07:11:40 浏览:43
鸿洋android 发布:2024-10-27 07:01:26 浏览:321
mac清除ps缓存 发布:2024-10-27 06:50:51 浏览:849
怎么把手机鸿蒙系统退回安卓 发布:2024-10-27 06:42:58 浏览:262
电脑联网服务器超时什么意思 发布:2024-10-27 06:42:20 浏览:584
ua是脚本吗 发布:2024-10-27 06:34:07 浏览:846
传奇变量脚本 发布:2024-10-27 06:33:34 浏览:635