为什么引入线程

为什么引入线程,第1张

问题一:为什么要在 *** 作系统中引入线程 您好:

在多道程序环境下,程序的执行属于并发执行,此时它们将失去其封闭性。并具有间断性及不可再现性的特征。这就决定了通常的程序是不能并发执行的而程序的顺序执行使系统资源利用率低,为此引入线程

问题二:为什么要在os中引入线程 线程可以增加并发的程度啊。其实多进程也是可以并发,但是为什么要是线程呢?因为线程是属于进程的,是个轻量级的对象。所以再切换线程时只需要做少量的工作,而切换进程消耗很大。这是从 *** 作系统角度讲。 从用户程序角度讲,有些程序在逻辑上需要线程,比如扫雷,它需要一个线程等待用户的输入,另一个线程的来更新时间。还有一个例子就是聊天程序,一个线程是响应用户输入,一个线程是响应对方输入。如果没有多线程,那么只能你说一句我说一句,你不说我这里就不能动,我还不能连续说。所以用户程序有这种需要, *** 作系统就要提供响应的机制

问题三:客户端为什么要引入多线程 不用多线程的话

就会卡死

线程执行堵塞式的 *** 作

就是这个 *** 作未开始或未结束你都不能做任何事情

问题四:为什么在 *** 作系统中要引入线程 在多道程序环境下,程序的执行属于并发执行,此时它们将失去其封闭性。并具有间断性及不可再现性的特征。这就决定了通常的程序是不能并发执行的而程序的顺序执行使系统资源利用率低,为此引入线程

问题五:在多线程中,为什么要引入同步机制 不加入线程的同步,可能导致冲突异常,不应该访问的,被访问,或者数据被无故修改

问题六:java在多线程中为什么要引入同步机制 不同步会造成数据访问混乱达不到目的效果:比如

某一趟火车卖的坐票是确定的吧? 如果没有同步的话 因为每一个卖票的窗口就相当与一个线程,就会出现同一时间多出窗口卖出同一张票。。。。。。。

如果有了同步就好比多了一道验证:一旦有线程(窗口)在执行卖票这段程序时其他线程(窗口)就先得这个线程(窗口)执行完才能执行。。。

问题七:线程与实际运行程序的区别,为什么要引入线程 在多道程序环境下,程序的执行属于并发执行,此时它们将失去其封闭性。并具有间断性及不可再现性的特征。这就决定了通常的程序是不能并发执行的而程序的顺序执行使系统资源利用率低,为此引入线程

问题八:在 *** 作系统中引入线程概念的主要目的是处理进程与进程之间的竞争???? 线程是轻量进程,也就是说线程是属于进程的一部分,一个进程里面可以用多个线程,主要目的就是萎了解决进程资源的竞争了。

线程只是进程中的模块,或者更细的部件,不过可以帮助解决进程之间的资源竞争。

问题九:在JAVA中线程到底起到什么作用 这是javaeye上非常经典的关于线程的帖子,写的非常通俗易懂的,适合任何读计算机的同学.

线程同步

我们可以在计算机上运行各种计算机软件程序。每一个运行的程序可能包括多个独立运行的线程(Thread)。

线程(Thread)是一份独立运行的程序,有自己专用的运行栈。线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等。

当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。

同步这个词是从英文synchronize(使同时发生)翻译过来的。我也不明白为什么要用这个很容易引起误解的词。既然大家都这么用,咱们也就只好这么将就。

线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行 *** 作,而不是同时进行 *** 作。

因此,关于线程同步,需要牢牢记住的第一点是:线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行。这可真是个无聊的绕口令。

关于线程同步,需要牢牢记住的第二点是 “共享”这两个字。只有共享资源的读写访问才需要同步。如果不是共享资源,那么就根本没有同步的必要。

关于线程同步,需要牢牢记住的第三点是,只有“变量”才需要同步访问。如果共享的资源是固定不变的,那么就相当于“常量”,线程同时读取常量也不需要同步。至少一个线程修改共享资源,这样的情况下,线程之间就需要同步。

关于线程同步,需要牢牢记住的第四点是:多个线程访问共享资源的代码有可能是同一份代码,也有可能是不同的代码;无论是否执行同一份代码,只要这些线程的代码访问同一份可变的共享资源,这些线程之间就需要同步。

