线程概念及多线程控制

多线程:

多进程:可以同时处理数据(并发/并行)

多线程:可以同时处理数据(并发/并行)

线程概念:

多进程任务处理(使用的是多个虚拟地址空间):将多个任务分解为多个程序(分解到多个进程中完成)。

多线程任务处理:多个pcb 共用同一个虚拟地址空间,同时完成一个代码段中多个不同模块的功能。

进程的理解:只有一个线程的进程

线程的理解:

1.在传统操作系统中进程就是一个运行中程序中的描述信息 ——>pcb,控制程序的运行

2.linux中并没有为线程设计一个tcb 来控制线程的运行

3.在linux下线程以进程pcb 实现,也就是说,在Linux下pcb 实际是一个线程。

(因此linux下线程:也叫轻量级进程)

(linux下进程:实际是一个线程组——包含一个/多个线程)

因为cpu 调度程序运行是调度pcb ,因此线程时cpu 调度的基本单位

因为一个程序运行起来会分配大量资源给线程组,因此进程是资源分配的基本单位

vfork 因为创建的子进程与父进程共用通过一个虚拟地址空间,因此不能同时运行

而为什么多线程不会出现这个问题?

同一个进程的线程之间独有的数据:

1.栈

2.寄存器(cpu 上的硬件)

3.errno (错误编号)

4.信号屏蔽字(信号阻塞集合)

5.线程id(线程标识符)

同一个进程的线程之间共享的数据:

1.数据段,代码段

2.文件描述符表

3.信号的处理方式

4.工作路径

5.用户id ,组id

多线程与多进程都可以并发完成任务哪一个更好?(分析优缺点,视使用场景而定)

多线程的优点:共享同一个虚拟地址空间

1.线程间的通讯更加方便

2.线程的创建销毁成本更低

3.同一个进程间的线程调度成本更低

4.执行力度更加细致

多线程的缺点:

1.缺乏访问控制,健壮性低:一些系统调用或异常,针对整个进程产生效果

共同优点:都可以并发/并行处理任务,提高处理效果

cpu 密集程序:程序中都是大量的运算操作

io 密集程序:程序中都是大量的io 操作

共同缺点:对临界资源操作需要考虑更多,编码更加复杂

多进程的使用场景:

对主进程安全都要度特别高——shell(多进程的使用要比多线程安全)

线程控制:

线程创建:

线程控制接口:因为操作系统并没有提供直接创建一个线程的接口,就封装了一套线程接口。因此有人称

创建的线程是一个用户态线程,在内核中对应有一个轻量级进程调度程序运行

int pthread_create(pthread_t *thread, const pthread_sttr_t *attr,

void *(*start_routine)(void *), void *arg);

thread:输出型参数,用于获取新创建的线程id

attr:线程属性通常置空

start_routine:线程入口函数

arg:传递给线程的参数

返回值:成功返回0;失败返回:错误编号(errno)

每一个线程都有一个pcb-task——struct 都有一个pid,但是用户使用ps -ef命令查看进程的时候只有一个进程,

也只有一个进程pid

查看信息:ps -eflL | head -n 1 && ps -eflL | grep create

LWP:task_struct -> pid

PID:task_struct -> tgid(线程组id)    默认==线程组中主线程pid==进程id

tid:首地址(共享区中线程地址空间的首地址)

线程终止:

线程入口函数中 return, 如果在main 函数中 return 则退出整个进程

void pthread_exit(void* retval) :退出调用线程 retval 一般为NULL(谁调用谁退出)

线程退出也会形成僵尸进程,因为线程退出也要保存自己的退出返回值

线程退出,也会保存退出返回值,而成为僵尸进程

主线程退出,进程并不会退出。

取消指定的线程:(被动推出)

int pthread_cancel(pthread_t thread)

thread —>

课后调研:

能不能取消自己?

如果一个线程取消则返回值是多少?

线程等待:获取指定退出线程的返回值,并且允许操作系统回收线程资源

一个线程启动后默认右一个属性是线程处于joinable状态

*处于joinable状态的线程,退出后,不会自动释放资源,需要被其他线程等待

int pthread_join(pthread_t thread, void **retval);

功能:等待线程退出,获取返回值,回收线程资源

前提:这个等待的线程必须处于joinable状态

pthread-> 指定的线程id

retval-> 获取线程的退出返回值

返回值

成功:0  失败:错误编号(errno)

线程分离:(设置线程的属性从 joinable 变成 detach 属性)

功能:分离一个线程,线程退出后系统将自动回收资源,被分离的线程无法被等待,若是非要pthread_join则会报错返回

int pthread_detach(pthread_t thread);->可以在任意位置调用

thread:要被分离的线程id

注意:线程被分离的前提是用户不关心线程的退出返回值

*处于detach状态的线程退出后自动回收资源,不需要被等待

*线程默认的属性是joinable

原文地址:https://www.cnblogs.com/cuckoo-/p/11409967.html

时间: 2024-10-15 08:47:15

线程概念及多线程控制的相关文章

11.2 线程概念

典型的UNIX程序被认为是单线程控制的:每一个进程在一个时刻仅仅做一件事:引入多线程以后,我们可以在单个进程内设计程序同时执行多个任务,该方法有如下几个好处: 我们可以简化异步时间处理的程序的设计:对于每一种时间类型非配一个单独的线程,每一个线程都可以使用同步模型来处理事件,同步编程模型比异步编程模型更加简单. 多进程要实现内存和文件描述符共享需要使用操作系统提供的复杂机制,这一点将在第15章和17章中看到,相反,线程,自动便拥有了同一地址空间内的内存与文件描述符的访问权限. 一些程序可以被分化

线程概念简介 什么是线程 多线程上篇(七)

操作系统为了程序的并发执行引入了进程的概念,提高了资源的利用率以及吞吐量. 在20世纪 60年代人们提出了进程的概念后,在OS中一直都是以进程作为能拥有资源和独立运行的基本单位的. 直到 20 世纪 80 年代中期,人们又提出了比进程更小的能独立运行的基本单位——线程(Threads) 试图用它来提高系统内程序并发执行的程度,从而可进一步提高系统的吞吐量. 简言之,进程的概念,使之能够并发执行多道程序,线程的概念让你更好地并发执行程序,一个是能不能的问题,一个是更好的问题. 线程与进程对比 线程

Java 多线程 编程 教程 线程的运行与控制

在多个线程同时运行时,就存在多个线程之间的调度控制.资源分配等.本节就来讲解线程使用中的一系列控制命令和使用方法 线程的启动start().join()与停止stop() 线程的休眠sleep().挂起yield 线程的同步synchronized 线程的同步锁机制:wait().notify()和notifyAll() start()启动线程,当线程创建之后,利用start方法启动线程.此外还可以利用join方法让线程立即执行 sleep()让当前线程暂停一段时间之后继续执行.sleep()方

进程控制概念简介 多线程上篇(三)

进程控制 进程的基本数据信息是操作系统控制管理进程的数据集合,这些信息就是用来控制进程的,此处我们说的进程控制就是进程的管理. 比如进程有状态,那么进程的创建.终止,状态的切换,这都不是进程自主进行的,都是通过操作系统进行管理的 如下图所示,所有的相关数据都是操作系统用来管理维护进程的 操作系统抽象出进程概念的核心是为了运行程序 所以进程的执行态是最为核心的 其他的状态则是为了更好的控制管理进程以及进程的并发执行而附加的 所以,一定程度上来讲,操作系统对于进程的控制,可以认为是对于进程的不同状态

线程概念及线程的同步与互斥

线程概念:它是运行在进程内部的的一个基本执行流,多线程的控制流程可以长期并存,一个进程中的数据段和代码段都是被该进程中的多个线程共享的,若定义一个函数,每个线程都可以调用,若定义一个全局变量,每个线程都可以访问. 线程还共享进程的以下内容:1.文件描述符表 2.当前的工作目录 3.用户id(uid)和组id(gid) 4.每种信号的处理方式. 但每个线程还必须有自己的私有部分:1.线程id 2.硬件上下文(硬件寄存器的值,栈指针等) 3.自己的栈空间(运行时的临时数据都要保存在自己的栈空间上)

JAVA线程概念

一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. "同时"执行是人的感觉,在线程之间实际上轮换执行. 二.Java中的线程 在J

进程同步概念简介 多线程上篇(四)

进程同步概念 临界资源 一旦有对资源的共享,就必然涉及竞争限制 比如尽管有两个人去水井打水,但是水井却只有一个:合理安排的话刚好错开,但是如果安排不合理,那就会出现冲突,出现冲突怎么办?总有一个先来后到,等下就好了. 这个水井就是一个临界资源 临界资源用来表示一种公共资源或者说是共享数据,可以被多个线程使用. 但是每一次,只能有一个线程使用它,一旦临界资源被占用,其他线程要想使用这个资源,就必须等待. 当多进程访问临界资源时,比如打印机 假设A进程和B进程轮流获得CPU时间片执行,A打印数学,B

Java多线程概念简介 多线程中篇(一)

Java的线程与操作系统的线程 在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JDK1.2中,线程模型变为基于操作系统原生线程模型来实现的 所以说Java虚拟机中线程的映射实现,是受制于操作系统的,操作系统支持怎样的线程模型,决定了Java虚拟机中线程的样子. 虚拟机规范中也并未限定Java线程需要使用哪种线程模型来实现. 线程模型只对线程的并发规模和操作成本产生影响,对Java程序

C#为什么多线程控制winform需要用委托?

C#(C#培训 )为什么多线程控制winform需要用委托?比如我新起了一个线程A,在A线程里要对winform的list控件里显示数据,我需要用一个委托函数来实现. 因为winform是主线程创建的,你用另外一个线程来调用它就可能会出现两个线程同时访问同一个资源的问题,这个时候很容易出现错误,比如A线程改变窗口的颜色为红色,B线程取窗口的颜色,如果这两个线程正好碰到一起,可能A略先于B,那么就是B取出来的红色,如果略后于那么就是原来的颜色,而这和CPU的繁忙度.时间片的轮转是相关的,是一种随机