为了加深理解,下面举几个例子。

有两个采购员,他们的工作内容是相同的,都是遵循如下的步骤:

(1)到市场上去,寻找并购买有潜力的样品。

(2)回到公司,写报告。

这两个人的工作内容虽然一样,他们都需要购买样品,他们可能买到同样种类的样品,但是他们绝对不会购买到同一件样品,他们之间没有任何共享资源。所以,他们可以各自进行自己的工作,互不干扰。

这两个采购员就相当于两个线程;两个采购员遵循相同的工作步骤,相当于这两个线程执行同一段代码。

下面给这两个采购员增加一个工作步骤。采购员需要根据公司的“布告栏”上面公布的信息,安排自己的工作计划。

这两个采购员有可能同时走到布告栏的前面,同时观看布告栏上的信息。这一点问题都没有。因为布告栏是只读的,这两个采购员谁都不会去修改布告栏上写的信息。

下面增加一个角色。一个办公室行政人员这个时候,也走到了布告栏前面,准备修改布告栏上的信息。

如果行政人员先到达布告栏,并且正在修改布告栏的内容。两个采购员这个时候,恰好也到了。这两个采购员就必须等待行政人员完成修改之后,才能观看修改后的信息。

如果行政人员到达的时候,两个采购员已经在观看布告栏了。那么行政人员需要等待两个采购员把当前信息记录下来之后,才能够写上新的信息。

上述这两种情况,行政人员和采购员对布告栏的访问就需要进行同步。因为其中一个线程(行政人员)修改了共享资源(布告栏)。而且我们可以看到,行政人员的工作流程和采购员的工作流程(执行代码)完全不同,但是由于他们访问了同一份可变共享资源(布告栏),所以他们之间需要同步。

同步锁

前面讲了为什么要线程同步,下面我们就来看如何才能线程同步。

线程同步的基本实现思路还是比较容易理解的。我们可以给共享资源加一把锁,这把锁只有一把......>>

经典定义:

1.进程是可以并发执行的计算部分

进程的五个特性

1.动态性:创建时产生,由调度而执行,得不到资源而暂停执行,有撤销而消亡

2.并发性:多个进程实体同存于主存中

(引入进程的目的,程序是不能并发执行的)

3.独立性:进程实体是一个能独立运行的基本单位,也是系统中获得资源和独立调度的基本单位

4.异步性:进程按各自独立的,不可预知的速度向前推进(导致程序执行的不可再现性)

5.结构特征:进程实体是由程序段、数据段、进程控制块三部分构成,又称进程映像/进程上下文(context)

进程的基本状态

有些还存在两个额外状态:新状态和终止状态

进程控制块PCB

1.概念:是 *** 作系统用于记录和刻画进程状态及有关信息的 数据结构 ,也是 *** 作系统控制和管理进程的主要依据。

原语:一组系统命令

要么全部执行,要么不执行,不存在中间状态

$$进程创建

\begin{cases}

&\text{系统生成时,会创建一些系统进程(用来分配系统资源和管理工作)}\

&\text{用户作业,由 *** 作系统的作业调度程序为之创建相应的进程}

\end{cases}$$

1.既可撤销具有指定标识符的过程,又可撤销一个优先级中的所有进程

2.一个进程被撤销时,必须从系统队列中移出,释放并归还所有系统资源,同时也有审查是否有子孙进程,如果有子孙进程也有一起予以撤销

1.当一个进程出现等待事件时,该进程调用阻塞原语将自己阻塞

1.必要性:解决多个进程争夺少数CPU资源的问题

2.功能:

(1)记录系统中所有进程的执行情况

(2)选择占有CPU的进程

(3)CPU分配给进程,即进行进程上下文切换

(4)回收CPU

3.进程调度算法

先来先服务/FCFS

按照进程进入就绪队列的先后次序选择占用处理器的进程

优先数调度算法

为每个进程确定一个优先数,进程调度总是让具有最高优先数的进程先使用处理器(若优先数相同则采用FCFS)

时间片轮转调度算法

CPU处理时间分成固定大小的时间片,轮流来,如果时间片用完进程还未结束,也得重新排到就绪队列的末尾等待再次调度

时间片q的选择:

q=R/N(R是系统对响应时间的要求;N是进程数)

多级反馈队列调度算法/MLFQ

设置多个就绪队列

各个队列的优先权不同(第一个队列的优先权最高,逐个降低)

各个队列的时间片大小不同(优先权越高的队列时间片越小)

当前队列的某个进程在时间片内没有完成就进入下一个队列的末尾

当某个队列为空时才会调度下一个队列

处理机在第i队为谋进程服务时,如果有新进程进入优先权较高的队列(i之前),则处理机就去处理i之前的那个新进程了,正在运行的进程被放到i队伍的末尾(可怜哈哈哈哈)

4.调度算法的选择

(1)处理器利用率(尽量让CPU处于忙碌状态)

(2)吞吐量

(3)等待时间(尽可能减少)

(4)响应时间(尽可能减少)

1.进程互斥:若干个进程要使用一个共享资源,任何时刻只允许一个进程去使用,其他要使用的进程必须等待,直到那个进程使用完后释放资源

2.进程互斥的管理办法: PV *** 作 管程

1.进程同步:并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达时才被唤醒

3.时间上的同步问题

$$进程通信

\begin{cases}

低级&\text{PV *** 作}\

高级 \begin{cases}共享存储器系统\ 消息传递系统 \管道通信系统 \end{cases}

\end{cases}$$

1.基于共享数据结构的通信方式

在这种通信方式中,要求诸进程公用某些数据结构,进程通过它们交换信息。这种通信方式是低效的,只适于传递少量数据。

2.基于共享存储区的通信方式

为了传输大量数据,在存储器中划出了一块共享存储区,诸进程可通过对共享存储区中的数据进行读或写来实现通信。这种通信方式属于高级通信。

消息传递系统中,进程间的数据交换以消息为单位

1.管道,是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称为pipe文件

2.为了协调双方的通信,管道通信机制必须提供以下三方面的协调能力:(1)互斥;(2)同步;(3)对方是否存在。

1.需要线程的目的:保持系统的并发性

2.为了减少额外开销,系统把进程的资源申请与调度执行分开,线程是调度的基本单位,进程是资源申请与拥有的基本单位

3.概念:线程(Thread)是进程中的一个实体,是可独立参与调度的基本单位

4.属性:

并发

一个线程可以创建另一个

动态性(生命周期)

TCB(进程是PCB)

同一进程内的线程共享同一地址空间

一个进程的线程对另外一个进程是不可见的

线程的通信是基于全局变量进行的

5.状态(与进程类似)

时间片轮转算法

优先权算法

1.进程作为资源的申请与拥有单位,线程作为调度的基本单位

2.线程在调度和切换上所花费的开销比进程小得多

3.进程是独立拥有资源的的一个基本单位,线程只拥有一点点运行中必要的资源

4.进程作为独立拥有资源的基本单位,线程是独立参与调度的基本单位

1.概念:死锁是多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进

2$$产生原因\begin{cases}竞争资源\ 进程推进顺序非法(请求与释放资源顺序不当) \end{cases}$$

3.$$产生死锁必要条件 \begin{cases}互斥条件(进程互斥使用资源) \ 占有且等待条件(得不到需要的资源就不释放占有的资源)\ 不剥夺条件(进程不能从另一进程抢夺资源)\ 循环等待条件(每个进程都在等待另一个进程所持有的资源) \end{cases}$$

4.对策:预防 避免 检测 解除

预防

(1)静态分配策略//破坏第二个必要条件

所谓静态分配是指一个进程必须在执行前就申请它所要的全部资源,并且直到它所要的资源都得到满足后才开始执行

(2)层次分配策略//破坏第四个必要条件

当一个进程获得了某一层的一个资源后,它想再申请该层中的另一个资源,必须先释放该层中的已占用资源。

避免

检测

*** 作系统中的每一时刻的系统状态都可以用进程—资源分配图来表示,进程—资源分配图是描述进程和资源间申请及分配关系的一种有向图,可用以检测系统是否处于死锁状态。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12046265.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存